@bitgo-beta/sdk-coin-sol 2.4.3-beta.998 → 7.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/bigint-buffer-guard.d.ts +1 -0
- package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/src/bigint-buffer-guard.js +29 -0
- package/dist/src/config/token2022StaticConfig.d.ts +3 -0
- package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/src/config/token2022StaticConfig.js +50 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/constants.d.ts +35 -2
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +41 -2
- package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/customInstructionBuilder.js +289 -0
- package/dist/src/lib/iface.d.ts +79 -5
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +364 -78
- package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +266 -69
- package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +23 -10
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
- package/dist/src/lib/token2022Config.d.ts +44 -0
- package/dist/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/src/lib/token2022Config.js +27 -0
- package/dist/src/lib/tokenTransferBuilder.js +7 -7
- package/dist/src/lib/transaction.d.ts +31 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +134 -46
- package/dist/src/lib/transactionBuilder.d.ts +18 -2
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +78 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +10 -1
- package/dist/src/lib/utils.d.ts +34 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +88 -24
- package/dist/src/sol.d.ts +36 -13
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +230 -38
- package/dist/test/fixtures/sol.d.ts +1152 -0
- package/dist/test/fixtures/sol.d.ts.map +1 -0
- package/dist/test/fixtures/sol.js +1433 -0
- package/dist/test/resources/sol.d.ts +238 -0
- package/dist/test/resources/sol.d.ts.map +1 -0
- package/dist/test/resources/sol.js +320 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.js +412 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +177 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/test/unit/sol.d.ts +2 -0
- package/dist/test/unit/sol.d.ts.map +1 -0
- package/dist/test/unit/sol.js +3108 -0
- package/dist/test/unit/solInstructionFactory.d.ts +2 -0
- package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/test/unit/solInstructionFactory.js +454 -0
- package/dist/test/unit/solToken.d.ts +2 -0
- package/dist/test/unit/solToken.d.ts.map +1 -0
- package/dist/test/unit/solToken.js +31 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +983 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +505 -0
- package/dist/test/unit/versionedTransaction.d.ts +2 -0
- package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/test/unit/versionedTransaction.js +207 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -9
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -1223
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transactionBuilder.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const bs58 = __importStar(require("bs58"));
|
|
41
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
42
|
+
const getBuilderFactory_1 = require("../getBuilderFactory");
|
|
43
|
+
const src_1 = require("../../../src");
|
|
44
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
45
|
+
const testData = __importStar(require("../../resources/sol"));
|
|
46
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
47
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
48
|
+
describe('Sol Transaction Builder', async () => {
|
|
49
|
+
let builders;
|
|
50
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
51
|
+
const authAccount = new src_1.KeyPair(testData.authAccount).getKeys();
|
|
52
|
+
const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
|
|
53
|
+
const validBlockhash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
54
|
+
beforeEach(function (done) {
|
|
55
|
+
builders = [
|
|
56
|
+
factory.getWalletInitializationBuilder(),
|
|
57
|
+
factory.getTransferBuilder(),
|
|
58
|
+
factory.getStakingActivateBuilder(),
|
|
59
|
+
factory.getStakingWithdrawBuilder(),
|
|
60
|
+
];
|
|
61
|
+
done();
|
|
62
|
+
});
|
|
63
|
+
it('start and build an empty a transfer tx with fee', async () => {
|
|
64
|
+
const txBuilder = factory.getTransferBuilder();
|
|
65
|
+
txBuilder.sender(authAccount.pub);
|
|
66
|
+
txBuilder.nonce(validBlockhash);
|
|
67
|
+
txBuilder.fee({ amount: 5000 });
|
|
68
|
+
const tx = await txBuilder.build();
|
|
69
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
70
|
+
const txJson = tx.toJson();
|
|
71
|
+
txJson.lamportsPerSignature?.should.equal(5000);
|
|
72
|
+
});
|
|
73
|
+
it('should fail to build if missing sender', async () => {
|
|
74
|
+
for (const txBuilder of builders) {
|
|
75
|
+
txBuilder.nonce(validBlockhash);
|
|
76
|
+
await txBuilder.build().should.rejectedWith('Invalid transaction: missing sender');
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
it('should fail to build if missing nonce', async () => {
|
|
80
|
+
for (const txBuilder of builders) {
|
|
81
|
+
txBuilder.sender(authAccount.pub);
|
|
82
|
+
await txBuilder.build().should.rejectedWith('Invalid transaction: missing nonce blockhash');
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
it('build a wallet init from rawTx', async () => {
|
|
86
|
+
const txBuilder = factory.from(testData.WALLET_INIT_SIGNED_TX);
|
|
87
|
+
const builtTx = await txBuilder.build();
|
|
88
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.WalletInitialization);
|
|
89
|
+
should_1.default.equal(builtTx.id, '7TkU8wLgXDeLFbVydtg6mqMsp9GatsetitSngysgjxFhofKSUcLPBoKPHciLeGEfJFMsqezpZmGRSFQTBy7ZDsg');
|
|
90
|
+
builtTx.inputs.length.should.equal(1);
|
|
91
|
+
builtTx.inputs[0].should.deepEqual({
|
|
92
|
+
address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
93
|
+
value: testData.tokenTransfers.amount.toString(),
|
|
94
|
+
coin: 'tsol',
|
|
95
|
+
});
|
|
96
|
+
builtTx.outputs.length.should.equal(0);
|
|
97
|
+
const jsonTx = builtTx.toJson();
|
|
98
|
+
jsonTx.id.should.equal('7TkU8wLgXDeLFbVydtg6mqMsp9GatsetitSngysgjxFhofKSUcLPBoKPHciLeGEfJFMsqezpZmGRSFQTBy7ZDsg');
|
|
99
|
+
jsonTx.feePayer.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
|
|
100
|
+
jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
|
|
101
|
+
jsonTx.numSignatures.should.equal(2);
|
|
102
|
+
jsonTx.instructionsData.should.deepEqual([
|
|
103
|
+
{
|
|
104
|
+
type: 'CreateNonceAccount',
|
|
105
|
+
params: {
|
|
106
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
107
|
+
nonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
108
|
+
authAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
109
|
+
amount: '300000',
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
]);
|
|
113
|
+
builtTx.toBroadcastFormat().should.equal(testData.WALLET_INIT_SIGNED_TX);
|
|
114
|
+
});
|
|
115
|
+
it('build a staking activate from rawTx', async () => {
|
|
116
|
+
const txBuilder = factory.from(testData.STAKING_ACTIVATE_SIGNED_TX);
|
|
117
|
+
const builtTx = await txBuilder.build();
|
|
118
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingActivate);
|
|
119
|
+
should_1.default.equal(builtTx.id, 'DCsSiGuKiWgtFRF2ZCh5x6xukApffYDs5Y9CyvYBEebMVnXH5TydKpT76srTSr1AhvDZqsnS5EVhvkS8Rzh91hH');
|
|
120
|
+
builtTx.inputs.length.should.equal(1);
|
|
121
|
+
builtTx.inputs[0].should.deepEqual({
|
|
122
|
+
address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
123
|
+
value: testData.tokenTransfers.amount.toString(),
|
|
124
|
+
coin: 'tsol',
|
|
125
|
+
});
|
|
126
|
+
builtTx.outputs.length.should.equal(1);
|
|
127
|
+
const jsonTx = builtTx.toJson();
|
|
128
|
+
jsonTx.id.should.equal('DCsSiGuKiWgtFRF2ZCh5x6xukApffYDs5Y9CyvYBEebMVnXH5TydKpT76srTSr1AhvDZqsnS5EVhvkS8Rzh91hH');
|
|
129
|
+
jsonTx.feePayer.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
|
|
130
|
+
jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
|
|
131
|
+
jsonTx.numSignatures.should.equal(2);
|
|
132
|
+
jsonTx.instructionsData.should.deepEqual([
|
|
133
|
+
{
|
|
134
|
+
type: 'Activate',
|
|
135
|
+
params: {
|
|
136
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
137
|
+
stakingAddress: '7dRuGFbU2y2kijP6o1LYNzVyz4yf13MooqoionCzv5Za',
|
|
138
|
+
amount: '300000',
|
|
139
|
+
validator: 'CyjoLt3kjqB57K7ewCBHmnHq3UgEj3ak6A7m6EsBsuhA',
|
|
140
|
+
stakingType: public_types_1.SolStakingTypeEnum.NATIVE,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
]);
|
|
144
|
+
builtTx.toBroadcastFormat().should.equal(testData.STAKING_ACTIVATE_SIGNED_TX);
|
|
145
|
+
});
|
|
146
|
+
it('build a send from rawTx', async () => {
|
|
147
|
+
const txBuilder = factory.from(testData.TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
148
|
+
const builtTx = await txBuilder.build();
|
|
149
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
|
|
150
|
+
should_1.default.equal(builtTx.id, '2XFxGfXddKWnqGaMAsfNL8HgXqDvjBL2Ae28KWrRvg9bQBmCrpHYVDacuZFeAUyYwjXG6ey2jTARX5VQCnj7SF4L');
|
|
151
|
+
builtTx.inputs.length.should.equal(1);
|
|
152
|
+
builtTx.inputs[0].should.deepEqual({
|
|
153
|
+
address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
154
|
+
value: testData.tokenTransfers.amount.toString(),
|
|
155
|
+
coin: 'tsol',
|
|
156
|
+
});
|
|
157
|
+
builtTx.outputs.length.should.equal(1);
|
|
158
|
+
builtTx.outputs[0].should.deepEqual({
|
|
159
|
+
address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
|
|
160
|
+
value: testData.tokenTransfers.amount.toString(),
|
|
161
|
+
coin: 'tsol',
|
|
162
|
+
});
|
|
163
|
+
const jsonTx = builtTx.toJson();
|
|
164
|
+
jsonTx.id.should.equal('2XFxGfXddKWnqGaMAsfNL8HgXqDvjBL2Ae28KWrRvg9bQBmCrpHYVDacuZFeAUyYwjXG6ey2jTARX5VQCnj7SF4L');
|
|
165
|
+
jsonTx.feePayer.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
|
|
166
|
+
jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
|
|
167
|
+
jsonTx.numSignatures.should.equal(1);
|
|
168
|
+
jsonTx.durableNonce.should.deepEqual({
|
|
169
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
170
|
+
authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
171
|
+
});
|
|
172
|
+
jsonTx.instructionsData.should.deepEqual([
|
|
173
|
+
{
|
|
174
|
+
type: 'Transfer',
|
|
175
|
+
params: {
|
|
176
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
177
|
+
toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
|
|
178
|
+
amount: '300000',
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
type: 'Memo',
|
|
183
|
+
params: { memo: 'test memo' },
|
|
184
|
+
},
|
|
185
|
+
]);
|
|
186
|
+
builtTx.toBroadcastFormat().should.equal(testData.TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
187
|
+
});
|
|
188
|
+
it('build a send from raw token transaction', async () => {
|
|
189
|
+
const txBuilder = factory.from(testData.TOKEN_TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
190
|
+
const prioFeeMicroLamports = '10000000';
|
|
191
|
+
// We don't have to manually set the priority fee here as the raw txn already has the priority fee instruction;
|
|
192
|
+
// therefore once initBuilder is called (it's called within fromImplementation), it will set the txBuilder's priorityFee field
|
|
193
|
+
// which will then be used in txBuilder.build() by tokenTransferBuilder to add the set compute fee instruction
|
|
194
|
+
const builtTx = await txBuilder.build();
|
|
195
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
|
|
196
|
+
should_1.default.equal(builtTx.id, '2ticU4ZkEqdTHULr6LobTgWBhim6E7wSscDhM4gzyuGUmQyUwLYhoqaifuvwmNzzEf1T5aefVcgMQkSHdJ5nsrfZ');
|
|
197
|
+
builtTx.inputs.length.should.equal(1);
|
|
198
|
+
builtTx.inputs[0].should.deepEqual({
|
|
199
|
+
address: testData.associatedTokenAccounts.accounts[0].pub,
|
|
200
|
+
value: testData.tokenTransfers.amount.toString(),
|
|
201
|
+
coin: 'tsol:usdc',
|
|
202
|
+
});
|
|
203
|
+
builtTx.outputs.length.should.equal(1);
|
|
204
|
+
builtTx.outputs[0].should.deepEqual({
|
|
205
|
+
address: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
|
|
206
|
+
value: testData.tokenTransfers.amount.toString(),
|
|
207
|
+
coin: 'tsol:usdc',
|
|
208
|
+
});
|
|
209
|
+
const jsonTx = builtTx.toJson();
|
|
210
|
+
jsonTx.id.should.equal('2ticU4ZkEqdTHULr6LobTgWBhim6E7wSscDhM4gzyuGUmQyUwLYhoqaifuvwmNzzEf1T5aefVcgMQkSHdJ5nsrfZ');
|
|
211
|
+
jsonTx.feePayer.should.equal(testData.associatedTokenAccounts.accounts[0].pub);
|
|
212
|
+
jsonTx.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
|
|
213
|
+
jsonTx.numSignatures.should.equal(1);
|
|
214
|
+
jsonTx.durableNonce.should.deepEqual({
|
|
215
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
216
|
+
authWalletAddress: testData.associatedTokenAccounts.accounts[0].pub,
|
|
217
|
+
});
|
|
218
|
+
const priorityFeeBigInt = BigInt(prioFeeMicroLamports);
|
|
219
|
+
jsonTx.instructionsData.should.deepEqual([
|
|
220
|
+
{
|
|
221
|
+
params: {
|
|
222
|
+
fee: priorityFeeBigInt,
|
|
223
|
+
},
|
|
224
|
+
type: 'SetPriorityFee',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
type: 'TokenTransfer',
|
|
228
|
+
params: {
|
|
229
|
+
fromAddress: testData.associatedTokenAccounts.accounts[0].pub,
|
|
230
|
+
toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
|
|
231
|
+
amount: testData.tokenTransfers.amount.toString(),
|
|
232
|
+
tokenName: testData.tokenTransfers.nameUSDC.toString(),
|
|
233
|
+
sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
|
|
234
|
+
tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
|
|
235
|
+
programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
|
|
236
|
+
decimalPlaces: 9,
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
type: 'Memo',
|
|
241
|
+
params: { memo: 'test memo' },
|
|
242
|
+
},
|
|
243
|
+
]);
|
|
244
|
+
builtTx.toBroadcastFormat().should.equal(testData.TOKEN_TRANSFER_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
245
|
+
});
|
|
246
|
+
describe('Nonce tests', async () => {
|
|
247
|
+
it('should throw for invalid nonce', () => {
|
|
248
|
+
const blockHash = 'randomstring';
|
|
249
|
+
for (const txBuilder of builders) {
|
|
250
|
+
(0, should_1.default)(() => txBuilder.nonce(blockHash)).throw('Invalid or missing blockHash, got: ' + blockHash);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
it('should throw for invalid params using durable nonce', () => {
|
|
254
|
+
const invalidPubKey = 'randomstring';
|
|
255
|
+
for (const txBuilder of builders) {
|
|
256
|
+
(0, should_1.default)(() => txBuilder.nonce(validBlockhash, {
|
|
257
|
+
walletNonceAddress: invalidPubKey,
|
|
258
|
+
authWalletAddress: authAccount.pub,
|
|
259
|
+
})).throw('Invalid or missing walletNonceAddress, got: ' + invalidPubKey);
|
|
260
|
+
(0, should_1.default)(() => txBuilder.nonce(validBlockhash, {
|
|
261
|
+
walletNonceAddress: nonceAccount.pub,
|
|
262
|
+
authWalletAddress: invalidPubKey,
|
|
263
|
+
})).throw('Invalid or missing authWalletAddress, got: ' + invalidPubKey);
|
|
264
|
+
(0, should_1.default)(() => txBuilder.nonce(validBlockhash, {
|
|
265
|
+
walletNonceAddress: nonceAccount.pub,
|
|
266
|
+
authWalletAddress: nonceAccount.pub,
|
|
267
|
+
})).throw('Invalid params: walletNonceAddress cannot be equal to authWalletAddress');
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
it('should succeed for valid nonce', () => {
|
|
271
|
+
for (const txBuilder of builders) {
|
|
272
|
+
should_1.default.doesNotThrow(() => txBuilder.nonce(validBlockhash));
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
it('should succeed for valid durable nonce', () => {
|
|
276
|
+
for (const txBuilder of builders) {
|
|
277
|
+
should_1.default.doesNotThrow(() => txBuilder.nonce(validBlockhash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub }));
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
describe('sender tests', async () => {
|
|
282
|
+
it('should throw for invalid sender', () => {
|
|
283
|
+
const invalidPublicKey = 'randomstring';
|
|
284
|
+
for (const txBuilder of builders) {
|
|
285
|
+
(0, should_1.default)(() => txBuilder.sender(invalidPublicKey)).throw('Invalid or missing sender, got: ' + invalidPublicKey);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
it('should succeed for valid sender', () => {
|
|
289
|
+
for (const txBuilder of builders) {
|
|
290
|
+
should_1.default.doesNotThrow(() => txBuilder.sender(authAccount.pub));
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
it('validateAddress', () => {
|
|
295
|
+
const validAddress = { address: authAccount.pub };
|
|
296
|
+
const invalidAddress = { address: testData.pubKeys.invalidPubKeys[0] };
|
|
297
|
+
for (const builder of builders) {
|
|
298
|
+
should_1.default.doesNotThrow(() => builder.validateAddress(validAddress));
|
|
299
|
+
(0, should_1.default)(() => builder.validateAddress(invalidAddress)).throwError('Invalid address ' + testData.pubKeys.invalidPubKeys[0]);
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
it('validateKey', () => {
|
|
303
|
+
const validKey = { key: testData.authAccount.prv };
|
|
304
|
+
const invalidKey = { key: testData.authAccount.pub };
|
|
305
|
+
for (const builder of builders) {
|
|
306
|
+
should_1.default.doesNotThrow(() => builder.validateKey(validKey));
|
|
307
|
+
(0, should_1.default)(() => builder.validateKey(invalidKey)).throwError('Invalid key');
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
it('validateRawTransaction', () => {
|
|
311
|
+
const validRawTx = testData.RAW_TX_SIGNED;
|
|
312
|
+
const invalidRawTx = 'AAAAAAAAAAAAAAAAAAA';
|
|
313
|
+
for (const builder of builders) {
|
|
314
|
+
should_1.default.doesNotThrow(() => builder.validateRawTransaction(validRawTx));
|
|
315
|
+
(0, should_1.default)(() => builder.validateRawTransaction(invalidRawTx)).throwError('Invalid raw transaction');
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
it('validateValue', () => {
|
|
319
|
+
const validValue = new bignumber_js_1.default('100000');
|
|
320
|
+
const invalidValue = new bignumber_js_1.default('-100000');
|
|
321
|
+
for (const builder of builders) {
|
|
322
|
+
should_1.default.doesNotThrow(() => builder.validateValue(validValue));
|
|
323
|
+
(0, should_1.default)(() => builder.validateValue(invalidValue)).throwError('Value cannot be less than zero');
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
it('validateMemo', () => {
|
|
327
|
+
const validMemo = 'test memo';
|
|
328
|
+
const invalidMemo = 'ooawindaonmawñdamwdoianwdonalskdnaiouwbdoinowadn90awndoawndaowdnaioiuwbdioauwndaoudnbawodnba9owudbnaowdnaasdijhaksdkjasdkjhaskdjhkasdasdasdasdasd';
|
|
329
|
+
for (const builder of builders) {
|
|
330
|
+
builder._instructionsData.push({
|
|
331
|
+
type: 'Transfer',
|
|
332
|
+
params: {
|
|
333
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
334
|
+
toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
|
|
335
|
+
amount: '300000',
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
builder.validateMemo(validMemo);
|
|
339
|
+
(0, should_1.default)(() => builder.validateMemo(invalidMemo)).throwError('Memo is too long');
|
|
340
|
+
(0, should_1.default)((memo) => builder.validateMemo(memo)).throwError('Invalid memo, got: undefined');
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
describe('add signature', () => {
|
|
344
|
+
let MPC;
|
|
345
|
+
it('should add signature to transaction', async () => {
|
|
346
|
+
const transferBuilder = factory
|
|
347
|
+
.getTransferBuilder()
|
|
348
|
+
.sender(authAccount.pub)
|
|
349
|
+
.nonce(validBlockhash)
|
|
350
|
+
.fee({ amount: 5000 })
|
|
351
|
+
.send({ address: nonceAccount.pub, amount: '1000' });
|
|
352
|
+
transferBuilder.sign({ key: authAccount.prv });
|
|
353
|
+
const signedTransaction = await transferBuilder.build();
|
|
354
|
+
// signature is base58 encoded
|
|
355
|
+
const signature = signedTransaction.signature[0];
|
|
356
|
+
// verify rebuilt transaction contains signature
|
|
357
|
+
const rawTransaction = signedTransaction.toBroadcastFormat();
|
|
358
|
+
const rebuiltSignedTransaction = await factory.from(rawTransaction).build();
|
|
359
|
+
rebuiltSignedTransaction.signature.should.deepEqual(signedTransaction.signature);
|
|
360
|
+
const transferBuilder2 = factory
|
|
361
|
+
.getTransferBuilder()
|
|
362
|
+
.sender(authAccount.pub)
|
|
363
|
+
.nonce(validBlockhash)
|
|
364
|
+
.fee({ amount: 5000 })
|
|
365
|
+
.send({ address: nonceAccount.pub, amount: '1000' });
|
|
366
|
+
transferBuilder2.addSignature({ pub: authAccount.pub }, Buffer.from(bs58.decode(signature)));
|
|
367
|
+
const signedTransaction2 = await transferBuilder2.build();
|
|
368
|
+
// verify signatures are correct
|
|
369
|
+
signedTransaction.signature.should.deepEqual(signedTransaction2.signature);
|
|
370
|
+
// verify rebuilt transaction contains signature
|
|
371
|
+
const rawTransaction2 = signedTransaction2.toBroadcastFormat();
|
|
372
|
+
const rebuiltTransaction2 = await factory.from(rawTransaction2).build();
|
|
373
|
+
rebuiltTransaction2.signature.should.deepEqual(signedTransaction2.signature);
|
|
374
|
+
});
|
|
375
|
+
before('initialize mpc module', async () => {
|
|
376
|
+
const hdTree = await sdk_lib_mpc_1.Ed25519Bip32HdTree.initialize();
|
|
377
|
+
MPC = await sdk_core_1.Eddsa.initialize(hdTree);
|
|
378
|
+
});
|
|
379
|
+
it('should add TSS signature', async () => {
|
|
380
|
+
const A = MPC.keyShare(1, 2, 3);
|
|
381
|
+
const B = MPC.keyShare(2, 2, 3);
|
|
382
|
+
const C = MPC.keyShare(3, 2, 3);
|
|
383
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
384
|
+
const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
|
|
385
|
+
const C_combine = MPC.keyCombine(C.uShare, [A.yShares[3], B.yShares[3]]);
|
|
386
|
+
const commonPub = A_combine.pShare.y;
|
|
387
|
+
const solPublicKey = new src_1.KeyPair({ pub: commonPub });
|
|
388
|
+
const sender = solPublicKey.getAddress();
|
|
389
|
+
let transferBuilder = factory
|
|
390
|
+
.getTransferBuilder()
|
|
391
|
+
.sender(sender)
|
|
392
|
+
.nonce(validBlockhash)
|
|
393
|
+
.fee({ amount: 5000 })
|
|
394
|
+
.send({ address: nonceAccount.pub, amount: '1000' });
|
|
395
|
+
const unsignedTransaction = await transferBuilder.build();
|
|
396
|
+
const signablePayload = unsignedTransaction.signablePayload;
|
|
397
|
+
// signing with A and B
|
|
398
|
+
let A_sign_share = MPC.signShare(signablePayload, A_combine.pShare, [A_combine.jShares[2]]);
|
|
399
|
+
let B_sign_share = MPC.signShare(signablePayload, B_combine.pShare, [B_combine.jShares[1]]);
|
|
400
|
+
let A_sign = MPC.sign(signablePayload, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
|
|
401
|
+
let B_sign = MPC.sign(signablePayload, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
|
|
402
|
+
let signature = MPC.signCombine([A_sign, B_sign]);
|
|
403
|
+
let rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
|
|
404
|
+
transferBuilder = factory
|
|
405
|
+
.getTransferBuilder()
|
|
406
|
+
.sender(sender)
|
|
407
|
+
.nonce(validBlockhash)
|
|
408
|
+
.fee({ amount: 5000 })
|
|
409
|
+
.send({ address: nonceAccount.pub, amount: '1000' });
|
|
410
|
+
transferBuilder.addSignature({ pub: sender }, rawSignature);
|
|
411
|
+
let signedTransaction = await transferBuilder.build();
|
|
412
|
+
signedTransaction.signature.length.should.equal(1);
|
|
413
|
+
signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
|
|
414
|
+
signedTransaction.id.should.equal(bs58.encode(rawSignature));
|
|
415
|
+
// signing with A and C
|
|
416
|
+
A_sign_share = MPC.signShare(signablePayload, A_combine.pShare, [A_combine.jShares[3]]);
|
|
417
|
+
let C_sign_share = MPC.signShare(signablePayload, C_combine.pShare, [C_combine.jShares[1]]);
|
|
418
|
+
A_sign = MPC.sign(signablePayload, A_sign_share.xShare, [C_sign_share.rShares[1]], [B.yShares[1]]);
|
|
419
|
+
let C_sign = MPC.sign(signablePayload, C_sign_share.xShare, [A_sign_share.rShares[3]], [B.yShares[3]]);
|
|
420
|
+
signature = MPC.signCombine([A_sign, C_sign]);
|
|
421
|
+
rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
|
|
422
|
+
transferBuilder = factory
|
|
423
|
+
.getTransferBuilder()
|
|
424
|
+
.sender(sender)
|
|
425
|
+
.nonce(validBlockhash)
|
|
426
|
+
.fee({ amount: 5000 })
|
|
427
|
+
.send({ address: nonceAccount.pub, amount: '1000' });
|
|
428
|
+
transferBuilder.addSignature({ pub: sender }, rawSignature);
|
|
429
|
+
signedTransaction = await transferBuilder.build();
|
|
430
|
+
signedTransaction.signature.length.should.equal(1);
|
|
431
|
+
signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
|
|
432
|
+
signedTransaction.id.should.equal(bs58.encode(rawSignature));
|
|
433
|
+
// signing with B and C
|
|
434
|
+
B_sign_share = MPC.signShare(signablePayload, B_combine.pShare, [B_combine.jShares[3]]);
|
|
435
|
+
C_sign_share = MPC.signShare(signablePayload, C_combine.pShare, [C_combine.jShares[2]]);
|
|
436
|
+
B_sign = MPC.sign(signablePayload, B_sign_share.xShare, [C_sign_share.rShares[2]], [A.yShares[2]]);
|
|
437
|
+
C_sign = MPC.sign(signablePayload, C_sign_share.xShare, [B_sign_share.rShares[3]], [A.yShares[3]]);
|
|
438
|
+
signature = MPC.signCombine([B_sign, C_sign]);
|
|
439
|
+
rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
|
|
440
|
+
transferBuilder = factory
|
|
441
|
+
.getTransferBuilder()
|
|
442
|
+
.sender(sender)
|
|
443
|
+
.nonce(validBlockhash)
|
|
444
|
+
.fee({ amount: 5000 })
|
|
445
|
+
.send({ address: nonceAccount.pub, amount: '1000' });
|
|
446
|
+
transferBuilder.addSignature({ pub: sender }, rawSignature);
|
|
447
|
+
signedTransaction = await transferBuilder.build();
|
|
448
|
+
signedTransaction.signature.length.should.equal(1);
|
|
449
|
+
signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
|
|
450
|
+
signedTransaction.id.should.equal(bs58.encode(rawSignature));
|
|
451
|
+
const rawTransaction = signedTransaction.toBroadcastFormat();
|
|
452
|
+
const rebuiltTransaction = await factory.from(rawTransaction).build();
|
|
453
|
+
rebuiltTransaction.id.should.equal(signedTransaction.id);
|
|
454
|
+
rebuiltTransaction.signature.should.deepEqual(signedTransaction.signature);
|
|
455
|
+
});
|
|
456
|
+
it('should add TSS HD signature', async () => {
|
|
457
|
+
const A = MPC.keyShare(1, 2, 3);
|
|
458
|
+
const B = MPC.keyShare(2, 2, 3);
|
|
459
|
+
const C = MPC.keyShare(3, 2, 3);
|
|
460
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
461
|
+
const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
|
|
462
|
+
for (let index = 0; index < 10; index++) {
|
|
463
|
+
const path = `m/${index}`;
|
|
464
|
+
const A_subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
|
|
465
|
+
const B_subkey = MPC.keyCombine(B.uShare, [A_subkey.yShares[2], C.yShares[2]]);
|
|
466
|
+
const solPublicKey = new src_1.KeyPair({ pub: A_subkey.pShare.y });
|
|
467
|
+
const sender = solPublicKey.getAddress();
|
|
468
|
+
const transferBuilder = factory
|
|
469
|
+
.getTransferBuilder()
|
|
470
|
+
.sender(sender)
|
|
471
|
+
.nonce(validBlockhash)
|
|
472
|
+
.fee({ amount: 5000 })
|
|
473
|
+
.send({ address: nonceAccount.pub, amount: '1000' });
|
|
474
|
+
const unsignedTransaction = await transferBuilder.build();
|
|
475
|
+
const signablePayload = unsignedTransaction.signablePayload;
|
|
476
|
+
const A_sign_share = MPC.signShare(signablePayload, A_subkey.pShare, [A_combine.jShares[2]]);
|
|
477
|
+
const B_sign_share = MPC.signShare(signablePayload, B_subkey.pShare, [B_combine.jShares[1]]);
|
|
478
|
+
const A_sign = MPC.sign(signablePayload, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
|
|
479
|
+
const B_sign = MPC.sign(signablePayload, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
|
|
480
|
+
const signature = MPC.signCombine([A_sign, B_sign]);
|
|
481
|
+
const rawSignature = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
|
|
482
|
+
transferBuilder.addSignature({ pub: sender }, rawSignature);
|
|
483
|
+
const signedTransaction = await transferBuilder.build();
|
|
484
|
+
signedTransaction.signature.length.should.equal(1);
|
|
485
|
+
signedTransaction.signature[0].should.equal(bs58.encode(rawSignature));
|
|
486
|
+
signedTransaction.id.should.equal(bs58.encode(rawSignature));
|
|
487
|
+
const rawTransaction = signedTransaction.toBroadcastFormat();
|
|
488
|
+
const rebuiltTransaction = await factory.from(rawTransaction).build();
|
|
489
|
+
rebuiltTransaction.id.should.equal(signedTransaction.id);
|
|
490
|
+
rebuiltTransaction.signature.should.deepEqual(signedTransaction.signature);
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
});
|
|
495
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsMkNBQTZCO0FBRTdCLHNEQUF5RDtBQUN6RCw0REFBeUQ7QUFDekQsc0NBQTZEO0FBQzdELG1EQUE4RDtBQUM5RCw4REFBZ0Q7QUFDaEQsZ0VBQXFDO0FBQ3JDLHlEQUE2RDtBQUU3RCxRQUFRLENBQUMseUJBQXlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDN0MsSUFBSSxRQUFRLENBQUM7SUFDYixNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEUsTUFBTSxjQUFjLEdBQUcsOENBQThDLENBQUM7SUFFdEUsVUFBVSxDQUFDLFVBQVUsSUFBSTtRQUN2QixRQUFRLEdBQUc7WUFDVCxPQUFPLENBQUMsOEJBQThCLEVBQUU7WUFDeEMsT0FBTyxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRTtZQUNuQyxPQUFPLENBQUMseUJBQXlCLEVBQUU7U0FDcEMsQ0FBQztRQUNGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixF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SyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgYnM1OCBmcm9tICdiczU4JztcblxuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IEtleVBhaXIsIFRva2VuVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IEVkZHNhLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEVkMjU1MTlCaXAzMkhkVHJlZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcblxuZGVzY3JpYmUoJ1NvbCBUcmFuc2FjdGlvbiBCdWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICBsZXQgYnVpbGRlcnM7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHNvbCcpO1xuICBjb25zdCBhdXRoQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLm5vbmNlQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCB2YWxpZEJsb2NraGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoZG9uZSkge1xuICAgIGJ1aWxkZXJzID0gW1xuICAgICAgZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKSxcbiAgICAgIGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCksXG4gICAgICBmYWN0b3J5LmdldFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIoKSxcbiAgICAgIGZhY3RvcnkuZ2V0U3Rha2luZ1dpdGhkcmF3QnVpbGRlcigpLFxuICAgIF07XG4gICAgZG9uZSgpO1xuICB9KTtcblxuICBpdCgnc3RhcnQgYW5kIGJ1aWxkIGFuIGVtcHR5IGEgdHJhbnNmZXIgdHggd2l0aCBmZWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHZhbGlkQmxvY2toYXNoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHsgYW1vdW50OiA1MDAwIH0pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgIHR4SnNvbi5sYW1wb3J0c1BlclNpZ25hdHVyZT8uc2hvdWxkLmVxdWFsKDUwMDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBzZW5kZXInLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHNlbmRlcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3Npbmcgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnYnVpbGQgYSB3YWxsZXQgaW5pdCBmcm9tIHJhd1R4JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5XQUxMRVRfSU5JVF9TSUdORURfVFgpO1xuICAgIGNvbnN0IGJ1aWx0VHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LmlkLCAnN1RrVTh3TGdYRGVMRmJWeWR0ZzZtcU1zcDlHYXRzZXRpdFNuZ3lzZ2p4RmhvZktTVWNMUEJvS1BIY2lMZUdFZkpGTXNxZXpwWm1HUlNGUVRCeTdaRHNnJyk7XG4gICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICB2YWx1ZTogdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjb2luOiAndHNvbCcsXG4gICAgfSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICBqc29uVHguaWQuc2hvdWxkLmVxdWFsKCc3VGtVOHdMZ1hEZUxGYlZ5ZHRnNm1xTXNwOUdhdHNldGl0U25neXNnanhGaG9mS1NVY0xQQm9LUEhjaUxlR0VmSkZNc3FlenBabUdSU0ZRVEJ5N1pEc2cnKTtcbiAgICBqc29uVHguZmVlUGF5ZXIuc2hvdWxkLmVxdWFsKCc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScpO1xuICAgIGpzb25UeC5ub25jZS5zaG91bGQuZXF1YWwoJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJyk7XG4gICAganNvblR4Lm51bVNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKDIpO1xuICAgIGpzb25UeC5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnQ3JlYXRlTm9uY2VBY2NvdW50JyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgbm9uY2VBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICAgIGF1dGhBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIGFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuV0FMTEVUX0lOSVRfU0lHTkVEX1RYKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkIGEgc3Rha2luZyBhY3RpdmF0ZSBmcm9tIHJhd1R4JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TVEFLSU5HX0FDVElWQVRFX1NJR05FRF9UWCk7XG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LmlkLCAnRENzU2lHdUtpV2d0RlJGMlpDaDV4Nnh1a0FwZmZZRHM1WTlDeXZZQkVlYk1WblhINVR5ZEtwVDc2c3JUU3IxQWh2RFpxc25TNUVWaHZrUzhSemg5MWhIJyk7XG4gICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICB2YWx1ZTogdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjb2luOiAndHNvbCcsXG4gICAgfSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICBqc29uVHguaWQuc2hvdWxkLmVxdWFsKCdEQ3NTaUd1S2lXZ3RGUkYyWkNoNXg2eHVrQXBmZllEczVZOUN5dllCRWViTVZuWEg1VHlkS3BUNzZzclRTcjFBaHZEWnFzblM1RVZodmtTOFJ6aDkxaEgnKTtcbiAgICBqc29uVHguZmVlUGF5ZXIuc2hvdWxkLmVxdWFsKCc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScpO1xuICAgIGpzb25UeC5ub25jZS5zaG91bGQuZXF1YWwoJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJyk7XG4gICAganNvblR4Lm51bVNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKDIpO1xuICAgIGpzb25UeC5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnQWN0aXZhdGUnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogJzdkUnVHRmJVMnkya2lqUDZvMUxZTnpWeXo0eWYxM01vb3FvaW9uQ3p2NVphJyxcbiAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIHZhbGlkYXRvcjogJ0N5am9MdDNranFCNTdLN2V3Q0JIbW5IcTNVZ0VqM2FrNkE3bTZFc0JzdWhBJyxcbiAgICAgICAgICBzdGFraW5nVHlwZTogU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5TVEFLSU5HX0FDVElWQVRFX1NJR05FRF9UWCk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZCBhIHNlbmQgZnJvbSByYXdUeCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVFJBTlNGRVJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBidWlsdFR4LmlkLFxuICAgICAgJzJYRnhHZlhkZEtXbnFHYU1Bc2ZOTDhIZ1hxRHZqQkwyQWUyOEtXclJ2ZzliUUJtQ3JwSFlWRGFjdVpGZUFVeVl3alhHNmV5MmpUQVJYNVZRQ25qN1NGNEwnXG4gICAgKTtcbiAgICBidWlsdFR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIGNvaW46ICd0c29sJyxcbiAgICB9KTtcbiAgICBidWlsdFR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdFR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICBhZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogJ3Rzb2wnLFxuICAgIH0pO1xuICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAganNvblR4LmlkLnNob3VsZC5lcXVhbCgnMlhGeEdmWGRkS1ducUdhTUFzZk5MOEhnWHFEdmpCTDJBZTI4S1dyUnZnOWJRQm1DcnBIWVZEYWN1WkZlQVV5WXdqWEc2ZXkyalRBUlg1VlFDbmo3U0Y0TCcpO1xuICAgIGpzb25UeC5mZWVQYXllci5zaG91bGQuZXF1YWwoJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyk7XG4gICAganNvblR4Lm5vbmNlLnNob3VsZC5lcXVhbCgnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknKTtcbiAgICBqc29uVHgubnVtU2lnbmF0dXJlcy5zaG91bGQuZXF1YWwoMSk7XG4gICAganNvblR4LmR1cmFibGVOb25jZS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgIH0pO1xuICAgIGpzb25UeC5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICB0b0FkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdNZW1vJyxcbiAgICAgICAgcGFyYW1zOiB7IG1lbW86ICd0ZXN0IG1lbW8nIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuVFJBTlNGRVJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZCBhIHNlbmQgZnJvbSByYXcgdG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKFxuICAgICAgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRVxuICAgICkgYXMgVG9rZW5UcmFuc2ZlckJ1aWxkZXI7XG4gICAgY29uc3QgcHJpb0ZlZU1pY3JvTGFtcG9ydHMgPSAnMTAwMDAwMDAnO1xuICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gbWFudWFsbHkgc2V0IHRoZSBwcmlvcml0eSBmZWUgaGVyZSBhcyB0aGUgcmF3IHR4biBhbHJlYWR5IGhhcyB0aGUgcHJpb3JpdHkgZmVlIGluc3RydWN0aW9uO1xuICAgIC8vIHRoZXJlZm9yZSBvbmNlIGluaXRCdWlsZGVyIGlzIGNhbGxlZCAoaXQncyBjYWxsZWQgd2l0aGluIGZyb21JbXBsZW1lbnRhdGlvbiksIGl0IHdpbGwgc2V0IHRoZSB0eEJ1aWxkZXIncyBwcmlvcml0eUZlZSBmaWVsZFxuICAgIC8vIHdoaWNoIHdpbGwgdGhlbiBiZSB1c2VkIGluIHR4QnVpbGRlci5idWlsZCgpIGJ5IHRva2VuVHJhbnNmZXJCdWlsZGVyIHRvIGFkZCB0aGUgc2V0IGNvbXB1dGUgZmVlIGluc3RydWN0aW9uXG4gICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBidWlsdFR4LmlkLFxuICAgICAgJzJ0aWNVNFprRXFkVEhVTHI2TG9iVGdXQmhpbTZFN3dTc2NEaE00Z3p5dUdVbVF5VXdMWWhvcWFpZnV2d21OenpFZjFUNWFlZlZjZ01Ra1NIZEo1bnNyZlonXG4gICAgKTtcbiAgICBidWlsdFR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogJ3Rzb2w6dXNkYycsXG4gICAgfSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIGNvaW46ICd0c29sOnVzZGMnLFxuICAgIH0pO1xuICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAganNvblR4LmlkLnNob3VsZC5lcXVhbCgnMnRpY1U0WmtFcWRUSFVMcjZMb2JUZ1dCaGltNkU3d1NzY0RoTTRnenl1R1VtUXlVd0xZaG9xYWlmdXZ3bU56ekVmMVQ1YWVmVmNnTVFrU0hkSjVuc3JmWicpO1xuICAgIGpzb25UeC5mZWVQYXllci5zaG91bGQuZXF1YWwodGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViKTtcbiAgICBqc29uVHgubm9uY2Uuc2hvdWxkLmVxdWFsKCdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScpO1xuICAgIGpzb25UeC5udW1TaWduYXR1cmVzLnNob3VsZC5lcXVhbCgxKTtcbiAgICBqc29uVHguZHVyYWJsZU5vbmNlLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YixcbiAgICB9KTtcbiAgICBjb25zdCBwcmlvcml0eUZlZUJpZ0ludCA9IEJpZ0ludChwcmlvRmVlTWljcm9MYW1wb3J0cyk7XG4gICAganNvblR4Lmluc3RydWN0aW9uc0RhdGEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZlZTogcHJpb3JpdHlGZWVCaWdJbnQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdTZXRQcmlvcml0eUZlZScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZyb21BZGRyZXNzOiB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5wdWIsXG4gICAgICAgICAgdG9BZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICAgIGFtb3VudDogdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgdG9rZW5OYW1lOiB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5uYW1lVVNEQy50b1N0cmluZygpLFxuICAgICAgICAgIHNvdXJjZUFkZHJlc3M6ICdCNXJKanVWaTdFbjYzaUs2bzNpaktkSndBb1RlMmd3Q1ltSnNWZEhRMmFLVicsXG4gICAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYSm9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IDksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnTWVtbycsXG4gICAgICAgIHBhcmFtczogeyBtZW1vOiAndGVzdCBtZW1vJyB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSX1NJR05FRF9UWF9XSVRIX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICB9KTtcblxuICBkZXNjcmliZSgnTm9uY2UgdGVzdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBub25jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJsb2NrSGFzaCA9ICdyYW5kb21zdHJpbmcnO1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5ub25jZShibG9ja0hhc2gpKS50aHJvdygnSW52YWxpZCBvciBtaXNzaW5nIGJsb2NrSGFzaCwgZ290OiAnICsgYmxvY2tIYXNoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgcGFyYW1zIHVzaW5nIGR1cmFibGUgbm9uY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkUHViS2V5ID0gJ3JhbmRvbXN0cmluZyc7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgICB0eEJ1aWxkZXIubm9uY2UodmFsaWRCbG9ja2hhc2gsIHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogaW52YWxpZFB1YktleSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKS50aHJvdygnSW52YWxpZCBvciBtaXNzaW5nIHdhbGxldE5vbmNlQWRkcmVzcywgZ290OiAnICsgaW52YWxpZFB1YktleSk7XG5cbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgdHhCdWlsZGVyLm5vbmNlKHZhbGlkQmxvY2toYXNoLCB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogaW52YWxpZFB1YktleSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93KCdJbnZhbGlkIG9yIG1pc3NpbmcgYXV0aFdhbGxldEFkZHJlc3MsIGdvdDogJyArIGludmFsaWRQdWJLZXkpO1xuXG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCwge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFjY291bnQucHViLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKS50aHJvdygnSW52YWxpZCBwYXJhbXM6IHdhbGxldE5vbmNlQWRkcmVzcyBjYW5ub3QgYmUgZXF1YWwgdG8gYXV0aFdhbGxldEFkZHJlc3MnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCBmb3IgdmFsaWQgbm9uY2UnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGZvciB2YWxpZCBkdXJhYmxlIG5vbmNlJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PlxuICAgICAgICAgIHR4QnVpbGRlci5ub25jZSh2YWxpZEJsb2NraGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NlbmRlciB0ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIHNlbmRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRQdWJsaWNLZXkgPSAncmFuZG9tc3RyaW5nJztcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZGVyKGludmFsaWRQdWJsaWNLZXkpKS50aHJvdygnSW52YWxpZCBvciBtaXNzaW5nIHNlbmRlciwgZ290OiAnICsgaW52YWxpZFB1YmxpY0tleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGZvciB2YWxpZCBzZW5kZXInLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZUFkZHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRBZGRyZXNzID0geyBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIgfTtcbiAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9IHsgYWRkcmVzczogdGVzdERhdGEucHViS2V5cy5pbnZhbGlkUHViS2V5c1swXSB9O1xuICAgIGZvciAoY29uc3QgYnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh2YWxpZEFkZHJlc3MpKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyhpbnZhbGlkQWRkcmVzcykpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIGFkZHJlc3MgJyArIHRlc3REYXRhLnB1YktleXMuaW52YWxpZFB1YktleXNbMF1cbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICBpdCgndmFsaWRhdGVLZXknLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRLZXkgPSB7IGtleTogdGVzdERhdGEuYXV0aEFjY291bnQucHJ2IH07XG4gICAgY29uc3QgaW52YWxpZEtleSA9IHsga2V5OiB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWIgfTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZUtleSh2YWxpZEtleSkpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoaW52YWxpZEtleSkpLnRocm93RXJyb3IoJ0ludmFsaWQga2V5Jyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgndmFsaWRhdGVSYXdUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZFJhd1R4ID0gdGVzdERhdGEuUkFXX1RYX1NJR05FRDtcbiAgICBjb25zdCBpbnZhbGlkUmF3VHggPSAnQUFBQUFBQUFBQUFBQUFBQUFBQSc7XG4gICAgZm9yIChjb25zdCBidWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih2YWxpZFJhd1R4KSk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKGludmFsaWRSYXdUeCkpLnRocm93RXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgndmFsaWRhdGVWYWx1ZScsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZFZhbHVlID0gbmV3IEJpZ051bWJlcignMTAwMDAwJyk7XG4gICAgY29uc3QgaW52YWxpZFZhbHVlID0gbmV3IEJpZ051bWJlcignLTEwMDAwMCcpO1xuICAgIGZvciAoY29uc3QgYnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlVmFsdWUodmFsaWRWYWx1ZSkpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVWYWx1ZShpbnZhbGlkVmFsdWUpKS50aHJvd0Vycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZU1lbW8nLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRNZW1vID0gJ3Rlc3QgbWVtbyc7XG4gICAgY29uc3QgaW52YWxpZE1lbW8gPVxuICAgICAgJ29vYXdpbmRhb25tYXfDsWRhbXdkb2lhbndkb25hbHNrZG5haW91d2Jkb2lub3dhZG45MGF3bmRvYXduZGFvd2RuYWlvaXV3YmRpb2F1d25kYW91ZG5iYXdvZG5iYTlvd3VkYm5hb3dkbmFhc2Rpamhha3Nka2phc2Rramhhc2tkamhrYXNkYXNkYXNkYXNkYXNkJztcbiAgICBmb3IgKGNvbnN0IGJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgIGJ1aWxkZXIuX2luc3RydWN0aW9uc0RhdGEucHVzaCh7XG4gICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIHRvQWRkcmVzczogJ0NQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyxcbiAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyLnZhbGlkYXRlTWVtbyh2YWxpZE1lbW8pO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVNZW1vKGludmFsaWRNZW1vKSkudGhyb3dFcnJvcignTWVtbyBpcyB0b28gbG9uZycpO1xuICAgICAgc2hvdWxkKChtZW1vOiBzdHJpbmcpID0+IGJ1aWxkZXIudmFsaWRhdGVNZW1vKG1lbW8pKS50aHJvd0Vycm9yKCdJbnZhbGlkIG1lbW8sIGdvdDogdW5kZWZpbmVkJyk7XG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZSgnYWRkIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICBsZXQgTVBDOiBFZGRzYTtcblxuICAgIGl0KCdzaG91bGQgYWRkIHNpZ25hdHVyZSB0byB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVyQnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoYXV0aEFjY291bnQucHViKVxuICAgICAgICAubm9uY2UodmFsaWRCbG9ja2hhc2gpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhbW91bnQ6ICcxMDAwJyB9KTtcbiAgICAgIHRyYW5zZmVyQnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNmZXJCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAvLyBzaWduYXR1cmUgaXMgYmFzZTU4IGVuY29kZWRcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZVswXTtcblxuICAgICAgLy8gdmVyaWZ5IHJlYnVpbHQgdHJhbnNhY3Rpb24gY29udGFpbnMgc2lnbmF0dXJlXG4gICAgICBjb25zdCByYXdUcmFuc2FjdGlvbiA9IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcmVidWlsdFNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1RyYW5zYWN0aW9uKS5idWlsZCgpO1xuICAgICAgcmVidWlsdFNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5zaG91bGQuZGVlcEVxdWFsKHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyQnVpbGRlcjIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKGF1dGhBY2NvdW50LnB1YilcbiAgICAgICAgLm5vbmNlKHZhbGlkQmxvY2toYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiAnMTAwMCcgfSk7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXIyLmFkZFNpZ25hdHVyZSh7IHB1YjogYXV0aEFjY291bnQucHViIH0sIEJ1ZmZlci5mcm9tKGJzNTguZGVjb2RlKHNpZ25hdHVyZSkpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uMiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlcjIuYnVpbGQoKTtcblxuICAgICAgLy8gdmVyaWZ5IHNpZ25hdHVyZXMgYXJlIGNvcnJlY3RcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5zaG91bGQuZGVlcEVxdWFsKHNpZ25lZFRyYW5zYWN0aW9uMi5zaWduYXR1cmUpO1xuXG4gICAgICAvLyB2ZXJpZnkgcmVidWlsdCB0cmFuc2FjdGlvbiBjb250YWlucyBzaWduYXR1cmVcbiAgICAgIGNvbnN0IHJhd1RyYW5zYWN0aW9uMiA9IHNpZ25lZFRyYW5zYWN0aW9uMi50b0Jyb2FkY2FzdEZvcm1hdCgpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHJlYnVpbHRUcmFuc2FjdGlvbjIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHJhbnNhY3Rpb24yKS5idWlsZCgpO1xuICAgICAgcmVidWlsdFRyYW5zYWN0aW9uMi5zaWduYXR1cmUuc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUcmFuc2FjdGlvbjIuc2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGJlZm9yZSgnaW5pdGlhbGl6ZSBtcGMgbW9kdWxlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaGRUcmVlID0gYXdhaXQgRWQyNTUxOUJpcDMySGRUcmVlLmluaXRpYWxpemUoKTtcbiAgICAgIE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoaGRUcmVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIFRTUyBzaWduYXR1cmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMpO1xuICAgICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzKTtcbiAgICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IENfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEMudVNoYXJlLCBbQS55U2hhcmVzWzNdLCBCLnlTaGFyZXNbM11dKTtcblxuICAgICAgY29uc3QgY29tbW9uUHViID0gQV9jb21iaW5lLnBTaGFyZS55O1xuICAgICAgY29uc3Qgc29sUHVibGljS2V5ID0gbmV3IEtleVBhaXIoeyBwdWI6IGNvbW1vblB1YiB9KTtcbiAgICAgIGNvbnN0IHNlbmRlciA9IHNvbFB1YmxpY0tleS5nZXRBZGRyZXNzKCk7XG5cbiAgICAgIGxldCB0cmFuc2ZlckJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm5vbmNlKHZhbGlkQmxvY2toYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiAnMTAwMCcgfSk7XG4gICAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNmZXJCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB1bnNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcblxuICAgICAgLy8gc2lnbmluZyB3aXRoIEEgYW5kIEJcbiAgICAgIGxldCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKHNpZ25hYmxlUGF5bG9hZCwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgICBsZXQgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1sxXV0pO1xuICAgICAgbGV0IEFfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IEJfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0MueVNoYXJlc1syXV0pO1xuICAgICAgbGV0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBCX3NpZ25dKTtcbiAgICAgIGxldCByYXdTaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWduYXR1cmUuUiwgJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYXR1cmUuc2lnbWEsICdoZXgnKV0pO1xuXG4gICAgICB0cmFuc2ZlckJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm5vbmNlKHZhbGlkQmxvY2toYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiAnMTAwMCcgfSk7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIgfSwgcmF3U2lnbmF0dXJlKTtcbiAgICAgIGxldCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlci5idWlsZCgpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbi5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uaWQuc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQ1xuICAgICAgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEFfY29tYmluZS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgICAgbGV0IENfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUoc2lnbmFibGVQYXlsb2FkLCBDX2NvbWJpbmUucFNoYXJlLCBbQ19jb21iaW5lLmpTaGFyZXNbMV1dKTtcbiAgICAgIEFfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0IueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IENfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQ19zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzNdXSwgW0IueVNoYXJlc1szXV0pO1xuICAgICAgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ24sIENfc2lnbl0pO1xuICAgICAgcmF3U2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oc2lnbmF0dXJlLlIsICdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlLnNpZ21hLCAnaGV4JyldKTtcblxuICAgICAgdHJhbnNmZXJCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5ub25jZSh2YWxpZEJsb2NraGFzaClcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuc2VuZCh7IGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGFtb3VudDogJzEwMDAnIH0pO1xuICAgICAgdHJhbnNmZXJCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyIH0sIHJhd1NpZ25hdHVyZSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlci5idWlsZCgpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbi5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uaWQuc2hvdWxkLmVxdWFsKGJzNTguZW5jb2RlKHJhd1NpZ25hdHVyZSkpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQiBhbmQgQ1xuICAgICAgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgICAgQ19zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIENfY29tYmluZS5wU2hhcmUsIFtDX2NvbWJpbmUualNoYXJlc1syXV0pO1xuICAgICAgQl9zaWduID0gTVBDLnNpZ24oc2lnbmFibGVQYXlsb2FkLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQ19zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQS55U2hhcmVzWzJdXSk7XG4gICAgICBDX3NpZ24gPSBNUEMuc2lnbihzaWduYWJsZVBheWxvYWQsIENfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1szXV0sIFtBLnlTaGFyZXNbM11dKTtcbiAgICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQl9zaWduLCBDX3NpZ25dKTtcbiAgICAgIHJhd1NpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKHNpZ25hdHVyZS5SLCAnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5zaWdtYSwgJ2hleCcpXSk7XG5cbiAgICAgIHRyYW5zZmVyQnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyKVxuICAgICAgICAubm9uY2UodmFsaWRCbG9ja2hhc2gpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhbW91bnQ6ICcxMDAwJyB9KTtcbiAgICAgIHRyYW5zZmVyQnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlciB9LCByYXdTaWduYXR1cmUpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0cmFuc2ZlckJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChiczU4LmVuY29kZShyYXdTaWduYXR1cmUpKTtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLmlkLnNob3VsZC5lcXVhbChiczU4LmVuY29kZShyYXdTaWduYXR1cmUpKTtcblxuICAgICAgY29uc3QgcmF3VHJhbnNhY3Rpb24gPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHJlYnVpbHRUcmFuc2FjdGlvbiA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUcmFuc2FjdGlvbikuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUcmFuc2FjdGlvbi5pZC5zaG91bGQuZXF1YWwoc2lnbmVkVHJhbnNhY3Rpb24uaWQpO1xuICAgICAgcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hdHVyZS5zaG91bGQuZGVlcEVxdWFsKHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBUU1MgSEQgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICAgIGNvbnN0IEIgPSBNUEMua2V5U2hhcmUoMiwgMiwgMyk7XG4gICAgICBjb25zdCBDID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuXG4gICAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG4gICAgICBjb25zdCBCX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0EueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAxMDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBwYXRoID0gYG0vJHtpbmRleH1gO1xuXG4gICAgICAgIGNvbnN0IEFfc3Via2V5ID0gTVBDLmtleURlcml2ZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSwgcGF0aCk7XG4gICAgICAgIGNvbnN0IEJfc3Via2V5ID0gTVBDLmtleUNvbWJpbmUoQi51U2hhcmUsIFtBX3N1YmtleS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcblxuICAgICAgICBjb25zdCBzb2xQdWJsaWNLZXkgPSBuZXcgS2V5UGFpcih7IHB1YjogQV9zdWJrZXkucFNoYXJlLnkgfSk7XG4gICAgICAgIGNvbnN0IHNlbmRlciA9IHNvbFB1YmxpY0tleS5nZXRBZGRyZXNzKCk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAgIC5zZW5kZXIoc2VuZGVyKVxuICAgICAgICAgIC5ub25jZSh2YWxpZEJsb2NraGFzaClcbiAgICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhbW91bnQ6ICcxMDAwJyB9KTtcbiAgICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRyYW5zZmVyQnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB1bnNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcblxuICAgICAgICBjb25zdCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKHNpZ25hYmxlUGF5bG9hZCwgQV9zdWJrZXkucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dKTtcbiAgICAgICAgY29uc3QgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIEJfc3Via2V5LnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG4gICAgICAgIGNvbnN0IEFfc2lnbiA9IE1QQy5zaWduKHNpZ25hYmxlUGF5bG9hZCwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgICBjb25zdCBCX3NpZ24gPSBNUEMuc2lnbihzaWduYWJsZVBheWxvYWQsIEJfc2lnbl9zaGFyZS54U2hhcmUsIFtBX3NpZ25fc2hhcmUuclNoYXJlc1syXV0sIFtDLnlTaGFyZXNbMl1dKTtcblxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbiwgQl9zaWduXSk7XG4gICAgICAgIGNvbnN0IHJhd1NpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKHNpZ25hdHVyZS5SLCAnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZS5zaWdtYSwgJ2hleCcpXSk7XG5cbiAgICAgICAgdHJhbnNmZXJCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyIH0sIHJhd1NpZ25hdHVyZSk7XG5cbiAgICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0cmFuc2ZlckJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoYnM1OC5lbmNvZGUocmF3U2lnbmF0dXJlKSk7XG4gICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uLmlkLnNob3VsZC5lcXVhbChiczU4LmVuY29kZShyYXdTaWduYXR1cmUpKTtcblxuICAgICAgICBjb25zdCByYXdUcmFuc2FjdGlvbiA9IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCkgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHJhbnNhY3Rpb24pLmJ1aWxkKCk7XG4gICAgICAgIHJlYnVpbHRUcmFuc2FjdGlvbi5pZC5zaG91bGQuZXF1YWwoc2lnbmVkVHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmF0dXJlLnNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transferBuilder.ts"],"names":[],"mappings":""}
|