@bitgo-beta/sdk-coin-flrp 1.0.1-beta.36 → 1.0.1-beta.360
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/flrp.d.ts +10 -17
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +51 -77
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +190 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +277 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +268 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +192 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +57 -71
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +246 -209
- package/dist/src/lib/iface.d.ts +38 -61
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +13 -14
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +12 -2
- package/dist/src/lib/keyPair.d.ts +5 -5
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +17 -9
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +43 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
- package/dist/src/lib/transaction.d.ts +25 -65
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +341 -199
- package/dist/src/lib/transactionBuilder.d.ts +107 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +210 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +129 -72
- package/dist/src/lib/utils.d.ts +78 -147
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +238 -324
- package/dist/test/resources/account.d.ts +51 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +54 -0
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +39 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInC.d.ts +27 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +44 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/flrp.js +446 -68
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +192 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +325 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +400 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +307 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +83 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +60 -0
- package/dist/test/unit/lib/utils.js +539 -207
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -10
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/lib/constants.d.ts +0 -11
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -17
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -170
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -56
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
require("should");
|
|
8
|
+
const importInP_1 = require("../../resources/transactionData/importInP");
|
|
9
|
+
const lib_1 = require("../../../src/lib");
|
|
10
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
11
|
+
const signFlowTestSuit_1 = __importDefault(require("./signFlowTestSuit"));
|
|
12
|
+
const utils_1 = __importDefault(require("../../../src/lib/utils"));
|
|
13
|
+
describe('Flrp Import In P Tx Builder', () => {
|
|
14
|
+
const coinConfig = statics_1.coins.get('tflrp');
|
|
15
|
+
const factory = new lib_1.TransactionBuilderFactory(coinConfig);
|
|
16
|
+
describe('default fee', () => {
|
|
17
|
+
const FIXED_FEE = coinConfig.network.txFee;
|
|
18
|
+
it('should set fixedFee (1261000) by default in constructor', () => {
|
|
19
|
+
const txBuilder = factory.getImportInPBuilder();
|
|
20
|
+
// The fixedFee should be set from network.txFee = '1261000'
|
|
21
|
+
const transaction = txBuilder.transaction;
|
|
22
|
+
transaction._fee.fee.should.equal(FIXED_FEE);
|
|
23
|
+
});
|
|
24
|
+
it('should use default fixedFee when fee is not explicitly set', async () => {
|
|
25
|
+
// Create a UTXO with enough balance to cover the default fee
|
|
26
|
+
const utxoAmount = '50000000'; // 0.05 FLR - enough to cover fee and have output
|
|
27
|
+
const txBuilder = factory
|
|
28
|
+
.getImportInPBuilder()
|
|
29
|
+
.threshold(importInP_1.IMPORT_IN_P.threshold)
|
|
30
|
+
.locktime(importInP_1.IMPORT_IN_P.locktime)
|
|
31
|
+
.fromPubKey(importInP_1.IMPORT_IN_P.pAddresses)
|
|
32
|
+
.externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
|
|
33
|
+
// NOTE: .fee() is NOT called - should use default fixedFee
|
|
34
|
+
.utxos([
|
|
35
|
+
{
|
|
36
|
+
outputID: 0,
|
|
37
|
+
amount: utxoAmount,
|
|
38
|
+
txid: importInP_1.IMPORT_IN_P.outputs[0].txid,
|
|
39
|
+
outputidx: '0',
|
|
40
|
+
addresses: importInP_1.IMPORT_IN_P.outputs[0].addresses,
|
|
41
|
+
threshold: importInP_1.IMPORT_IN_P.threshold,
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
const tx = (await txBuilder.build());
|
|
45
|
+
// Verify the fee in the built transaction equals the fixedFee
|
|
46
|
+
tx.fee.fee.should.equal(FIXED_FEE);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('validate txBuilder fields', () => {
|
|
50
|
+
const txBuilder = factory.getImportInPBuilder();
|
|
51
|
+
it('should fail target chain id length incorrect', () => {
|
|
52
|
+
assert_1.default.throws(() => {
|
|
53
|
+
txBuilder.externalChainId(Buffer.from(importInP_1.IMPORT_IN_P.INVALID_CHAIN_ID));
|
|
54
|
+
}, (e) => e.message === 'Chain id are 32 byte size');
|
|
55
|
+
});
|
|
56
|
+
it('should fail target chain id not a valid base58 string', () => {
|
|
57
|
+
assert_1.default.throws(() => {
|
|
58
|
+
txBuilder.externalChainId(importInP_1.IMPORT_IN_P.INVALID_CHAIN_ID);
|
|
59
|
+
}, (e) => e.message === 'Non-base58 character');
|
|
60
|
+
});
|
|
61
|
+
it('should fail target chain id cb58 invalid checksum', () => {
|
|
62
|
+
assert_1.default.throws(() => {
|
|
63
|
+
txBuilder.externalChainId(importInP_1.IMPORT_IN_P.VALID_C_CHAIN_ID.slice(2));
|
|
64
|
+
}, (e) => e.message === 'Invalid checksum');
|
|
65
|
+
});
|
|
66
|
+
it('should fail validate Utxos empty string', () => {
|
|
67
|
+
assert_1.default.throws(() => {
|
|
68
|
+
txBuilder.validateUtxos([]);
|
|
69
|
+
}, (e) => e.message === 'UTXOs array cannot be empty');
|
|
70
|
+
});
|
|
71
|
+
it('should fail validate Utxos without amount field', () => {
|
|
72
|
+
assert_1.default.throws(() => {
|
|
73
|
+
txBuilder.validateUtxos([{ outputID: '' }]);
|
|
74
|
+
}, (e) => e.message === 'UTXO missing required field: amount');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
(0, signFlowTestSuit_1.default)({
|
|
78
|
+
transactionType: 'Import P2C',
|
|
79
|
+
newTxFactory: () => new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')),
|
|
80
|
+
newTxBuilder: () => new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
|
|
81
|
+
.getImportInPBuilder()
|
|
82
|
+
.threshold(importInP_1.IMPORT_IN_P.threshold)
|
|
83
|
+
.locktime(importInP_1.IMPORT_IN_P.locktime)
|
|
84
|
+
.fromPubKey(importInP_1.IMPORT_IN_P.pAddresses)
|
|
85
|
+
.externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
|
|
86
|
+
.fee(importInP_1.IMPORT_IN_P.fee)
|
|
87
|
+
.utxos(importInP_1.IMPORT_IN_P.outputs),
|
|
88
|
+
unsignedTxHex: importInP_1.IMPORT_IN_P.unsignedHex,
|
|
89
|
+
halfSignedTxHex: importInP_1.IMPORT_IN_P.halfSigntxHex,
|
|
90
|
+
fullSignedTxHex: importInP_1.IMPORT_IN_P.fullSigntxHex,
|
|
91
|
+
privateKey: {
|
|
92
|
+
prv1: importInP_1.IMPORT_IN_P.privateKeys[0],
|
|
93
|
+
prv2: importInP_1.IMPORT_IN_P.privateKeys[1],
|
|
94
|
+
},
|
|
95
|
+
txHash: importInP_1.IMPORT_IN_P.txhash,
|
|
96
|
+
});
|
|
97
|
+
it('Should full sign a import tx from unsigned raw tx', () => {
|
|
98
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInP_1.IMPORT_IN_P.unsignedHex);
|
|
99
|
+
txBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
|
|
100
|
+
txBuilder
|
|
101
|
+
.build()
|
|
102
|
+
.then(() => assert_1.default.fail('it can sign'))
|
|
103
|
+
.catch((err) => {
|
|
104
|
+
err.message.should.be.equal('Private key cannot sign the transaction');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('on-chain verified transactions', () => {
|
|
108
|
+
it('should verify on-chain tx id for signed P-chain import', async () => {
|
|
109
|
+
const signedImportHex = '0x0000000000110000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000002e79f04000000000000000000000002000000033329be7d01cd3ebaae6654d7327dd9f17a2e15817e918a5e8083ae4c9f2f0ed77055c24bf3665001c7324437c96c7c8a6a152da2385c1db5c3ab1f91000000000000000078db5c30bed04c05ce209179812850bbb3fe6d46d7eef3744d814c0da555247900000001063ec620d1892f802c8f0c124d05ce1e73a85686bea2b09380fc58f6d72497db0000000058734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000050000000002faf0800000000200000000000000010000000100000009000000022ed4ebc2c81e38820cc7bd6e952d10bd30382fa0679c8a0ba5dc67990a09125656d47eadcc622af935fd5dad654f9b00d3b9563df38e875ef1964e1c9ded851100ec514ace26baefce3ffeab94e3580443abcc3cea669a87c7c26ef8ffa3fe79b330e4bdbacabfd1cce9f7b6a9f2515b4fdf627f7d2678e9532d861a7673444aa700';
|
|
110
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(signedImportHex);
|
|
111
|
+
const tx = await txBuilder.build();
|
|
112
|
+
const rawTx = tx.toBroadcastFormat();
|
|
113
|
+
rawTx.should.equal(signedImportHex);
|
|
114
|
+
tx.id.should.equal('2vwvuXp47dsUmqb4vkaMk7UsukrZNapKXT2ruZhVibbjMDpqr9');
|
|
115
|
+
});
|
|
116
|
+
it('should FAIL with unsorted UTXO addresses - demonstrates AddressMap mismatch issue', async () => {
|
|
117
|
+
// This test uses UTXO addresses in UNSORTED order to demonstrate the issue.
|
|
118
|
+
// With unsorted addresses, the current implementation will create AddressMaps incorrectly
|
|
119
|
+
// because it uses sorted addresses, not UTXO address order.
|
|
120
|
+
//
|
|
121
|
+
// Expected: AddressMap should map addresses to signature slots based on UTXO order (sigIndicies)
|
|
122
|
+
// Current (WRONG): AddressMap uses sorted addresses with sequential slots
|
|
123
|
+
//
|
|
124
|
+
// This test WILL FAIL with current implementation because AddressMaps don't match sigIndicies
|
|
125
|
+
// UTXO addresses in UNSORTED order (different from sorted)
|
|
126
|
+
// Sorted would be: [0x12cb... (smallest), 0xa6e0... (middle), 0xc386... (largest)]
|
|
127
|
+
// Unsorted: [0xc386... (largest), 0x12cb... (smallest), 0xa6e0... (middle)]
|
|
128
|
+
const unsortedUtxoAddresses = [
|
|
129
|
+
'0xc386d58d09a9ae77cf1cf07bf1c9de44ebb0c9f3', // Largest (would be index 2 if sorted)
|
|
130
|
+
'0x12cb32eaf92553064db98d271b56cba079ec78f5', // Smallest (would be index 0 if sorted)
|
|
131
|
+
'0xa6e0c1abd0132f70efb77e2274637ff336a29a57', // Middle (would be index 1 if sorted)
|
|
132
|
+
];
|
|
133
|
+
// Corresponding P-chain addresses (in same order as UTXO)
|
|
134
|
+
const pAddresses = [
|
|
135
|
+
'P-costwo15msvr27szvhhpmah0c38gcml7vm29xjh7tcek8', // Maps to 0xc386... (UTXO index 0)
|
|
136
|
+
'P-costwo1zt9n96hey4fsvnde35n3k4kt5pu7c784dzewzd', // Maps to 0x12cb... (UTXO index 1)
|
|
137
|
+
'P-costwo1cwrdtrgf4xh80ncu7palrjw7gn4mpj0n4dxghh', // Maps to 0xa6e0... (UTXO index 2)
|
|
138
|
+
];
|
|
139
|
+
// Create UTXO with UNSORTED addresses
|
|
140
|
+
const utxo = {
|
|
141
|
+
outputID: 0,
|
|
142
|
+
amount: '50000000',
|
|
143
|
+
txid: 'zstyYq5riDKYDSR3fUYKKkuXKJ1aJCe8WNrXKqEBJD4CGwzFw',
|
|
144
|
+
outputidx: '0',
|
|
145
|
+
addresses: unsortedUtxoAddresses, // UNSORTED order
|
|
146
|
+
threshold: 2,
|
|
147
|
+
};
|
|
148
|
+
// Build transaction
|
|
149
|
+
const txBuilder = factory
|
|
150
|
+
.getImportInPBuilder()
|
|
151
|
+
.threshold(2)
|
|
152
|
+
.locktime(0)
|
|
153
|
+
.fromPubKey(pAddresses)
|
|
154
|
+
.externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
|
|
155
|
+
.fee('1261000')
|
|
156
|
+
.utxos([utxo]);
|
|
157
|
+
// Build unsigned transaction
|
|
158
|
+
const unsignedTx = await txBuilder.build();
|
|
159
|
+
const unsignedHex = unsignedTx.toBroadcastFormat();
|
|
160
|
+
// Parse it back to inspect AddressMaps and sigIndicies
|
|
161
|
+
const parsedBuilder = factory.from(unsignedHex);
|
|
162
|
+
const parsedTx = await parsedBuilder.build();
|
|
163
|
+
const flareTx = parsedTx._flareTransaction;
|
|
164
|
+
// Get the input to check sigIndicies
|
|
165
|
+
const importTx = flareTx.tx;
|
|
166
|
+
const input = importTx.ins[0];
|
|
167
|
+
const transferInput = input.input;
|
|
168
|
+
const sigIndicies = transferInput.sigIndicies();
|
|
169
|
+
// sigIndicies tells us: sigIndicies[slotIndex] = utxoAddressIndex
|
|
170
|
+
// For threshold=2, we need signatures for first 2 addresses in UTXO order
|
|
171
|
+
// UTXO order: [0xc386... (index 0), 0x12cb... (index 1), 0xa6e0... (index 2)]
|
|
172
|
+
// So sigIndicies should be [0, 1] meaning: slot 0 = UTXO index 0, slot 1 = UTXO index 1
|
|
173
|
+
// Verify sigIndicies are [0, 1] (first 2 addresses in UTXO order, NOT sorted order)
|
|
174
|
+
sigIndicies.length.should.equal(2);
|
|
175
|
+
sigIndicies[0].should.equal(0, 'First signature slot should be UTXO address index 0 (0xc386...)');
|
|
176
|
+
sigIndicies[1].should.equal(1, 'Second signature slot should be UTXO address index 1 (0x12cb...)');
|
|
177
|
+
// Now the key test: AddressMap should map addresses based on sigIndicies (UTXO order)
|
|
178
|
+
// NOT based on sorted order
|
|
179
|
+
//
|
|
180
|
+
// Current implementation (WRONG):
|
|
181
|
+
// - Sorts addresses: [0x12cb... (smallest), 0xa6e0... (middle), 0xc386... (largest)]
|
|
182
|
+
// - Maps: sorted[0] -> slot 0, sorted[1] -> slot 1
|
|
183
|
+
// - This means: 0x12cb... -> slot 0, 0xa6e0... -> slot 1 (WRONG!)
|
|
184
|
+
//
|
|
185
|
+
// Expected (CORRECT):
|
|
186
|
+
// - Uses UTXO order via sigIndicies: sigIndicies[0]=0, sigIndicies[1]=1
|
|
187
|
+
// - Maps: address at UTXO index 0 (0xc386...) -> slot 0, address at UTXO index 1 (0x12cb...) -> slot 1
|
|
188
|
+
// - This means: 0xc386... -> slot 0, 0x12cb... -> slot 1 (CORRECT!)
|
|
189
|
+
// Parse addresses
|
|
190
|
+
// Address at UTXO index 0 (0xc386...) should map to signature slot 0
|
|
191
|
+
const pAddr0Bytes = utils_1.default.parseAddress(pAddresses[0]); // Corresponds to UTXO index 0
|
|
192
|
+
// Address at UTXO index 1 (0x12cb...) should map to signature slot 1
|
|
193
|
+
const pAddr1Bytes = utils_1.default.parseAddress(pAddresses[1]); // Corresponds to UTXO index 1
|
|
194
|
+
// Get addresses from AddressMap
|
|
195
|
+
const addressesInMap = flareTx.getAddresses();
|
|
196
|
+
// Verify addresses are in the map
|
|
197
|
+
const addr0InMap = addressesInMap.some((addr) => Buffer.compare(Buffer.from(addr), pAddr0Bytes) === 0);
|
|
198
|
+
const addr1InMap = addressesInMap.some((addr) => Buffer.compare(Buffer.from(addr), pAddr1Bytes) === 0);
|
|
199
|
+
addr0InMap.should.be.true('Address at UTXO index 0 should be in AddressMap');
|
|
200
|
+
addr1InMap.should.be.true('Address at UTXO index 1 should be in AddressMap');
|
|
201
|
+
// The critical assertion: AddressMap should map addresses to signature slots based on sigIndicies
|
|
202
|
+
// Since we can't directly access individual AddressMap instances, we verify the behavior
|
|
203
|
+
// by checking that the transaction structure is correct.
|
|
204
|
+
//
|
|
205
|
+
// With current implementation (WRONG):
|
|
206
|
+
// - AddressMap maps sorted addresses: 0x12cb... -> slot 0, 0xa6e0... -> slot 1
|
|
207
|
+
// - But sigIndicies say: slot 0 = UTXO index 0 (0xc386...), slot 1 = UTXO index 1 (0x12cb...)
|
|
208
|
+
// - Mismatch! AddressMap says 0x12cb... -> slot 0, but sigIndicies say slot 0 = 0xc386...
|
|
209
|
+
//
|
|
210
|
+
// This mismatch will cause signing to fail because:
|
|
211
|
+
// - Signing logic uses AddressMap to find which slot to sign
|
|
212
|
+
// - But credentials expect signatures in slots based on sigIndicies (UTXO order)
|
|
213
|
+
// - Result: "wrong signature" error on-chain
|
|
214
|
+
// The critical test: Verify that signature slots have embedded addresses based on UTXO order
|
|
215
|
+
// With unsorted UTXO addresses, this will FAIL if AddressMaps don't match UTXO order
|
|
216
|
+
//
|
|
217
|
+
// sigIndicies tells us: sigIndicies[slotIndex] = utxoAddressIndex
|
|
218
|
+
// For threshold=2, we need signatures for first 2 addresses in UTXO order
|
|
219
|
+
// UTXO order: [0xc386... (index 0), 0x12cb... (index 1), 0xa6e0... (index 2)]
|
|
220
|
+
// So sigIndicies should be [0, 1] meaning: slot 0 = UTXO index 0, slot 1 = UTXO index 1
|
|
221
|
+
// Parse the credential to see which slots have which embedded addresses
|
|
222
|
+
const credential = flareTx.credentials[0];
|
|
223
|
+
const signatures = credential.getSignatures();
|
|
224
|
+
// Extract embedded addresses from signature slots
|
|
225
|
+
const embeddedAddresses = [];
|
|
226
|
+
// Helper function to check if signature has embedded address (same logic as transaction.ts)
|
|
227
|
+
const isEmptySignature = (signature) => {
|
|
228
|
+
return !!signature && utils_1.default.removeHexPrefix(signature).startsWith('0'.repeat(90));
|
|
229
|
+
};
|
|
230
|
+
const hasEmbeddedAddress = (signature) => {
|
|
231
|
+
if (!isEmptySignature(signature))
|
|
232
|
+
return false;
|
|
233
|
+
const cleanSig = utils_1.default.removeHexPrefix(signature);
|
|
234
|
+
if (cleanSig.length < 130)
|
|
235
|
+
return false;
|
|
236
|
+
const embeddedPart = cleanSig.substring(90, 130);
|
|
237
|
+
// Check if embedded part is not all zeros
|
|
238
|
+
return embeddedPart !== '0'.repeat(40);
|
|
239
|
+
};
|
|
240
|
+
signatures.forEach((sig, slotIndex) => {
|
|
241
|
+
if (hasEmbeddedAddress(sig)) {
|
|
242
|
+
// Extract embedded address (after position 90, 40 chars = 20 bytes)
|
|
243
|
+
const cleanSig = utils_1.default.removeHexPrefix(sig);
|
|
244
|
+
const embeddedAddr = cleanSig.substring(90, 130).toLowerCase();
|
|
245
|
+
embeddedAddresses[slotIndex] = '0x' + embeddedAddr;
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
// Verify: Credentials only embed ONE address (user/recovery), not both
|
|
249
|
+
// The embedded address should be based on addressesIndex logic, not sorted order
|
|
250
|
+
//
|
|
251
|
+
// Compute addressesIndex to determine expected signature order
|
|
252
|
+
const utxoAddressBytes = unsortedUtxoAddresses.map((addr) => utils_1.default.parseAddress(addr));
|
|
253
|
+
const pAddressBytes = pAddresses.map((addr) => utils_1.default.parseAddress(addr));
|
|
254
|
+
const addressesIndex = [];
|
|
255
|
+
pAddressBytes.forEach((pAddr) => {
|
|
256
|
+
const utxoIndex = utxoAddressBytes.findIndex((uAddr) => Buffer.compare(Buffer.from(uAddr), Buffer.from(pAddr)) === 0);
|
|
257
|
+
addressesIndex.push(utxoIndex);
|
|
258
|
+
});
|
|
259
|
+
// firstIndex = 0 (user), bitgoIndex = 1
|
|
260
|
+
const firstIndex = 0;
|
|
261
|
+
const bitgoIndex = 1;
|
|
262
|
+
// Determine expected signature order based on addressesIndex
|
|
263
|
+
const userComesFirst = addressesIndex[bitgoIndex] > addressesIndex[firstIndex];
|
|
264
|
+
// Expected credential structure:
|
|
265
|
+
// - If user comes first: [userAddress, zeros]
|
|
266
|
+
// - If bitgo comes first: [zeros, userAddress]
|
|
267
|
+
const userAddressHex = Buffer.from(pAddressBytes[firstIndex]).toString('hex').toLowerCase();
|
|
268
|
+
const expectedUserAddr = '0x' + userAddressHex;
|
|
269
|
+
if (userComesFirst) {
|
|
270
|
+
// Expected: [userAddress, zeros]
|
|
271
|
+
// Slot 0 should have user address (pAddr0 = 0xc386... = UTXO index 0)
|
|
272
|
+
if (embeddedAddresses[0]) {
|
|
273
|
+
embeddedAddresses[0]
|
|
274
|
+
.toLowerCase()
|
|
275
|
+
.should.equal(expectedUserAddr, `Slot 0 should have user address (${expectedUserAddr}) because user comes first in UTXO order`);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
throw new Error(`Slot 0 should have embedded user address, but is empty`);
|
|
279
|
+
}
|
|
280
|
+
// Slot 1 should be zeros (no embedded address)
|
|
281
|
+
if (embeddedAddresses[1]) {
|
|
282
|
+
throw new Error(`Slot 1 should be zeros, but has embedded address: ${embeddedAddresses[1]}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Expected: [zeros, userAddress]
|
|
287
|
+
// Slot 0 should be zeros
|
|
288
|
+
if (embeddedAddresses[0]) {
|
|
289
|
+
throw new Error(`Slot 0 should be zeros, but has embedded address: ${embeddedAddresses[0]}`);
|
|
290
|
+
}
|
|
291
|
+
// Slot 1 should have user address
|
|
292
|
+
if (embeddedAddresses[1]) {
|
|
293
|
+
embeddedAddresses[1]
|
|
294
|
+
.toLowerCase()
|
|
295
|
+
.should.equal(expectedUserAddr, `Slot 1 should have user address (${expectedUserAddr}) because bitgo comes first in UTXO order`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
throw new Error(`Slot 1 should have embedded user address, but is empty`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// The key verification: AddressMaps should match the credential order
|
|
302
|
+
// With the fix, AddressMaps are created using the same addressesIndex logic as credentials
|
|
303
|
+
// This ensures signing works correctly even with unsorted UTXO addresses
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLHlFQUFvRjtBQUNwRiwwQ0FBMEY7QUFDMUYsaURBQTBEO0FBQzFELDBFQUE4QztBQUM5QyxtRUFBK0M7QUFFL0MsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFMUQsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxTQUFTLEdBQUksVUFBVSxDQUFDLE9BQXdCLENBQUMsS0FBSyxDQUFDO1FBRTdELEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxHQUFHLEVBQUU7WUFDakUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDaEQsNERBQTREO1lBQzVELE1BQU0sV0FBVyxHQUFJLFNBQWlCLENBQUMsV0FBVyxDQUFDO1lBQ25ELFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUUsNkRBQTZEO1lBQzdELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLGlEQUFpRDtZQUVoRixNQUFNLFNBQVMsR0FBRyxPQUFPO2lCQUN0QixtQkFBbUIsRUFBRTtpQkFDckIsU0FBUyxDQUFDLHVCQUFRLENBQUMsU0FBUyxDQUFDO2lCQUM3QixRQUFR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O29CQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztnQkFDNUUsQ0FBQztZQUNILENBQUM7WUFFRCxzRUFBc0U7WUFDdEUsMkZBQTJGO1lBQzNGLHlFQUF5RTtRQUMzRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBJTVBPUlRfSU5fUCBhcyB0ZXN0RGF0YSB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy90cmFuc2FjdGlvbkRhdGEvaW1wb3J0SW5QJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIERlY29kZWRVdHhvT2JqLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMsIEZsYXJlTmV0d29yayB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHNpZ25GbG93VGVzdCBmcm9tICcuL3NpZ25GbG93VGVzdFN1aXQnO1xuaW1wb3J0IHRlc3RVdGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ0ZscnAgSW1wb3J0IEluIFAgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuXG4gIGRlc2NyaWJlKCdkZWZhdWx0IGZlZScsICgpID0+IHtcbiAgICBjb25zdCBGSVhFRF9GRUUgPSAoY29pbkNvbmZpZy5uZXR3b3JrIGFzIEZsYXJlTmV0d29yaykudHhGZWU7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBmaXhlZEZlZSAoMTI2MTAwMCkgYnkgZGVmYXVsdCBpbiBjb25zdHJ1Y3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5QQnVpbGRlcigpO1xuICAgICAgLy8gVGhlIGZpeGVkRmVlIHNob3VsZCBiZSBzZXQgZnJvbSBuZXR3b3JrLnR4RmVlID0gJzEyNjEwMDAnXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9ICh0eEJ1aWxkZXIgYXMgYW55KS50cmFuc2FjdGlvbjtcbiAgICAgIHRyYW5zYWN0aW9uLl9mZWUuZmVlLnNob3VsZC5lcXVhbChGSVhFRF9GRUUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgZGVmYXVsdCBmaXhlZEZlZSB3aGVuIGZlZSBpcyBub3QgZXhwbGljaXRseSBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBVVFhPIHdpdGggZW5vdWdoIGJhbGFuY2UgdG8gY292ZXIgdGhlIGRlZmF1bHQgZmVlXG4gICAgICBjb25zdCB1dHhvQW1vdW50ID0gJzUwMDAwMDAwJzsgLy8gMC4wNSBGTFIgLSBlbm91Z2ggdG8gY292ZXIgZmVlIGFuZCBoYXZlIG91dHB1dFxuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAvLyBOT1RFOiAuZmVlKCkgaXMgTk9UIGNhbGxlZCAtIHNob3VsZCB1c2UgZGVmYXVsdCBmaXhlZEZlZVxuICAgICAgICAudXR4b3MoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG91dHB1dElEOiAwLFxuICAgICAgICAgICAgYW1vdW50OiB1dHhvQW1vdW50LFxuICAgICAgICAgICAgdHhpZDogdGVzdERhdGEub3V0cHV0c1swXS50eGlkLFxuICAgICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgICBhZGRyZXNzZXM6IHRlc3REYXRhLm91dHB1dHNbMF0uYWRkcmVzc2VzLFxuICAgICAgICAgICAgdGhyZXNob2xkOiB0ZXN0RGF0YS50aHJlc2hvbGQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBmZWUgaW4gdGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGVxdWFscyB0aGUgZml4ZWRGZWVcbiAgICAgIHR4LmZlZS5mZWUuc2hvdWxkLmVxdWFsKEZJWEVEX0ZFRSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSB0eEJ1aWxkZXIgZmllbGRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5QQnVpbGRlcigpO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBsZW5ndGggaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQoQnVmZmVyLmZyb20odGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCkpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdDaGFpbiBpZCBhcmUgMzIgYnl0ZSBzaXplJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbm90IGEgdmFsaWQgYmFzZTU4IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdOb24tYmFzZTU4IGNoYXJhY3RlcidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGNiNTggaW52YWxpZCBjaGVja3N1bScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLlZBTElEX0NfQ0hBSU5fSUQuc2xpY2UoMikpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdJbnZhbGlkIGNoZWNrc3VtJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIHdpdGhvdXQgYW1vdW50IGZpZWxkJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFt7IG91dHB1dElEOiAnJyB9IGFzIGFueSBhcyBEZWNvZGVkVXR4b09ial0pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQ6IGFtb3VudCdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnSW1wb3J0IFAyQycsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAudXR4b3ModGVzdERhdGEub3V0cHV0cyksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEudW5zaWduZWRIZXgsXG4gICAgaGFsZlNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4LFxuICAgIGZ1bGxTaWduZWRUeEhleDogdGVzdERhdGEuZnVsbFNpZ250eEhleCxcbiAgICBwcml2YXRlS2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSxcbiAgICAgIHBydjI6IHRlc3REYXRhLnByaXZhdGVLZXlzWzFdLFxuICAgIH0sXG4gICAgdHhIYXNoOiB0ZXN0RGF0YS50eGhhc2gsXG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgaW1wb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdIH0pO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmJ1aWxkKClcbiAgICAgIC50aGVuKCgpID0+IGFzc2VydC5mYWlsKCdpdCBjYW4gc2lnbicpKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb24tY2hhaW4gdmVyaWZpZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmVyaWZ5IG9uLWNoYWluIHR4IGlkIGZvciBzaWduZWQgUC1jaGFpbiBpbXBvcnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzaWduZWRJbXBvcnRIZXggPVxuICAgICAgICAnMHgwMDAwMDAwMDAwMTEwMDAwMDA3MjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNzAwMDAwMDAwMDJlNzlmMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODE3ZTkxOGE1ZTgwODNhZTRjOWYyZjBlZDc3MDU1YzI0YmYzNjY1MDAxYzczMjQ0MzdjOTZjN2M4YTZhMTUyZGEyMzg1YzFkYjVjM2FiMWY5MTAwMDAwMDAwMDAwMDAwMDA3OGRiNWMzMGJlZDA0YzA1Y2UyMDkxNzk4MTI4NTBiYmIzZmU2ZDQ2ZDdlZWYzNzQ0ZDgxNGMwZGE1NTUyNDc5MDAwMDAwMDEwNjNlYzYyMGQxODkyZjgwMmM4ZjBjMTI0ZDA1Y2UxZTczYTg1Njg2YmVhMmIwOTM4MGZjNThmNmQ3MjQ5N2RiMDAwMDAwMDA1ODczNGY5NGFmODcxYzNkMTMxYjU2MTMxYjZmYjdhMDI5MWVhY2FkZDI2MWU2OWRmYjQyYTljZGY2ZjdmZGRkMDAwMDAwMDUwMDAwMDAwMDAyZmFmMDgwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDEwMDAwMDAwOTAwMDAwMDAyMmVkNGViYzJjODFlMzg4MjBjYzdiZDZlOTUyZDEwYmQzMDM4MmZhMDY3OWM4YTBiYTVkYzY3OTkwYTA5MTI1NjU2ZDQ3ZWFkY2M2MjJhZjkzNWZkNWRhZDY1NGY5YjAwZDNiOTU2M2RmMzhlODc1ZWYxOTY0ZTFjOWRlZDg1MTEwMGVjNTE0YWNlMjZiYWVmY2UzZmZlYWI5NGUzNTgwNDQzYWJjYzNjZWE2NjlhODdjN2MyNmVmOGZmYTNmZTc5YjMzMGU0YmRiYWNhYmZkMWNjZTlmN2I2YTlmMjUxNWI0ZmRmNjI3ZjdkMjY3OGU5NTMyZDg2MWE3NjczNDQ0YWE3MDAnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHNpZ25lZEltcG9ydEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHNpZ25lZEltcG9ydEhleCk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJzJ2d3Z1WHA0N2RzVW1xYjR2a2FNazdVc3VrclpOYXBLWFQycnVaaFZpYmJqTURwcXI5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIEZBSUwgd2l0aCB1bnNvcnRlZCBVVFhPIGFkZHJlc3NlcyAtIGRlbW9uc3RyYXRlcyBBZGRyZXNzTWFwIG1pc21hdGNoIGlzc3VlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyB0ZXN0IHVzZXMgVVRYTyBhZGRyZXNzZXMgaW4gVU5TT1JURUQgb3JkZXIgdG8gZGVtb25zdHJhdGUgdGhlIGlzc3VlLlxuICAgICAgLy8gV2l0aCB1bnNvcnRlZCBhZGRyZXNzZXMsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgY3JlYXRlIEFkZHJlc3NNYXBzIGluY29ycmVjdGx5XG4gICAgICAvLyBiZWNhdXNlIGl0IHVzZXMgc29ydGVkIGFkZHJlc3Nlcywgbm90IFVUWE8gYWRkcmVzcyBvcmRlci5cbiAgICAgIC8vXG4gICAgICAvLyBFeHBlY3RlZDogQWRkcmVzc01hcCBzaG91bGQgbWFwIGFkZHJlc3NlcyB0byBzaWduYXR1cmUgc2xvdHMgYmFzZWQgb24gVVRYTyBvcmRlciAoc2lnSW5kaWNpZXMpXG4gICAgICAvLyBDdXJyZW50IChXUk9ORyk6IEFkZHJlc3NNYXAgdXNlcyBzb3J0ZWQgYWRkcmVzc2VzIHdpdGggc2VxdWVudGlhbCBzbG90c1xuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgdGVzdCBXSUxMIEZBSUwgd2l0aCBjdXJyZW50IGltcGxlbWVudGF0aW9uIGJlY2F1c2UgQWRkcmVzc01hcHMgZG9uJ3QgbWF0Y2ggc2lnSW5kaWNpZXNcblxuICAgICAgLy8gVVRYTyBhZGRyZXNzZXMgaW4gVU5TT1JURUQgb3JkZXIgKGRpZmZlcmVudCBmcm9tIHNvcnRlZClcbiAgICAgIC8vIFNvcnRlZCB3b3VsZCBiZTogWzB4MTJjYi4uLiAoc21hbGxlc3QpLCAweGE2ZTAuLi4gKG1pZGRsZSksIDB4YzM4Ni4uLiAobGFyZ2VzdCldXG4gICAgICAvLyBVbnNvcnRlZDogWzB4YzM4Ni4uLiAobGFyZ2VzdCksIDB4MTJjYi4uLiAoc21hbGxlc3QpLCAweGE2ZTAuLi4gKG1pZGRsZSldXG4gICAgICBjb25zdCB1bnNvcnRlZFV0eG9BZGRyZXNzZXMgPSBbXG4gICAgICAgICcweGMzODZkNThkMDlhOWFlNzdjZjFjZjA3YmYxYzlkZTQ0ZWJiMGM5ZjMnLCAvLyBMYXJnZXN0ICh3b3VsZCBiZSBpbmRleCAyIGlmIHNvcnRlZClcbiAgICAgICAgJzB4MTJjYjMyZWFmOTI1NTMwNjRkYjk4ZDI3MWI1NmNiYTA3OWVjNzhmNScsIC8vIFNtYWxsZXN0ICh3b3VsZCBiZSBpbmRleCAwIGlmIHNvcnRlZClcbiAgICAgICAgJzB4YTZlMGMxYWJkMDEzMmY3MGVmYjc3ZTIyNzQ2MzdmZjMzNmEyOWE1NycsIC8vIE1pZGRsZSAod291bGQgYmUgaW5kZXggMSBpZiBzb3J0ZWQpXG4gICAgICBdO1xuXG4gICAgICAvLyBDb3JyZXNwb25kaW5nIFAtY2hhaW4gYWRkcmVzc2VzIChpbiBzYW1lIG9yZGVyIGFzIFVUWE8pXG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gW1xuICAgICAgICAnUC1jb3N0d28xNW1zdnIyN3N6dmhocG1haDBjMzhnY21sN3ZtMjl4amg3dGNlazgnLCAvLyBNYXBzIHRvIDB4YzM4Ni4uLiAoVVRYTyBpbmRleCAwKVxuICAgICAgICAnUC1jb3N0d28xenQ5bjk2aGV5NGZzdm5kZTM1bjNrNGt0NXB1N2M3ODRkemV3emQnLCAvLyBNYXBzIHRvIDB4MTJjYi4uLiAoVVRYTyBpbmRleCAxKVxuICAgICAgICAnUC1jb3N0d28xY3dyZHRyZ2Y0eGg4MG5jdTdwYWxyanc3Z240bXBqMG40ZHhnaGgnLCAvLyBNYXBzIHRvIDB4YTZlMC4uLiAoVVRYTyBpbmRleCAyKVxuICAgICAgXTtcblxuICAgICAgLy8gQ3JlYXRlIFVUWE8gd2l0aCBVTlNPUlRFRCBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogMCxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwMDAnLFxuICAgICAgICB0eGlkOiAnenN0eVlxNXJpREtZRFNSM2ZVWUtLa3VYS0oxYUpDZThXTnJYS3FFQkpENENHd3pGdycsXG4gICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICBhZGRyZXNzZXM6IHVuc29ydGVkVXR4b0FkZHJlc3NlcywgLy8gVU5TT1JURUQgb3JkZXJcbiAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgfTtcblxuICAgICAgLy8gQnVpbGQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKDIpXG4gICAgICAgIC5sb2NrdGltZSgwKVxuICAgICAgICAuZnJvbVB1YktleShwQWRkcmVzc2VzKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWUoJzEyNjEwMDAnKVxuICAgICAgICAudXR4b3MoW3V0eG9dKTtcblxuICAgICAgLy8gQnVpbGQgdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBQYXJzZSBpdCBiYWNrIHRvIGluc3BlY3QgQWRkcmVzc01hcHMgYW5kIHNpZ0luZGljaWVzXG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHVuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgcGFyc2VkQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZmxhcmVUeCA9IChwYXJzZWRUeCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBHZXQgdGhlIGlucHV0IHRvIGNoZWNrIHNpZ0luZGljaWVzXG4gICAgICBjb25zdCBpbXBvcnRUeCA9IGZsYXJlVHgudHggYXMgYW55O1xuICAgICAgY29uc3QgaW5wdXQgPSBpbXBvcnRUeC5pbnNbMF07XG4gICAgICBjb25zdCB0cmFuc2ZlcklucHV0ID0gaW5wdXQuaW5wdXQ7XG4gICAgICBjb25zdCBzaWdJbmRpY2llcyA9IHRyYW5zZmVySW5wdXQuc2lnSW5kaWNpZXMoKTtcblxuICAgICAgLy8gc2lnSW5kaWNpZXMgdGVsbHMgdXM6IHNpZ0luZGljaWVzW3Nsb3RJbmRleF0gPSB1dHhvQWRkcmVzc0luZGV4XG4gICAgICAvLyBGb3IgdGhyZXNob2xkPTIsIHdlIG5lZWQgc2lnbmF0dXJlcyBmb3IgZmlyc3QgMiBhZGRyZXNzZXMgaW4gVVRYTyBvcmRlclxuICAgICAgLy8gVVRYTyBvcmRlcjogWzB4YzM4Ni4uLiAoaW5kZXggMCksIDB4MTJjYi4uLiAoaW5kZXggMSksIDB4YTZlMC4uLiAoaW5kZXggMildXG4gICAgICAvLyBTbyBzaWdJbmRpY2llcyBzaG91bGQgYmUgWzAsIDFdIG1lYW5pbmc6IHNsb3QgMCA9IFVUWE8gaW5kZXggMCwgc2xvdCAxID0gVVRYTyBpbmRleCAxXG5cbiAgICAgIC8vIFZlcmlmeSBzaWdJbmRpY2llcyBhcmUgWzAsIDFdIChmaXJzdCAyIGFkZHJlc3NlcyBpbiBVVFhPIG9yZGVyLCBOT1Qgc29ydGVkIG9yZGVyKVxuICAgICAgc2lnSW5kaWNpZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHNpZ0luZGljaWVzWzBdLnNob3VsZC5lcXVhbCgwLCAnRmlyc3Qgc2lnbmF0dXJlIHNsb3Qgc2hvdWxkIGJlIFVUWE8gYWRkcmVzcyBpbmRleCAwICgweGMzODYuLi4pJyk7XG4gICAgICBzaWdJbmRpY2llc1sxXS5zaG91bGQuZXF1YWwoMSwgJ1NlY29uZCBzaWduYXR1cmUgc2xvdCBzaG91bGQgYmUgVVRYTyBhZGRyZXNzIGluZGV4IDEgKDB4MTJjYi4uLiknKTtcblxuICAgICAgLy8gTm93IHRoZSBrZXkgdGVzdDogQWRkcmVzc01hcCBzaG91bGQgbWFwIGFkZHJlc3NlcyBiYXNlZCBvbiBzaWdJbmRpY2llcyAoVVRYTyBvcmRlcilcbiAgICAgIC8vIE5PVCBiYXNlZCBvbiBzb3J0ZWQgb3JkZXJcbiAgICAgIC8vXG4gICAgICAvLyBDdXJyZW50IGltcGxlbWVudGF0aW9uIChXUk9ORyk6XG4gICAgICAvLyAtIFNvcnRzIGFkZHJlc3NlczogWzB4MTJjYi4uLiAoc21hbGxlc3QpLCAweGE2ZTAuLi4gKG1pZGRsZSksIDB4YzM4Ni4uLiAobGFyZ2VzdCldXG4gICAgICAvLyAtIE1hcHM6IHNvcnRlZFswXSAtPiBzbG90IDAsIHNvcnRlZFsxXSAtPiBzbG90IDFcbiAgICAgIC8vIC0gVGhpcyBtZWFuczogMHgxMmNiLi4uIC0+IHNsb3QgMCwgMHhhNmUwLi4uIC0+IHNsb3QgMSAoV1JPTkchKVxuICAgICAgLy9cbiAgICAgIC8vIEV4cGVjdGVkIChDT1JSRUNUKTpcbiAgICAgIC8vIC0gVXNlcyBVVFhPIG9yZGVyIHZpYSBzaWdJbmRpY2llczogc2lnSW5kaWNpZXNbMF09MCwgc2lnSW5kaWNpZXNbMV09MVxuICAgICAgLy8gLSBNYXBzOiBhZGRyZXNzIGF0IFVUWE8gaW5kZXggMCAoMHhjMzg2Li4uKSAtPiBzbG90IDAsIGFkZHJlc3MgYXQgVVRYTyBpbmRleCAxICgweDEyY2IuLi4pIC0+IHNsb3QgMVxuICAgICAgLy8gLSBUaGlzIG1lYW5zOiAweGMzODYuLi4gLT4gc2xvdCAwLCAweDEyY2IuLi4gLT4gc2xvdCAxIChDT1JSRUNUISlcblxuICAgICAgLy8gUGFyc2UgYWRkcmVzc2VzXG4gICAgICAvLyBBZGRyZXNzIGF0IFVUWE8gaW5kZXggMCAoMHhjMzg2Li4uKSBzaG91bGQgbWFwIHRvIHNpZ25hdHVyZSBzbG90IDBcbiAgICAgIGNvbnN0IHBBZGRyMEJ5dGVzID0gdGVzdFV0aWxzLnBhcnNlQWRkcmVzcyhwQWRkcmVzc2VzWzBdKTsgLy8gQ29ycmVzcG9uZHMgdG8gVVRYTyBpbmRleCAwXG5cbiAgICAgIC8vIEFkZHJlc3MgYXQgVVRYTyBpbmRleCAxICgweDEyY2IuLi4pIHNob3VsZCBtYXAgdG8gc2lnbmF0dXJlIHNsb3QgMVxuICAgICAgY29uc3QgcEFkZHIxQnl0ZXMgPSB0ZXN0VXRpbHMucGFyc2VBZGRyZXNzKHBBZGRyZXNzZXNbMV0pOyAvLyBDb3JyZXNwb25kcyB0byBVVFhPIGluZGV4IDFcblxuICAgICAgLy8gR2V0IGFkZHJlc3NlcyBmcm9tIEFkZHJlc3NNYXBcbiAgICAgIGNvbnN0IGFkZHJlc3Nlc0luTWFwID0gZmxhcmVUeC5nZXRBZGRyZXNzZXMoKTtcblxuICAgICAgLy8gVmVyaWZ5IGFkZHJlc3NlcyBhcmUgaW4gdGhlIG1hcFxuICAgICAgY29uc3QgYWRkcjBJbk1hcCA9IGFkZHJlc3Nlc0luTWFwLnNvbWUoKGFkZHIpID0+IEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKGFkZHIpLCBwQWRkcjBCeXRlcykgPT09IDApO1xuICAgICAgY29uc3QgYWRkcjFJbk1hcCA9IGFkZHJlc3Nlc0luTWFwLnNvbWUoKGFkZHIpID0+IEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKGFkZHIpLCBwQWRkcjFCeXRlcykgPT09IDApO1xuXG4gICAgICBhZGRyMEluTWFwLnNob3VsZC5iZS50cnVlKCdBZGRyZXNzIGF0IFVUWE8gaW5kZXggMCBzaG91bGQgYmUgaW4gQWRkcmVzc01hcCcpO1xuICAgICAgYWRkcjFJbk1hcC5zaG91bGQuYmUudHJ1ZSgnQWRkcmVzcyBhdCBVVFhPIGluZGV4IDEgc2hvdWxkIGJlIGluIEFkZHJlc3NNYXAnKTtcblxuICAgICAgLy8gVGhlIGNyaXRpY2FsIGFzc2VydGlvbjogQWRkcmVzc01hcCBzaG91bGQgbWFwIGFkZHJlc3NlcyB0byBzaWduYXR1cmUgc2xvdHMgYmFzZWQgb24gc2lnSW5kaWNpZXNcbiAgICAgIC8vIFNpbmNlIHdlIGNhbid0IGRpcmVjdGx5IGFjY2VzcyBpbmRpdmlkdWFsIEFkZHJlc3NNYXAgaW5zdGFuY2VzLCB3ZSB2ZXJpZnkgdGhlIGJlaGF2aW9yXG4gICAgICAvLyBieSBjaGVja2luZyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgaXMgY29ycmVjdC5cbiAgICAgIC8vXG4gICAgICAvLyBXaXRoIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKFdST05HKTpcbiAgICAgIC8vIC0gQWRkcmVzc01hcCBtYXBzIHNvcnRlZCBhZGRyZXNzZXM6IDB4MTJjYi4uLiAtPiBzbG90IDAsIDB4YTZlMC4uLiAtPiBzbG90IDFcbiAgICAgIC8vIC0gQnV0IHNpZ0luZGljaWVzIHNheTogc2xvdCAwID0gVVRYTyBpbmRleCAwICgweGMzODYuLi4pLCBzbG90IDEgPSBVVFhPIGluZGV4IDEgKDB4MTJjYi4uLilcbiAgICAgIC8vIC0gTWlzbWF0Y2ghIEFkZHJlc3NNYXAgc2F5cyAweDEyY2IuLi4gLT4gc2xvdCAwLCBidXQgc2lnSW5kaWNpZXMgc2F5IHNsb3QgMCA9IDB4YzM4Ni4uLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgbWlzbWF0Y2ggd2lsbCBjYXVzZSBzaWduaW5nIHRvIGZhaWwgYmVjYXVzZTpcbiAgICAgIC8vIC0gU2lnbmluZyBsb2dpYyB1c2VzIEFkZHJlc3NNYXAgdG8gZmluZCB3aGljaCBzbG90IHRvIHNpZ25cbiAgICAgIC8vIC0gQnV0IGNyZWRlbnRpYWxzIGV4cGVjdCBzaWduYXR1cmVzIGluIHNsb3RzIGJhc2VkIG9uIHNpZ0luZGljaWVzIChVVFhPIG9yZGVyKVxuICAgICAgLy8gLSBSZXN1bHQ6IFwid3Jvbmcgc2lnbmF0dXJlXCIgZXJyb3Igb24tY2hhaW5cblxuICAgICAgLy8gVGhlIGNyaXRpY2FsIHRlc3Q6IFZlcmlmeSB0aGF0IHNpZ25hdHVyZSBzbG90cyBoYXZlIGVtYmVkZGVkIGFkZHJlc3NlcyBiYXNlZCBvbiBVVFhPIG9yZGVyXG4gICAgICAvLyBXaXRoIHVuc29ydGVkIFVUWE8gYWRkcmVzc2VzLCB0aGlzIHdpbGwgRkFJTCBpZiBBZGRyZXNzTWFwcyBkb24ndCBtYXRjaCBVVFhPIG9yZGVyXG4gICAgICAvL1xuICAgICAgLy8gc2lnSW5kaWNpZXMgdGVsbHMgdXM6IHNpZ0luZGljaWVzW3Nsb3RJbmRleF0gPSB1dHhvQWRkcmVzc0luZGV4XG4gICAgICAvLyBGb3IgdGhyZXNob2xkPTIsIHdlIG5lZWQgc2lnbmF0dXJlcyBmb3IgZmlyc3QgMiBhZGRyZXNzZXMgaW4gVVRYTyBvcmRlclxuICAgICAgLy8gVVRYTyBvcmRlcjogWzB4YzM4Ni4uLiAoaW5kZXggMCksIDB4MTJjYi4uLiAoaW5kZXggMSksIDB4YTZlMC4uLiAoaW5kZXggMildXG4gICAgICAvLyBTbyBzaWdJbmRpY2llcyBzaG91bGQgYmUgWzAsIDFdIG1lYW5pbmc6IHNsb3QgMCA9IFVUWE8gaW5kZXggMCwgc2xvdCAxID0gVVRYTyBpbmRleCAxXG5cbiAgICAgIC8vIFBhcnNlIHRoZSBjcmVkZW50aWFsIHRvIHNlZSB3aGljaCBzbG90cyBoYXZlIHdoaWNoIGVtYmVkZGVkIGFkZHJlc3Nlc1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IGZsYXJlVHguY3JlZGVudGlhbHNbMF07XG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG5cbiAgICAgIC8vIEV4dHJhY3QgZW1iZWRkZWQgYWRkcmVzc2VzIGZyb20gc2lnbmF0dXJlIHNsb3RzXG4gICAgICBjb25zdCBlbWJlZGRlZEFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHNpZ25hdHVyZSBoYXMgZW1iZWRkZWQgYWRkcmVzcyAoc2FtZSBsb2dpYyBhcyB0cmFuc2FjdGlvbi50cylcbiAgICAgIGNvbnN0IGlzRW1wdHlTaWduYXR1cmUgPSAoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuICEhc2lnbmF0dXJlICYmIHRlc3RVdGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKS5zdGFydHNXaXRoKCcwJy5yZXBlYXQoOTApKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGhhc0VtYmVkZGVkQWRkcmVzcyA9IChzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjbGVhblNpZyA9IHRlc3RVdGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKTtcbiAgICAgICAgaWYgKGNsZWFuU2lnLmxlbmd0aCA8IDEzMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbWJlZGRlZFBhcnQgPSBjbGVhblNpZy5zdWJzdHJpbmcoOTAsIDEzMCk7XG4gICAgICAgIC8vIENoZWNrIGlmIGVtYmVkZGVkIHBhcnQgaXMgbm90IGFsbCB6ZXJvc1xuICAgICAgICByZXR1cm4gZW1iZWRkZWRQYXJ0ICE9PSAnMCcucmVwZWF0KDQwKTtcbiAgICAgIH07XG5cbiAgICAgIHNpZ25hdHVyZXMuZm9yRWFjaCgoc2lnOiBzdHJpbmcsIHNsb3RJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChoYXNFbWJlZGRlZEFkZHJlc3Moc2lnKSkge1xuICAgICAgICAgIC8vIEV4dHJhY3QgZW1iZWRkZWQgYWRkcmVzcyAoYWZ0ZXIgcG9zaXRpb24gOTAsIDQwIGNoYXJzID0gMjAgYnl0ZXMpXG4gICAgICAgICAgY29uc3QgY2xlYW5TaWcgPSB0ZXN0VXRpbHMucmVtb3ZlSGV4UHJlZml4KHNpZyk7XG4gICAgICAgICAgY29uc3QgZW1iZWRkZWRBZGRyID0gY2xlYW5TaWcuc3Vic3RyaW5nKDkwLCAxMzApLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgZW1iZWRkZWRBZGRyZXNzZXNbc2xvdEluZGV4XSA9ICcweCcgKyBlbWJlZGRlZEFkZHI7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBWZXJpZnk6IENyZWRlbnRpYWxzIG9ubHkgZW1iZWQgT05FIGFkZHJlc3MgKHVzZXIvcmVjb3ZlcnkpLCBub3QgYm90aFxuICAgICAgLy8gVGhlIGVtYmVkZGVkIGFkZHJlc3Mgc2hvdWxkIGJlIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4IGxvZ2ljLCBub3Qgc29ydGVkIG9yZGVyXG4gICAgICAvL1xuICAgICAgLy8gQ29tcHV0ZSBhZGRyZXNzZXNJbmRleCB0byBkZXRlcm1pbmUgZXhwZWN0ZWQgc2lnbmF0dXJlIG9yZGVyXG4gICAgICBjb25zdCB1dHhvQWRkcmVzc0J5dGVzID0gdW5zb3J0ZWRVdHhvQWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gdGVzdFV0aWxzLnBhcnNlQWRkcmVzcyhhZGRyKSk7XG4gICAgICBjb25zdCBwQWRkcmVzc0J5dGVzID0gcEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHRlc3RVdGlscy5wYXJzZUFkZHJlc3MoYWRkcikpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXNJbmRleDogbnVtYmVyW10gPSBbXTtcbiAgICAgIHBBZGRyZXNzQnl0ZXMuZm9yRWFjaCgocEFkZHIpID0+IHtcbiAgICAgICAgY29uc3QgdXR4b0luZGV4ID0gdXR4b0FkZHJlc3NCeXRlcy5maW5kSW5kZXgoXG4gICAgICAgICAgKHVBZGRyKSA9PiBCdWZmZXIuY29tcGFyZShCdWZmZXIuZnJvbSh1QWRkciksIEJ1ZmZlci5mcm9tKHBBZGRyKSkgPT09IDBcbiAgICAgICAgKTtcbiAgICAgICAgYWRkcmVzc2VzSW5kZXgucHVzaCh1dHhvSW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZpcnN0SW5kZXggPSAwICh1c2VyKSwgYml0Z29JbmRleCA9IDFcbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSAwO1xuICAgICAgY29uc3QgYml0Z29JbmRleCA9IDE7XG5cbiAgICAgIC8vIERldGVybWluZSBleHBlY3RlZCBzaWduYXR1cmUgb3JkZXIgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXhcbiAgICAgIGNvbnN0IHVzZXJDb21lc0ZpcnN0ID0gYWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF0gPiBhZGRyZXNzZXNJbmRleFtmaXJzdEluZGV4XTtcblxuICAgICAgLy8gRXhwZWN0ZWQgY3JlZGVudGlhbCBzdHJ1Y3R1cmU6XG4gICAgICAvLyAtIElmIHVzZXIgY29tZXMgZmlyc3Q6IFt1c2VyQWRkcmVzcywgemVyb3NdXG4gICAgICAvLyAtIElmIGJpdGdvIGNvbWVzIGZpcnN0OiBbemVyb3MsIHVzZXJBZGRyZXNzXVxuICAgICAgY29uc3QgdXNlckFkZHJlc3NIZXggPSBCdWZmZXIuZnJvbShwQWRkcmVzc0J5dGVzW2ZpcnN0SW5kZXhdKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVXNlckFkZHIgPSAnMHgnICsgdXNlckFkZHJlc3NIZXg7XG5cbiAgICAgIGlmICh1c2VyQ29tZXNGaXJzdCkge1xuICAgICAgICAvLyBFeHBlY3RlZDogW3VzZXJBZGRyZXNzLCB6ZXJvc11cbiAgICAgICAgLy8gU2xvdCAwIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzcyAocEFkZHIwID0gMHhjMzg2Li4uID0gVVRYTyBpbmRleCAwKVxuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMF0pIHtcbiAgICAgICAgICBlbWJlZGRlZEFkZHJlc3Nlc1swXVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVXNlckFkZHIsXG4gICAgICAgICAgICAgIGBTbG90IDAgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzICgke2V4cGVjdGVkVXNlckFkZHJ9KSBiZWNhdXNlIHVzZXIgY29tZXMgZmlyc3QgaW4gVVRYTyBvcmRlcmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDAgc2hvdWxkIGhhdmUgZW1iZWRkZWQgdXNlciBhZGRyZXNzLCBidXQgaXMgZW1wdHlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTbG90IDEgc2hvdWxkIGJlIHplcm9zIChubyBlbWJlZGRlZCBhZGRyZXNzKVxuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMV0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsb3QgMSBzaG91bGQgYmUgemVyb3MsIGJ1dCBoYXMgZW1iZWRkZWQgYWRkcmVzczogJHtlbWJlZGRlZEFkZHJlc3Nlc1sxXX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQ6IFt6ZXJvcywgdXNlckFkZHJlc3NdXG4gICAgICAgIC8vIFNsb3QgMCBzaG91bGQgYmUgemVyb3NcbiAgICAgICAgaWYgKGVtYmVkZGVkQWRkcmVzc2VzWzBdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDAgc2hvdWxkIGJlIHplcm9zLCBidXQgaGFzIGVtYmVkZGVkIGFkZHJlc3M6ICR7ZW1iZWRkZWRBZGRyZXNzZXNbMF19YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2xvdCAxIHNob3VsZCBoYXZlIHVzZXIgYWRkcmVzc1xuICAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMV0pIHtcbiAgICAgICAgICBlbWJlZGRlZEFkZHJlc3Nlc1sxXVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAgIGV4cGVjdGVkVXNlckFkZHIsXG4gICAgICAgICAgICAgIGBTbG90IDEgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzICgke2V4cGVjdGVkVXNlckFkZHJ9KSBiZWNhdXNlIGJpdGdvIGNvbWVzIGZpcnN0IGluIFVUWE8gb3JkZXJgXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2xvdCAxIHNob3VsZCBoYXZlIGVtYmVkZGVkIHVzZXIgYWRkcmVzcywgYnV0IGlzIGVtcHR5YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGtleSB2ZXJpZmljYXRpb246IEFkZHJlc3NNYXBzIHNob3VsZCBtYXRjaCB0aGUgY3JlZGVudGlhbCBvcmRlclxuICAgICAgLy8gV2l0aCB0aGUgZml4LCBBZGRyZXNzTWFwcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgc2FtZSBhZGRyZXNzZXNJbmRleCBsb2dpYyBhcyBjcmVkZW50aWFsc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIHNpZ25pbmcgd29ya3MgY29ycmVjdGx5IGV2ZW4gd2l0aCB1bnNvcnRlZCBVVFhPIGFkZHJlc3Nlc1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/keyPair.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,158 @@
|
|
|
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 lib_1 = require("../../../src/lib");
|
|
42
|
+
const testData = __importStar(require("../../resources/account"));
|
|
43
|
+
const pubKey = testData.ACCOUNT_1.publicKey;
|
|
44
|
+
const prvKey = testData.ACCOUNT_1.privateKey;
|
|
45
|
+
describe('Flr P Key Pair', () => {
|
|
46
|
+
describe('should create a valid KeyPair', () => {
|
|
47
|
+
it('from an empty value', () => {
|
|
48
|
+
const keyPair = new lib_1.KeyPair();
|
|
49
|
+
const pubKey = keyPair.getKeys().pub;
|
|
50
|
+
const prvKey = keyPair.getKeys().prv;
|
|
51
|
+
should_1.default.exists(pubKey);
|
|
52
|
+
should_1.default.exists(prvKey);
|
|
53
|
+
});
|
|
54
|
+
it('from a seed', () => {
|
|
55
|
+
const seed = testData.SEED_ACCOUNT.seed;
|
|
56
|
+
const keyPairObj = new lib_1.KeyPair({ seed: Buffer.from(seed, 'hex') });
|
|
57
|
+
const keys = keyPairObj.getKeys();
|
|
58
|
+
should_1.default.exists(keys.prv);
|
|
59
|
+
should_1.default.exists(keys.pub);
|
|
60
|
+
should_1.default.equal(keys.prv, testData.SEED_ACCOUNT.privateKey);
|
|
61
|
+
should_1.default.equal(keys.pub, testData.SEED_ACCOUNT.publicKey);
|
|
62
|
+
const extendedKeys = keyPairObj.getExtendedKeys();
|
|
63
|
+
should_1.default.exists(extendedKeys.xprv);
|
|
64
|
+
should_1.default.exists(extendedKeys.xpub);
|
|
65
|
+
should_1.default.equal(extendedKeys.xprv, testData.SEED_ACCOUNT.xPrivateKey);
|
|
66
|
+
should_1.default.equal(extendedKeys.xpub, testData.SEED_ACCOUNT.xPublicKey);
|
|
67
|
+
});
|
|
68
|
+
it('from a xprv', () => {
|
|
69
|
+
const keyPairObj = new lib_1.KeyPair({ prv: testData.SEED_ACCOUNT.xPrivateKey });
|
|
70
|
+
const keys = keyPairObj.getKeys();
|
|
71
|
+
should_1.default.exists(keys.prv);
|
|
72
|
+
should_1.default.exists(keys.pub);
|
|
73
|
+
should_1.default.equal(keys.prv, testData.SEED_ACCOUNT.privateKey);
|
|
74
|
+
should_1.default.equal(keys.pub, testData.SEED_ACCOUNT.publicKey);
|
|
75
|
+
const extendedKeys = keyPairObj.getExtendedKeys();
|
|
76
|
+
should_1.default.exists(extendedKeys.xprv);
|
|
77
|
+
should_1.default.exists(extendedKeys.xpub);
|
|
78
|
+
should_1.default.equal(extendedKeys.xprv, testData.SEED_ACCOUNT.xPrivateKey);
|
|
79
|
+
should_1.default.equal(extendedKeys.xpub, testData.SEED_ACCOUNT.xPublicKey);
|
|
80
|
+
});
|
|
81
|
+
it('from a xpub', () => {
|
|
82
|
+
const keyPairObj = new lib_1.KeyPair({ pub: testData.SEED_ACCOUNT.xPublicKey });
|
|
83
|
+
const keys = keyPairObj.getKeys();
|
|
84
|
+
should_1.default.not.exists(keys.prv);
|
|
85
|
+
should_1.default.exists(keys.pub);
|
|
86
|
+
should_1.default.equal(keys.pub, testData.SEED_ACCOUNT.publicKey);
|
|
87
|
+
const extendedKeys = keyPairObj.getExtendedKeys();
|
|
88
|
+
should_1.default.not.exists(extendedKeys.xprv);
|
|
89
|
+
should_1.default.exists(extendedKeys.xpub);
|
|
90
|
+
should_1.default.equal(extendedKeys.xpub, testData.SEED_ACCOUNT.xPublicKey);
|
|
91
|
+
});
|
|
92
|
+
it('from a public key', () => {
|
|
93
|
+
const keyPair = new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey });
|
|
94
|
+
should_1.default.equal(keyPair.getKeys().pub, testData.ACCOUNT_3.publicKey);
|
|
95
|
+
should_1.default.exists(keyPair.getAddress());
|
|
96
|
+
});
|
|
97
|
+
it('Should get same address key for account 3 private key ', () => {
|
|
98
|
+
const keyPair = new lib_1.KeyPair({ prv: testData.ACCOUNT_3.privateKey });
|
|
99
|
+
should_1.default.equal(keyPair.getKeys().prv, testData.ACCOUNT_3.privateKey);
|
|
100
|
+
should_1.default.equal(keyPair.getKeys().pub, testData.ACCOUNT_3.publicKey);
|
|
101
|
+
should_1.default.equal(keyPair.getAddress('testnet'), testData.ACCOUNT_3.address);
|
|
102
|
+
});
|
|
103
|
+
it('Should get same address key for account 4 private key ', () => {
|
|
104
|
+
const keyPair = new lib_1.KeyPair({ prv: testData.ACCOUNT_4.privateKey });
|
|
105
|
+
should_1.default.equal(keyPair.getKeys().prv, testData.ACCOUNT_4.privateKey);
|
|
106
|
+
should_1.default.equal(keyPair.getKeys().pub, testData.ACCOUNT_4.publicKey);
|
|
107
|
+
should_1.default.equal(keyPair.getAddress('testnet'), testData.ACCOUNT_4.address);
|
|
108
|
+
});
|
|
109
|
+
describe('getAddress', function () {
|
|
110
|
+
it('should get an address', () => {
|
|
111
|
+
const seed = testData.SEED_ACCOUNT.seed;
|
|
112
|
+
const keyPair = new lib_1.KeyPair({ seed: Buffer.from(seed, 'hex') });
|
|
113
|
+
const address = keyPair.getAddress();
|
|
114
|
+
address.should.equal(testData.SEED_ACCOUNT.addressMainnet);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
it('without source', () => {
|
|
118
|
+
const keyPair = new lib_1.KeyPair();
|
|
119
|
+
keyPair.getKeys().should.have.property('pub');
|
|
120
|
+
keyPair.getKeys().should.have.property('prv');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('should fail to create a KeyPair', () => {
|
|
124
|
+
it('from an invalid public key', () => {
|
|
125
|
+
assert_1.default.throws(() => new lib_1.KeyPair({ pub: testData.INVALID_SHORT_KEYPAIR_KEY }), (e) => e.message === testData.INVALID_PUBLIC_KEY_ERROR_MESSAGE);
|
|
126
|
+
});
|
|
127
|
+
it('from an invalid private key', () => {
|
|
128
|
+
assert_1.default.throws(() => new lib_1.KeyPair({ prv: testData.INVALID_SHORT_KEYPAIR_KEY }), (e) => e.message === testData.INVALID_PRIVATE_KEY_ERROR_MESSAGE);
|
|
129
|
+
assert_1.default.throws(() => {
|
|
130
|
+
new lib_1.KeyPair({ prv: testData.INVALID_LONG_KEYPAIR_PRV });
|
|
131
|
+
}, (e) => e.message === testData.INVALID_PRIVATE_KEY_ERROR_MESSAGE);
|
|
132
|
+
assert_1.default.throws(() => new lib_1.KeyPair({ prv: prvKey + pubKey }), (e) => e.message === testData.INVALID_PRIVATE_KEY_ERROR_MESSAGE);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
describe('verifyAddress', function () {
|
|
136
|
+
it('should get and match mainnet address', () => {
|
|
137
|
+
const seed = testData.SEED_ACCOUNT.seed;
|
|
138
|
+
const keyPair = new lib_1.KeyPair({ seed: Buffer.from(seed, 'hex') });
|
|
139
|
+
const address = keyPair.getAddress();
|
|
140
|
+
address.should.equal(testData.SEED_ACCOUNT.addressMainnet);
|
|
141
|
+
const prv = testData.ACCOUNT_1.privateKey;
|
|
142
|
+
const keyPair2 = new lib_1.KeyPair({ prv: prv });
|
|
143
|
+
const address2 = keyPair2.getAddress();
|
|
144
|
+
address2.should.equal(testData.ACCOUNT_1.addressMainnet);
|
|
145
|
+
});
|
|
146
|
+
it('should get and match testnet address', () => {
|
|
147
|
+
const seed = testData.SEED_ACCOUNT.seed;
|
|
148
|
+
const keyPair = new lib_1.KeyPair({ seed: Buffer.from(seed, 'hex') });
|
|
149
|
+
const address = keyPair.getAddress('testnet');
|
|
150
|
+
address.should.equal(testData.SEED_ACCOUNT.addressTestnet);
|
|
151
|
+
const prv = testData.ACCOUNT_1.privateKey;
|
|
152
|
+
const keyPair2 = new lib_1.KeyPair({ prv: prv });
|
|
153
|
+
const address2 = keyPair2.getAddress('testnet');
|
|
154
|
+
address2.should.equal(testData.ACCOUNT_1.addressTestnet);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsMENBQTJDO0FBQzNDLGtFQUFvRDtBQUVwRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUM1QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztBQUU3QyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLFFBQVEsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDN0MsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtZQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sRUFBRSxDQUFDO1lBQzlCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDckMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRSxNQUFNLElBQUksR0FBRyxV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QUM5QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRCxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9hY2NvdW50JztcblxuY29uc3QgcHViS2V5ID0gdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleTtcbmNvbnN0IHBydktleSA9IHRlc3REYXRhLkFDQ09VTlRfMS5wcml2YXRlS2V5O1xuXG5kZXNjcmliZSgnRmxyIFAgS2V5IFBhaXInLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdzaG91bGQgY3JlYXRlIGEgdmFsaWQgS2V5UGFpcicsICgpID0+IHtcbiAgICBpdCgnZnJvbSBhbiBlbXB0eSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcigpO1xuICAgICAgY29uc3QgcHViS2V5ID0ga2V5UGFpci5nZXRLZXlzKCkucHViO1xuICAgICAgY29uc3QgcHJ2S2V5ID0ga2V5UGFpci5nZXRLZXlzKCkucHJ2O1xuICAgICAgc2hvdWxkLmV4aXN0cyhwdWJLZXkpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhwcnZLZXkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYSBzZWVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VlZCA9IHRlc3REYXRhLlNFRURfQUNDT1VOVC5zZWVkO1xuICAgICAgY29uc3Qga2V5UGFpck9iaiA9IG5ldyBLZXlQYWlyKHsgc2VlZDogQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpIH0pO1xuICAgICAgY29uc3Qga2V5cyA9IGtleVBhaXJPYmouZ2V0S2V5cygpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhrZXlzLnBydik7XG4gICAgICBzaG91bGQuZXhpc3RzKGtleXMucHViKTtcbiAgICAgIHNob3VsZC5lcXVhbChrZXlzLnBydiEsIHRlc3REYXRhLlNFRURfQUNDT1VOVC5wcml2YXRlS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChrZXlzLnB1YiwgdGVzdERhdGEuU0VFRF9BQ0NPVU5ULnB1YmxpY0tleSk7XG5cbiAgICAgIGNvbnN0IGV4dGVuZGVkS2V5cyA9IGtleVBhaXJPYmouZ2V0RXh0ZW5kZWRLZXlzKCk7XG4gICAgICBzaG91bGQuZXhpc3RzKGV4dGVuZGVkS2V5cy54cHJ2KTtcbiAgICAgIHNob3VsZC5leGlzdHMoZXh0ZW5kZWRLZXlzLnhwdWIpO1xuICAgICAgc2hvdWxkLmVxdWFsKGV4dGVuZGVkS2V5cy54cHJ2LCB0ZXN0RGF0YS5TRUVEX0FDQ09VTlQueFByaXZhdGVLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKGV4dGVuZGVkS2V5cy54cHViLCB0ZXN0RGF0YS5TRUVEX0FDQ09VTlQueFB1YmxpY0tleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhIHhwcnYnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyT2JqID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLlNFRURfQUNDT1VOVC54UHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyT2JqLmdldEtleXMoKTtcbiAgICAgIHNob3VsZC5leGlzdHMoa2V5cy5wcnYpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhrZXlzLnB1Yik7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5cy5wcnYhLCB0ZXN0RGF0YS5TRUVEX0FDQ09VTlQucHJpdmF0ZUtleSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5cy5wdWIsIHRlc3REYXRhLlNFRURfQUNDT1VOVC5wdWJsaWNLZXkpO1xuXG4gICAgICBjb25zdCBleHRlbmRlZEtleXMgPSBrZXlQYWlyT2JqLmdldEV4dGVuZGVkS2V5cygpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhleHRlbmRlZEtleXMueHBydik7XG4gICAgICBzaG91bGQuZXhpc3RzKGV4dGVuZGVkS2V5cy54cHViKTtcbiAgICAgIHNob3VsZC5lcXVhbChleHRlbmRlZEtleXMueHBydiwgdGVzdERhdGEuU0VFRF9BQ0NPVU5ULnhQcml2YXRlS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChleHRlbmRlZEtleXMueHB1YiwgdGVzdERhdGEuU0VFRF9BQ0NPVU5ULnhQdWJsaWNLZXkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYSB4cHViJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpck9iaiA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5TRUVEX0FDQ09VTlQueFB1YmxpY0tleSB9KTtcbiAgICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyT2JqLmdldEtleXMoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3RzKGtleXMucHJ2KTtcbiAgICAgIHNob3VsZC5leGlzdHMoa2V5cy5wdWIpO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleXMucHViLCB0ZXN0RGF0YS5TRUVEX0FDQ09VTlQucHVibGljS2V5KTtcblxuICAgICAgY29uc3QgZXh0ZW5kZWRLZXlzID0ga2V5UGFpck9iai5nZXRFeHRlbmRlZEtleXMoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3RzKGV4dGVuZGVkS2V5cy54cHJ2KTtcbiAgICAgIHNob3VsZC5leGlzdHMoZXh0ZW5kZWRLZXlzLnhwdWIpO1xuICAgICAgc2hvdWxkLmVxdWFsKGV4dGVuZGVkS2V5cy54cHViLCB0ZXN0RGF0YS5TRUVEX0FDQ09VTlQueFB1YmxpY0tleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHViLCB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5leGlzdHMoa2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgc2FtZSBhZGRyZXNzIGtleSBmb3IgYWNjb3VudCAzIHByaXZhdGUga2V5ICcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuQUNDT1VOVF8zLnByaXZhdGVLZXkgfSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHJ2LCB0ZXN0RGF0YS5BQ0NPVU5UXzMucHJpdmF0ZUtleSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHViLCB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChrZXlQYWlyLmdldEFkZHJlc3MoJ3Rlc3RuZXQnKSwgdGVzdERhdGEuQUNDT1VOVF8zLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgc2FtZSBhZGRyZXNzIGtleSBmb3IgYWNjb3VudCA0IHByaXZhdGUga2V5ICcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuQUNDT1VOVF80LnByaXZhdGVLZXkgfSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHJ2LCB0ZXN0RGF0YS5BQ0NPVU5UXzQucHJpdmF0ZUtleSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHViLCB0ZXN0RGF0YS5BQ0NPVU5UXzQucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChrZXlQYWlyLmdldEFkZHJlc3MoJ3Rlc3RuZXQnKSwgdGVzdERhdGEuQUNDT1VOVF80LmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGdldCBhbiBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWVkID0gdGVzdERhdGEuU0VFRF9BQ0NPVU5ULnNlZWQ7XG4gICAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHNlZWQ6IEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSB9KTtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcygpO1xuICAgICAgICBhZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5TRUVEX0FDQ09VTlQuYWRkcmVzc01haW5uZXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aG91dCBzb3VyY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoKTtcbiAgICAgIGtleVBhaXIuZ2V0S2V5cygpLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwdWInKTtcbiAgICAgIGtleVBhaXIuZ2V0S2V5cygpLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcnYnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIGNyZWF0ZSBhIEtleVBhaXInLCAoKSA9PiB7XG4gICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLklOVkFMSURfU0hPUlRfS0VZUEFJUl9LRVkgfSksXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuSU5WQUxJRF9QVUJMSUNfS0VZX0VSUk9SX01FU1NBR0VcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLklOVkFMSURfU0hPUlRfS0VZUEFJUl9LRVkgfSksXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuSU5WQUxJRF9QUklWQVRFX0tFWV9FUlJPUl9NRVNTQUdFXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5JTlZBTElEX0xPTkdfS0VZUEFJUl9QUlYgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuSU5WQUxJRF9QUklWQVRFX0tFWV9FUlJPUl9NRVNTQUdFXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gbmV3IEtleVBhaXIoeyBwcnY6IHBydktleSArIHB1YktleSB9KSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSB0ZXN0RGF0YS5JTlZBTElEX1BSSVZBVEVfS0VZX0VSUk9SX01FU1NBR0VcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJpZnlBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGFuZCBtYXRjaCBtYWlubmV0IGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0gdGVzdERhdGEuU0VFRF9BQ0NPVU5ULnNlZWQ7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBzZWVkOiBCdWZmZXIuZnJvbShzZWVkLCAnaGV4JykgfSk7XG4gICAgICBjb25zdCBhZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKCk7XG4gICAgICBhZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5TRUVEX0FDQ09VTlQuYWRkcmVzc01haW5uZXQpO1xuXG4gICAgICBjb25zdCBwcnYgPSB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleTtcbiAgICAgIGNvbnN0IGtleVBhaXIyID0gbmV3IEtleVBhaXIoeyBwcnY6IHBydiB9KTtcbiAgICAgIGNvbnN0IGFkZHJlc3MyID0ga2V5UGFpcjIuZ2V0QWRkcmVzcygpO1xuICAgICAgYWRkcmVzczIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFDQ09VTlRfMS5hZGRyZXNzTWFpbm5ldCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhbmQgbWF0Y2ggdGVzdG5ldCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VlZCA9IHRlc3REYXRhLlNFRURfQUNDT1VOVC5zZWVkO1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgc2VlZDogQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpIH0pO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcygndGVzdG5ldCcpO1xuICAgICAgYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0KTtcblxuICAgICAgY29uc3QgcHJ2ID0gdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXk7XG4gICAgICBjb25zdCBrZXlQYWlyMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBwcnYgfSk7XG4gICAgICBjb25zdCBhZGRyZXNzMiA9IGtleVBhaXIyLmdldEFkZHJlc3MoJ3Rlc3RuZXQnKTtcbiAgICAgIGFkZHJlc3MyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseTransactionBuilder, BaseTransactionBuilderFactory } from '@bitgo-beta/sdk-core';
|
|
2
|
+
export interface signFlowTestSuitArgs {
|
|
3
|
+
transactionType: string;
|
|
4
|
+
newTxFactory: () => BaseTransactionBuilderFactory;
|
|
5
|
+
newTxBuilder: () => BaseTransactionBuilder;
|
|
6
|
+
unsignedTxHex: string;
|
|
7
|
+
halfSignedTxHex: string;
|
|
8
|
+
fullSignedTxHex: string;
|
|
9
|
+
privateKey: {
|
|
10
|
+
prv1: string;
|
|
11
|
+
prv2: string;
|
|
12
|
+
};
|
|
13
|
+
txHash: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Test suit focus in raw tx signing changes.
|
|
17
|
+
* @param {signFlowTestSuitArgs} data with require info.
|
|
18
|
+
*/
|
|
19
|
+
export default function signFlowTestSuit(data: signFlowTestSuitArgs): void;
|
|
20
|
+
//# sourceMappingURL=signFlowTestSuit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signFlowTestSuit.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/signFlowTestSuit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,6BAA6B,CAAC;IAClD,YAAY,EAAE,MAAM,sBAAsB,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAqFzE"}
|