PHP WebShell

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

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.StakingBuilder = void 0;
const assert_1 = __importDefault(require("assert"));
const sdk_core_1 = require("@bitgo/sdk-core");
const transactionBuilder_1 = require("./transactionBuilder");
const stakingTransaction_1 = require("../transaction/stakingTransaction");
const utils_1 = __importDefault(require("../utils"));
class StakingBuilder extends transactionBuilder_1.TransactionBuilder {
    /**
     * Creates a new StakingBuilder instance.
     *
     * @param {Readonly<CoinConfig>} _coinConfig - The coin configuration object
     */
    constructor(_coinConfig) {
        super(_coinConfig);
        this._transaction = new stakingTransaction_1.StakingTransaction(_coinConfig);
    }
    /**
     * Initializes the builder with an existing StakingTransaction.
     *
     * @param {StakingTransaction} tx - The transaction to initialize the builder with
     */
    initBuilder(tx) {
        this._transaction = tx;
    }
    /**
     * Gets the staking transaction instance.
     *
     * @returns {StakingTransaction} The staking transaction
     */
    get stakingTransaction() {
        return this._transaction;
    }
    /**
     * Gets the transaction type for staking.
     *
     * @returns {TransactionType} The transaction type
     */
    get transactionType() {
        return sdk_core_1.TransactionType.ContractCall;
    }
    /**
     * Validates the transaction clauses for staking transaction.
     * @param {TransactionClause[]} clauses - The transaction clauses to validate.
     * @returns {boolean} - Returns true if the clauses are valid, false otherwise.
     */
    isValidTransactionClauses(clauses) {
        try {
            if (!clauses || !Array.isArray(clauses) || clauses.length === 0) {
                return false;
            }
            const clause = clauses[0];
            if (!clause.to || !utils_1.default.isValidAddress(clause.to)) {
                return false;
            }
            // For staking transactions, value must be greater than 0
            if (!clause.value || clause.value === '0x0' || clause.value === '0') {
                return false;
            }
            return true;
        }
        catch (e) {
            return false;
        }
    }
    /**
     * Sets the staking contract address for this staking tx.
     *
     * @param {string} address - The staking contract address
     * @returns {StakingBuilder} This transaction builder
     */
    stakingContractAddress(address) {
        this.validateAddress({ address });
        this.stakingTransaction.stakingContractAddress = address;
        return this;
    }
    /**
     * Sets the amount to stake for this staking tx.
     *
     * @param {string} amount - The amount to stake in wei
     * @returns {StakingBuilder} This transaction builder
     */
    amountToStake(amount) {
        this.stakingTransaction.amountToStake = amount;
        return this;
    }
    /**
     * Sets the staking contract ABI for this staking tx.
     *
     * @param {EthereumAbi} abi - The staking contract ABI
     * @returns {StakingBuilder} This transaction builder
     */
    stakingContractABI(abi) {
        this.stakingTransaction.stakingContractABI = abi;
        return this;
    }
    /**
     * Sets the transaction data for this staking tx.
     *
     * @param {string} data - The transaction data
     * @returns {StakingBuilder} This transaction builder
     */
    transactionData(data) {
        this.stakingTransaction.transactionData = data;
        return this;
    }
    /** @inheritdoc */
    validateTransaction(transaction) {
        if (!transaction) {
            throw new Error('transaction not defined');
        }
        (0, assert_1.default)(transaction.stakingContractAddress, 'Staking contract address is required');
        (0, assert_1.default)(transaction.amountToStake, 'Amount to stake is required');
        (0, assert_1.default)(transaction.stakingContractABI, 'Staking contract ABI is required');
        this.validateAddress({ address: transaction.stakingContractAddress });
    }
    /** @inheritdoc */
    async buildImplementation() {
        this.transaction.type = this.transactionType;
        await this.stakingTransaction.build();
        return this.transaction;
    }
}
exports.StakingBuilder = StakingBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ0J1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlci9zdGFraW5nQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsOENBQWtEO0FBR2xELDZEQUEwRDtBQUUxRCwwRUFBdUU7QUFFdkUscURBQTZCO0FBRTdCLE1BQWEsY0FBZSxTQUFRLHVDQUFrQjtJQUNwRDs7OztPQUlHO0lBQ0gsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHVDQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLEVBQXNCO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBa0MsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsWUFBWSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ08seUJBQXlCLENBQUMsT0FBNEI7UUFDOUQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTFCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQseURBQXlEO1lBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3BFLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxzQkFBc0IsQ0FBQyxPQUFlO1FBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsTUFBYztRQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFDLEdBQWdCO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsSUFBWTtRQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsbUJBQW1CLENBQUMsV0FBZ0M7UUFDbEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ25GLElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUMsYUFBYSxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDakUsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFoSUQsd0NBZ0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNsYXVzZSB9IGZyb20gJ0B2ZWNoYWluL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBTdGFraW5nVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbi9zdGFraW5nVHJhbnNhY3Rpb24nO1xuaW1wb3J0IEV0aGVyZXVtQWJpIGZyb20gJ2V0aGVyZXVtanMtYWJpJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBTdGFraW5nQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFN0YWtpbmdCdWlsZGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWRvbmx5PENvaW5Db25maWc+fSBfY29pbkNvbmZpZyAtIFRoZSBjb2luIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgU3Rha2luZ1RyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgYnVpbGRlciB3aXRoIGFuIGV4aXN0aW5nIFN0YWtpbmdUcmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdGFraW5nVHJhbnNhY3Rpb259IHR4IC0gVGhlIHRyYW5zYWN0aW9uIHRvIGluaXRpYWxpemUgdGhlIGJ1aWxkZXIgd2l0aFxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFN0YWtpbmdUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Rha2luZyB0cmFuc2FjdGlvbiBpbnN0YW5jZS5cbiAgICpcbiAgICogQHJldHVybnMge1N0YWtpbmdUcmFuc2FjdGlvbn0gVGhlIHN0YWtpbmcgdHJhbnNhY3Rpb25cbiAgICovXG4gIGdldCBzdGFraW5nVHJhbnNhY3Rpb24oKTogU3Rha2luZ1RyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24gYXMgU3Rha2luZ1RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zYWN0aW9uIHR5cGUgZm9yIHN0YWtpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvblR5cGV9IFRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgdHJhbnNhY3Rpb24gY2xhdXNlcyBmb3Igc3Rha2luZyB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkNsYXVzZVtdfSBjbGF1c2VzIC0gVGhlIHRyYW5zYWN0aW9uIGNsYXVzZXMgdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xhdXNlcyBhcmUgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkVHJhbnNhY3Rpb25DbGF1c2VzKGNsYXVzZXM6IFRyYW5zYWN0aW9uQ2xhdXNlW10pOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFjbGF1c2VzIHx8ICFBcnJheS5pc0FycmF5KGNsYXVzZXMpIHx8IGNsYXVzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xhdXNlID0gY2xhdXNlc1swXTtcblxuICAgICAgaWYgKCFjbGF1c2UudG8gfHwgIXV0aWxzLmlzVmFsaWRBZGRyZXNzKGNsYXVzZS50bykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3Igc3Rha2luZyB0cmFuc2FjdGlvbnMsIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcbiAgICAgIGlmICghY2xhdXNlLnZhbHVlIHx8IGNsYXVzZS52YWx1ZSA9PT0gJzB4MCcgfHwgY2xhdXNlLnZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcyBmb3IgdGhpcyBzdGFraW5nIHR4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIFRoZSBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3NcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHN0YWtpbmdDb250cmFjdEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICAgIHRoaXMuc3Rha2luZ1RyYW5zYWN0aW9uLnN0YWtpbmdDb250cmFjdEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFtb3VudCB0byBzdGFrZSBmb3IgdGhpcyBzdGFraW5nIHR4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gVGhlIGFtb3VudCB0byBzdGFrZSBpbiB3ZWlcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGFtb3VudFRvU3Rha2UoYW1vdW50OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnN0YWtpbmdUcmFuc2FjdGlvbi5hbW91bnRUb1N0YWtlID0gYW1vdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0YWtpbmcgY29udHJhY3QgQUJJIGZvciB0aGlzIHN0YWtpbmcgdHguXG4gICAqXG4gICAqIEBwYXJhbSB7RXRoZXJldW1BYml9IGFiaSAtIFRoZSBzdGFraW5nIGNvbnRyYWN0IEFCSVxuICAgKiBAcmV0dXJucyB7U3Rha2luZ0J1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgc3Rha2luZ0NvbnRyYWN0QUJJKGFiaTogRXRoZXJldW1BYmkpOiB0aGlzIHtcbiAgICB0aGlzLnN0YWtpbmdUcmFuc2FjdGlvbi5zdGFraW5nQ29udHJhY3RBQkkgPSBhYmk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhpcyBzdGFraW5nIHR4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSAtIFRoZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIHtTdGFraW5nQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICB0cmFuc2FjdGlvbkRhdGEoZGF0YTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5zdGFraW5nVHJhbnNhY3Rpb24udHJhbnNhY3Rpb25EYXRhID0gZGF0YTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uPzogU3Rha2luZ1RyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0cmFuc2FjdGlvbiBub3QgZGVmaW5lZCcpO1xuICAgIH1cbiAgICBhc3NlcnQodHJhbnNhY3Rpb24uc3Rha2luZ0NvbnRyYWN0QWRkcmVzcywgJ1N0YWtpbmcgY29udHJhY3QgYWRkcmVzcyBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydCh0cmFuc2FjdGlvbi5hbW91bnRUb1N0YWtlLCAnQW1vdW50IHRvIHN0YWtlIGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KHRyYW5zYWN0aW9uLnN0YWtpbmdDb250cmFjdEFCSSwgJ1N0YWtpbmcgY29udHJhY3QgQUJJIGlzIHJlcXVpcmVkJyk7XG4gICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiB0cmFuc2FjdGlvbi5zdGFraW5nQ29udHJhY3RBZGRyZXNzIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnR5cGUgPSB0aGlzLnRyYW5zYWN0aW9uVHlwZTtcbiAgICBhd2FpdCB0aGlzLnN0YWtpbmdUcmFuc2FjdGlvbi5idWlsZCgpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG59XG4iXX0=

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


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