PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-avaxc/dist/test/unit/transactionBuilder
Просмотр файла: walletInitializationBuilder.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const sdk_core_1 = require("@bitgo/sdk-core");
const testData = __importStar(require("../../resources/avaxc"));
const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
const getBuilder_1 = require("../getBuilder");
describe('AvaxC Wallet Initialization Builder', function () {
let txBuilder;
const initTxBuilder = () => {
txBuilder = (0, getBuilder_1.getBuilder)('tavaxc');
txBuilder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
txBuilder.counter(1);
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
};
describe('Avax C-Chain Wallet Initialization Transaction', () => {
it('Should build walletInitialization', async () => {
initTxBuilder();
txBuilder.owner(testData.OWNER_1.ethAddress);
txBuilder.owner(testData.OWNER_2.ethAddress);
txBuilder.owner(testData.OWNER_3.ethAddress);
txBuilder.sign({ key: testData.OWNER_1.ethKey });
const tx = await txBuilder.build();
const txJson = tx.toJson();
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
txJson.gasLimit.should.equal('7000000');
txJson._type.should.equals(sdk_coin_eth_1.ETHTransactionType.LEGACY);
txJson.gasPrice.should.equal('280000000000');
should_1.default.equal(txJson.nonce, 1);
should_1.default.equal(txJson.chainId, '0xa869');
should_1.default.equal(tx.toBroadcastFormat(), testData.TX_BROADCAST);
});
it('Should build with counter 0 if not manually defined', async () => {
txBuilder = (0, getBuilder_1.getBuilder)('tavaxc');
txBuilder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
txBuilder.owner(testData.OWNER_1.ethAddress);
txBuilder.owner(testData.OWNER_2.ethAddress);
txBuilder.owner(testData.OWNER_3.ethAddress);
txBuilder.sign({ key: testData.OWNER_1.ethKey });
const tx = await txBuilder.build();
const txJson = tx.toJson();
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
txJson.gasLimit.should.equal('7000000');
txJson._type.should.equals(sdk_coin_eth_1.ETHTransactionType.LEGACY);
txJson.gasPrice.should.equal('280000000000');
should_1.default.equal(txJson.chainId, '0xa869');
should_1.default.equal(txJson.v, '0x0150f5');
should_1.default.equal(tx.toBroadcastFormat(), testData.TX_BROADCAST_ZERO_NONCE);
});
it('Should throw if building walletInitialization without fee', async function () {
txBuilder = (0, getBuilder_1.getBuilder)('tavaxc');
txBuilder.counter(1);
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
txBuilder.counter(1);
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
txBuilder.owner(testData.OWNER_1.ethAddress);
txBuilder.owner(testData.OWNER_2.ethAddress);
txBuilder.owner(testData.OWNER_3.ethAddress);
txBuilder.sign({ key: testData.OWNER_1.ethKey });
txBuilder.build().should.be.rejectedWith('Invalid transaction: missing fee');
});
it('Should throw if building walletInitialization without type', async function () {
txBuilder = (0, getBuilder_1.getBuilder)('tavaxc');
txBuilder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
txBuilder.counter(1);
assert_1.default.throws(() => txBuilder.owner(testData.OWNER_1.ethAddress), (e) => e.message === 'Multisig wallet owner can only be set for initialization transactions');
});
it('Should throw if building walletInitialization without owners', async function () {
initTxBuilder();
txBuilder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
txBuilder.counter(1);
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
assert_1.default.throws(() => txBuilder.sign({ key: testData.OWNER_1.ethKey }), (e) => e.message === 'Cannot sign an wallet initialization transaction without owners');
});
it('Should throw if building walletInitialization with only one owner', async function () {
initTxBuilder();
txBuilder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
txBuilder.counter(1);
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
txBuilder.owner(testData.OWNER_1.ethAddress);
txBuilder.sign({ key: testData.OWNER_1.ethKey });
txBuilder.build().should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 1');
});
it('Should throw if building walletInitialization with only two owners', async function () {
initTxBuilder();
txBuilder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
txBuilder.counter(1);
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
txBuilder.owner(testData.OWNER_1.ethAddress);
txBuilder.owner(testData.OWNER_2.ethAddress);
txBuilder.sign({ key: testData.OWNER_1.ethKey });
txBuilder.build().should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 2');
});
it('Should getting same tx from raw tx', async function () {
initTxBuilder();
txBuilder.owner(testData.OWNER_1.ethAddress);
txBuilder.owner(testData.OWNER_2.ethAddress);
txBuilder.owner(testData.OWNER_3.ethAddress);
txBuilder.sign({ key: testData.OWNER_1.ethKey });
const tx = await txBuilder.build();
const txBuiderFromRaw = (0, getBuilder_1.getBuilder)('tavaxc');
txBuiderFromRaw.from(tx.toBroadcastFormat());
const txFromRaw = await txBuiderFromRaw.build();
should_1.default.deepEqual(tx.toJson(), txFromRaw.toJson());
should_1.default.deepEqual(tx.toBroadcastFormat(), txFromRaw.toBroadcastFormat());
should_1.default.deepEqual(tx.id, txFromRaw.id);
});
it('Should build tx with final v', async function () {
initTxBuilder();
txBuilder.owner(testData.OWNER_1.ethAddress);
txBuilder.owner(testData.OWNER_2.ethAddress);
txBuilder.owner(testData.OWNER_3.ethAddress);
const tx = await txBuilder.build();
should_1.default.deepEqual(tx.toJson().v, '0x0150f5');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci93YWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBRTVCLDhDQUFrRDtBQUNsRCxnRUFBa0Q7QUFDbEQsc0RBQWlFO0FBQ2pFLDhDQUEyQztBQUczQyxRQUFRLENBQUMscUNBQXFDLEVBQUU7SUFDOUMsSUFBSSxTQUE2QixDQUFDO0lBRWxDLE1BQU0sYUFBYSxHQUFHLEdBQVMsRUFBRTtRQUMvQixTQUFTLEdBQUcsSUFBQSx1QkFBVSxFQUFDLFFBQVEsQ0FBdUIsQ0FBQztRQUN2RCxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ1osR0FBRyxFQUFFLGNBQWM7WUFDbkIsUUFBUSxFQUFFLFNBQVM7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUM7SUFFRixRQUFRLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1FBQzlELEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRCxhQUFhLEVBQUUsQ0FBQztZQUNoQixTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0MsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZ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QUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9hdmF4Yyc7XG5pbXBvcnQgeyBFVEhUcmFuc2FjdGlvblR5cGUsIFR4RGF0YSB9IGZyb20gJ0BiaXRnby9zZGstY29pbi1ldGgnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uL2dldEJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ0F2YXhDIFdhbGxldCBJbml0aWFsaXphdGlvbiBCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXI7XG5cbiAgY29uc3QgaW5pdFR4QnVpbGRlciA9ICgpOiB2b2lkID0+IHtcbiAgICB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdBdmF4IEMtQ2hhaW4gV2FsbGV0IEluaXRpYWxpemF0aW9uIFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdTaG91bGQgYnVpbGQgd2FsbGV0SW5pdGlhbGl6YXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIodGVzdERhdGEuT1dORVJfMS5ldGhBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcih0ZXN0RGF0YS5PV05FUl8yLmV0aEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLk9XTkVSXzMuZXRoQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuT1dORVJfMS5ldGhLZXkgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb246IFR4RGF0YSA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhKc29uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnNzAwMDAwMCcpO1xuICAgICAgdHhKc29uLl90eXBlLnNob3VsZC5lcXVhbHMoRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSk7XG4gICAgICB0eEpzb24uZ2FzUHJpY2UhLnNob3VsZC5lcXVhbCgnMjgwMDAwMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm5vbmNlLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uY2hhaW5JZCEsICcweGE4NjknKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5UWF9CUk9BRENBU1QpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBidWlsZCB3aXRoIGNvdW50ZXIgMCBpZiBub3QgbWFudWFsbHkgZGVmaW5lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuXG4gICAgICB0eEJ1aWxkZXIub3duZXIodGVzdERhdGEuT1dORVJfMS5ldGhBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcih0ZXN0RGF0YS5PV05FUl8yLmV0aEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLk9XTkVSXzMuZXRoQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuT1dORVJfMS5ldGhLZXkgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb246IFR4RGF0YSA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhKc29uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnNzAwMDAwMCcpO1xuICAgICAgdHhKc29uLl90eXBlLnNob3VsZC5lcXVhbHMoRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSk7XG4gICAgICB0eEpzb24uZ2FzUHJpY2UhLnNob3VsZC5lcXVhbCgnMjgwMDAwMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmNoYWluSWQhLCAnMHhhODY5Jyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLnYsICcweDAxNTBmNScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlRYX0JST0FEQ0FTVF9aRVJPX05PTkNFKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgdGhyb3cgaWYgYnVpbGRpbmcgd2FsbGV0SW5pdGlhbGl6YXRpb24gd2l0aG91dCBmZWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIub3duZXIodGVzdERhdGEuT1dORVJfMS5ldGhBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcih0ZXN0RGF0YS5PV05FUl8yLmV0aEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLk9XTkVSXzMuZXRoQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuT1dORVJfMS5ldGhLZXkgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgZmVlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHRocm93IGlmIGJ1aWxkaW5nIHdhbGxldEluaXRpYWxpemF0aW9uIHdpdGhvdXQgdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci5vd25lcih0ZXN0RGF0YS5PV05FUl8xLmV0aEFkZHJlc3MpLFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdNdWx0aXNpZyB3YWxsZXQgb3duZXIgY2FuIG9ubHkgYmUgc2V0IGZvciBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbnMnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCB0aHJvdyBpZiBidWlsZGluZyB3YWxsZXRJbml0aWFsaXphdGlvbiB3aXRob3V0IG93bmVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuT1dORVJfMS5ldGhLZXkgfSksXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0Nhbm5vdCBzaWduIGFuIHdhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbiB3aXRob3V0IG93bmVycydcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHRocm93IGlmIGJ1aWxkaW5nIHdhbGxldEluaXRpYWxpemF0aW9uIHdpdGggb25seSBvbmUgb3duZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLk9XTkVSXzEuZXRoQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuT1dORVJfMS5ldGhLZXkgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IHdyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHRocm93IGlmIGJ1aWxkaW5nIHdhbGxldEluaXRpYWxpemF0aW9uIHdpdGggb25seSB0d28gb3duZXJzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzI4MDAwMDAwMDAwMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnNzAwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcih0ZXN0RGF0YS5PV05FUl8xLmV0aEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLk9XTkVSXzIuZXRoQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuT1dORVJfMS5ldGhLZXkgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IHdyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldHRpbmcgc2FtZSB0eCBmcm9tIHJhdyB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcih0ZXN0RGF0YS5PV05FUl8xLmV0aEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLk9XTkVSXzIuZXRoQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIodGVzdERhdGEuT1dORVJfMy5ldGhBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5PV05FUl8xLmV0aEtleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEJ1aWRlckZyb21SYXcgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWRlckZyb21SYXcuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGNvbnN0IHR4RnJvbVJhdyA9IGF3YWl0IHR4QnVpZGVyRnJvbVJhdy5idWlsZCgpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0pzb24oKSwgdHhGcm9tUmF3LnRvSnNvbigpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdHhGcm9tUmF3LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pZCwgdHhGcm9tUmF3LmlkKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgYnVpbGQgdHggd2l0aCBmaW5hbCB2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLk9XTkVSXzEuZXRoQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIodGVzdERhdGEuT1dORVJfMi5ldGhBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcih0ZXN0RGF0YS5PV05FUl8zLmV0aEFkZHJlc3MpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Kc29uKCkudiwgJzB4MDE1MGY1Jyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!