PHP WebShell

Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/staking

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const nock = require("nock");
const stakingWallet_1 = require("../../fixtures/staking/stakingWallet");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../../src");
const sinon = require("sinon");
describe('non-TSS Staking Wallet', function () {
    const microservicesUri = sdk_core_1.Environments['mock'].uri;
    let bitgo;
    let ethBaseCoin;
    let maticBaseCoin;
    let btcBaseCoin;
    let enterprise;
    let ethWalletData;
    let btcWalletData;
    let btcDescriptorWalletData;
    let ethStakingWallet;
    let maticStakingWallet;
    let btcStakingWallet;
    before(function () {
        bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri });
        bitgo.initializeTestVars();
        ethBaseCoin = bitgo.coin('eth');
        ethBaseCoin.keychains();
        maticBaseCoin = bitgo.coin('matic');
        maticBaseCoin.keychains();
        btcBaseCoin = bitgo.coin('btc');
        btcBaseCoin.keychains();
        enterprise = new sdk_core_1.Enterprise(bitgo, ethBaseCoin, {
            id: '5cf940949449412d00f53b3d92dbcaa3',
            name: 'Test Enterprise',
        });
        ethWalletData = {
            id: 'walletId',
            coin: 'eth',
            enterprise: enterprise.id,
            keys: ['5b3424f91bf349930e340175'],
            coinSpecific: { walletVersion: 2 },
        };
        const maticWalletData = {
            id: 'maticWalletId',
            coin: 'matic',
            enterprise: enterprise.id,
            keys: ['5b3424f91bf349930e340175'],
        };
        btcWalletData = {
            id: 'btcWalletId',
            coin: 'btc',
            enterprise: enterprise.id,
            keys: ['5b3424f91bf349930e340175'],
            coinSpecific: {},
        };
        btcDescriptorWalletData = {
            id: 'btcDescriptorWalletId',
            coin: 'btc',
            enterprise: enterprise.id,
            keys: ['5b3424f91bf349930e340175'],
            coinSpecific: {},
        };
        const ethWallet = new sdk_core_1.Wallet(bitgo, ethBaseCoin, ethWalletData);
        const maticWallet = new sdk_core_1.Wallet(bitgo, maticBaseCoin, maticWalletData);
        const btcWallet = new sdk_core_1.Wallet(bitgo, btcBaseCoin, btcWalletData);
        ethStakingWallet = ethWallet.toStakingWallet();
        maticStakingWallet = maticWallet.toStakingWallet();
        btcStakingWallet = btcWallet.toStakingWallet();
    });
    const sandbox = sinon.createSandbox();
    afterEach(function () {
        sandbox.verifyAndRestore();
    });
    describe('buildSignAndSend', function () {
        it('should build, sign and send transaction', async function () {
            const walletPassphrase = 'passphrase';
            const transaction = stakingWallet_1.default.transaction('READY', stakingWallet_1.default.buildParams);
            // BUILD
            nock(microservicesUri)
                .get(`/api/staking/v1/${ethStakingWallet.coin}/wallets/${ethStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`)
                .query({ expandBuildParams: true })
                .reply(200, transaction);
            const prebuildTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'prebuildTransaction');
            const txPrebuild = {
                walletId: ethStakingWallet.walletId,
                txHex: 'hex',
                buildParams: transaction.buildParams,
            };
            prebuildTransaction.resolves(txPrebuild);
            prebuildTransaction.calledOnceWithExactly(transaction.buildParams);
            // SIGN
            const getKeysForSigning = sandbox.stub(sdk_core_1.Keychains.prototype, 'getKeysForSigning');
            const keyChain = {
                id: 'id',
                pub: 'pub',
                type: 'independent',
            };
            getKeysForSigning.resolves([keyChain]);
            getKeysForSigning.calledOnce;
            const signTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'signTransaction');
            const signed = {
                halfSigned: {
                    txHex: 'hex',
                    payload: 'payload',
                    txBase64: 'base64',
                },
            };
            signTransaction.resolves(signed);
            signTransaction.calledOnceWithExactly({
                txPrebuild: txPrebuild,
                walletPassphrase: walletPassphrase,
                keychain: keyChain,
            });
            // SEND
            nock(microservicesUri)
                .post(`/api/staking/v1/${ethStakingWallet.coin}/wallets/${ethStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`, _.matches(signed))
                .reply(200, transaction);
            const stakingTransaction = await ethStakingWallet.buildSignAndSend({ walletPassphrase: walletPassphrase }, transaction);
            stakingTransaction.should.deepEqual(transaction);
        });
        it('should throw error when buildParams are not expanded', async function () {
            const walletPassphrase = 'passphrase';
            const transaction = stakingWallet_1.default.transaction('READY');
            // BUILD
            nock(microservicesUri)
                .get(`/api/staking/v1/${ethStakingWallet.coin}/wallets/${ethStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`)
                .query({ expandBuildParams: true })
                .reply(200, transaction);
            await ethStakingWallet
                .buildSignAndSend({ walletPassphrase: walletPassphrase }, transaction)
                .should.rejectedWith(`Staking transaction ${transaction.id} build params not expanded`);
        });
    });
    describe('token buildSignAndSend', function () {
        afterEach(function () {
            sandbox.verifyAndRestore();
        });
        it('should build, sign and send transaction', async function () {
            const walletPassphrase = 'passphrase';
            const transaction = stakingWallet_1.default.transaction('READY', stakingWallet_1.default.buildParams);
            // BUILD
            nock(microservicesUri)
                .get(`/api/staking/v1/${maticStakingWallet.coin}/wallets/${maticStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`)
                .query({ expandBuildParams: true })
                .reply(200, transaction);
            const prebuildTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'prebuildTransaction');
            const txPrebuild = {
                walletId: maticStakingWallet.walletId,
                txHex: 'hex',
                buildParams: transaction.buildParams,
            };
            prebuildTransaction.resolves(txPrebuild);
            prebuildTransaction.calledOnceWithExactly(transaction.buildParams);
            // SIGN
            const getKeysForSigning = sandbox.stub(sdk_core_1.Keychains.prototype, 'getKeysForSigning');
            const keyChain = {
                id: 'id',
                pub: 'pub',
                type: 'independent',
            };
            getKeysForSigning.resolves([keyChain]);
            getKeysForSigning.calledOnce;
            const signTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'signTransaction');
            const signed = {
                halfSigned: {
                    txHex: 'hex',
                    payload: 'payload',
                    txBase64: 'base64',
                },
            };
            signTransaction.resolves(signed);
            signTransaction.calledOnceWithExactly({
                txPrebuild: txPrebuild,
                walletPassphrase: walletPassphrase,
                keychain: keyChain,
            });
            const type = maticStakingWallet.wallet.baseCoin.tokenConfig?.type;
            const coin = maticStakingWallet.wallet.baseCoin.tokenConfig?.coin;
            // get wallet for building and signing
            nock(microservicesUri).get(`/api/v2/${coin}/wallet/${maticStakingWallet.walletId}`).reply(200, ethWalletData);
            // SEND
            nock(microservicesUri)
                .post(`/api/staking/v1/${type}/wallets/${maticStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`, _.matches(signed))
                .reply(200, transaction);
            const stakingTransaction = await maticStakingWallet.buildSignAndSend({ walletPassphrase: walletPassphrase }, transaction);
            stakingTransaction.should.deepEqual(transaction);
        });
    });
    describe('BTC staking', function () {
        it('btc delegation transaction', async function () {
            const transaction = stakingWallet_1.default.transaction('READY', stakingWallet_1.default.buildParams, false);
            nock(microservicesUri)
                .get(`/api/staking/v1/${btcStakingWallet.coin}/wallets/${btcStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`)
                .query({ expandBuildParams: true })
                .reply(200, transaction);
            const prebuildTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'prebuildTransaction');
            const descriptor = sandbox.stub(sdk_core_1.StakingWallet.prototype, 'getDescriptorWallet');
            await btcStakingWallet.build(transaction);
            prebuildTransaction.calledOnceWithExactly(transaction.buildParams).should.be.true;
            descriptor.notCalled.should.be.true;
        });
        it('btc undelegation transaction', async function () {
            const transaction = stakingWallet_1.default.transaction('READY', stakingWallet_1.default.btcUnstakingBuildParams, false, 'undelegate_withdraw');
            nock(microservicesUri)
                .get(`/api/staking/v1/${btcStakingWallet.coin}/wallets/${btcStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`)
                .query({ expandBuildParams: true })
                .reply(200, transaction);
            nock(microservicesUri)
                .get(`/api/v2/btc/wallet/${btcDescriptorWalletData.id}`)
                .reply(200, btcDescriptorWalletData);
            const prebuildTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'prebuildTransaction');
            await btcStakingWallet.build(transaction);
            prebuildTransaction.calledOnceWithExactly(transaction.buildParams).should.be.true;
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dhbGxldE5vblRTUy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9zdGFraW5nL3N0YWtpbmdXYWxsZXROb25UU1MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBNEI7QUFFNUIsNkJBQTZCO0FBQzdCLHdFQUE0RDtBQUU1RCw4Q0FBdUc7QUFDdkcsOENBQTRDO0FBQzVDLHlDQUF3QztBQUN4QywrQkFBK0I7QUFFL0IsUUFBUSxDQUFDLHdCQUF3QixFQUFFO0lBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLGFBQWEsQ0FBQztJQUNsQixJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUksYUFBa0IsQ0FBQztJQUN2QixJQUFJLGFBQWtCLENBQUM7SUFDdkIsSUFBSSx1QkFBNEIsQ0FBQztJQUNqQyxJQUFJLGdCQUErQixDQUFDO0lBQ3BDLElBQUksa0JBQWlDLENBQUM7SUFDdEMsSUFBSSxnQkFBK0IsQ0FBQztJQUVwQyxNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBUyxDQUFDLENBQUM7UUFDNUUsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQixXQUFXLEdBQUcsS0FB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dCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCAqIGFzIG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgZml4dHVyZXMgZnJvbSAnLi4vLi4vZml4dHVyZXMvc3Rha2luZy9zdGFraW5nV2FsbGV0JztcblxuaW1wb3J0IHsgRW50ZXJwcmlzZSwgRW52aXJvbm1lbnRzLCBLZXljaGFpbiwgS2V5Y2hhaW5zLCBTdGFraW5nV2FsbGV0LCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcblxuZGVzY3JpYmUoJ25vbi1UU1MgU3Rha2luZyBXYWxsZXQnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IG1pY3Jvc2VydmljZXNVcmkgPSBFbnZpcm9ubWVudHNbJ21vY2snXS51cmk7XG4gIGxldCBiaXRnbztcbiAgbGV0IGV0aEJhc2VDb2luO1xuICBsZXQgbWF0aWNCYXNlQ29pbjtcbiAgbGV0IGJ0Y0Jhc2VDb2luO1xuICBsZXQgZW50ZXJwcmlzZTtcbiAgbGV0IGV0aFdhbGxldERhdGE6IGFueTtcbiAgbGV0IGJ0Y1dhbGxldERhdGE6IGFueTtcbiAgbGV0IGJ0Y0Rlc2NyaXB0b3JXYWxsZXREYXRhOiBhbnk7XG4gIGxldCBldGhTdGFraW5nV2FsbGV0OiBTdGFraW5nV2FsbGV0O1xuICBsZXQgbWF0aWNTdGFraW5nV2FsbGV0OiBTdGFraW5nV2FsbGV0O1xuICBsZXQgYnRjU3Rha2luZ1dhbGxldDogU3Rha2luZ1dhbGxldDtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpIH0gYXMgYW55KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBldGhCYXNlQ29pbiA9IGJpdGdvLmNvaW4oJ2V0aCcpO1xuICAgIGV0aEJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIG1hdGljQmFzZUNvaW4gPSBiaXRnby5jb2luKCdtYXRpYycpO1xuICAgIG1hdGljQmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgYnRjQmFzZUNvaW4gPSBiaXRnby5jb2luKCdidGMnKTtcbiAgICBidGNCYXNlQ29pbi5rZXljaGFpbnMoKTtcblxuICAgIGVudGVycHJpc2UgPSBuZXcgRW50ZXJwcmlzZShiaXRnbywgZXRoQmFzZUNvaW4sIHtcbiAgICAgIGlkOiAnNWNmOTQwOTQ5NDQ5NDEyZDAwZjUzYjNkOTJkYmNhYTMnLFxuICAgICAgbmFtZTogJ1Rlc3QgRW50ZXJwcmlzZScsXG4gICAgfSk7XG4gICAgZXRoV2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnd2FsbGV0SWQnLFxuICAgICAgY29pbjogJ2V0aCcsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLmlkLFxuICAgICAga2V5czogWyc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUnXSxcbiAgICAgIGNvaW5TcGVjaWZpYzogeyB3YWxsZXRWZXJzaW9uOiAyIH0sXG4gICAgfTtcbiAgICBjb25zdCBtYXRpY1dhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ21hdGljV2FsbGV0SWQnLFxuICAgICAgY29pbjogJ21hdGljJyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2UuaWQsXG4gICAgICBrZXlzOiBbJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NSddLFxuICAgIH07XG4gICAgYnRjV2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnYnRjV2FsbGV0SWQnLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLmlkLFxuICAgICAga2V5czogWyc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzUnXSxcbiAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgfTtcbiAgICBidGNEZXNjcmlwdG9yV2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnYnRjRGVzY3JpcHRvcldhbGxldElkJyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZS5pZCxcbiAgICAgIGtleXM6IFsnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1J10sXG4gICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgIH07XG4gICAgY29uc3QgZXRoV2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgZXRoQmFzZUNvaW4sIGV0aFdhbGxldERhdGEpO1xuICAgIGNvbnN0IG1hdGljV2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgbWF0aWNCYXNlQ29pbiwgbWF0aWNXYWxsZXREYXRhKTtcbiAgICBjb25zdCBidGNXYWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBidGNCYXNlQ29pbiwgYnRjV2FsbGV0RGF0YSk7XG4gICAgZXRoU3Rha2luZ1dhbGxldCA9IGV0aFdhbGxldC50b1N0YWtpbmdXYWxsZXQoKTtcbiAgICBtYXRpY1N0YWtpbmdXYWxsZXQgPSBtYXRpY1dhbGxldC50b1N0YWtpbmdXYWxsZXQoKTtcbiAgICBidGNTdGFraW5nV2FsbGV0ID0gYnRjV2FsbGV0LnRvU3Rha2luZ1dhbGxldCgpO1xuICB9KTtcblxuICBjb25zdCBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC52ZXJpZnlBbmRSZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZFNpZ25BbmRTZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQsIHNpZ24gYW5kIHNlbmQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3Bhc3NwaHJhc2UnO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknLCBmaXh0dXJlcy5idWlsZFBhcmFtcyk7XG5cbiAgICAgIC8vIEJVSUxEXG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoXG4gICAgICAgICAgYC9hcGkvc3Rha2luZy92MS8ke2V0aFN0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke2V0aFN0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YFxuICAgICAgICApXG4gICAgICAgIC5xdWVyeSh7IGV4cGFuZEJ1aWxkUGFyYW1zOiB0cnVlIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3QgcHJlYnVpbGRUcmFuc2FjdGlvbiA9IHNhbmRib3guc3R1YihXYWxsZXQucHJvdG90eXBlLCAncHJlYnVpbGRUcmFuc2FjdGlvbicpO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgd2FsbGV0SWQ6IGV0aFN0YWtpbmdXYWxsZXQud2FsbGV0SWQsXG4gICAgICAgIHR4SGV4OiAnaGV4JyxcbiAgICAgICAgYnVpbGRQYXJhbXM6IHRyYW5zYWN0aW9uLmJ1aWxkUGFyYW1zLFxuICAgICAgfTtcbiAgICAgIHByZWJ1aWxkVHJhbnNhY3Rpb24ucmVzb2x2ZXModHhQcmVidWlsZCk7XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLmNhbGxlZE9uY2VXaXRoRXhhY3RseSh0cmFuc2FjdGlvbi5idWlsZFBhcmFtcyk7XG5cbiAgICAgIC8vIFNJR05cbiAgICAgIGNvbnN0IGdldEtleXNGb3JTaWduaW5nID0gc2FuZGJveC5zdHViKEtleWNoYWlucy5wcm90b3R5cGUsICdnZXRLZXlzRm9yU2lnbmluZycpO1xuICAgICAgY29uc3Qga2V5Q2hhaW46IEtleWNoYWluID0ge1xuICAgICAgICBpZDogJ2lkJyxcbiAgICAgICAgcHViOiAncHViJyxcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIH07XG4gICAgICBnZXRLZXlzRm9yU2lnbmluZy5yZXNvbHZlcyhba2V5Q2hhaW5dKTtcbiAgICAgIGdldEtleXNGb3JTaWduaW5nLmNhbGxlZE9uY2U7XG5cbiAgICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvbiA9IHNhbmRib3guc3R1YihXYWxsZXQucHJvdG90eXBlLCAnc2lnblRyYW5zYWN0aW9uJyk7XG4gICAgICBjb25zdCBzaWduZWQgPSB7XG4gICAgICAgIGhhbGZTaWduZWQ6IHtcbiAgICAgICAgICB0eEhleDogJ2hleCcsXG4gICAgICAgICAgcGF5bG9hZDogJ3BheWxvYWQnLFxuICAgICAgICAgIHR4QmFzZTY0OiAnYmFzZTY0JyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBzaWduVHJhbnNhY3Rpb24ucmVzb2x2ZXMoc2lnbmVkKTtcbiAgICAgIHNpZ25UcmFuc2FjdGlvbi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoe1xuICAgICAgICB0eFByZWJ1aWxkOiB0eFByZWJ1aWxkLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBrZXljaGFpbjoga2V5Q2hhaW4sXG4gICAgICB9KTtcblxuICAgICAgLy8gU0VORFxuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChcbiAgICAgICAgICBgL2FwaS9zdGFraW5nL3YxLyR7ZXRoU3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7ZXRoU3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHt0cmFuc2FjdGlvbi5zdGFraW5nUmVxdWVzdElkfS90cmFuc2FjdGlvbnMvJHt0cmFuc2FjdGlvbi5pZH1gLFxuICAgICAgICAgIF8ubWF0Y2hlcyhzaWduZWQpXG4gICAgICAgIClcbiAgICAgICAgLnJlcGx5KDIwMCwgdHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCBzdGFraW5nVHJhbnNhY3Rpb24gPSBhd2FpdCBldGhTdGFraW5nV2FsbGV0LmJ1aWxkU2lnbkFuZFNlbmQoXG4gICAgICAgIHsgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0UGFzc3BocmFzZSB9LFxuICAgICAgICB0cmFuc2FjdGlvblxuICAgICAgKTtcblxuICAgICAgc3Rha2luZ1RyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwodHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGJ1aWxkUGFyYW1zIGFyZSBub3QgZXhwYW5kZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3Bhc3NwaHJhc2UnO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknKTtcblxuICAgICAgLy8gQlVJTERcbiAgICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChcbiAgICAgICAgICBgL2FwaS9zdGFraW5nL3YxLyR7ZXRoU3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7ZXRoU3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHt0cmFuc2FjdGlvbi5zdGFraW5nUmVxdWVzdElkfS90cmFuc2FjdGlvbnMvJHt0cmFuc2FjdGlvbi5pZH1gXG4gICAgICAgIClcbiAgICAgICAgLnF1ZXJ5KHsgZXhwYW5kQnVpbGRQYXJhbXM6IHRydWUgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwgdHJhbnNhY3Rpb24pO1xuXG4gICAgICBhd2FpdCBldGhTdGFraW5nV2FsbGV0XG4gICAgICAgIC5idWlsZFNpZ25BbmRTZW5kKHsgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0UGFzc3BocmFzZSB9LCB0cmFuc2FjdGlvbilcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoYFN0YWtpbmcgdHJhbnNhY3Rpb24gJHt0cmFuc2FjdGlvbi5pZH0gYnVpbGQgcGFyYW1zIG5vdCBleHBhbmRlZGApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9rZW4gYnVpbGRTaWduQW5kU2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZGJveC52ZXJpZnlBbmRSZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkLCBzaWduIGFuZCBzZW5kIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwYXNzcGhyYXNlJztcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZml4dHVyZXMudHJhbnNhY3Rpb24oJ1JFQURZJywgZml4dHVyZXMuYnVpbGRQYXJhbXMpO1xuXG4gICAgICAvLyBCVUlMRFxuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAuZ2V0KFxuICAgICAgICAgIGAvYXBpL3N0YWtpbmcvdjEvJHttYXRpY1N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke21hdGljU3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHt0cmFuc2FjdGlvbi5zdGFraW5nUmVxdWVzdElkfS90cmFuc2FjdGlvbnMvJHt0cmFuc2FjdGlvbi5pZH1gXG4gICAgICAgIClcbiAgICAgICAgLnF1ZXJ5KHsgZXhwYW5kQnVpbGRQYXJhbXM6IHRydWUgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwgdHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCBwcmVidWlsZFRyYW5zYWN0aW9uID0gc2FuZGJveC5zdHViKFdhbGxldC5wcm90b3R5cGUsICdwcmVidWlsZFRyYW5zYWN0aW9uJyk7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB3YWxsZXRJZDogbWF0aWNTdGFraW5nV2FsbGV0LndhbGxldElkLFxuICAgICAgICB0eEhleDogJ2hleCcsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB0cmFuc2FjdGlvbi5idWlsZFBhcmFtcyxcbiAgICAgIH07XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLnJlc29sdmVzKHR4UHJlYnVpbGQpO1xuICAgICAgcHJlYnVpbGRUcmFuc2FjdGlvbi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24uYnVpbGRQYXJhbXMpO1xuXG4gICAgICAvLyBTSUdOXG4gICAgICBjb25zdCBnZXRLZXlzRm9yU2lnbmluZyA9IHNhbmRib3guc3R1YihLZXljaGFpbnMucHJvdG90eXBlLCAnZ2V0S2V5c0ZvclNpZ25pbmcnKTtcbiAgICAgIGNvbnN0IGtleUNoYWluOiBLZXljaGFpbiA9IHtcbiAgICAgICAgaWQ6ICdpZCcsXG4gICAgICAgIHB1YjogJ3B1YicsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICB9O1xuICAgICAgZ2V0S2V5c0ZvclNpZ25pbmcucmVzb2x2ZXMoW2tleUNoYWluXSk7XG4gICAgICBnZXRLZXlzRm9yU2lnbmluZy5jYWxsZWRPbmNlO1xuXG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb24gPSBzYW5kYm94LnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3NpZ25UcmFuc2FjdGlvbicpO1xuICAgICAgY29uc3Qgc2lnbmVkID0ge1xuICAgICAgICBoYWxmU2lnbmVkOiB7XG4gICAgICAgICAgdHhIZXg6ICdoZXgnLFxuICAgICAgICAgIHBheWxvYWQ6ICdwYXlsb2FkJyxcbiAgICAgICAgICB0eEJhc2U2NDogJ2Jhc2U2NCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgc2lnblRyYW5zYWN0aW9uLnJlc29sdmVzKHNpZ25lZCk7XG4gICAgICBzaWduVHJhbnNhY3Rpb24uY2FsbGVkT25jZVdpdGhFeGFjdGx5KHtcbiAgICAgICAgdHhQcmVidWlsZDogdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAga2V5Y2hhaW46IGtleUNoYWluLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBtYXRpY1N0YWtpbmdXYWxsZXQud2FsbGV0LmJhc2VDb2luLnRva2VuQ29uZmlnPy50eXBlO1xuICAgICAgY29uc3QgY29pbiA9IG1hdGljU3Rha2luZ1dhbGxldC53YWxsZXQuYmFzZUNvaW4udG9rZW5Db25maWc/LmNvaW47XG4gICAgICAvLyBnZXQgd2FsbGV0IGZvciBidWlsZGluZyBhbmQgc2lnbmluZ1xuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKS5nZXQoYC9hcGkvdjIvJHtjb2lufS93YWxsZXQvJHttYXRpY1N0YWtpbmdXYWxsZXQud2FsbGV0SWR9YCkucmVwbHkoMjAwLCBldGhXYWxsZXREYXRhKTtcbiAgICAgIC8vIFNFTkRcbiAgICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoXG4gICAgICAgICAgYC9hcGkvc3Rha2luZy92MS8ke3R5cGV9L3dhbGxldHMvJHttYXRpY1N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YCxcbiAgICAgICAgICBfLm1hdGNoZXMoc2lnbmVkKVxuICAgICAgICApXG4gICAgICAgIC5yZXBseSgyMDAsIHRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1RyYW5zYWN0aW9uID0gYXdhaXQgbWF0aWNTdGFraW5nV2FsbGV0LmJ1aWxkU2lnbkFuZFNlbmQoXG4gICAgICAgIHsgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0UGFzc3BocmFzZSB9LFxuICAgICAgICB0cmFuc2FjdGlvblxuICAgICAgKTtcblxuICAgICAgc3Rha2luZ1RyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwodHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQlRDIHN0YWtpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2J0YyBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknLCBmaXh0dXJlcy5idWlsZFBhcmFtcywgZmFsc2UpO1xuXG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoXG4gICAgICAgICAgYC9hcGkvc3Rha2luZy92MS8ke2J0Y1N0YWtpbmdXYWxsZXQuY29pbn0vd2FsbGV0cy8ke2J0Y1N0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YFxuICAgICAgICApXG4gICAgICAgIC5xdWVyeSh7IGV4cGFuZEJ1aWxkUGFyYW1zOiB0cnVlIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3QgcHJlYnVpbGRUcmFuc2FjdGlvbiA9IHNhbmRib3guc3R1YihXYWxsZXQucHJvdG90eXBlLCAncHJlYnVpbGRUcmFuc2FjdGlvbicpO1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHNhbmRib3guc3R1YihTdGFraW5nV2FsbGV0LnByb3RvdHlwZSwgPGFueT4nZ2V0RGVzY3JpcHRvcldhbGxldCcpO1xuICAgICAgYXdhaXQgYnRjU3Rha2luZ1dhbGxldC5idWlsZCh0cmFuc2FjdGlvbik7XG4gICAgICBwcmVidWlsZFRyYW5zYWN0aW9uLmNhbGxlZE9uY2VXaXRoRXhhY3RseSh0cmFuc2FjdGlvbi5idWlsZFBhcmFtcykuc2hvdWxkLmJlLnRydWU7XG4gICAgICBkZXNjcmlwdG9yLm5vdENhbGxlZC5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdidGMgdW5kZWxlZ2F0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknLCBmaXh0dXJlcy5idGNVbnN0YWtpbmdCdWlsZFBhcmFtcywgZmFsc2UsICd1bmRlbGVnYXRlX3dpdGhkcmF3Jyk7XG5cbiAgICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLmdldChcbiAgICAgICAgICBgL2FwaS9zdGFraW5nL3YxLyR7YnRjU3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7YnRjU3Rha2luZ1dhbGxldC53YWxsZXRJZH0vcmVxdWVzdHMvJHt0cmFuc2FjdGlvbi5zdGFraW5nUmVxdWVzdElkfS90cmFuc2FjdGlvbnMvJHt0cmFuc2FjdGlvbi5pZH1gXG4gICAgICAgIClcbiAgICAgICAgLnF1ZXJ5KHsgZXhwYW5kQnVpbGRQYXJhbXM6IHRydWUgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwgdHJhbnNhY3Rpb24pO1xuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAuZ2V0KGAvYXBpL3YyL2J0Yy93YWxsZXQvJHtidGNEZXNjcmlwdG9yV2FsbGV0RGF0YS5pZH1gKVxuICAgICAgICAucmVwbHkoMjAwLCBidGNEZXNjcmlwdG9yV2FsbGV0RGF0YSk7XG5cbiAgICAgIGNvbnN0IHByZWJ1aWxkVHJhbnNhY3Rpb24gPSBzYW5kYm94LnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3ByZWJ1aWxkVHJhbnNhY3Rpb24nKTtcbiAgICAgIGF3YWl0IGJ0Y1N0YWtpbmdXYWxsZXQuYnVpbGQodHJhbnNhY3Rpb24pO1xuICAgICAgcHJlYnVpbGRUcmFuc2FjdGlvbi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24uYnVpbGRQYXJhbXMpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19

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


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