PHP WebShell

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

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BatchUnstakingBuilder = void 0;
const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
const sdk_core_1 = require("@bitgo/sdk-core");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const baseBuilder_1 = require("./baseBuilder");
const txnSchema_1 = require("./txnSchema");
const utils_1 = __importDefault(require("./utils"));
class BatchUnstakingBuilder extends baseBuilder_1.PolyxBaseBuilder {
    constructor(_coinConfig) {
        super(_coinConfig);
    }
    /**
     * Unbond tokens and chill (stop nominating validators)
     *
     * @returns {UnsignedTransaction} an unsigned Polyx transaction
     */
    buildTransaction() {
        const baseTxInfo = this.createBaseTxInfo();
        const chillCall = txwrapper_polkadot_1.methods.staking.chill({}, baseTxInfo.baseTxInfo, baseTxInfo.options);
        const unbondCall = txwrapper_polkadot_1.methods.staking.unbond({
            value: this._amount,
        }, baseTxInfo.baseTxInfo, baseTxInfo.options);
        // Create batch all transaction (atomic execution)
        return txwrapper_polkadot_1.methods.utility.batchAll({
            calls: [chillCall.method, unbondCall.method],
        }, baseTxInfo.baseTxInfo, baseTxInfo.options);
    }
    get transactionType() {
        return sdk_core_1.TransactionType.Batch;
    }
    /**
     * The amount to unstake.
     *
     * @param {string} amount
     * @returns {BatchUnstakingBuilder} This unstake builder.
     */
    amount(amount) {
        this.validateValue(new bignumber_js_1.default(amount));
        this._amount = amount;
        return this;
    }
    /**
     * Get the amount to unstake
     */
    getAmount() {
        return this._amount;
    }
    /** @inheritdoc */
    validateDecodedTransaction(decodedTxn) {
        const methodName = decodedTxn.method?.name;
        if (methodName === 'batchAll') {
            const txMethod = decodedTxn.method.args;
            const calls = txMethod.calls;
            if (calls.length !== 2) {
                throw new sdk_core_1.InvalidTransactionError(`Invalid batch unstaking transaction: expected 2 calls but got ${calls.length}`);
            }
            // Check that first call is chill
            const firstCallMethod = utils_1.default.decodeMethodName(calls[0], this._registry);
            if (firstCallMethod !== 'chill') {
                throw new sdk_core_1.InvalidTransactionError(`Invalid batch unstaking transaction: first call should be chill but got ${firstCallMethod}`);
            }
            // Check that second call is unbond
            const secondCallMethod = utils_1.default.decodeMethodName(calls[1], this._registry);
            if (secondCallMethod !== 'unbond') {
                throw new sdk_core_1.InvalidTransactionError(`Invalid batch unstaking transaction: second call should be unbond but got ${secondCallMethod}`);
            }
            // Validate unbond amount - handle both string and number formats
            const unbondArgs = calls[1].args;
            const valueString = typeof unbondArgs.value === 'string' ? unbondArgs.value : unbondArgs.value.toString();
            const validationResult = txnSchema_1.BatchUnstakingTransactionSchema.validate({
                value: valueString,
            });
            if (validationResult.error) {
                throw new sdk_core_1.InvalidTransactionError(`Invalid batch unstaking transaction: ${validationResult.error.message}`);
            }
        }
        else {
            throw new sdk_core_1.InvalidTransactionError(`Invalid transaction type: ${methodName}. Expected batchAll`);
        }
    }
    /** @inheritdoc */
    fromImplementation(rawTransaction) {
        const tx = super.fromImplementation(rawTransaction);
        if (this._method && this._method.name === 'batchAll') {
            const txMethod = this._method.args;
            const calls = txMethod.calls;
            if (calls && calls.length === 2) {
                const secondCallMethod = utils_1.default.decodeMethodName(calls[1], this._registry);
                if (secondCallMethod === 'unbond') {
                    const unbondArgs = calls[1].args;
                    const valueString = typeof unbondArgs.value === 'string' ? unbondArgs.value : unbondArgs.value.toString();
                    this.amount(valueString);
                }
            }
        }
        else {
            throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${this._method?.name}. Expected batchAll`);
        }
        return tx;
    }
    /** @inheritdoc */
    validateTransaction(_) {
        super.validateTransaction(_);
        this.validateFields(this._amount);
    }
    validateFields(value) {
        const validationResult = txnSchema_1.BatchUnstakingTransactionSchema.validate({
            value,
        });
        if (validationResult.error) {
            throw new sdk_core_1.InvalidTransactionError(`Batch Unstaking Builder Transaction validation failed: ${validationResult.error.message}`);
        }
    }
    /**
     * Validates fields for testing
     */
    testValidateFields() {
        this.validateFields(this._amount);
    }
}
exports.BatchUnstakingBuilder = BatchUnstakingBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hVbnN0YWtpbmdCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9iYXRjaFVuc3Rha2luZ0J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esc0VBQXdEO0FBRXhELDhDQUEyRTtBQUMzRSxnRUFBcUM7QUFFckMsK0NBQWlEO0FBRWpELDJDQUE4RDtBQUM5RCxvREFBNEI7QUFFNUIsTUFBYSxxQkFBc0IsU0FBUSw4QkFBZ0I7SUFHekQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxnQkFBZ0I7UUFDeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFM0MsTUFBTSxTQUFTLEdBQUcsNEJBQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2RixNQUFNLFVBQVUsR0FBRyw0QkFBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3ZDO1lBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3BCLEVBQ0QsVUFBVSxDQUFDLFVBQVUsRUFDckIsVUFBVSxDQUFDLE9BQU8sQ0FDbkIsQ0FBQztRQUVGLGtEQUFrRDtRQUNsRCxPQUFPLDRCQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FDN0I7WUFDRSxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUM7U0FDN0MsRUFDRCxVQUFVLENBQUMsVUFBVSxFQUNyQixVQUFVLENBQUMsT0FBTyxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0s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QUFrQjtRQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUF0SkQsc0RBc0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IG1ldGhvZHMgfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1wb2xrYWRvdCc7XG5pbXBvcnQgeyBVbnNpZ25lZFRyYW5zYWN0aW9uLCBEZWNvZGVkU2lnbmluZ1BheWxvYWQsIERlY29kZWRTaWduZWRUeCB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUnO1xuaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgUG9seXhCYXNlQnVpbGRlciB9IGZyb20gJy4vYmFzZUJ1aWxkZXInO1xuaW1wb3J0IHsgQmF0Y2hBcmdzIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBCYXRjaFVuc3Rha2luZ1RyYW5zYWN0aW9uU2NoZW1hIH0gZnJvbSAnLi90eG5TY2hlbWEnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hVbnN0YWtpbmdCdWlsZGVyIGV4dGVuZHMgUG9seXhCYXNlQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfYW1vdW50OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYm9uZCB0b2tlbnMgYW5kIGNoaWxsIChzdG9wIG5vbWluYXRpbmcgdmFsaWRhdG9ycylcbiAgICpcbiAgICogQHJldHVybnMge1Vuc2lnbmVkVHJhbnNhY3Rpb259IGFuIHVuc2lnbmVkIFBvbHl4IHRyYW5zYWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRUcmFuc2FjdGlvbigpOiBVbnNpZ25lZFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBiYXNlVHhJbmZvID0gdGhpcy5jcmVhdGVCYXNlVHhJbmZvKCk7XG5cbiAgICBjb25zdCBjaGlsbENhbGwgPSBtZXRob2RzLnN0YWtpbmcuY2hpbGwoe30sIGJhc2VUeEluZm8uYmFzZVR4SW5mbywgYmFzZVR4SW5mby5vcHRpb25zKTtcblxuICAgIGNvbnN0IHVuYm9uZENhbGwgPSBtZXRob2RzLnN0YWtpbmcudW5ib25kKFxuICAgICAge1xuICAgICAgICB2YWx1ZTogdGhpcy5fYW1vdW50LFxuICAgICAgfSxcbiAgICAgIGJhc2VUeEluZm8uYmFzZVR4SW5mbyxcbiAgICAgIGJhc2VUeEluZm8ub3B0aW9uc1xuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYmF0Y2ggYWxsIHRyYW5zYWN0aW9uIChhdG9taWMgZXhlY3V0aW9uKVxuICAgIHJldHVybiBtZXRob2RzLnV0aWxpdHkuYmF0Y2hBbGwoXG4gICAgICB7XG4gICAgICAgIGNhbGxzOiBbY2hpbGxDYWxsLm1ldGhvZCwgdW5ib25kQ2FsbC5tZXRob2RdLFxuICAgICAgfSxcbiAgICAgIGJhc2VUeEluZm8uYmFzZVR4SW5mbyxcbiAgICAgIGJhc2VUeEluZm8ub3B0aW9uc1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQmF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFtb3VudCB0byB1bnN0YWtlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50XG4gICAqIEByZXR1cm5zIHtCYXRjaFVuc3Rha2luZ0J1aWxkZXJ9IFRoaXMgdW5zdGFrZSBidWlsZGVyLlxuICAgKi9cbiAgYW1vdW50KGFtb3VudDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoYW1vdW50KSk7XG4gICAgdGhpcy5fYW1vdW50ID0gYW1vdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYW1vdW50IHRvIHVuc3Rha2VcbiAgICovXG4gIGdldEFtb3VudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hbW91bnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVEZWNvZGVkVHJhbnNhY3Rpb24oZGVjb2RlZFR4bjogRGVjb2RlZFNpZ25pbmdQYXlsb2FkIHwgRGVjb2RlZFNpZ25lZFR4KTogdm9pZCB7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IGRlY29kZWRUeG4ubWV0aG9kPy5uYW1lIGFzIHN0cmluZztcblxuICAgIGlmIChtZXRob2ROYW1lID09PSAnYmF0Y2hBbGwnKSB7XG4gICAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeG4ubWV0aG9kLmFyZ3MgYXMgdW5rbm93biBhcyBCYXRjaEFyZ3M7XG4gICAgICBjb25zdCBjYWxscyA9IHR4TWV0aG9kLmNhbGxzO1xuXG4gICAgICBpZiAoY2FsbHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBiYXRjaCB1bnN0YWtpbmcgdHJhbnNhY3Rpb246IGV4cGVjdGVkIDIgY2FsbHMgYnV0IGdvdCAke2NhbGxzLmxlbmd0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgZmlyc3QgY2FsbCBpcyBjaGlsbFxuICAgICAgY29uc3QgZmlyc3RDYWxsTWV0aG9kID0gdXRpbHMuZGVjb2RlTWV0aG9kTmFtZShjYWxsc1swXSwgdGhpcy5fcmVnaXN0cnkpO1xuICAgICAgaWYgKGZpcnN0Q2FsbE1ldGhvZCAhPT0gJ2NoaWxsJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgYmF0Y2ggdW5zdGFraW5nIHRyYW5zYWN0aW9uOiBmaXJzdCBjYWxsIHNob3VsZCBiZSBjaGlsbCBidXQgZ290ICR7Zmlyc3RDYWxsTWV0aG9kfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdGhhdCBzZWNvbmQgY2FsbCBpcyB1bmJvbmRcbiAgICAgIGNvbnN0IHNlY29uZENhbGxNZXRob2QgPSB1dGlscy5kZWNvZGVNZXRob2ROYW1lKGNhbGxzWzFdLCB0aGlzLl9yZWdpc3RyeSk7XG4gICAgICBpZiAoc2Vjb25kQ2FsbE1ldGhvZCAhPT0gJ3VuYm9uZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGJhdGNoIHVuc3Rha2luZyB0cmFuc2FjdGlvbjogc2Vjb25kIGNhbGwgc2hvdWxkIGJlIHVuYm9uZCBidXQgZ290ICR7c2Vjb25kQ2FsbE1ldGhvZH1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHVuYm9uZCBhbW91bnQgLSBoYW5kbGUgYm90aCBzdHJpbmcgYW5kIG51bWJlciBmb3JtYXRzXG4gICAgICBjb25zdCB1bmJvbmRBcmdzID0gY2FsbHNbMV0uYXJncyBhcyB7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfTtcbiAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdHlwZW9mIHVuYm9uZEFyZ3MudmFsdWUgPT09ICdzdHJpbmcnID8gdW5ib25kQXJncy52YWx1ZSA6IHVuYm9uZEFyZ3MudmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBCYXRjaFVuc3Rha2luZ1RyYW5zYWN0aW9uU2NoZW1hLnZhbGlkYXRlKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlU3RyaW5nLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBiYXRjaCB1bnN0YWtpbmcgdHJhbnNhY3Rpb246ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgdHJhbnNhY3Rpb24gdHlwZTogJHttZXRob2ROYW1lfS4gRXhwZWN0ZWQgYmF0Y2hBbGxgKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcblxuICAgIGlmICh0aGlzLl9tZXRob2QgJiYgKHRoaXMuX21ldGhvZC5uYW1lIGFzIHN0cmluZykgPT09ICdiYXRjaEFsbCcpIHtcbiAgICAgIGNvbnN0IHR4TWV0aG9kID0gdGhpcy5fbWV0aG9kLmFyZ3MgYXMgdW5rbm93biBhcyBCYXRjaEFyZ3M7XG4gICAgICBjb25zdCBjYWxscyA9IHR4TWV0aG9kLmNhbGxzO1xuXG4gICAgICBpZiAoY2FsbHMgJiYgY2FsbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZENhbGxNZXRob2QgPSB1dGlscy5kZWNvZGVNZXRob2ROYW1lKGNhbGxzWzFdLCB0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgIGlmIChzZWNvbmRDYWxsTWV0aG9kID09PSAndW5ib25kJykge1xuICAgICAgICAgIGNvbnN0IHVuYm9uZEFyZ3MgPSBjYWxsc1sxXS5hcmdzIGFzIHsgdmFsdWU6IHN0cmluZyB8IG51bWJlciB9O1xuICAgICAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdHlwZW9mIHVuYm9uZEFyZ3MudmFsdWUgPT09ICdzdHJpbmcnID8gdW5ib25kQXJncy52YWx1ZSA6IHVuYm9uZEFyZ3MudmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICB0aGlzLmFtb3VudCh2YWx1ZVN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6ICR7dGhpcy5fbWV0aG9kPy5uYW1lfS4gRXhwZWN0ZWQgYmF0Y2hBbGxgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbihfOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oXyk7XG4gICAgdGhpcy52YWxpZGF0ZUZpZWxkcyh0aGlzLl9hbW91bnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpZWxkcyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IEJhdGNoVW5zdGFraW5nVHJhbnNhY3Rpb25TY2hlbWEudmFsaWRhdGUoe1xuICAgICAgdmFsdWUsXG4gICAgfSk7XG5cbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgQmF0Y2ggVW5zdGFraW5nIEJ1aWxkZXIgVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBmaWVsZHMgZm9yIHRlc3RpbmdcbiAgICovXG4gIHRlc3RWYWxpZGF0ZUZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlRmllbGRzKHRoaXMuX2Ftb3VudCk7XG4gIH1cbn1cbiJdfQ==

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


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