PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-rune/dist/test/unit
Просмотр файла: transaction.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 sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const encoding_1 = require("@cosmjs/encoding");
const should_1 = __importDefault(require("should"));
const bech32 = require('bech32-buffer');
const abstract_cosmos_1 = require("@bitgo/abstract-cosmos");
const utils_1 = require("../../src/lib/utils");
const testData = __importStar(require("../resources/trune"));
describe('Rune Transaction', () => {
let tx;
const config = statics_1.coins.get('tthorchain:rune');
const utils = new utils_1.RuneUtils(config.network.type);
beforeEach(() => {
tx = new abstract_cosmos_1.CosmosTransaction(config, utils);
});
describe('Empty transaction', () => {
it('should throw empty transaction', function () {
should_1.default.throws(() => tx.toBroadcastFormat(), 'Empty transaction');
});
});
describe('From raw transaction', () => {
it('should build a transfer from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
should_1.default.deepEqual(json.sendMessages[0].value.toAddress, bech32.decode(testData.TEST_SEND_TX.sendMessage.value.toAddress).data);
should_1.default.deepEqual(json.sendMessages[0].value.amount[0].denom, testData.TEST_SEND_TX.sendMessage.value.amount[0].denom);
should_1.default.deepEqual(json.sendMessages[0].value.amount[0].amount, testData.TEST_SEND_TX.sendMessage.value.amount[0].amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: bech32.decode(testData.TEST_SEND_TX.sender).data,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tthorchain:rune',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: bech32.decode(testData.TEST_SEND_TX.sendMessage.value.toAddress).data,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tthorchain:rune',
},
]);
});
it('should build a transfer from raw signed hex', function () {
tx.enrichTransactionDetailsFromRawTransaction((0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.signedTxBase64)));
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
should_1.default.deepEqual(json.sendMessages[0].value.toAddress, bech32.decode(testData.TEST_SEND_TX.sendMessage.value.toAddress).data);
should_1.default.deepEqual(json.sendMessages[0].value.amount[0].denom, testData.TEST_SEND_TX.sendMessage.value.amount[0].denom);
should_1.default.deepEqual(json.sendMessages[0].value.amount[0].amount, testData.TEST_SEND_TX.sendMessage.value.amount[0].amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: bech32.decode(testData.TEST_SEND_TX.sender).data,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tthorchain:rune',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: bech32.decode(testData.TEST_SEND_TX.sendMessage.value.toAddress).data,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tthorchain:rune',
},
]);
});
it('should fail to build a transfer from incorrect raw hex', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('random' + testData.TEST_SEND_TX.signedTxBase64), 'incorrect raw data');
});
it('should fail to explain transaction with invalid raw hex', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
});
});
describe('Explain transaction', () => {
it('should explain a transfer pay transaction', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
const explainedTransaction = tx.explainTransaction();
explainedTransaction.should.deepEqual({
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
id: testData.TEST_SEND_TX.hash,
outputs: [
{
address: bech32.decode(testData.TEST_SEND_TX.recipient).data,
amount: testData.TEST_SEND_TX.sendAmount,
},
],
outputAmount: testData.TEST_SEND_TX.sendAmount,
changeOutputs: [],
changeAmount: '0',
fee: { fee: testData.TEST_SEND_TX.feeAmount },
type: 0,
});
});
it('should fail to explain transaction with invalid raw base64 string', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBeUQ7QUFDekQsNENBQXVDO0FBQ3ZDLCtDQUE4QztBQUM5QyxvREFBNEI7QUFDNUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRXhDLDREQUF3RTtBQUN4RSwrQ0FBZ0Q7QUFDaEQsNkRBQStDO0FBRS9DLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsSUFBSSxFQUFxQixDQUFDO0lBQzFCLE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLGlCQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsRUFBRSxHQUFHLElBQUksbUNBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsY0FB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QUFDLFNBQVMsRUFBRTtnQkFDN0MsSUFBSSxFQUFFLENBQUM7YUFDUixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRUFBbUUsRUFBRTtZQUN0RSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsY0FBYyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUM1RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0hleCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCB9IGZyb20gJ0Bjb3NtanMvZW5jb2RpbmcnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuY29uc3QgYmVjaDMyID0gcmVxdWlyZSgnYmVjaDMyLWJ1ZmZlcicpO1xuXG5pbXBvcnQgeyBDb3Ntb3NUcmFuc2FjdGlvbiwgU2VuZE1lc3NhZ2UgfSBmcm9tICdAYml0Z28vYWJzdHJhY3QtY29zbW9zJztcbmltcG9ydCB7IFJ1bmVVdGlscyB9IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3RydW5lJztcblxuZGVzY3JpYmUoJ1J1bmUgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGxldCB0eDogQ29zbW9zVHJhbnNhY3Rpb247XG4gIGNvbnN0IGNvbmZpZyA9IGNvaW5zLmdldCgndHRob3JjaGFpbjpydW5lJyk7XG4gIGNvbnN0IHV0aWxzID0gbmV3IFJ1bmVVdGlscyhjb25maWcubmV0d29yay50eXBlKTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0eCA9IG5ldyBDb3Ntb3NUcmFuc2FjdGlvbihjb25maWcsIHV0aWxzKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VtcHR5IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRnJvbSByYXcgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdERhdGEuVEVTVF9TRU5EX1RYLnB1YktleSkpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBTZW5kTWVzc2FnZSkudG9BZGRyZXNzLFxuICAgICAgICBiZWNoMzIuZGVjb2RlKHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MpLmRhdGFcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgU2VuZE1lc3NhZ2UpLmFtb3VudFswXS5kZW5vbSxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5kZW5vbVxuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBTZW5kTWVzc2FnZSkuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5zaWduYXR1cmUgYXMgYW55KS50b1N0cmluZygnYmFzZTY0JyksIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogYmVjaDMyLmRlY29kZSh0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZGVyKS5kYXRhLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndHRob3JjaGFpbjpydW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBiZWNoMzIuZGVjb2RlKHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MpLmRhdGEsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0dGhvcmNoYWluOnJ1bmUnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgZnJvbSByYXcgc2lnbmVkIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbih0b0hleChmcm9tQmFzZTY0KHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduZWRUeEJhc2U2NCkpKTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdERhdGEuVEVTVF9TRU5EX1RYLnB1YktleSkpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBTZW5kTWVzc2FnZSkudG9BZGRyZXNzLFxuICAgICAgICBiZWNoMzIuZGVjb2RlKHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MpLmRhdGFcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgU2VuZE1lc3NhZ2UpLmFtb3VudFswXS5kZW5vbSxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5kZW5vbVxuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBTZW5kTWVzc2FnZSkuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5zaWduYXR1cmUgYXMgYW55KS50b1N0cmluZygnYmFzZTY0JyksIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogYmVjaDMyLmRlY29kZSh0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZGVyKS5kYXRhLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndHRob3JjaGFpbjpydW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBiZWNoMzIuZGVjb2RlKHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MpLmRhdGEsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0dGhvcmNoYWluOnJ1bmUnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgYSB0cmFuc2ZlciBmcm9tIGluY29ycmVjdCByYXcgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cyhcbiAgICAgICAgKCkgPT4gdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKCdyYW5kb20nICsgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0KSxcbiAgICAgICAgJ2luY29ycmVjdCByYXcgZGF0YSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcmF3IGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKCdyYW5kb21TdHJpbmcnKSwgJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0V4cGxhaW4gdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgdHJhbnNmZXIgcGF5IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddLFxuICAgICAgICBpZDogdGVzdERhdGEuVEVTVF9TRU5EX1RYLmhhc2gsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBiZWNoMzIuZGVjb2RlKHRlc3REYXRhLlRFU1RfU0VORF9UWC5yZWNpcGllbnQpLmRhdGEsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kQW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dEFtb3VudDogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRBbW91bnQsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLmZlZUFtb3VudCB9LFxuICAgICAgICB0eXBlOiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcmF3IGJhc2U2NCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbigncmFuZG9tU3RyaW5nJyksICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!