@bitgo-beta/sdk-coin-stx 1.1.1-beta.202 → 1.1.1-beta.2021

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.
Files changed (88) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +24 -9
  4. package/dist/src/lib/abstractContractBuilder.js +2 -2
  5. package/dist/src/lib/btcAddressUtils.d.ts +30 -0
  6. package/dist/src/lib/btcAddressUtils.d.ts.map +1 -0
  7. package/dist/src/lib/btcAddressUtils.js +134 -0
  8. package/dist/src/lib/constants.d.ts +4 -1
  9. package/dist/src/lib/constants.d.ts.map +1 -1
  10. package/dist/src/lib/constants.js +8 -3
  11. package/dist/src/lib/contractBuilder.js +10 -10
  12. package/dist/src/lib/fungibleTokenTransferBuilder.d.ts +62 -0
  13. package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -0
  14. package/dist/src/lib/fungibleTokenTransferBuilder.js +131 -0
  15. package/dist/src/lib/iface.d.ts +61 -0
  16. package/dist/src/lib/iface.d.ts.map +1 -1
  17. package/dist/src/lib/iface.js +1 -1
  18. package/dist/src/lib/index.d.ts +1 -0
  19. package/dist/src/lib/index.d.ts.map +1 -1
  20. package/dist/src/lib/index.js +24 -9
  21. package/dist/src/lib/keyPair.js +18 -19
  22. package/dist/src/lib/sbtcWithdrawBuilder.d.ts +27 -0
  23. package/dist/src/lib/sbtcWithdrawBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/sbtcWithdrawBuilder.js +124 -0
  25. package/dist/src/lib/sendmanyBuilder.js +11 -11
  26. package/dist/src/lib/transaction.d.ts.map +1 -1
  27. package/dist/src/lib/transaction.js +31 -15
  28. package/dist/src/lib/transactionBuilder.js +12 -12
  29. package/dist/src/lib/transactionBuilderFactory.d.ts +4 -0
  30. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  31. package/dist/src/lib/transactionBuilderFactory.js +16 -2
  32. package/dist/src/lib/transferBuilder.js +4 -4
  33. package/dist/src/lib/utils.d.ts +40 -2
  34. package/dist/src/lib/utils.d.ts.map +1 -1
  35. package/dist/src/lib/utils.js +171 -63
  36. package/dist/src/register.d.ts.map +1 -1
  37. package/dist/src/register.js +5 -1
  38. package/dist/src/sip10Token.d.ts +22 -0
  39. package/dist/src/sip10Token.d.ts.map +1 -0
  40. package/dist/src/sip10Token.js +128 -0
  41. package/dist/src/stx.d.ts +146 -2
  42. package/dist/src/stx.d.ts.map +1 -1
  43. package/dist/src/stx.js +420 -11
  44. package/dist/src/tstx.js +1 -1
  45. package/dist/test/fixtures.d.ts +119 -0
  46. package/dist/test/fixtures.d.ts.map +1 -0
  47. package/dist/test/fixtures.js +147 -0
  48. package/dist/test/unit/btcAddressUtils.d.ts +2 -0
  49. package/dist/test/unit/btcAddressUtils.d.ts.map +1 -0
  50. package/dist/test/unit/btcAddressUtils.js +82 -0
  51. package/dist/test/unit/keyPair.d.ts +2 -0
  52. package/dist/test/unit/keyPair.d.ts.map +1 -0
  53. package/dist/test/unit/keyPair.js +144 -0
  54. package/dist/test/unit/resources.d.ts +97 -0
  55. package/dist/test/unit/resources.d.ts.map +1 -0
  56. package/dist/test/unit/resources.js +144 -0
  57. package/dist/test/unit/sip10Token.d.ts +2 -0
  58. package/dist/test/unit/sip10Token.d.ts.map +1 -0
  59. package/dist/test/unit/sip10Token.js +374 -0
  60. package/dist/test/unit/stx.d.ts +2 -0
  61. package/dist/test/unit/stx.d.ts.map +1 -0
  62. package/dist/test/unit/stx.js +470 -0
  63. package/dist/test/unit/transaction.d.ts +2 -0
  64. package/dist/test/unit/transaction.d.ts.map +1 -0
  65. package/dist/test/unit/transaction.js +83 -0
  66. package/dist/test/unit/transactionBuilder/contractBuilder.d.ts +2 -0
  67. package/dist/test/unit/transactionBuilder/contractBuilder.d.ts.map +1 -0
  68. package/dist/test/unit/transactionBuilder/contractBuilder.js +421 -0
  69. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts +2 -0
  70. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts.map +1 -0
  71. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +187 -0
  72. package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.d.ts +2 -0
  73. package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.d.ts.map +1 -0
  74. package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.js +306 -0
  75. package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts +2 -0
  76. package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts.map +1 -0
  77. package/dist/test/unit/transactionBuilder/sendmanyBuilder.js +140 -0
  78. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  79. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  80. package/dist/test/unit/transactionBuilder/transferBuilder.js +347 -0
  81. package/dist/test/unit/util.d.ts +2 -0
  82. package/dist/test/unit/util.d.ts.map +1 -0
  83. package/dist/test/unit/util.js +340 -0
  84. package/dist/tsconfig.tsbuildinfo +1 -0
  85. package/package.json +16 -12
  86. package/.eslintignore +0 -5
  87. package/.mocharc.yml +0 -8
  88. package/CHANGELOG.md +0 -107
