PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-sol/dist/src/lib

Просмотр файла: customInstructionBuilder.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CustomInstructionBuilder = void 0;
const sdk_core_1 = require("@bitgo/sdk-core");
const web3_js_1 = require("@solana/web3.js");
const transactionBuilder_1 = require("./transactionBuilder");
const constants_1 = require("./constants");
const assert_1 = __importDefault(require("assert"));
/**
 * Transaction builder for custom Solana instructions.
 * Allows building transactions with any set of raw Solana instructions.
 */
class CustomInstructionBuilder extends transactionBuilder_1.TransactionBuilder {
    constructor(_coinConfig) {
        super(_coinConfig);
        this._customInstructions = [];
    }
    get transactionType() {
        return sdk_core_1.TransactionType.CustomTx;
    }
    /**
     * Initialize the builder from an existing transaction
     */
    initBuilder(tx) {
        super.initBuilder(tx);
        for (const instruction of this._instructionsData) {
            if (instruction.type === constants_1.InstructionBuilderTypes.CustomInstruction) {
                const customInstruction = instruction;
                this.addCustomInstruction(customInstruction.params);
            }
        }
    }
    /**
     * Add a custom instruction to the transaction
     * @param instruction - The custom instruction to add
     * @returns This builder instance
     */
    addCustomInstruction(instruction) {
        this.validateInstruction(instruction);
        const customInstruction = {
            type: constants_1.InstructionBuilderTypes.CustomInstruction,
            params: instruction,
        };
        this._customInstructions.push(customInstruction);
        return this;
    }
    /**
     * Add multiple custom instructions to the transaction
     * @param instructions - Array of custom instructions to add
     * @returns This builder instance
     */
    addCustomInstructions(instructions) {
        if (!Array.isArray(instructions)) {
            throw new sdk_core_1.BuildTransactionError('Instructions must be an array');
        }
        for (const instruction of instructions) {
            this.addCustomInstruction(instruction);
        }
        return this;
    }
    /**
     * Clear all custom instructions
     * @returns This builder instance
     */
    clearInstructions() {
        this._customInstructions = [];
        return this;
    }
    /**
     * Get the current custom instructions
     * @returns Array of custom instructions
     */
    getInstructions() {
        return [...this._customInstructions];
    }
    /**
     * Validate custom instruction format
     * @param instruction - The instruction to validate
     */
    validateInstruction(instruction) {
        if (!instruction) {
            throw new sdk_core_1.BuildTransactionError('Instruction cannot be null or undefined');
        }
        if (!instruction.programId || typeof instruction.programId !== 'string') {
            throw new sdk_core_1.BuildTransactionError('Instruction must have a valid programId string');
        }
        // Validate that programId is a valid Solana public key
        try {
            new web3_js_1.PublicKey(instruction.programId);
        }
        catch (error) {
            throw new sdk_core_1.BuildTransactionError('Invalid programId format');
        }
        if (!instruction.keys || !Array.isArray(instruction.keys)) {
            throw new sdk_core_1.BuildTransactionError('Instruction must have valid keys array');
        }
        // Validate each key
        for (const key of instruction.keys) {
            if (!key.pubkey || typeof key.pubkey !== 'string') {
                throw new sdk_core_1.BuildTransactionError('Each key must have a valid pubkey string');
            }
            try {
                new web3_js_1.PublicKey(key.pubkey);
            }
            catch (error) {
                throw new sdk_core_1.BuildTransactionError('Invalid pubkey format in keys');
            }
            if (typeof key.isSigner !== 'boolean') {
                throw new sdk_core_1.BuildTransactionError('Each key must have a boolean isSigner field');
            }
            if (typeof key.isWritable !== 'boolean') {
                throw new sdk_core_1.BuildTransactionError('Each key must have a boolean isWritable field');
            }
        }
        if (instruction.data === undefined || typeof instruction.data !== 'string') {
            throw new sdk_core_1.BuildTransactionError('Instruction must have valid data string');
        }
    }
    /** @inheritdoc */
    async buildImplementation() {
        (0, assert_1.default)(this._customInstructions.length > 0, 'At least one custom instruction must be specified');
        // Set the instructions data to our custom instructions
        this._instructionsData = [...this._customInstructions];
        return await super.buildImplementation();
    }
}
exports.CustomInstructionBuilder = CustomInstructionBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsOENBQXlGO0FBQ3pGLDZDQUE0QztBQUU1Qyw2REFBMEQ7QUFDMUQsMkNBQXNEO0FBRXRELG9EQUE0QjtBQUU1Qjs7O0dBR0c7QUFDSCxNQUFhLHdCQUF5QixTQUFRLHVDQUFrQjtJQUc5RCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUhiLHdCQUFtQixHQUF3QixFQUFFLENBQUM7SUFJdEQsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssbUNBQXVCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbkUsTUFBTSxpQkFBaUIsR0FBRyxXQUFnQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG9CQUFvQixDQUFDLFdBQTJCO1FBQzlDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxNQUFNLGlCQUFpQixHQUFzQjtZQUMzQyxJQUFJLEVBQUUsbUNBQXVCLENBQUMsaUJBQWlCO1lBQy9DLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUM7UUFDRixJQUFJLENBQUMsbUJB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a0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUVqRyx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV2RCxPQUFPLE1BQU0sS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBbklELDREQW1JQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFNvbEluc3RydWN0aW9uLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEN1c3RvbUluc3RydWN0aW9uIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gYnVpbGRlciBmb3IgY3VzdG9tIFNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKiBBbGxvd3MgYnVpbGRpbmcgdHJhbnNhY3Rpb25zIHdpdGggYW55IHNldCBvZiByYXcgU29sYW5hIGluc3RydWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEN1c3RvbUluc3RydWN0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX2N1c3RvbUluc3RydWN0aW9uczogQ3VzdG9tSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBidWlsZGVyIGZyb20gYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb25cbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSkge1xuICAgICAgaWYgKGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgQ3VzdG9tSW5zdHJ1Y3Rpb247XG4gICAgICAgIHRoaXMuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY3VzdG9tSW5zdHJ1Y3Rpb24ucGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY3VzdG9tIGluc3RydWN0aW9uIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSBUaGUgY3VzdG9tIGluc3RydWN0aW9uIHRvIGFkZFxuICAgKiBAcmV0dXJucyBUaGlzIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIGFkZEN1c3RvbUluc3RydWN0aW9uKGluc3RydWN0aW9uOiBTb2xJbnN0cnVjdGlvbik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb246IEN1c3RvbUluc3RydWN0aW9uID0ge1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gICAgICBwYXJhbXM6IGluc3RydWN0aW9uLFxuICAgIH07XG4gICAgdGhpcy5fY3VzdG9tSW5zdHJ1Y3Rpb25zLnB1c2goY3VzdG9tSW5zdHJ1Y3Rpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtdWx0aXBsZSBjdXN0b20gaW5zdHJ1Y3Rpb25zIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb25zIC0gQXJyYXkgb2YgY3VzdG9tIGluc3RydWN0aW9ucyB0byBhZGRcbiAgICogQHJldHVybnMgVGhpcyBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBhZGRDdXN0b21JbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBTb2xJbnN0cnVjdGlvbltdKTogdGhpcyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGluc3RydWN0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0luc3RydWN0aW9ucyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICB0aGlzLmFkZEN1c3RvbUluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgICogQHJldHVybnMgVGhpcyBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBjbGVhckluc3RydWN0aW9ucygpOiB0aGlzIHtcbiAgICB0aGlzLl9jdXN0b21JbnN0cnVjdGlvbnMgPSBbXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgY3VzdG9tIGluc3RydWN0aW9uc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBjdXN0b20gaW5zdHJ1Y3Rpb25zXG4gICAqL1xuICBnZXRJbnN0cnVjdGlvbnMoKTogQ3VzdG9tSW5zdHJ1Y3Rpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9jdXN0b21JbnN0cnVjdGlvbnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGN1c3RvbSBpbnN0cnVjdGlvbiBmb3JtYXRcbiAgICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIGluc3RydWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb246IFNvbEluc3RydWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFpbnN0cnVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdHJ1Y3Rpb24gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnN0cnVjdGlvbi5wcm9ncmFtSWQgfHwgdHlwZW9mIGluc3RydWN0aW9uLnByb2dyYW1JZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0luc3RydWN0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIHByb2dyYW1JZCBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHByb2dyYW1JZCBpcyBhIHZhbGlkIFNvbGFuYSBwdWJsaWMga2V5XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBQdWJsaWNLZXkoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBwcm9ncmFtSWQgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnN0cnVjdGlvbi5rZXlzIHx8ICFBcnJheS5pc0FycmF5KGluc3RydWN0aW9uLmtleXMpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnN0cnVjdGlvbiBtdXN0IGhhdmUgdmFsaWQga2V5cyBhcnJheScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2gga2V5XG4gICAgZm9yIChjb25zdCBrZXkgb2YgaW5zdHJ1Y3Rpb24ua2V5cykge1xuICAgICAgaWYgKCFrZXkucHVia2V5IHx8IHR5cGVvZiBrZXkucHVia2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdFYWNoIGtleSBtdXN0IGhhdmUgYSB2YWxpZCBwdWJrZXkgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBQdWJsaWNLZXkoa2V5LnB1YmtleSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHB1YmtleSBmb3JtYXQgaW4ga2V5cycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGtleS5pc1NpZ25lciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VhY2gga2V5IG11c3QgaGF2ZSBhIGJvb2xlYW4gaXNTaWduZXIgZmllbGQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBrZXkuaXNXcml0YWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VhY2gga2V5IG11c3QgaGF2ZSBhIGJvb2xlYW4gaXNXcml0YWJsZSBmaWVsZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbnN0cnVjdGlvbi5kYXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGluc3RydWN0aW9uLmRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnN0cnVjdGlvbiBtdXN0IGhhdmUgdmFsaWQgZGF0YSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGFzc2VydCh0aGlzLl9jdXN0b21JbnN0cnVjdGlvbnMubGVuZ3RoID4gMCwgJ0F0IGxlYXN0IG9uZSBjdXN0b20gaW5zdHJ1Y3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQnKTtcblxuICAgIC8vIFNldCB0aGUgaW5zdHJ1Y3Rpb25zIGRhdGEgdG8gb3VyIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gWy4uLnRoaXMuX2N1c3RvbUluc3RydWN0aW9uc107XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICB9XG59XG4iXX0=

Выполнить команду


Для локальной разработки. Не используйте в интернете!