PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-cspr/dist/src/lib

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WalletInitializationBuilder = void 0;
const casper_js_sdk_1 = require("casper-js-sdk");
const sdk_core_1 = require("@bitgo/sdk-core");
const transactionBuilder_1 = require("./transactionBuilder");
const utils_1 = require("./utils");
const constants_1 = require("./constants");
const keyPair_1 = require("./keyPair");
const DEFAULT_OWNER_WEIGHT = 1;
class WalletInitializationBuilder extends transactionBuilder_1.TransactionBuilder {
    constructor(_coinConfig) {
        super(_coinConfig);
        this._owners = [];
        this._contract = Uint8Array.from(Buffer.from(utils_1.casperContractHexCode, 'hex'));
    }
    // region Base Builder
    /** @inheritdoc */
    async buildImplementation() {
        const args = this.buildWalletParameters();
        const extraArguments = new Map();
        extraArguments.set(constants_1.TRANSACTION_TYPE, casper_js_sdk_1.CLValueBuilder.string(sdk_core_1.TransactionType[sdk_core_1.TransactionType.WalletInitialization]));
        for (let index = 0; index < this._owners.length; index++) {
            const ownerPublicKey = Buffer.from(this._owners[index].address.value()).toString('hex');
            const ownerAddress = new keyPair_1.KeyPair({ pub: ownerPublicKey }).getAddress();
            extraArguments.set(constants_1.OWNER_PREFIX + index, casper_js_sdk_1.CLValueBuilder.string(ownerAddress));
        }
        this._session = { moduleBytes: this._contract, args: casper_js_sdk_1.RuntimeArgs.fromMap(args), extraArguments: extraArguments };
        this.transaction.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
        return await super.buildImplementation();
    }
    /**
     * Build args needed to create a session, then we can send this session with the contract
     *
     * @returns {WalletInitContractArgs} contracts args to create a session
     */
    buildWalletParameters() {
        const accounts = this._owners.map((owner) => casper_js_sdk_1.CLValueBuilder.byteArray(owner.address.toAccountHash()));
        const weights = this._owners.map((owner) => casper_js_sdk_1.CLValueBuilder.u8(owner.weight));
        // set source address weight to zero to disable the master private key from signing.
        accounts.push(casper_js_sdk_1.CLValueBuilder.byteArray(casper_js_sdk_1.CLPublicKey.fromHex(this._source.address).toAccountHash()));
        weights.push(casper_js_sdk_1.CLValueBuilder.u8(0));
        return {
            action: casper_js_sdk_1.CLValueBuilder.string(constants_1.WALLET_INITIALIZATION_CONTRACT_ACTION),
            // This typo is on purpose since the contract we use for multisig wallet initialization expect this argument to be written like this.
            deployment_thereshold: casper_js_sdk_1.CLValueBuilder.u8(transactionBuilder_1.DEFAULT_N),
            key_management_threshold: casper_js_sdk_1.CLValueBuilder.u8(transactionBuilder_1.DEFAULT_M),
            accounts: casper_js_sdk_1.CLValueBuilder.list(accounts),
            weights: casper_js_sdk_1.CLValueBuilder.list(weights),
        };
    }
    /** @inheritdoc */
    initBuilder(tx) {
        super.initBuilder(tx);
        this.transaction.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
        for (let ownerIndex = 0; ownerIndex < transactionBuilder_1.DEFAULT_M; ownerIndex++) {
            const ownerCLValue = tx.casperTx.session.getArgByName(constants_1.OWNER_PREFIX + ownerIndex);
            this.owner(ownerCLValue.value());
        }
    }
    // endregion
    // region Common builder methods
    /**
     * Set one of the owners of the multisig wallet.
     *
     * @param {string} address The public key of the owner's account
     * @returns {WalletInitializationBuilder} This wallet initialization builder
     */
    owner(address) {
        if (this._owners.length >= transactionBuilder_1.DEFAULT_M) {
            throw new sdk_core_1.BuildTransactionError('A maximum of ' + transactionBuilder_1.DEFAULT_M + ' owners can be set for a multisig wallet');
        }
        this.validateAddress({ address: address });
        for (const _owner of this._owners) {
            if (address.substr(0, 2) + Buffer.from(_owner.address.value()).toString('hex') === address) {
                throw new sdk_core_1.BuildTransactionError('Duplicated owner: ' + address);
            }
        }
        this._owners.push({ address: casper_js_sdk_1.CLPublicKey.fromHex(address), weight: DEFAULT_OWNER_WEIGHT });
        return this;
    }
    // endregion
    // region Validators
    validateMandatoryFields() {
        if (this._owners.length === 0) {
            throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing wallet owners');
        }
        if (this._owners.length !== transactionBuilder_1.DEFAULT_M) {
            throw new sdk_core_1.BuildTransactionError(`Invalid transaction: wrong number of owners -- required: ${transactionBuilder_1.DEFAULT_M}, found: ${this._owners.length}`);
        }
        super.validateMandatoryFields();
    }
}
exports.WalletInitializationBuilder = WalletInitializationBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi93YWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQXlHO0FBQ3pHLDhDQUF5RTtBQUN6RSw2REFBZ0Y7QUFHaEYsbUNBQWdEO0FBQ2hELDJDQUFvRztBQUNwRyx1Q0FBb0M7QUFFcEMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFDL0IsTUFBYSwyQkFBNEIsU0FBUSx1Q0FBa0I7SUFJakUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFKYixZQUFPLEdBQVksRUFBRSxDQUFDO1FBSzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDUixLQUFLLENBQUMsbUJBQW1CO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzFDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1FBRWxELGNBQWMsQ0FBQyxHQUFHLENBQUMsNEJBQWdCLEVBQUUsOEJBQWMsQ0FBQyxNQUFNLENBQUMsMEJBQWUsQ0FBQywwQkFBZSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ILEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3pELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFP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bUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IENMVmFsdWUsIENMUHVibGljS2V5IGFzIFB1YmxpY0tleSwgUnVudGltZUFyZ3MsIENMVmFsdWVCdWlsZGVyLCBDTFN0cmluZyB9IGZyb20gJ2Nhc3Blci1qcy1zZGsnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyLCBERUZBVUxUX00sIERFRkFVTFRfTiB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBPd25lciwgV2FsbGV0SW5pdENvbnRyYWN0QXJncyB9IGZyb20gJy4vaWZhY2VzJztcbmltcG9ydCB7IGNhc3BlckNvbnRyYWN0SGV4Q29kZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgT1dORVJfUFJFRklYLCBUUkFOU0FDVElPTl9UWVBFLCBXQUxMRVRfSU5JVElBTElaQVRJT05fQ09OVFJBQ1RfQUNUSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5cbmNvbnN0IERFRkFVTFRfT1dORVJfV0VJR0hUID0gMTtcbmV4cG9ydCBjbGFzcyBXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9vd25lcnM6IE93bmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBfY29udHJhY3Q6IFVpbnQ4QXJyYXk7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2NvbnRyYWN0ID0gVWludDhBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKGNhc3BlckNvbnRyYWN0SGV4Q29kZSwgJ2hleCcpKTtcbiAgfVxuXG4gIC8vIHJlZ2lvbiBCYXNlIEJ1aWxkZXJcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5idWlsZFdhbGxldFBhcmFtZXRlcnMoKTtcbiAgICBjb25zdCBleHRyYUFyZ3VtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBDTFZhbHVlPigpO1xuXG4gICAgZXh0cmFBcmd1bWVudHMuc2V0KFRSQU5TQUNUSU9OX1RZUEUsIENMVmFsdWVCdWlsZGVyLnN0cmluZyhUcmFuc2FjdGlvblR5cGVbVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uXSkpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9vd25lcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBvd25lclB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHRoaXMuX293bmVyc1tpbmRleF0uYWRkcmVzcy52YWx1ZSgpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBvd25lckFkZHJlc3MgPSBuZXcgS2V5UGFpcih7IHB1Yjogb3duZXJQdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICAgICAgZXh0cmFBcmd1bWVudHMuc2V0KE9XTkVSX1BSRUZJWCArIGluZGV4LCBDTFZhbHVlQnVpbGRlci5zdHJpbmcob3duZXJBZGRyZXNzKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2Vzc2lvbiA9IHsgbW9kdWxlQnl0ZXM6IHRoaXMuX2NvbnRyYWN0LCBhcmdzOiBSdW50aW1lQXJncy5mcm9tTWFwKGFyZ3MpLCBleHRyYUFyZ3VtZW50czogZXh0cmFBcmd1bWVudHMgfTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYXJncyBuZWVkZWQgdG8gY3JlYXRlIGEgc2Vzc2lvbiwgdGhlbiB3ZSBjYW4gc2VuZCB0aGlzIHNlc3Npb24gd2l0aCB0aGUgY29udHJhY3RcbiAgICpcbiAgICogQHJldHVybnMge1dhbGxldEluaXRDb250cmFjdEFyZ3N9IGNvbnRyYWN0cyBhcmdzIHRvIGNyZWF0ZSBhIHNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgYnVpbGRXYWxsZXRQYXJhbWV0ZXJzKCk6IFdhbGxldEluaXRDb250cmFjdEFyZ3Mge1xuICAgIGNvbnN0IGFjY291bnRzID0gdGhpcy5fb3duZXJzLm1hcCgob3duZXIpID0+IENMVmFsdWVCdWlsZGVyLmJ5dGVBcnJheShvd25lci5hZGRyZXNzLnRvQWNjb3VudEhhc2goKSkpO1xuICAgIGNvbnN0IHdlaWdodHMgPSB0aGlzLl9vd25lcnMubWFwKChvd25lcikgPT4gQ0xWYWx1ZUJ1aWxkZXIudTgob3duZXIud2VpZ2h0KSk7XG5cbiAgICAvLyBzZXQgc291cmNlIGFkZHJlc3Mgd2VpZ2h0IHRvIHplcm8gdG8gZGlzYWJsZSB0aGUgbWFzdGVyIHByaXZhdGUga2V5IGZyb20gc2lnbmluZy5cbiAgICBhY2NvdW50cy5wdXNoKENMVmFsdWVCdWlsZGVyLmJ5dGVBcnJheShQdWJsaWNLZXkuZnJvbUhleCh0aGlzLl9zb3VyY2UuYWRkcmVzcykudG9BY2NvdW50SGFzaCgpKSk7XG4gICAgd2VpZ2h0cy5wdXNoKENMVmFsdWVCdWlsZGVyLnU4KDApKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IENMVmFsdWVCdWlsZGVyLnN0cmluZyhXQUxMRVRfSU5JVElBTElaQVRJT05fQ09OVFJBQ1RfQUNUSU9OKSxcbiAgICAgIC8vIFRoaXMgdHlwbyBpcyBvbiBwdXJwb3NlIHNpbmNlIHRoZSBjb250cmFjdCB3ZSB1c2UgZm9yIG11bHRpc2lnIHdhbGxldCBpbml0aWFsaXphdGlvbiBleHBlY3QgdGhpcyBhcmd1bWVudCB0byBiZSB3cml0dGVuIGxpa2UgdGhpcy5cbiAgICAgIGRlcGxveW1lbnRfdGhlcmVzaG9sZDogQ0xWYWx1ZUJ1aWxkZXIudTgoREVGQVVMVF9OKSxcbiAgICAgIGtleV9tYW5hZ2VtZW50X3RocmVzaG9sZDogQ0xWYWx1ZUJ1aWxkZXIudTgoREVGQVVMVF9NKSxcbiAgICAgIGFjY291bnRzOiBDTFZhbHVlQnVpbGRlci5saXN0KGFjY291bnRzKSxcbiAgICAgIHdlaWdodHM6IENMVmFsdWVCdWlsZGVyLmxpc3Qod2VpZ2h0cyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICBmb3IgKGxldCBvd25lckluZGV4ID0gMDsgb3duZXJJbmRleCA8IERFRkFVTFRfTTsgb3duZXJJbmRleCsrKSB7XG4gICAgICBjb25zdCBvd25lckNMVmFsdWUgPSB0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZShPV05FUl9QUkVGSVggKyBvd25lckluZGV4KSBhcyBDTFN0cmluZztcbiAgICAgIHRoaXMub3duZXIob3duZXJDTFZhbHVlLnZhbHVlKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8vIHJlZ2lvbiBDb21tb24gYnVpbGRlciBtZXRob2RzXG4gIC8qKlxuICAgKiBTZXQgb25lIG9mIHRoZSBvd25lcnMgb2YgdGhlIG11bHRpc2lnIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgVGhlIHB1YmxpYyBrZXkgb2YgdGhlIG93bmVyJ3MgYWNjb3VudFxuICAgKiBAcmV0dXJucyB7V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyfSBUaGlzIHdhbGxldCBpbml0aWFsaXphdGlvbiBidWlsZGVyXG4gICAqL1xuICBvd25lcihhZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAodGhpcy5fb3duZXJzLmxlbmd0aCA+PSBERUZBVUxUX00pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0EgbWF4aW11bSBvZiAnICsgREVGQVVMVF9NICsgJyBvd25lcnMgY2FuIGJlIHNldCBmb3IgYSBtdWx0aXNpZyB3YWxsZXQnKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiBhZGRyZXNzIH0pO1xuICAgIGZvciAoY29uc3QgX293bmVyIG9mIHRoaXMuX293bmVycykge1xuICAgICAgaWYgKGFkZHJlc3Muc3Vic3RyKDAsIDIpICsgQnVmZmVyLmZyb20oX293bmVyLmFkZHJlc3MudmFsdWUoKSkudG9TdHJpbmcoJ2hleCcpID09PSBhZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0R1cGxpY2F0ZWQgb3duZXI6ICcgKyBhZGRyZXNzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9vd25lcnMucHVzaCh7IGFkZHJlc3M6IFB1YmxpY0tleS5mcm9tSGV4KGFkZHJlc3MpLCB3ZWlnaHQ6IERFRkFVTFRfT1dORVJfV0VJR0hUIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8vIHJlZ2lvbiBWYWxpZGF0b3JzXG4gIHZhbGlkYXRlTWFuZGF0b3J5RmllbGRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vd25lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHdhbGxldCBvd25lcnMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3duZXJzLmxlbmd0aCAhPT0gREVGQVVMVF9NKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCB0cmFuc2FjdGlvbjogd3JvbmcgbnVtYmVyIG9mIG93bmVycyAtLSByZXF1aXJlZDogJHtERUZBVUxUX019LCBmb3VuZDogJHt0aGlzLl9vd25lcnMubGVuZ3RofWBcbiAgICAgICk7XG4gICAgfVxuICAgIHN1cGVyLnZhbGlkYXRlTWFuZGF0b3J5RmllbGRzKCk7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG59XG4iXX0=

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


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