@@ -0,0 +1,140 @@
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 network_1 = require("@stacks/network");
41
+ const transactions_1 = require("@stacks/transactions");
42
+ const principalCV_1 = require("@stacks/transactions/dist/clarity/types/principalCV");
43
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
44
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
45
+ const statics_1 = require("@bitgo-beta/statics");
46
+ const src_1 = require("../../../src");
47
+ const testData = __importStar(require("../resources"));
48
+ describe('Stacks: Send Many Builder', function () {
49
+ const coinName = 'stx';
50
+ const coinNameTest = 'tstx';
51
+ let bitgo;
52
+ before(function () {
53
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
54
+ env: 'mock',
55
+ });
56
+ bitgo.initializeTestVars();
57
+ bitgo.safeRegister('stx', src_1.Stx.createInstance);
58
+ bitgo.safeRegister('tstx', src_1.Tstx.createInstance);
59
+ });
60
+ describe('Stx Send Many Builder', () => {
61
+ const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinNameTest));
62
+ const factoryProd = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
63
+ const initTxBuilder = () => {
64
+ const txBuilder = factory.getSendmanyBuilder();
65
+ txBuilder.fee({ fee: '532' });
66
+ txBuilder.nonce(45);
67
+ return txBuilder;
68
+ };
69
+ it('should select the right network', function () {
70
+ should_1.default.equal(factory.getSendmanyBuilder().coinName(), 'tstx');
71
+ should_1.default.equal(factoryProd.getSendmanyBuilder().coinName(), 'stx');
72
+ // used type any to access protected properties
73
+ const txBuilder = factory.getSendmanyBuilder();
74
+ const txBuilderProd = factoryProd.getSendmanyBuilder();
75
+ txBuilder._network.should.deepEqual(new network_1.StacksTestnet());
76
+ txBuilderProd._network.should.deepEqual(new network_1.StacksMainnet());
77
+ });
78
+ describe('should build ', function () {
79
+ it('a multisig send many transaction with memo', async () => {
80
+ const builder = initTxBuilder();
81
+ // corresponding public keys
82
+ const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
83
+ const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
84
+ builder.fromPubKey(pubKeyStrings);
85
+ for (const recipient of testData.sendManyRecipients) {
86
+ builder.send(recipient);
87
+ }
88
+ builder.sign({ key: testData.prvKeysString[0] });
89
+ builder.sign({ key: testData.prvKeysString[1] });
90
+ const tx = await builder.build();
91
+ const txJson = tx.toJson();
92
+ txJson.id.should.equal('01793eeb993d15791ea9af8910d867407803fe4c7d1db2dac592a2e8200de12a');
93
+ txJson.fee.should.equal('532');
94
+ txJson.from.should.equal('SN3KT9DVM9TCTAHV0S9VEAKTDG7JBC0K26ZMWEBNT');
95
+ txJson.nonce.should.equal(45);
96
+ const { contractName, contractAddress, functionName, functionArgs } = txJson.payload;
97
+ contractAddress.should.equal(testData.SEND_MANY_CONTRACT_ADDRESS_WITH_MEMO);
98
+ contractName.should.equal(testData.SEND_MANY_CONTRACT_NAME_WITH_MEMO);
99
+ functionName.should.equal(testData.SEND_MANY_CONTRACT_FUNCTION_NAME_WITH_MEMO);
100
+ functionArgs.length.should.equal(1);
101
+ functionArgs[0].should.have.property('list');
102
+ const { list } = functionArgs[0];
103
+ list.length.should.equal(testData.sendManyRecipients.length);
104
+ for (let i = 0; i < testData.sendManyRecipients.length; i++) {
105
+ list[i].data.should.have.properties(['to', 'ustx', 'memo']);
106
+ (0, principalCV_1.principalToString)(list[i].data.to).should.equal(testData.sendManyRecipients[i].address);
107
+ list[i].data.memo.buffer.toString('ascii').should.equal(testData.sendManyRecipients[i].memo);
108
+ list[i].data.ustx.value.should.equal(testData.sendManyRecipients[i].amount);
109
+ }
110
+ tx.outputs.length.should.equal(testData.sendManyRecipients.length);
111
+ for (let i = 0; i < testData.sendManyRecipients.length; i++) {
112
+ tx.outputs[i].address.should.equal(testData.sendManyRecipients[i].address);
113
+ tx.outputs[i].value.should.equal(testData.sendManyRecipients[i].amount);
114
+ }
115
+ tx.inputs.length.should.equal(1);
116
+ tx.inputs[0].address.should.equal('SN3KT9DVM9TCTAHV0S9VEAKTDG7JBC0K26ZMWEBNT');
117
+ tx.inputs[0].value.should.equal('6000000');
118
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_SEND_MANY_WITH_MEMO);
119
+ });
120
+ it('a multisig send-many unsigned transfer transaction with memo from raw tx', async () => {
121
+ const builder = factory.from(testData.UNSIGNED_SEND_MANY_WITH_MEMO);
122
+ const tx = await builder.build();
123
+ tx.toBroadcastFormat().should.equal(testData.UNSIGNED_SEND_MANY_WITH_MEMO);
124
+ });
125
+ it('a unsigned send-many signed transfer transaction with memo from raw tx', async () => {
126
+ const builder = factory.from(testData.SIGNED_SEND_MANY_WITH_MEMO);
127
+ const tx = await builder.build();
128
+ tx.toBroadcastFormat().should.equal(testData.SIGNED_SEND_MANY_WITH_MEMO);
129
+ });
130
+ it('sign an unsigned tx from a raw tx', async () => {
131
+ const builder = factory.from(testData.UNSIGNED_SEND_MANY_WITH_MEMO);
132
+ builder.sign({ key: testData.prvKeysString[0] });
133
+ builder.sign({ key: testData.prvKeysString[1] });
134
+ const tx = await builder.build();
135
+ tx.toBroadcastFormat().should.equal(testData.SIGNED_SEND_MANY_WITH_MEMO);
136
+ });
137
+ });
138
+ });
139
+ });
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZG1hbnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9zZW5kbWFueUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBQStEO0FBQy9ELHVEQUE0RTtBQUM1RSxxRkFBd0Y7QUFFeEYsbURBQStEO0FBQy9ELGlEQUErQztBQUMvQyxpREFBNEM7QUFFNUMsc0NBQWlEO0FBQ2pELHVEQUF5QztBQUV6QyxRQUFRLENBQUMsMkJBQTJCLEVBQUU7SUFDcEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztJQUM1QixJQUFJLEtBQW1CLENBQUM7SUFFeEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUU7WUFDbkMsR0FBRyxFQUFFLE1BQU07U0FDWixDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQU0sQ0FBQyx5QkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxZQUFNLENBQUMseUJBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FB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Q0FBQztnQkFDakMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFN0YWNrc1Rlc3RuZXQsIFN0YWNrc01haW5uZXQgfSBmcm9tICdAc3RhY2tzL25ldHdvcmsnO1xuaW1wb3J0IHsgcHViS2V5ZnJvbVByaXZLZXksIHB1YmxpY0tleVRvU3RyaW5nIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgcHJpbmNpcGFsVG9TdHJpbmcgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucy9kaXN0L2NsYXJpdHkvdHlwZXMvcHJpbmNpcGFsQ1YnO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBTdHgsIFRzdHgsIFN0eExpYiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5kZXNjcmliZSgnU3RhY2tzOiBTZW5kIE1hbnkgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnc3R4JztcbiAgY29uc3QgY29pbk5hbWVUZXN0ID0gJ3RzdHgnO1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7XG4gICAgICBlbnY6ICdtb2NrJyxcbiAgICB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3N0eCcsIFN0eC5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0c3R4JywgVHN0eC5jcmVhdGVJbnN0YW5jZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTdHggU2VuZCBNYW55IEJ1aWxkZXInLCAoKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoY29pbk5hbWVUZXN0KSk7XG4gICAgY29uc3QgZmFjdG9yeVByb2QgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG5cbiAgICBjb25zdCBpbml0VHhCdWlsZGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTZW5kbWFueUJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICc1MzInIH0pO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKDQ1KTtcbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGl0KCdzaG91bGQgc2VsZWN0IHRoZSByaWdodCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhY3RvcnkuZ2V0U2VuZG1hbnlCdWlsZGVyKCkuY29pbk5hbWUoKSwgJ3RzdHgnKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWN0b3J5UHJvZC5nZXRTZW5kbWFueUJ1aWxkZXIoKS5jb2luTmFtZSgpLCAnc3R4Jyk7XG4gICAgICAvLyB1c2VkIHR5cGUgYW55IHRvIGFjY2VzcyBwcm90ZWN0ZWQgcHJvcGVydGllc1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBmYWN0b3J5LmdldFNlbmRtYW55QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyUHJvZDogYW55ID0gZmFjdG9yeVByb2QuZ2V0U2VuZG1hbnlCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlci5fbmV0d29yay5zaG91bGQuZGVlcEVxdWFsKG5ldyBTdGFja3NUZXN0bmV0KCkpO1xuICAgICAgdHhCdWlsZGVyUHJvZC5fbmV0d29yay5zaG91bGQuZGVlcEVxdWFsKG5ldyBTdGFja3NNYWlubmV0KCkpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnYSBtdWx0aXNpZyBzZW5kIG1hbnkgdHJhbnNhY3Rpb24gd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuXG4gICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleXNcbiAgICAgICAgY29uc3QgcHViS2V5cyA9IHRlc3REYXRhLnBydktleXNTdHJpbmcubWFwKHB1YktleWZyb21Qcml2S2V5KTtcbiAgICAgICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleXMubWFwKHB1YmxpY0tleVRvU3RyaW5nKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHB1YktleVN0cmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlY2lwaWVudCBvZiB0ZXN0RGF0YS5zZW5kTWFueVJlY2lwaWVudHMpIHtcbiAgICAgICAgICBidWlsZGVyLnNlbmQocmVjaXBpZW50KTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydktleXNTdHJpbmdbMF0gfSk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2S2V5c1N0cmluZ1sxXSB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICB0eEpzb24uaWQuc2hvdWxkLmVxdWFsKCcwMTc5M2VlYjk5M2QxNTc5MWVhOWFmODkxMGQ4Njc0MDc4MDNmZTRjN2QxZGIyZGFjNTkyYTJlODIwMGRlMTJhJyk7XG4gICAgICAgIHR4SnNvbi5mZWUuc2hvdWxkLmVxdWFsKCc1MzInKTtcbiAgICAgICAgdHhKc29uLmZyb20uc2hvdWxkLmVxdWFsKCdTTjNLVDlEVk05VENUQUhWMFM5VkVBS1RERzdKQkMwSzI2Wk1XRUJOVCcpO1xuICAgICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDQ1KTtcbiAgICAgICAgY29uc3QgeyBjb250cmFjdE5hbWUsIGNvbnRyYWN0QWRkcmVzcywgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkFyZ3MgfSA9IHR4SnNvbi5wYXlsb2FkO1xuICAgICAgICBjb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLlNFTkRfTUFOWV9DT05UUkFDVF9BRERSRVNTX1dJVEhfTUVNTyk7XG4gICAgICAgIGNvbnRyYWN0TmFtZS5zaG91bGQuZXF1YWwodGVzdERhdGEuU0VORF9NQU5ZX0NPTlRSQUNUX05BTUVfV0lUSF9NRU1PKTtcbiAgICAgICAgZnVuY3Rpb25OYW1lLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5TRU5EX01BTllfQ09OVFJBQ1RfRlVOQ1RJT05fTkFNRV9XSVRIX01FTU8pO1xuICAgICAgICBmdW5jdGlvbkFyZ3MubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgZnVuY3Rpb25BcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCdsaXN0Jyk7XG4gICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gZnVuY3Rpb25BcmdzWzBdO1xuICAgICAgICBsaXN0Lmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGlzdFtpXS5kYXRhLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWyd0bycsICd1c3R4JywgJ21lbW8nXSk7XG4gICAgICAgICAgcHJpbmNpcGFsVG9TdHJpbmcobGlzdFtpXS5kYXRhLnRvKS5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzW2ldLmFkZHJlc3MpO1xuICAgICAgICAgIGxpc3RbaV0uZGF0YS5tZW1vLmJ1ZmZlci50b1N0cmluZygnYXNjaWknKS5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzW2ldLm1lbW8pO1xuICAgICAgICAgIGxpc3RbaV0uZGF0YS51c3R4LnZhbHVlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kTWFueVJlY2lwaWVudHNbaV0uYW1vdW50KTtcbiAgICAgICAgfVxuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdHgub3V0cHV0c1tpXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kTWFueVJlY2lwaWVudHNbaV0uYWRkcmVzcyk7XG4gICAgICAgICAgdHgub3V0cHV0c1tpXS52YWx1ZS5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzW2ldLmFtb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnU04zS1Q5RFZNOVRDVEFIVjBTOVZFQUtUREc3SkJDMEsyNlpNV0VCTlQnKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnNjAwMDAwMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9TRU5EX01BTllfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBtdWx0aXNpZyBzZW5kLW1hbnkgdW5zaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBtZW1vIGZyb20gcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlVOU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuVU5TSUdORURfU0VORF9NQU5ZX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdW5zaWduZWQgc2VuZC1tYW55IHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1lbW8gZnJvbSByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaWduIGFuIHVuc2lnbmVkIHR4IGZyb20gYSByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVU5TSUdORURfU0VORF9NQU5ZX1dJVEhfTUVNTyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2S2V5c1N0cmluZ1swXSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnZLZXlzU3RyaW5nWzFdIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transferBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,347 @@
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 assert_1 = __importDefault(require("assert"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const network_1 = require("@stacks/network");
42
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
43
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
44
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
45
+ const statics_1 = require("@bitgo-beta/statics");
46
+ const src_1 = require("../../../src");
47
+ const testData = __importStar(require("../resources"));
48
+ const { KeyPair } = src_1.StxLib;
49
+ describe('Stacks: Send Many Builder', function () {
50
+ const coinName = 'stx';
51
+ const coinNameTest = 'tstx';
52
+ let bitgo;
53
+ before(function () {
54
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
55
+ env: 'mock',
56
+ });
57
+ bitgo.initializeTestVars();
58
+ bitgo.safeRegister('stx', src_1.Stx.createInstance);
59
+ bitgo.safeRegister('tstx', src_1.Tstx.createInstance);
60
+ });
61
+ describe('Stx Transfer Builder', () => {
62
+ const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinNameTest));
63
+ const factoryProd = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
64
+ const initTxBuilder = () => {
65
+ const txBuilder = factory.getTransferBuilder();
66
+ txBuilder.fee({ fee: '180' });
67
+ txBuilder.nonce(0);
68
+ txBuilder.to(testData.TX_RECIEVER.address);
69
+ txBuilder.amount('1000');
70
+ return txBuilder;
71
+ };
72
+ describe('transfer builder environment', function () {
73
+ it('should select the right network', function () {
74
+ should_1.default.equal(factory.getTransferBuilder().coinName(), 'tstx');
75
+ should_1.default.equal(factoryProd.getTransferBuilder().coinName(), 'stx');
76
+ // used type any to access protected properties
77
+ const txBuilder = factory.getTransferBuilder();
78
+ const txBuilderProd = factoryProd.getTransferBuilder();
79
+ txBuilder._network.should.deepEqual(new network_1.StacksTestnet());
80
+ txBuilderProd._network.should.deepEqual(new network_1.StacksMainnet());
81
+ });
82
+ });
83
+ describe('should build ', () => {
84
+ it('a signed transfer transaction', async () => {
85
+ const builder = initTxBuilder();
86
+ builder.fromPubKey(testData.TX_SENDER.pub);
87
+ builder.sign({ key: testData.TX_SENDER.prv });
88
+ const tx = await builder.build();
89
+ const txJson = tx.toJson();
90
+ // should.deepEqual(tx.signature.length, 1);
91
+ should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
92
+ should_1.default.deepEqual(txJson.payload.amount, '1000');
93
+ should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
94
+ should_1.default.deepEqual(txJson.nonce, 0);
95
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
96
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
97
+ tx.type.should.equal(sdk_core_1.TransactionType.Send);
98
+ tx.outputs.length.should.equal(1);
99
+ tx.outputs[0].address.should.equal(testData.TX_RECIEVER.address);
100
+ tx.outputs[0].value.should.equal('1000');
101
+ tx.inputs.length.should.equal(1);
102
+ tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
103
+ tx.inputs[0].value.should.equal('1000');
104
+ });
105
+ it('a transfer transaction with memo', async () => {
106
+ const builder = initTxBuilder();
107
+ builder.fromPubKey(testData.TX_SENDER.pub);
108
+ builder.memo('This is an example');
109
+ builder.sign({ key: testData.TX_SENDER.prv });
110
+ const tx = await builder.build();
111
+ const txJson = tx.toJson();
112
+ should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
113
+ should_1.default.deepEqual(txJson.payload.amount, '1000');
114
+ should_1.default.deepEqual(txJson.payload.memo, 'This is an example');
115
+ should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
116
+ should_1.default.deepEqual(txJson.nonce, 0);
117
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
118
+ });
119
+ it('an unsigned multisig signed and verified', async () => {
120
+ const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
121
+ const amount = '1000';
122
+ const memo = 'test';
123
+ const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
124
+ const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
125
+ const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
126
+ const txBuilder = factory.getTransferBuilder();
127
+ txBuilder.fee({
128
+ fee: '180',
129
+ });
130
+ txBuilder.to(destination);
131
+ txBuilder.amount(amount);
132
+ txBuilder.nonce(1);
133
+ txBuilder.fromPubKey([kp.getKeys().pub, kp1.getKeys().pub, kp2.getKeys().pub]);
134
+ txBuilder.numberSignatures(2);
135
+ txBuilder.memo(memo);
136
+ const tx = await txBuilder.build(); // unsigned multisig tx
137
+ const txBuilder2 = factory.getTransferBuilder();
138
+ txBuilder2.from(tx.toBroadcastFormat());
139
+ txBuilder2.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
140
+ txBuilder2.sign({ key: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
141
+ txBuilder.fromPubKey([kp.getKeys().pub, kp1.getKeys().pub, kp2.getKeys().pub]);
142
+ const signedTx = await txBuilder2.build(); // signed multisig tx
143
+ const txBuilder3 = factory.getTransferBuilder();
144
+ txBuilder3.from(signedTx.toBroadcastFormat());
145
+ const remake = await txBuilder3.build();
146
+ should_1.default.deepEqual(remake.toBroadcastFormat(), signedTx.toBroadcastFormat());
147
+ });
148
+ it('an half signed tx', async () => {
149
+ const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
150
+ const amount = '1000';
151
+ const memo = 'test';
152
+ const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
153
+ const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
154
+ const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
155
+ const txBuilder = factory.getTransferBuilder();
156
+ txBuilder.fee({
157
+ fee: '180',
158
+ });
159
+ txBuilder.to(destination);
160
+ txBuilder.amount(amount);
161
+ txBuilder.nonce(1);
162
+ txBuilder.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
163
+ txBuilder.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
164
+ txBuilder.numberSignatures(2);
165
+ txBuilder.memo(memo);
166
+ const tx = await txBuilder.build(); // half signed multisig tx
167
+ should_1.default.deepEqual(tx.signature.length, 1);
168
+ const txBuilder2 = factory.getTransferBuilder();
169
+ txBuilder2.from(tx.toBroadcastFormat());
170
+ txBuilder2.sign({ key: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
171
+ txBuilder2.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
172
+ const signedTx = await txBuilder2.build();
173
+ should_1.default.deepEqual(signedTx.toBroadcastFormat(), '808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000100000000000000b4000000030201091538373641a50a4ebd6f653bb7b477489aceec50eff963072a838d2eaf50e4784c7c6d1490f57b899f0f04c215fce9176d9bb4ce19bfb07499c48878675a1f02008074202e04a7c777b4cdd26ad3fd35194311536113666d81a3840148e59eb43f274d88768ef1202d55633bfdcde8c6057932107354f406af6c378b6ea6b75d1a00038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d000203020000000000051a1ae3f911d8f1d46d7416bfbe4b593fd41eac19cb00000000000003e874657374000000000000000000000000000000000000000000000000000000000000');
174
+ should_1.default.deepEqual(signedTx.signature.length, 2);
175
+ });
176
+ it('an half signed tx with xprv', async () => {
177
+ const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
178
+ const amount = '1000';
179
+ const memo = 'test';
180
+ const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
181
+ const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
182
+ const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
183
+ const txBuilder = factory.getTransferBuilder();
184
+ txBuilder.fee({
185
+ fee: '180',
186
+ });
187
+ txBuilder.to(destination);
188
+ txBuilder.amount(amount);
189
+ txBuilder.nonce(1);
190
+ txBuilder.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
191
+ txBuilder.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
192
+ txBuilder.numberSignatures(2);
193
+ txBuilder.memo(memo);
194
+ const tx = await txBuilder.build(); // half signed multisig tx
195
+ should_1.default.deepEqual(tx.signature.length, 1);
196
+ const txBuilder2 = factory.getTransferBuilder();
197
+ txBuilder2.from(tx.toBroadcastFormat());
198
+ txBuilder2.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
199
+ const extendedKey = (0, sdk_core_1.rawPrvToExtendedKeys)(kp1.getKeys(false).prv);
200
+ txBuilder2.sign({ key: extendedKey.xprv });
201
+ const signedTx = await txBuilder2.build();
202
+ should_1.default.deepEqual(signedTx.toBroadcastFormat(), '808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000100000000000000b4000000030201091538373641a50a4ebd6f653bb7b477489aceec50eff963072a838d2eaf50e4784c7c6d1490f57b899f0f04c215fce9176d9bb4ce19bfb07499c48878675a1f02008074202e04a7c777b4cdd26ad3fd35194311536113666d81a3840148e59eb43f274d88768ef1202d55633bfdcde8c6057932107354f406af6c378b6ea6b75d1a00038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d000203020000000000051a1ae3f911d8f1d46d7416bfbe4b593fd41eac19cb00000000000003e874657374000000000000000000000000000000000000000000000000000000000000');
203
+ should_1.default.deepEqual(signedTx.signature.length, 2);
204
+ });
205
+ it('a multisig transfer transaction', async () => {
206
+ const builder = initTxBuilder();
207
+ builder.memo('test memo');
208
+ builder.sign({ key: testData.prv1 });
209
+ builder.sign({ key: testData.prv2 });
210
+ builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
211
+ const tx = await builder.build();
212
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.MULTI_SIG_SIGNED_TRANSACTION);
213
+ should_1.default.deepEqual(tx.signature.length, 2);
214
+ });
215
+ it('a multisig serialized transfer transaction', async () => {
216
+ const builder = factory.from(testData.MULTI_SIG_SIGNED_TRANSACTION);
217
+ const tx = await builder.build();
218
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.MULTI_SIG_SIGNED_TRANSACTION);
219
+ });
220
+ it('a transfer transaction signed multiple times', async () => {
221
+ const builder = initTxBuilder();
222
+ builder.memo('test memo');
223
+ builder.sign({ key: testData.prv1 });
224
+ builder.sign({ key: testData.prv2 });
225
+ builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
226
+ builder.numberSignatures(2);
227
+ const tx = await builder.build();
228
+ const txJson = tx.toJson();
229
+ should_1.default.deepEqual(tx.signature.length, 2);
230
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
231
+ should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
232
+ should_1.default.deepEqual(txJson.payload.memo, 'test memo');
233
+ should_1.default.deepEqual(txJson.payload.amount, '1000');
234
+ });
235
+ it('a transfer transaction with amount 0', async () => {
236
+ const builder = initTxBuilder();
237
+ builder.amount('0');
238
+ builder.fromPubKey(testData.TX_SENDER.pub);
239
+ builder.sign({ key: testData.TX_SENDER.prv });
240
+ const tx = await builder.build();
241
+ const txJson = tx.toJson();
242
+ should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
243
+ should_1.default.deepEqual(txJson.payload.amount, '0');
244
+ should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
245
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
246
+ });
247
+ it('get pubkey of a transfer transaction signed 1', async () => {
248
+ const txBuilder2 = factory.getTransferBuilder();
249
+ txBuilder2.from(testData.SIGNED_TRANSACTION_PK_1_3);
250
+ should_1.default.deepEqual(txBuilder2._fromPubKeys, [testData.pub1, testData.pub2, testData.pub3]);
251
+ });
252
+ it('get pubkey of a transfer transaction signed 2', async () => {
253
+ const txBuilder2 = factory.getTransferBuilder();
254
+ txBuilder2.from(testData.SIGNED_TRANSACTION_PK_2_3);
255
+ should_1.default.deepEqual(txBuilder2._fromPubKeys, [testData.pub1, testData.pub2, testData.pub3]);
256
+ });
257
+ it('a transfer transaction signed multiple times with mid key no signer', async () => {
258
+ const builder = initTxBuilder();
259
+ builder.memo('test');
260
+ builder.sign({ key: testData.prv1 });
261
+ builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
262
+ builder.numberSignatures(2);
263
+ const tx = await builder.build();
264
+ const txBuilder2 = factory.getTransferBuilder();
265
+ txBuilder2.from(tx.toBroadcastFormat());
266
+ txBuilder2.sign({ key: testData.prv3 });
267
+ const signedTx = await txBuilder2.build();
268
+ const txJson = signedTx.toJson();
269
+ should_1.default.deepEqual(signedTx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_1_3);
270
+ should_1.default.deepEqual(signedTx.signature.length, 2);
271
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
272
+ should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
273
+ should_1.default.deepEqual(txJson.payload.memo, 'test');
274
+ should_1.default.deepEqual(txJson.payload.amount, '1000');
275
+ });
276
+ it('a transfer transaction signed multiple times with first key no signer', async () => {
277
+ const builder = initTxBuilder();
278
+ builder.memo('test');
279
+ builder.sign({ key: testData.prv2 });
280
+ builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
281
+ builder.numberSignatures(2);
282
+ const tx = await builder.build();
283
+ const txBuilder2 = factory.getTransferBuilder();
284
+ txBuilder2.from(tx.toBroadcastFormat());
285
+ txBuilder2.sign({ key: testData.prv3 });
286
+ const signedTx = await txBuilder2.build();
287
+ const txJson = signedTx.toJson();
288
+ should_1.default.deepEqual(signedTx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_2_3);
289
+ should_1.default.deepEqual(signedTx.signature.length, 2);
290
+ should_1.default.deepEqual(txJson.fee.toString(), '180');
291
+ should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
292
+ should_1.default.deepEqual(txJson.payload.memo, 'test');
293
+ should_1.default.deepEqual(txJson.payload.amount, '1000');
294
+ });
295
+ describe('serialized transactions', () => {
296
+ it('a non signed transfer transaction from serialized', async () => {
297
+ const builder = factory.from(testData.RAW_TX_UNSIGNED);
298
+ builder.sign({ key: testData.TX_SENDER.prv });
299
+ const tx2 = await builder.build();
300
+ should_1.default.deepEqual(tx2.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
301
+ tx2.type.should.equal(sdk_core_1.TransactionType.Send);
302
+ });
303
+ it('a signed transfer transaction from serialized', async () => {
304
+ const txBuilder = factory.from(testData.SIGNED_TRANSACTION);
305
+ const tx = await txBuilder.build();
306
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
307
+ tx.type.should.equal(sdk_core_1.TransactionType.Send);
308
+ });
309
+ it('a signed transfer transaction from serilaized 1', async () => {
310
+ const txBuilder = factory.from(testData.SIGNED_TRANSACTION_PK_2_3);
311
+ const tx = await txBuilder.build();
312
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_2_3);
313
+ tx.type.should.equal(sdk_core_1.TransactionType.Send);
314
+ });
315
+ it('a signed transfer transaction from serilaized 2', async () => {
316
+ const txBuilder = factory.from(testData.SIGNED_TRANSACTION_PK_1_3);
317
+ const tx = await txBuilder.build();
318
+ should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_1_3);
319
+ tx.type.should.equal(sdk_core_1.TransactionType.Send);
320
+ });
321
+ });
322
+ describe('should fail', () => {
323
+ it('a transfer transaction with an invalid key', () => {
324
+ const builder = initTxBuilder();
325
+ assert_1.default.throws(() => builder.sign({ key: 'invalidKey' }), /Unsupported private key/);
326
+ });
327
+ it('a transfer transaction with an invalid destination address', () => {
328
+ const txBuilder = factory.getTransferBuilder();
329
+ assert_1.default.throws(() => txBuilder.to('invalidaddress'), /Invalid address/);
330
+ });
331
+ it('a transfer transaction with an invalid amount: text value', () => {
332
+ const txBuilder = factory.getTransferBuilder();
333
+ assert_1.default.throws(() => txBuilder.amount('invalidamount'), /Invalid amount/);
334
+ });
335
+ it('a transfer transaction with an invalid amount: negative value', () => {
336
+ const txBuilder = factory.getTransferBuilder();
337
+ assert_1.default.throws(() => txBuilder.amount('-5'), /Invalid amount/);
338
+ });
339
+ it('a transfer transaction with an invalid memo', async () => {
340
+ const txBuilder = factory.getTransferBuilder();
341
+ assert_1.default.throws(() => txBuilder.memo('This is a memo that is too long for a transaction'), /Memo is too long/);
342
+ });
343
+ });
344
+ });
345
+ });
346
+ });
347
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErRDtBQUMvRCxtREFBNkU7QUFFN0UsbURBQStEO0FBQy9ELGlEQUErQztBQUMvQyxpREFBNEM7QUFFNUMsc0NBQWlEO0FBQ2pELHVEQUF5QztBQUV6QyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsWUFBTSxDQUFDO0FBRTNCLFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtJQUNwQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUV4QixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQU0sQ0FBQyx5QkFB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LENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgU3RhY2tzTWFpbm5ldCwgU3RhY2tzVGVzdG5ldCB9IGZyb20gJ0BzdGFja3MvbmV0d29yayc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIHJhd1BydlRvRXh0ZW5kZWRLZXlzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBTdHgsIFRzdHgsIFN0eExpYiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5jb25zdCB7IEtleVBhaXIgfSA9IFN0eExpYjtcblxuZGVzY3JpYmUoJ1N0YWNrczogU2VuZCBNYW55IEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW5OYW1lID0gJ3N0eCc7XG4gIGNvbnN0IGNvaW5OYW1lVGVzdCA9ICd0c3R4JztcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwge1xuICAgICAgZW52OiAnbW9jaycsXG4gICAgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdzdHgnLCBTdHguY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHN0eCcsIFRzdHguY3JlYXRlSW5zdGFuY2UpO1xuICB9KTtcbiAgZGVzY3JpYmUoJ1N0eCBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lVGVzdCkpO1xuICAgIGNvbnN0IGZhY3RvcnlQcm9kID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZSkpO1xuXG4gICAgY29uc3QgaW5pdFR4QnVpbGRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTgwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5ub25jZSgwKTtcbiAgICAgIHR4QnVpbGRlci50byh0ZXN0RGF0YS5UWF9SRUNJRVZFUi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5hbW91bnQoJzEwMDAnKTtcbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGRlc2NyaWJlKCd0cmFuc2ZlciBidWlsZGVyIGVudmlyb25tZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBzZWxlY3QgdGhlIHJpZ2h0IG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpLmNvaW5OYW1lKCksICd0c3R4Jyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChmYWN0b3J5UHJvZC5nZXRUcmFuc2ZlckJ1aWxkZXIoKS5jb2luTmFtZSgpLCAnc3R4Jyk7XG4gICAgICAgIC8vIHVzZWQgdHlwZSBhbnkgdG8gYWNjZXNzIHByb3RlY3RlZCBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyUHJvZDogYW55ID0gZmFjdG9yeVByb2QuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgICAgdHhCdWlsZGVyLl9uZXR3b3JrLnNob3VsZC5kZWVwRXF1YWwobmV3IFN0YWNrc1Rlc3RuZXQoKSk7XG4gICAgICAgIHR4QnVpbGRlclByb2QuX25ldHdvcmsuc2hvdWxkLmRlZXBFcXVhbChuZXcgU3RhY2tzTWFpbm5ldCgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCAoKSA9PiB7XG4gICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgLy8gc2hvdWxkLmRlZXBFcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAxKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMTAwMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLm5vbmNlLCAwKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksICcxODAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRYX1NFTkRFUi5hZGRyZXNzKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgICBidWlsZGVyLm1lbW8oJ1RoaXMgaXMgYW4gZXhhbXBsZScpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlRYX1NFTkRFUi5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMTAwMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLm1lbW8sICdUaGlzIGlzIGFuIGV4YW1wbGUnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgdGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub25jZSwgMCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIHVuc2lnbmVkIG11bHRpc2lnIHNpZ25lZCBhbmQgdmVyaWZpZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgICBjb25zdCBhbW91bnQgPSAnMTAwMCc7XG4gICAgICAgIGNvbnN0IG1lbW8gPSAndGVzdCc7XG4gICAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwcnY6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICBjb25zdCBrcDEgPSBuZXcgS2V5UGFpcih7IHBydjogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScgfSk7XG4gICAgICAgIGNvbnN0IGtwMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnZTc1ZGNiNjZmODQyODdlYWYzNDc5NTVlOTRmYTA0MzM3Mjk4ZGJkOTVhYTBkYmI5ODU3NzExMDRlZjE5MTNkYjAxJyB9KTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgICAgZmVlOiAnMTgwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci50byhkZXN0aW5hdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbVB1YktleShba3AuZ2V0S2V5cygpLnB1Yiwga3AxLmdldEtleXMoKS5wdWIsIGtwMi5nZXRLZXlzKCkucHViXSk7XG4gICAgICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTsgLy8gdW5zaWduZWQgbXVsdGlzaWcgdHhcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6ICdjNzE3MDBiMDdkNTIwYThjOTczMWU0ZDBmMDk1YWE2ZWZiOTFlMTZlMjVmYjI3Y2UyYjcyZTdiNjk4ZjgxMjdhMDEnIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbVB1YktleShba3AuZ2V0S2V5cygpLnB1Yiwga3AxLmdldEtleXMoKS5wdWIsIGtwMi5nZXRLZXlzKCkucHViXSk7XG4gICAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpOyAvLyBzaWduZWQgbXVsdGlzaWcgdHhcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIzID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMy5mcm9tKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCByZW1ha2UgPSBhd2FpdCB0eEJ1aWxkZXIzLmJ1aWxkKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVtYWtlLnRvQnJvYWRjYXN0Rm9ybWF0KCksIHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbiBoYWxmIHNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMCc7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwJztcbiAgICAgICAgY29uc3QgbWVtbyA9ICd0ZXN0JztcbiAgICAgICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHBydjogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScgfSk7XG4gICAgICAgIGNvbnN0IGtwMSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnYzcxNzAwYjA3ZDUyMGE4Yzk3MzFlNGQwZjA5NWFhNmVmYjkxZTE2ZTI1ZmIyN2NlMmI3MmU3YjY5OGY4MTI3YTAxJyB9KTtcbiAgICAgICAgY29uc3Qga3AyID0gbmV3IEtleVBhaXIoeyBwcnY6ICdlNzVkY2I2NmY4NDI4N2VhZjM0Nzk1NWU5NGZhMDQzMzcyOThkYmQ5NWFhMGRiYjk4NTc3MTEwNGVmMTkxM2RiMDEnIH0pO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgICBmZWU6ICcxODAnLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UoMSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmZyb21QdWJLZXkoW2twLmdldEtleXModHJ1ZSkucHViLCBrcDEuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMi5nZXRLZXlzKHRydWUpLnB1Yl0pO1xuICAgICAgICB0eEJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7IC8vIGhhbGYgc2lnbmVkIG11bHRpc2lnIHR4XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScgfSk7XG4gICAgICAgIHR4QnVpbGRlcjIuZnJvbVB1YktleShba3AuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMS5nZXRLZXlzKHRydWUpLnB1Yiwga3AyLmdldEtleXModHJ1ZSkucHViXSk7XG4gICAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgICAgJzgwODAwMDAwMDAwNDAxMmZlNTA3YzA5ZGJiMjNjM2I3ZTVkMTY2YzgxZmM0Yjg3NjkyNTEwYjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMGI0MDAwMDAwMDMwMjAxMDkxNTM4MzczNjQxYTUwYTRlYmQ2ZjY1M2JiN2I0Nzc0ODlhY2VlYzUwZWZmOTYzMDcyYTgzOGQyZWFmNTBlNDc4NGM3YzZkMTQ5MGY1N2I4OTlmMGYwNGMyMTVmY2U5MTc2ZDliYjRjZTE5YmZiMDc0OTljNDg4Nzg2NzVhMWYwMjAwODA3NDIwMmUwNGE3Yzc3N2I0Y2RkMjZhZDNmZDM1MTk0MzExNTM2MTEzNjY2ZDgxYTM4NDAxNDhlNTllYjQzZjI3NGQ4ODc2OGVmMTIwMmQ1NTYzM2JmZGNkZThjNjA1NzkzMjEwNzM1NGY0MDZhZjZjMzc4YjZlYTZiNzVkMWEwMDAzOGUzYzQ1MjkzOTU2MTFiZTlhYmY2ZmEzYjY5ODdlODFkNDAyMzg1ZTNkNjA1YTA3M2Y0MmY0MDc1NjVhNGEzZDAwMDIwMzAyMDAwMDAwMDAwMDA1MWExYWUzZjkxMWQ4ZjFkNDZkNzQxNmJmYmU0YjU5M2ZkNDFlYWMxOWNiMDAwMDAwMDAwMDAwMDNlODc0NjU3Mzc0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbiBoYWxmIHNpZ25lZCB0eCB3aXRoIHhwcnYnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgICBjb25zdCBhbW91bnQgPSAnMTAwMCc7XG4gICAgICAgIGNvbnN0IG1lbW8gPSAndGVzdCc7XG4gICAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwcnY6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICBjb25zdCBrcDEgPSBuZXcgS2V5UGFpcih7IHBydjogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScgfSk7XG4gICAgICAgIGNvbnN0IGtwMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnZTc1ZGNiNjZmODQyODdlYWYzNDc5NTVlOTRmYTA0MzM3Mjk4ZGJkOTVhYTBkYmI5ODU3NzExMDRlZjE5MTNkYjAxJyB9KTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgICAgZmVlOiAnMTgwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci50byhkZXN0aW5hdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScgfSk7XG4gICAgICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KFtrcC5nZXRLZXlzKHRydWUpLnB1Yiwga3AxLmdldEtleXModHJ1ZSkucHViLCBrcDIuZ2V0S2V5cyh0cnVlKS5wdWJdKTtcbiAgICAgICAgdHhCdWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpOyAvLyBoYWxmIHNpZ25lZCBtdWx0aXNpZyB0eFxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb21QdWJLZXkoW2twLmdldEtleXModHJ1ZSkucHViLCBrcDEuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMi5nZXRLZXlzKHRydWUpLnB1Yl0pO1xuICAgICAgICBjb25zdCBleHRlbmRlZEtleSA9IHJhd1BydlRvRXh0ZW5kZWRLZXlzKGtwMS5nZXRLZXlzKGZhbHNlKS5wcnYhKTtcbiAgICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiBleHRlbmRlZEtleS54cHJ2IH0pO1xuICAgICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICAgICc4MDgwMDAwMDAwMDQwMTJmZTUwN2MwOWRiYjIzYzNiN2U1ZDE2NmM4MWZjNGI4NzY5MjUxMGIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDBiNDAwMDAwMDAzMDIwMTA5MTUzODM3MzY0MWE1MGE0ZWJkNmY2NTNiYjdiNDc3NDg5YWNlZWM1MGVmZjk2MzA3MmE4MzhkMmVhZjUwZTQ3ODRjN2M2ZDE0OTBmNTdiODk5ZjBmMDRjMjE1ZmNlOTE3NmQ5YmI0Y2UxOWJmYjA3NDk5YzQ4ODc4Njc1YTFmMDIwMDgwNzQyMDJlMDRhN2M3NzdiNGNkZDI2YWQzZmQzNTE5NDMxMTUzNjExMzY2NmQ4MWEzODQwMTQ4ZTU5ZWI0M2YyNzRkODg3NjhlZjEyMDJkNTU2MzNiZmRjZGU4YzYwNTc5MzIxMDczNTRmNDA2YWY2YzM3OGI2ZWE2Yjc1ZDFhMDAwMzhlM2M0NTI5Mzk1NjExYmU5YWJmNmZhM2I2OTg3ZTgxZDQwMjM4NWUzZDYwNWEwNzNmNDJmNDA3NTY1YTRhM2QwMDAyMDMwMjAwMDAwMDAwMDAwNTFhMWFlM2Y5MTFkOGYxZDQ2ZDc0MTZiZmJlNGI1OTNmZDQxZWFjMTljYjAwMDAwMDAwMDAwMDAzZTg3NDY1NzM3NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBtdWx0aXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8nKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnYxIH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjIgfSk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleShbdGVzdERhdGEucHViMSwgdGVzdERhdGEucHViMiwgdGVzdERhdGEucHViM10pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5NVUxUSV9TSUdfU0lHTkVEX1RSQU5TQUNUSU9OKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBtdWx0aXNpZyBzZXJpYWxpemVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLk1VTFRJX1NJR19TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5NVUxUSV9TSUdfU0lHTkVEX1RSQU5TQUNUSU9OKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzaWduZWQgbXVsdGlwbGUgdGltZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIubWVtbygndGVzdCBtZW1vJyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnYyIH0pO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkoW3Rlc3REYXRhLnB1YjEsIHRlc3REYXRhLnB1YjIsIHRlc3REYXRhLnB1YjNdKTtcbiAgICAgICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQudG8sIHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLm1lbW8sICd0ZXN0IG1lbW8nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5hbW91bnQsICcxMDAwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbW91bnQgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzAnKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlRYX1NFTkRFUi5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2dldCBwdWJrZXkgb2YgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzaWduZWQgMScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMjogYW55ID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18xXzMpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4QnVpbGRlcjIuX2Zyb21QdWJLZXlzLCBbdGVzdERhdGEucHViMSwgdGVzdERhdGEucHViMiwgdGVzdERhdGEucHViM10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdnZXQgcHVia2V5IG9mIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIDInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjI6IGFueSA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjIuZnJvbSh0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT05fUEtfMl8zKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEJ1aWxkZXIyLl9mcm9tUHViS2V5cywgW3Rlc3REYXRhLnB1YjEsIHRlc3REYXRhLnB1YjIsIHRlc3REYXRhLnB1YjNdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzaWduZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBtaWQga2V5IG5vIHNpZ25lcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5tZW1vKCd0ZXN0Jyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MSB9KTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KFt0ZXN0RGF0YS5wdWIxLCB0ZXN0RGF0YS5wdWIyLCB0ZXN0RGF0YS5wdWIzXSk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MyB9KTtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgICAgY29uc3QgdHhKc29uID0gc2lnbmVkVHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzFfMyk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksICcxODAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQubWVtbywgJ3Rlc3QnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5hbW91bnQsICcxMDAwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIG11bHRpcGxlIHRpbWVzIHdpdGggZmlyc3Qga2V5IG5vIHNpZ25lcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5tZW1vKCd0ZXN0Jyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MiB9KTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KFt0ZXN0RGF0YS5wdWIxLCB0ZXN0RGF0YS5wdWIyLCB0ZXN0RGF0YS5wdWIzXSk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MyB9KTtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgICAgY29uc3QgdHhKc29uID0gc2lnbmVkVHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzJfMyk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksICcxODAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQubWVtbywgJ3Rlc3QnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5hbW91bnQsICcxMDAwJyk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3NlcmlhbGl6ZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgICAgICBpdCgnYSBub24gc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlJBV19UWF9VTlNJR05FRCk7XG4gICAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICAgIHR4Mi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTik7XG4gICAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTik7XG4gICAgICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpbGFpemVkIDEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18yXzMpO1xuICAgICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT05fUEtfMl8zKTtcbiAgICAgICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlsYWl6ZWQgMicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzFfMyk7XG4gICAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18xXzMpO1xuICAgICAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQga2V5JywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLnNpZ24oeyBrZXk6ICdpbnZhbGlkS2V5JyB9KSwgL1Vuc3VwcG9ydGVkIHByaXZhdGUga2V5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW4gaW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG8oJ2ludmFsaWRhZGRyZXNzJyksIC9JbnZhbGlkIGFkZHJlc3MvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGFtb3VudDogdGV4dCB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmFtb3VudCgnaW52YWxpZGFtb3VudCcpLCAvSW52YWxpZCBhbW91bnQvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGFtb3VudDogbmVnYXRpdmUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5hbW91bnQoJy01JyksIC9JbnZhbGlkIGFtb3VudC8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQgbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLm1lbW8oJ1RoaXMgaXMgYSBtZW1vIHRoYXQgaXMgdG9vIGxvbmcgZm9yIGEgdHJhbnNhY3Rpb24nKSwgL01lbW8gaXMgdG9vIGxvbmcvKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}