PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/staking
Просмотр файла: stakingWalletTSS.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('TSS Staking Wallet', function () {
const microservicesUri = sdk_core_1.Environments['mock'].uri;
let bitgo;
let nearBaseCoin;
let ethBaseCoin;
let atomBaseCoin;
let enterprise;
let ethWalletData;
let nearStakingWallet;
let ethStakingWallet;
let atomStakingWallet;
before(function () {
bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri });
bitgo.initializeTestVars();
nearBaseCoin = bitgo.coin('near');
nearBaseCoin.keychains();
ethBaseCoin = bitgo.coin('eth');
ethBaseCoin.keychains();
atomBaseCoin = bitgo.coin('atom');
atomBaseCoin.keychains();
enterprise = new sdk_core_1.Enterprise(bitgo, nearBaseCoin, {
id: '5cf940949449412d00f53b3d92dbcaa3',
name: 'TSS Test Enterprise',
});
const tssWalletData = {
id: 'walletIdTss',
coin: 'near',
enterprise: enterprise.id,
keys: ['5b3424f91bf349930e340175'],
};
const nearWallet = new sdk_core_1.Wallet(bitgo, nearBaseCoin, tssWalletData);
nearStakingWallet = nearWallet.toStakingWallet();
ethWalletData = {
id: 'walletId',
coin: 'eth',
enterprise: enterprise.id,
keys: ['5b3424f91bf349930e340175'],
coinSpecific: { walletVersion: 3 },
};
const ethWallet = new sdk_core_1.Wallet(bitgo, ethBaseCoin, ethWalletData);
ethStakingWallet = ethWallet.toStakingWallet();
const atomWallet = new sdk_core_1.Wallet(bitgo, atomBaseCoin, { ...tssWalletData, coin: 'atom' });
atomStakingWallet = atomWallet.toStakingWallet();
});
describe('buildSignAndSend', function () {
const sandbox = sinon.createSandbox();
afterEach(function () {
sandbox.verifyAndRestore();
});
it('should throw error when txRequestId is not defined', async function () {
const transaction = stakingWallet_1.default.transaction('READY');
transaction.txRequestId = undefined;
await nearStakingWallet
.buildSignAndSend({ walletPassphrase: 'passphrase' }, transaction)
.should.rejectedWith('txRequestId is required to sign and send');
});
it('should build, sign and send transaction', async function () {
const walletPassphrase = 'passphrase';
const transaction = stakingWallet_1.default.transaction('READY');
const deleteSignatureShares = sandbox.stub(sdk_core_1.TssUtils.prototype, 'deleteSignatureShares');
deleteSignatureShares.resolves([]);
deleteSignatureShares.calledOnceWithExactly(transaction.id);
const getKeysForSigning = sandbox.stub(sdk_core_1.Keychains.prototype, 'getKeysForSigning');
const keyChain = {
id: 'id',
pub: 'pub',
type: 'tss',
};
getKeysForSigning.resolves([keyChain]);
getKeysForSigning.calledOnce;
const signTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'signTransaction');
signTransaction.resolves({ txRequestId: stakingWallet_1.default.txRequestId });
signTransaction.calledOnceWithExactly({
txPrebuild: {
txRequestId: stakingWallet_1.default.txRequestId,
},
walletPassphrase: walletPassphrase,
keychain: keyChain,
});
nock(microservicesUri)
.post(`/api/staking/v1/${nearStakingWallet.coin}/wallets/${nearStakingWallet.walletId}/requests/${transaction.stakingRequestId}/transactions/${transaction.id}`, _.matches({ txRequestId: stakingWallet_1.default.txRequestId }))
.reply(200, transaction);
const stakingTransaction = await nearStakingWallet.buildSignAndSend({ walletPassphrase: walletPassphrase }, transaction);
stakingTransaction.should.deepEqual(transaction);
});
it('should build and sign but not send transaction for ETH TSS or ECDSA based TSS Coin', async function () {
[ethStakingWallet, atomStakingWallet].forEach(async (ecdsaStakingWallet) => {
const walletPassphrase = 'passphrase';
const transaction = stakingWallet_1.default.transaction('READY');
const deleteSignatureShares = sandbox.stub(sdk_core_1.TssUtils.prototype, 'deleteSignatureShares');
deleteSignatureShares.resolves([]);
deleteSignatureShares.calledOnceWithExactly(transaction.id);
const getKeysForSigning = sandbox.stub(sdk_core_1.Keychains.prototype, 'getKeysForSigning');
const keyChain = {
id: 'id',
pub: 'pub',
type: 'tss',
};
getKeysForSigning.resolves([keyChain]);
getKeysForSigning.calledOnce;
const signTransaction = sandbox.stub(sdk_core_1.Wallet.prototype, 'signTransaction');
signTransaction.resolves({ txRequestId: stakingWallet_1.default.txRequestId });
signTransaction.calledOnceWithExactly({
txPrebuild: {
txRequestId: stakingWallet_1.default.txRequestId,
},
walletPassphrase: walletPassphrase,
keychain: keyChain,
});
const stakingTransaction = await ecdsaStakingWallet.buildSignAndSend({ walletPassphrase: walletPassphrase }, transaction);
stakingTransaction.should.deepEqual(transaction);
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dhbGxldFRTUy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9zdGFraW5nL3N0YWtpbmdXYWxsZXRUU1MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBNEI7QUFFNUIsNkJBQTZCO0FBQzdCLHdFQUE0RDtBQUU1RCw4Q0FBaUg7QUFDakgsOENBQTRDO0FBQzVDLHlDQUF3QztBQUV4QywrQkFBK0I7QUFFL0IsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFlBQVksQ0FBQztJQUNqQixJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLFlBQVksQ0FBQztJQUNqQixJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUksYUFBa0IsQ0FBQztJQUN2QixJQUFJLGlCQUFnQyxDQUFDO0lBQ3JDLElBQUksZ0JBQStCLENBQUM7SUFDcEMsSUFBSSxpQkFBZ0MsQ0FBQztJQUVyQyxNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBUyxDQUFDLENBQUM7UUFDNUUsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QixZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxZQUFZLENBQUMsU0FB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QUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0ICogYXMgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCBmaXh0dXJlcyBmcm9tICcuLi8uLi9maXh0dXJlcy9zdGFraW5nL3N0YWtpbmdXYWxsZXQnO1xuXG5pbXBvcnQgeyBFbnRlcnByaXNlLCBFbnZpcm9ubWVudHMsIEtleWNoYWluLCBLZXljaGFpbnMsIFN0YWtpbmdXYWxsZXQsIFRzc1V0aWxzLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuXG5kZXNjcmliZSgnVFNTIFN0YWtpbmcgV2FsbGV0JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBtaWNyb3NlcnZpY2VzVXJpID0gRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICBsZXQgYml0Z287XG4gIGxldCBuZWFyQmFzZUNvaW47XG4gIGxldCBldGhCYXNlQ29pbjtcbiAgbGV0IGF0b21CYXNlQ29pbjtcbiAgbGV0IGVudGVycHJpc2U7XG4gIGxldCBldGhXYWxsZXREYXRhOiBhbnk7XG4gIGxldCBuZWFyU3Rha2luZ1dhbGxldDogU3Rha2luZ1dhbGxldDtcbiAgbGV0IGV0aFN0YWtpbmdXYWxsZXQ6IFN0YWtpbmdXYWxsZXQ7XG4gIGxldCBhdG9tU3Rha2luZ1dhbGxldDogU3Rha2luZ1dhbGxldDtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpIH0gYXMgYW55KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBuZWFyQmFzZUNvaW4gPSBiaXRnby5jb2luKCduZWFyJyk7XG4gICAgbmVhckJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGV0aEJhc2VDb2luID0gYml0Z28uY29pbignZXRoJyk7XG4gICAgZXRoQmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgYXRvbUJhc2VDb2luID0gYml0Z28uY29pbignYXRvbScpO1xuICAgIGF0b21CYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICBlbnRlcnByaXNlID0gbmV3IEVudGVycHJpc2UoYml0Z28sIG5lYXJCYXNlQ29pbiwge1xuICAgICAgaWQ6ICc1Y2Y5NDA5NDk0NDk0MTJkMDBmNTNiM2Q5MmRiY2FhMycsXG4gICAgICBuYW1lOiAnVFNTIFRlc3QgRW50ZXJwcmlzZScsXG4gICAgfSk7XG4gICAgY29uc3QgdHNzV2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnd2FsbGV0SWRUc3MnLFxuICAgICAgY29pbjogJ25lYXInLFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZS5pZCxcbiAgICAgIGtleXM6IFsnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1J10sXG4gICAgfTtcbiAgICBjb25zdCBuZWFyV2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgbmVhckJhc2VDb2luLCB0c3NXYWxsZXREYXRhKTtcbiAgICBuZWFyU3Rha2luZ1dhbGxldCA9IG5lYXJXYWxsZXQudG9TdGFraW5nV2FsbGV0KCk7XG5cbiAgICBldGhXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd3YWxsZXRJZCcsXG4gICAgICBjb2luOiAnZXRoJyxcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2UuaWQsXG4gICAgICBrZXlzOiBbJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NSddLFxuICAgICAgY29pblNwZWNpZmljOiB7IHdhbGxldFZlcnNpb246IDMgfSxcbiAgICB9O1xuICAgIGNvbnN0IGV0aFdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGV0aEJhc2VDb2luLCBldGhXYWxsZXREYXRhKTtcbiAgICBldGhTdGFraW5nV2FsbGV0ID0gZXRoV2FsbGV0LnRvU3Rha2luZ1dhbGxldCgpO1xuXG4gICAgY29uc3QgYXRvbVdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGF0b21CYXNlQ29pbiwgeyAuLi50c3NXYWxsZXREYXRhLCBjb2luOiAnYXRvbScgfSk7XG4gICAgYXRvbVN0YWtpbmdXYWxsZXQgPSBhdG9tV2FsbGV0LnRvU3Rha2luZ1dhbGxldCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRTaWduQW5kU2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRib3gudmVyaWZ5QW5kUmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UmVxdWVzdElkIGlzIG5vdCBkZWZpbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBmaXh0dXJlcy50cmFuc2FjdGlvbignUkVBRFknKTtcbiAgICAgIHRyYW5zYWN0aW9uLnR4UmVxdWVzdElkID0gdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgbmVhclN0YWtpbmdXYWxsZXRcbiAgICAgICAgLmJ1aWxkU2lnbkFuZFNlbmQoeyB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScgfSwgdHJhbnNhY3Rpb24pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCd0eFJlcXVlc3RJZCBpcyByZXF1aXJlZCB0byBzaWduIGFuZCBzZW5kJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkLCBzaWduIGFuZCBzZW5kIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwYXNzcGhyYXNlJztcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZml4dHVyZXMudHJhbnNhY3Rpb24oJ1JFQURZJyk7XG4gICAgICBjb25zdCBkZWxldGVTaWduYXR1cmVTaGFyZXMgPSBzYW5kYm94LnN0dWIoVHNzVXRpbHMucHJvdG90eXBlLCAnZGVsZXRlU2lnbmF0dXJlU2hhcmVzJyk7XG4gICAgICBkZWxldGVTaWduYXR1cmVTaGFyZXMucmVzb2x2ZXMoW10pO1xuICAgICAgZGVsZXRlU2lnbmF0dXJlU2hhcmVzLmNhbGxlZE9uY2VXaXRoRXhhY3RseSh0cmFuc2FjdGlvbi5pZCk7XG5cbiAgICAgIGNvbnN0IGdldEtleXNGb3JTaWduaW5nID0gc2FuZGJveC5zdHViKEtleWNoYWlucy5wcm90b3R5cGUsICdnZXRLZXlzRm9yU2lnbmluZycpO1xuICAgICAgY29uc3Qga2V5Q2hhaW46IEtleWNoYWluID0ge1xuICAgICAgICBpZDogJ2lkJyxcbiAgICAgICAgcHViOiAncHViJyxcbiAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICB9O1xuICAgICAgZ2V0S2V5c0ZvclNpZ25pbmcucmVzb2x2ZXMoW2tleUNoYWluXSk7XG4gICAgICBnZXRLZXlzRm9yU2lnbmluZy5jYWxsZWRPbmNlO1xuXG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb24gPSBzYW5kYm94LnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3NpZ25UcmFuc2FjdGlvbicpO1xuICAgICAgc2lnblRyYW5zYWN0aW9uLnJlc29sdmVzKHsgdHhSZXF1ZXN0SWQ6IGZpeHR1cmVzLnR4UmVxdWVzdElkIH0pO1xuICAgICAgc2lnblRyYW5zYWN0aW9uLmNhbGxlZE9uY2VXaXRoRXhhY3RseSh7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogZml4dHVyZXMudHhSZXF1ZXN0SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGtleWNoYWluOiBrZXlDaGFpbixcbiAgICAgIH0pO1xuXG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5wb3N0KFxuICAgICAgICAgIGAvYXBpL3N0YWtpbmcvdjEvJHtuZWFyU3Rha2luZ1dhbGxldC5jb2lufS93YWxsZXRzLyR7bmVhclN0YWtpbmdXYWxsZXQud2FsbGV0SWR9L3JlcXVlc3RzLyR7dHJhbnNhY3Rpb24uc3Rha2luZ1JlcXVlc3RJZH0vdHJhbnNhY3Rpb25zLyR7dHJhbnNhY3Rpb24uaWR9YCxcbiAgICAgICAgICBfLm1hdGNoZXMoeyB0eFJlcXVlc3RJZDogZml4dHVyZXMudHhSZXF1ZXN0SWQgfSlcbiAgICAgICAgKVxuICAgICAgICAucmVwbHkoMjAwLCB0cmFuc2FjdGlvbik7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdUcmFuc2FjdGlvbiA9IGF3YWl0IG5lYXJTdGFraW5nV2FsbGV0LmJ1aWxkU2lnbkFuZFNlbmQoXG4gICAgICAgIHsgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0UGFzc3BocmFzZSB9LFxuICAgICAgICB0cmFuc2FjdGlvblxuICAgICAgKTtcblxuICAgICAgc3Rha2luZ1RyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwodHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBidXQgbm90IHNlbmQgdHJhbnNhY3Rpb24gZm9yIEVUSCBUU1Mgb3IgRUNEU0EgYmFzZWQgVFNTIENvaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBbZXRoU3Rha2luZ1dhbGxldCwgYXRvbVN0YWtpbmdXYWxsZXRdLmZvckVhY2goYXN5bmMgKGVjZHNhU3Rha2luZ1dhbGxldCkgPT4ge1xuICAgICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3Bhc3NwaHJhc2UnO1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGZpeHR1cmVzLnRyYW5zYWN0aW9uKCdSRUFEWScpO1xuICAgICAgICBjb25zdCBkZWxldGVTaWduYXR1cmVTaGFyZXMgPSBzYW5kYm94LnN0dWIoVHNzVXRpbHMucHJvdG90eXBlLCAnZGVsZXRlU2lnbmF0dXJlU2hhcmVzJyk7XG4gICAgICAgIGRlbGV0ZVNpZ25hdHVyZVNoYXJlcy5yZXNvbHZlcyhbXSk7XG4gICAgICAgIGRlbGV0ZVNpZ25hdHVyZVNoYXJlcy5jYWxsZWRPbmNlV2l0aEV4YWN0bHkodHJhbnNhY3Rpb24uaWQpO1xuXG4gICAgICAgIGNvbnN0IGdldEtleXNGb3JTaWduaW5nID0gc2FuZGJveC5zdHViKEtleWNoYWlucy5wcm90b3R5cGUsICdnZXRLZXlzRm9yU2lnbmluZycpO1xuICAgICAgICBjb25zdCBrZXlDaGFpbjogS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgaWQ6ICdpZCcsXG4gICAgICAgICAgcHViOiAncHViJyxcbiAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgfTtcbiAgICAgICAgZ2V0S2V5c0ZvclNpZ25pbmcucmVzb2x2ZXMoW2tleUNoYWluXSk7XG4gICAgICAgIGdldEtleXNGb3JTaWduaW5nLmNhbGxlZE9uY2U7XG5cbiAgICAgICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uID0gc2FuZGJveC5zdHViKFdhbGxldC5wcm90b3R5cGUsICdzaWduVHJhbnNhY3Rpb24nKTtcbiAgICAgICAgc2lnblRyYW5zYWN0aW9uLnJlc29sdmVzKHsgdHhSZXF1ZXN0SWQ6IGZpeHR1cmVzLnR4UmVxdWVzdElkIH0pO1xuICAgICAgICBzaWduVHJhbnNhY3Rpb24uY2FsbGVkT25jZVdpdGhFeGFjdGx5KHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogZml4dHVyZXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIGtleWNoYWluOiBrZXlDaGFpbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3Rha2luZ1RyYW5zYWN0aW9uID0gYXdhaXQgZWNkc2FTdGFraW5nV2FsbGV0LmJ1aWxkU2lnbkFuZFNlbmQoXG4gICAgICAgICAgeyB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXRQYXNzcGhyYXNlIH0sXG4gICAgICAgICAgdHJhbnNhY3Rpb25cbiAgICAgICAgKTtcblxuICAgICAgICBzdGFraW5nVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh0cmFuc2FjdGlvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!