@bitgo-beta/sdk-coin-trx 1.0.2-beta.201 → 1.0.2-beta.2011
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/resources/protobuf/Contract.proto +32 -0
- package/dist/resources/protobuf/tron.d.ts +1478 -214
- package/dist/resources/protobuf/tron.js +6312 -2600
- package/dist/resources/protobuf/tron.proto +6 -0
- package/dist/src/index.js +6 -2
- package/dist/src/lib/accountCreateTxBuilder.d.ts +60 -0
- package/dist/src/lib/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/accountCreateTxBuilder.js +191 -0
- package/dist/src/lib/constants.d.ts +4 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +7 -0
- package/dist/src/lib/contractCallBuilder.d.ts +1 -35
- package/dist/src/lib/contractCallBuilder.d.ts.map +1 -1
- package/dist/src/lib/contractCallBuilder.js +13 -76
- package/dist/src/lib/delegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/enum.d.ts +40 -1
- package/dist/src/lib/enum.d.ts.map +1 -1
- package/dist/src/lib/enum.js +44 -4
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts +71 -0
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/freezeBalanceTxBuilder.js +217 -0
- package/dist/src/lib/iface.d.ts +248 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.d.ts +0 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +31 -18
- package/dist/src/lib/resourceManagementTxBuilder.d.ts +72 -0
- package/dist/src/lib/resourceManagementTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/resourceManagementTxBuilder.js +150 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +3 -3
- package/dist/src/lib/transaction.d.ts +3 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +115 -6
- package/dist/src/lib/transactionBuilder.d.ts +53 -6
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +114 -21
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/undelegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.js +210 -0
- package/dist/src/lib/utils.d.ts +92 -4
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +482 -47
- package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
- package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
- package/dist/src/lib/withdrawBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawBuilder.js +167 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
- package/dist/src/lib/wrappedBuilder.d.ts +67 -1
- package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
- package/dist/src/lib/wrappedBuilder.js +114 -4
- package/dist/src/trx.d.ts +105 -4
- package/dist/src/trx.d.ts.map +1 -1
- package/dist/src/trx.js +519 -147
- package/dist/src/trxToken.d.ts +2 -2
- package/dist/src/trxToken.d.ts.map +1 -1
- package/dist/src/trxToken.js +47 -6
- package/dist/test/fixtures.d.ts +40 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +46 -0
- package/dist/test/resources.d.ts +596 -0
- package/dist/test/resources.d.ts.map +1 -0
- package/dist/test/resources.js +759 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +19 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +163 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +38 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.js +247 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +365 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +55 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +336 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.js +50 -0
- package/dist/test/unit/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.js +178 -0
- package/dist/test/unit/trx.d.ts +2 -0
- package/dist/test/unit/trx.d.ts.map +1 -0
- package/dist/test/unit/trx.js +639 -0
- package/dist/test/unit/trxToken.d.ts +2 -0
- package/dist/test/unit/trxToken.d.ts.map +1 -0
- package/dist/test/unit/trxToken.js +119 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +141 -0
- package/dist/test/unit/verifyTransaction.d.ts +2 -0
- package/dist/test/unit/verifyTransaction.d.ts.map +1 -0
- package/dist/test/unit/verifyTransaction.js +593 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +22 -16
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -104
- package/resources/README.md +0 -31
- package/resources/protobuf/Contract.proto +0 -256
- package/resources/protobuf/Discover.proto +0 -44
- package/resources/protobuf/tron.d.ts +0 -11205
- package/resources/protobuf/tron.js +0 -33480
- package/resources/protobuf/tron.proto +0 -677
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trxToken.d.ts","sourceRoot":"","sources":["../../../test/unit/trxToken.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,119 @@
|
|
|
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 node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
9
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
10
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
11
|
+
const trx_1 = require("../../src/trx");
|
|
12
|
+
const trxToken_1 = require("../../src/trxToken");
|
|
13
|
+
const ttrx_1 = require("../../src/ttrx");
|
|
14
|
+
const lib_1 = require("../../src/lib");
|
|
15
|
+
// Real TriggerSmartContract protobuf raw_data_hex encoding a TRC20 transfer:
|
|
16
|
+
// owner: 41c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac
|
|
17
|
+
// contract: 4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0
|
|
18
|
+
// data: a9059cbb + abi(address=8483618ca85c35a9b923d98bebca718f5a1db279, uint256=100000000)
|
|
19
|
+
const TRC20_RAW_DATA_HEX = '0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307';
|
|
20
|
+
// Recipient address decoded from the ABI data above (41 prefix → base58)
|
|
21
|
+
const TRC20_RECIPIENT_HEX = '418483618ca85c35a9b923d98bebca718f5a1db279';
|
|
22
|
+
const TRC20_AMOUNT = '100000000';
|
|
23
|
+
(0, node_test_1.describe)('TrxToken verifyTransaction:', function () {
|
|
24
|
+
const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
25
|
+
bitgo.initializeTestVars();
|
|
26
|
+
bitgo.safeRegister('trx', trx_1.Trx.createInstance);
|
|
27
|
+
bitgo.safeRegister('ttrx', ttrx_1.Ttrx.createInstance);
|
|
28
|
+
let tokenCoin;
|
|
29
|
+
(0, node_test_1.before)(function () {
|
|
30
|
+
const usdtConfig = statics_1.tokens.testnet.trx.tokens.find((t) => t.type === 'ttrx:usdt');
|
|
31
|
+
node_assert_1.default.ok(usdtConfig, 'ttrx:usdt token config not found');
|
|
32
|
+
tokenCoin = new trxToken_1.TrxToken(bitgo, usdtConfig);
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.describe)('TSS wallet — TriggerSmartContract validation', () => {
|
|
35
|
+
(0, node_test_1.it)('should validate a correct TRC20 transfer', async function () {
|
|
36
|
+
const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
|
|
37
|
+
const result = await tokenCoin.verifyTransaction({
|
|
38
|
+
txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
|
|
39
|
+
txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
|
|
40
|
+
walletType: 'tss',
|
|
41
|
+
});
|
|
42
|
+
node_assert_1.default.strictEqual(result, true);
|
|
43
|
+
});
|
|
44
|
+
(0, node_test_1.it)('should validate when txHex is a serialized JSON (prebuildAndSignTransaction path)', async function () {
|
|
45
|
+
const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
|
|
46
|
+
const serializedTxHex = JSON.stringify({ txID: 'abc', raw_data_hex: TRC20_RAW_DATA_HEX, raw_data: {} });
|
|
47
|
+
const result = await tokenCoin.verifyTransaction({
|
|
48
|
+
txPrebuild: { txHex: serializedTxHex },
|
|
49
|
+
txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
|
|
50
|
+
walletType: 'tss',
|
|
51
|
+
});
|
|
52
|
+
node_assert_1.default.strictEqual(result, true);
|
|
53
|
+
});
|
|
54
|
+
(0, node_test_1.it)('should throw when amount does not match', async function () {
|
|
55
|
+
const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
|
|
56
|
+
await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
|
|
57
|
+
txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
|
|
58
|
+
txParams: { recipients: [{ address: recipientBase58, amount: '999' }] },
|
|
59
|
+
walletType: 'tss',
|
|
60
|
+
}), { message: 'transaction amount in txPrebuild does not match the value given by client' });
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.it)('should throw when recipient address does not match', async function () {
|
|
63
|
+
await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
|
|
64
|
+
txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
|
|
65
|
+
txParams: { recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: TRC20_AMOUNT }] },
|
|
66
|
+
walletType: 'tss',
|
|
67
|
+
}), { message: 'destination address does not match with the recipient address' });
|
|
68
|
+
});
|
|
69
|
+
(0, node_test_1.it)('should throw when recipients is empty', async function () {
|
|
70
|
+
await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
|
|
71
|
+
txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
|
|
72
|
+
txParams: { recipients: [] },
|
|
73
|
+
walletType: 'tss',
|
|
74
|
+
}), { message: 'missing or invalid required property recipients' });
|
|
75
|
+
});
|
|
76
|
+
(0, node_test_1.it)('should throw when contract type is not TriggerSmartContract', async function () {
|
|
77
|
+
// Use a native TRX Transfer protobuf as txHex — TrxToken only handles TriggerSmartContract
|
|
78
|
+
const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
|
|
79
|
+
const nativeTrxRawDataHex = lib_1.Utils.generateRawDataHex({
|
|
80
|
+
contract: [
|
|
81
|
+
{
|
|
82
|
+
parameter: {
|
|
83
|
+
value: {
|
|
84
|
+
amount: 100000000,
|
|
85
|
+
owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
|
|
86
|
+
to_address: TRC20_RECIPIENT_HEX,
|
|
87
|
+
},
|
|
88
|
+
type_url: 'type.googleapis.com/protocol.TransferContract',
|
|
89
|
+
},
|
|
90
|
+
type: 'TransferContract',
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
refBlockBytes: 'c8cf',
|
|
94
|
+
refBlockHash: '89177fd84c5d9196',
|
|
95
|
+
expiration: Date.now() + 3600000,
|
|
96
|
+
timestamp: Date.now(),
|
|
97
|
+
});
|
|
98
|
+
await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
|
|
99
|
+
txPrebuild: { txHex: nativeTrxRawDataHex },
|
|
100
|
+
txParams: { recipients: [{ address: recipientBase58, amount: '100000000' }] },
|
|
101
|
+
walletType: 'tss',
|
|
102
|
+
}), { message: /Expected TriggerSmartContract for TRC20 token transfer/ });
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
(0, node_test_1.describe)('non-TSS wallet — builder-based validation (existing path)', () => {
|
|
106
|
+
(0, node_test_1.it)('should validate a correct non-TSS TRC20 transfer using txBuilder', async function () {
|
|
107
|
+
// The non-TSS path uses getBuilder().from(rawTx).build() and checks tx.outputs[0]
|
|
108
|
+
// This test uses the full JSON tx format that the builder understands.
|
|
109
|
+
const txHex = '{"raw_data":{"contractType":2,"contract":[{"parameter":{"value":{"data":"a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e100","owner_address":"41c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac","contract_address":"4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"expiration":1674581767432,"timestamp":1674578167432,"ref_block_bytes":"578b","ref_block_hash":"6113bb9ac351432b","fee_limit":15000000},"raw_data_hex":"0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307","txID":"fe21c49f4febd9089125e3a006943c145721d8fcb7ab84136f8c6663ff92f8ed","signature":["0775cde302689eb8293883c66a89b31e80d608bfc3ad3c283b64a490ea4cc712c55a2fd2e62c75843dd7e77d8c4cb52e0f371fbb29b332c259f8cb63c2e6195301"]}';
|
|
110
|
+
const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
|
|
111
|
+
const result = await tokenCoin.verifyTransaction({
|
|
112
|
+
txPrebuild: { txHex },
|
|
113
|
+
txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
|
|
114
|
+
});
|
|
115
|
+
node_assert_1.default.strictEqual(result, true);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ4VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJ4VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMseUNBQWlEO0FBQ2pELGlEQUErQztBQUMvQyxtREFBK0Q7QUFDL0QsaURBQTZDO0FBQzdDLHVDQUFvQztBQUNwQyxpREFBOEM7QUFDOUMseUNBQXNDO0FBQ3RDLHVDQUFzQztBQUV0Qyw2RUFBNkU7QUFDN0UseURBQXlEO0FBQ3pELHlEQUF5RDtBQUN6RCxrR0FBa0c7QUFDbEcsTUFBTSxrQkFBa0IsR0FDdEIsd2FBQXdhLENBQUM7QUFFM2EseUVBQXlFO0FBQ3pFLE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7QUFDekUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBRWpDLElBQUEsb0JBQVEsRUFBQyw2QkFBNkIsRUFBRTtJQUN0QyxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsSUFBSSxTQUFtQixDQUFDO0lBRXhCLElBQUEsa0JBQU0sRUFBQztRQUNMLE1BQU0sVUFBVSxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ2pGLHFCQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxrQ0FB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QkFDN0UsVUFBVSxFQUFFLEtBQUs7YUFDWCxDQUFDLEVBQ1QsRUFBRSxPQUFPLEVBQUUsd0RBQXdELEVBQUUsQ0FDdEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLG9CQUFRLEVBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1FBQ3pFLElBQUEsY0FBRSxFQUFDLGtFQUFrRSxFQUFFLEtBQUs7WUFDMUUsa0ZBQWtGO1lBQ2xGLHVFQUF1RTtZQUN2RSxNQUFNLEtBQUssR0FDVCxndENBQWd0QyxDQUFDO1lBQ250QyxNQUFNLGVBQWUsR0FBRyxXQUFLLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUUzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFO2dCQUNyQixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUU7YUFDeEUsQ0FBQyxDQUFDO1lBRVYscUJBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGl0LCBiZWZvcmUgfSBmcm9tICdub2RlOnRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHb0FQSSwgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcnggfSBmcm9tICcuLi8uLi9zcmMvdHJ4JztcbmltcG9ydCB7IFRyeFRva2VuIH0gZnJvbSAnLi4vLi4vc3JjL3RyeFRva2VuJztcbmltcG9ydCB7IFR0cnggfSBmcm9tICcuLi8uLi9zcmMvdHRyeCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL3NyYy9saWInO1xuXG4vLyBSZWFsIFRyaWdnZXJTbWFydENvbnRyYWN0IHByb3RvYnVmIHJhd19kYXRhX2hleCBlbmNvZGluZyBhIFRSQzIwIHRyYW5zZmVyOlxuLy8gICBvd25lcjogICAgNDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjXG4vLyAgIGNvbnRyYWN0OiA0MTQyYTFlMzlhZWZhNDkyOTBmMmIzZjllZDY4OGQ3Y2VjZjg2Y2Q2ZTBcbi8vICAgZGF0YTogICAgIGE5MDU5Y2JiICsgYWJpKGFkZHJlc3M9ODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OSwgdWludDI1Nj0xMDAwMDAwMDApXG5jb25zdCBUUkMyMF9SQVdfREFUQV9IRVggPVxuICAnMGEwMjU3OGIyMjA4NjExM2JiOWFjMzUxNDMyYjQwODhlYWU3YTZkZTMwNWFhZTAxMDgxZjEyYTkwMTBhMzE3NDc5NzA2NTJlNjc2ZjZmNjc2YzY1NjE3MDY5NzMyZTYzNmY2ZDJmNzA3MjZmNzQ2ZjYzNmY2YzJlNTQ3MjY5Njc2NzY1NzI1MzZkNjE3Mjc0NDM2ZjZlNzQ3MjYxNjM3NDEyNzQwYTE1NDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjMTIxNTQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMDIyNDRhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwNzA4ODhkOGNhNWRlMzA5MDAxYzBjMzkzMDcnO1xuXG4vLyBSZWNpcGllbnQgYWRkcmVzcyBkZWNvZGVkIGZyb20gdGhlIEFCSSBkYXRhIGFib3ZlICg0MSBwcmVmaXgg4oaSIGJhc2U1OClcbmNvbnN0IFRSQzIwX1JFQ0lQSUVOVF9IRVggPSAnNDE4NDgzNjE4Y2E4NWMzNWE5YjkyM2Q5OGJlYmNhNzE4ZjVhMWRiMjc5JztcbmNvbnN0IFRSQzIwX0FNT1VOVCA9ICcxMDAwMDAwMDAnO1xuXG5kZXNjcmliZSgnVHJ4VG9rZW4gdmVyaWZ5VHJhbnNhY3Rpb246JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbzogVGVzdEJpdEdvQVBJID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0cngnLCBUcnguY3JlYXRlSW5zdGFuY2UpO1xuICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3R0cngnLCBUdHJ4LmNyZWF0ZUluc3RhbmNlKTtcblxuICBsZXQgdG9rZW5Db2luOiBUcnhUb2tlbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZHRDb25maWcgPSB0b2tlbnMudGVzdG5ldC50cngudG9rZW5zLmZpbmQoKHQpID0+IHQudHlwZSA9PT0gJ3R0cng6dXNkdCcpO1xuICAgIGFzc2VydC5vayh1c2R0Q29uZmlnLCAndHRyeDp1c2R0IHRva2VuIGNvbmZpZyBub3QgZm91bmQnKTtcbiAgICB0b2tlbkNvaW4gPSBuZXcgVHJ4VG9rZW4oYml0Z28sIHVzZHRDb25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVFNTIHdhbGxldCDigJQgVHJpZ2dlclNtYXJ0Q29udHJhY3QgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgY29ycmVjdCBUUkMyMCB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudEJhc2U1OCA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KFRSQzIwX1JFQ0lQSUVOVF9IRVgpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdoZW4gdHhIZXggaXMgYSBzZXJpYWxpemVkIEpTT04gKHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uIHBhdGgpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBKU09OLnN0cmluZ2lmeSh7IHR4SUQ6ICdhYmMnLCByYXdfZGF0YV9oZXg6IFRSQzIwX1JBV19EQVRBX0hFWCwgcmF3X2RhdGE6IHt9IH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBzZXJpYWxpemVkVHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IFRSQzIwX1JBV19EQVRBX0hFWCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IHJlY2lwaWVudEJhc2U1OCwgYW1vdW50OiAnOTk5JyB9XSB9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9IGFzIGFueSksXG4gICAgICAgIHsgbWVzc2FnZTogJ3RyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBnaXZlbiBieSBjbGllbnQnIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gcmVjaXBpZW50IGFkZHJlc3MgZG9lcyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVExXaDY3UDkzS2d0blpOQ3RHbkVITTFIMzNOaHEydXZ2TicsIGFtb3VudDogVFJDMjBfQU1PVU5UIH1dIH0sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0gYXMgYW55KSxcbiAgICAgICAgeyBtZXNzYWdlOiAnZGVzdGluYXRpb24gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNpcGllbnQgYWRkcmVzcycgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnRzIGlzIGVtcHR5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogVFJDMjBfUkFXX0RBVEFfSEVYIH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW10gfSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgICB7IG1lc3NhZ2U6ICdtaXNzaW5nIG9yIGludmFsaWQgcmVxdWlyZWQgcHJvcGVydHkgcmVjaXBpZW50cycgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBjb250cmFjdCB0eXBlIGlzIG5vdCBUcmlnZ2VyU21hcnRDb250cmFjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVzZSBhIG5hdGl2ZSBUUlggVHJhbnNmZXIgcHJvdG9idWYgYXMgdHhIZXgg4oCUIFRyeFRva2VuIG9ubHkgaGFuZGxlcyBUcmlnZ2VyU21hcnRDb250cmFjdFxuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG4gICAgICBjb25zdCBuYXRpdmVUcnhSYXdEYXRhSGV4ID0gVXRpbHMuZ2VuZXJhdGVSYXdEYXRhSGV4KHtcbiAgICAgICAgY29udHJhY3Q6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMCxcbiAgICAgICAgICAgICAgICBvd25lcl9hZGRyZXNzOiAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JyxcbiAgICAgICAgICAgICAgICB0b19hZGRyZXNzOiBUUkMyMF9SRUNJUElFTlRfSEVYLFxuICAgICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmQmxvY2tCeXRlczogJ2M4Y2YnLFxuICAgICAgICByZWZCbG9ja0hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgZXhwaXJhdGlvbjogRGF0ZS5ub3coKSArIDM2MDAwMDAsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBuYXRpdmVUcnhSYXdEYXRhSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6ICcxMDAwMDAwMDAnIH1dIH0sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0gYXMgYW55KSxcbiAgICAgICAgeyBtZXNzYWdlOiAvRXhwZWN0ZWQgVHJpZ2dlclNtYXJ0Q29udHJhY3QgZm9yIFRSQzIwIHRva2VuIHRyYW5zZmVyLyB9XG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uLVRTUyB3YWxsZXQg4oCUIGJ1aWxkZXItYmFzZWQgdmFsaWRhdGlvbiAoZXhpc3RpbmcgcGF0aCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIGNvcnJlY3Qgbm9uLVRTUyBUUkMyMCB0cmFuc2ZlciB1c2luZyB0eEJ1aWxkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgbm9uLVRTUyBwYXRoIHVzZXMgZ2V0QnVpbGRlcigpLmZyb20ocmF3VHgpLmJ1aWxkKCkgYW5kIGNoZWNrcyB0eC5vdXRwdXRzWzBdXG4gICAgICAvLyBUaGlzIHRlc3QgdXNlcyB0aGUgZnVsbCBKU09OIHR4IGZvcm1hdCB0aGF0IHRoZSBidWlsZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAne1wicmF3X2RhdGFcIjp7XCJjb250cmFjdFR5cGVcIjoyLFwiY29udHJhY3RcIjpbe1wicGFyYW1ldGVyXCI6e1widmFsdWVcIjp7XCJkYXRhXCI6XCJhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwXCIsXCJvd25lcl9hZGRyZXNzXCI6XCI0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWNcIixcImNvbnRyYWN0X2FkZHJlc3NcIjpcIjQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMFwifSxcInR5cGVfdXJsXCI6XCJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyaWdnZXJTbWFydENvbnRyYWN0XCJ9LFwidHlwZVwiOlwiVHJpZ2dlclNtYXJ0Q29udHJhY3RcIn1dLFwiZXhwaXJhdGlvblwiOjE2NzQ1ODE3Njc0MzIsXCJ0aW1lc3RhbXBcIjoxNjc0NTc4MTY3NDMyLFwicmVmX2Jsb2NrX2J5dGVzXCI6XCI1NzhiXCIsXCJyZWZfYmxvY2tfaGFzaFwiOlwiNjExM2JiOWFjMzUxNDMyYlwiLFwiZmVlX2xpbWl0XCI6MTUwMDAwMDB9LFwicmF3X2RhdGFfaGV4XCI6XCIwYTAyNTc4YjIyMDg2MTEzYmI5YWMzNTE0MzJiNDA4OGVhZTdhNmRlMzA1YWFlMDEwODFmMTJhOTAxMGEzMTc0Nzk3MDY1MmU2NzZmNmY2NzZjNjU2MTcwNjk3MzJlNjM2ZjZkMmY3MDcyNmY3NDZmNjM2ZjZjMmU1NDcyNjk2NzY3NjU3MjUzNmQ2MTcyNzQ0MzZmNmU3NDcyNjE2Mzc0MTI3NDBhMTU0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWMxMjE1NDE0MmExZTM5YWVmYTQ5MjkwZjJiM2Y5ZWQ2ODhkN2NlY2Y4NmNkNmUwMjI0NGE5MDU5Y2JiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVmNWUxMDA3MDg4OGQ4Y2E1ZGUzMDkwMDFjMGMzOTMwN1wiLFwidHhJRFwiOlwiZmUyMWM0OWY0ZmViZDkwODkxMjVlM2EwMDY5NDNjMTQ1NzIxZDhmY2I3YWI4NDEzNmY4YzY2NjNmZjkyZjhlZFwiLFwic2lnbmF0dXJlXCI6W1wiMDc3NWNkZTMwMjY4OWViODI5Mzg4M2M2NmE4OWIzMWU4MGQ2MDhiZmMzYWQzYzI4M2I2NGE0OTBlYTRjYzcxMmM1NWEyZmQyZTYyYzc1ODQzZGQ3ZTc3ZDhjNGNiNTJlMGYzNzFmYmIyOWIzMzJjMjU5ZjhjYjYzYzJlNjE5NTMwMVwiXX0nO1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgfSBhcyBhbnkpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,141 @@
|
|
|
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 node_test_1 = require("node:test");
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const src_1 = require("../../src");
|
|
9
|
+
const resources_1 = require("../resources");
|
|
10
|
+
const utils_1 = require("../../src/lib/utils");
|
|
11
|
+
(0, node_test_1.describe)('Util library should', function () {
|
|
12
|
+
// arbitrary text
|
|
13
|
+
const arr = [127, 255, 31, 192, 3, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
14
|
+
const hex = '7FFF1FC0037E0000000000000000000000000000000000000000000000000000';
|
|
15
|
+
const txt = 'arbitrary string to sign';
|
|
16
|
+
const signedString = '0x9424113f32c17b6ffbeee024e1a54b6991d756e82f66cca16a41231fdfa270d03b08e833f5dbbd5cc86896c2e5ea6c74d2e292cda21f717164f994fcdf28486d1b';
|
|
17
|
+
// prv-pub-address hex
|
|
18
|
+
const prv = 'FB3AA887E0BE3FAC9D75E661DAFF4A7FE0E91AAB13DA9775CD8586D7CB9B7640';
|
|
19
|
+
const pub = '046EBFB90C396B4A3B992B727CB4714A32E2A6DE43FDB3EC266286AC2246D8FD1E23E12C0DEB752C631A9011BBF8B56E2FBAA20E99D3952F0A558D11F96E7C1C5D';
|
|
20
|
+
const addressHex = '412C2BA4A9FF6C53207DC5B686BFECF75EA7B80577';
|
|
21
|
+
const base58 = 'TDzm1tCXM2YS1PDa3GoXSvxdy4AgwVbBPE';
|
|
22
|
+
const addrBytes = [65, 44, 43, 164, 169, 255, 108, 83, 32, 125, 197, 182, 134, 191, 236, 247, 94, 167, 184, 5, 119];
|
|
23
|
+
// tx information
|
|
24
|
+
(0, node_test_1.it)('be able to convert hex to bytes', () => {
|
|
25
|
+
const ba = src_1.Utils.getByteArrayFromHexAddress(hex);
|
|
26
|
+
assert_1.default.deepStrictEqual(ba, arr);
|
|
27
|
+
});
|
|
28
|
+
(0, node_test_1.it)('be able to convert hex with 0x to bytes ', () => {
|
|
29
|
+
const ba = src_1.Utils.getByteArrayFromHexAddress('0x' + hex);
|
|
30
|
+
assert_1.default.deepStrictEqual(ba, arr);
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('be able to convert hex to bytes', () => {
|
|
33
|
+
const hs = src_1.Utils.getHexAddressFromByteArray(arr);
|
|
34
|
+
assert_1.default.equal(hs, hex);
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.it)('get a pub from a prv', () => {
|
|
37
|
+
const derivedPub = src_1.Utils.getPubKeyFromPriKey(Buffer.from(prv, 'hex'));
|
|
38
|
+
const derivedPubHex = src_1.Utils.getHexAddressFromByteArray(derivedPub);
|
|
39
|
+
assert_1.default.equal(derivedPubHex, pub);
|
|
40
|
+
});
|
|
41
|
+
(0, node_test_1.it)('get an hex address from a prv', () => {
|
|
42
|
+
const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
|
|
43
|
+
const hexAddr = src_1.Utils.getHexAddressFromByteArray(addr);
|
|
44
|
+
assert_1.default.equal(hexAddr, addressHex);
|
|
45
|
+
});
|
|
46
|
+
(0, node_test_1.it)('get an base58 address', () => {
|
|
47
|
+
const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
|
|
48
|
+
const addr58 = src_1.Utils.getBase58AddressFromByteArray(addr);
|
|
49
|
+
assert_1.default.equal(addr58, base58);
|
|
50
|
+
});
|
|
51
|
+
(0, node_test_1.it)('get an base58 address from hex', () => {
|
|
52
|
+
const addr58 = src_1.Utils.getBase58AddressFromHex(addressHex);
|
|
53
|
+
assert_1.default.equal(addr58, base58);
|
|
54
|
+
});
|
|
55
|
+
(0, node_test_1.it)('get hex from base58 address', () => {
|
|
56
|
+
const hexAddr = src_1.Utils.getHexAddressFromBase58Address(base58);
|
|
57
|
+
assert_1.default.equal(hexAddr, addressHex);
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.it)('validate a hex string', () => {
|
|
60
|
+
const hex = ['0xaffd', '0x11'];
|
|
61
|
+
hex.map((hex) => {
|
|
62
|
+
assert_1.default.ok(src_1.Utils.isValidHex(hex));
|
|
63
|
+
});
|
|
64
|
+
const invalidHex = ['0xa11', '0xFFdYYY', '0x', ''];
|
|
65
|
+
invalidHex.map((hex) => {
|
|
66
|
+
assert_1.default.strictEqual(src_1.Utils.isValidHex(hex), false);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
(0, node_test_1.it)('sign a string', () => {
|
|
70
|
+
const hexText = Buffer.from(txt).toString('hex');
|
|
71
|
+
const signed = src_1.Utils.signString(hexText, prv);
|
|
72
|
+
assert_1.default.equal(signedString, signed);
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.it)('should calculate an address from a pub', () => {
|
|
75
|
+
const pubBytes = src_1.Utils.getByteArrayFromHexAddress(pub);
|
|
76
|
+
const bytes = src_1.Utils.getRawAddressFromPubKey(pubBytes);
|
|
77
|
+
assert_1.default.deepStrictEqual(bytes, addrBytes);
|
|
78
|
+
});
|
|
79
|
+
(0, node_test_1.it)('should verify a signed message', () => {
|
|
80
|
+
const hexEncodedMessage = Buffer.from(txt).toString('hex');
|
|
81
|
+
assert_1.default.strictEqual(src_1.Utils.verifySignature(hexEncodedMessage, base58, signedString, true), true);
|
|
82
|
+
});
|
|
83
|
+
(0, node_test_1.it)('should fail to verify a signed message if the message is not in hex', () => {
|
|
84
|
+
assert_1.default.throws(() => src_1.Utils.verifySignature(txt, base58, signedString, true));
|
|
85
|
+
});
|
|
86
|
+
(0, node_test_1.it)('should fail to verify a signed message if the address is not in base58', () => {
|
|
87
|
+
const hexEncodedString = Buffer.from(txt).toString('hex');
|
|
88
|
+
assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, addressHex, signedString, true));
|
|
89
|
+
});
|
|
90
|
+
(0, node_test_1.it)('should fail to verify a signed message if the signature is not in hex', () => {
|
|
91
|
+
const hexEncodedString = Buffer.from(txt).toString('hex');
|
|
92
|
+
assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, base58, 'abc', true));
|
|
93
|
+
});
|
|
94
|
+
(0, node_test_1.it)('should return transaction data', () => {
|
|
95
|
+
const data = src_1.Utils.decodeRawTransaction(resources_1.UnsignedTransferContractTx.tx.raw_data_hex);
|
|
96
|
+
assert_1.default.equal(data.timestamp, resources_1.UnsignedTransferContractTx.tx.raw_data.timestamp);
|
|
97
|
+
assert_1.default.equal(data.expiration, resources_1.UnsignedTransferContractTx.tx.raw_data.expiration);
|
|
98
|
+
assert_1.default.ok(data.contracts);
|
|
99
|
+
});
|
|
100
|
+
(0, node_test_1.it)('should decode a transfer contract', () => {
|
|
101
|
+
const tx = resources_1.UnsignedTransferContractTx.tx;
|
|
102
|
+
const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
|
|
103
|
+
const value = resources_1.UnsignedTransferContractTx.tx.raw_data.contract[0].parameter.value;
|
|
104
|
+
const parsedContract = src_1.Utils.decodeTransferContract(rawTx.contracts[0].parameter.value);
|
|
105
|
+
const toAddress = src_1.Utils.getBase58AddressFromHex(value.to_address);
|
|
106
|
+
const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
|
|
107
|
+
const amount = value.amount;
|
|
108
|
+
assert_1.default.equal(parsedContract[0].parameter.value.to_address, toAddress);
|
|
109
|
+
assert_1.default.equal(parsedContract[0].parameter.value.owner_address, ownerAddress);
|
|
110
|
+
assert_1.default.equal(parsedContract[0].parameter.value.amount, amount);
|
|
111
|
+
});
|
|
112
|
+
(0, node_test_1.it)('should decode an AccountPermissionUpdate Contract', () => {
|
|
113
|
+
const tx = resources_1.SignedAccountPermissionUpdateContractTx;
|
|
114
|
+
const value = tx.raw_data.contract[0].parameter.value;
|
|
115
|
+
const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
|
|
116
|
+
const parsedTx = src_1.Utils.decodeAccountPermissionUpdateContract(rawTx.contracts[0].parameter.value);
|
|
117
|
+
const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
|
|
118
|
+
assert_1.default.equal(parsedTx.ownerAddress, ownerAddress);
|
|
119
|
+
assert_1.default.equal(parsedTx.owner.type, 0);
|
|
120
|
+
assert_1.default.equal(parsedTx.owner.threshold, 2);
|
|
121
|
+
assert_1.default.equal(parsedTx.actives.length, 1);
|
|
122
|
+
assert_1.default.equal(parsedTx.actives[0].type, 2);
|
|
123
|
+
assert_1.default.equal(parsedTx.actives[0].threshold, 2);
|
|
124
|
+
});
|
|
125
|
+
(0, node_test_1.it)('should encode and decode data parameters for transfer', () => {
|
|
126
|
+
const types = ['address', 'uint256'];
|
|
127
|
+
const amount = '2000000000000000000000';
|
|
128
|
+
const values = [addressHex, amount];
|
|
129
|
+
const methodId = '0xa9059cbb';
|
|
130
|
+
const data = src_1.Utils.encodeDataParams(types, values, methodId);
|
|
131
|
+
assert_1.default.equal(data, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
|
|
132
|
+
const decodedData = src_1.Utils.decodeDataParams(types, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
|
|
133
|
+
assert_1.default.equal(decodedData[0], addressHex.toLocaleLowerCase());
|
|
134
|
+
assert_1.default.equal(decodedData[1].toString(), amount);
|
|
135
|
+
});
|
|
136
|
+
(0, node_test_1.it)('should correctly map testnet and mainnet tokens', () => {
|
|
137
|
+
assert_1.default.strictEqual(utils_1.tokenMainnetContractAddresses.includes('TSSMHYeV2uE9qYH95DqyoCuNCzEL1NvU3S'), true);
|
|
138
|
+
assert_1.default.strictEqual(utils_1.tokenTestnetContractAddresses.includes('TGkfUshdbAiNj5G1mynp2meq2BfF6XSGPf'), true);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBNkM7QUFFN0MsNENBQW1HO0FBQ25HLCtDQUFtRztBQUVuRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLEVBQUU7SUFDOUIsaUJBQWlCO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RILE1BQU0sR0FBRyxHQUFHLGtFQUFrRSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLDBCQUEwQixDQUFDO0lBQ3ZDLE1BQU0sWUFBWSxHQUNoQixzSUFBc0ksQ0FBQztJQUV6SSxzQkFBc0I7SUFDdEIsTUFBTSxHQUFHLEdBQUcsa0VBQWtFLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQ1Asb0lBQW9JLENBQUM7SUFDdkksTUFBTSxVQUFVLEdBQUcsNENBQTRDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdB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Q0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkcsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnRlcmZhY2UsIFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgsIFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeCB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyB0b2tlbk1haW5uZXRDb250cmFjdEFkZHJlc3NlcywgdG9rZW5UZXN0bmV0Q29udHJhY3RBZGRyZXNzZXMgfSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ1V0aWwgbGlicmFyeSBzaG91bGQnLCBmdW5jdGlvbiAoKSB7XG4gIC8vIGFyYml0cmFyeSB0ZXh0XG4gIGNvbnN0IGFyciA9IFsxMjcsIDI1NSwgMzEsIDE5MiwgMywgMTI2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgY29uc3QgaGV4ID0gJzdGRkYxRkMwMDM3RTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICBjb25zdCB0eHQgPSAnYXJiaXRyYXJ5IHN0cmluZyB0byBzaWduJztcbiAgY29uc3Qgc2lnbmVkU3RyaW5nID1cbiAgICAnMHg5NDI0MTEzZjMyYzE3YjZmZmJlZWUwMjRlMWE1NGI2OTkxZDc1NmU4MmY2NmNjYTE2YTQxMjMxZmRmYTI3MGQwM2IwOGU4MzNmNWRiYmQ1Y2M4Njg5NmMyZTVlYTZjNzRkMmUyOTJjZGEyMWY3MTcxNjRmOTk0ZmNkZjI4NDg2ZDFiJztcblxuICAvLyBwcnYtcHViLWFkZHJlc3MgaGV4XG4gIGNvbnN0IHBydiA9ICdGQjNBQTg4N0UwQkUzRkFDOUQ3NUU2NjFEQUZGNEE3RkUwRTkxQUFCMTNEQTk3NzVDRDg1ODZEN0NCOUI3NjQwJztcbiAgY29uc3QgcHViID1cbiAgICAnMDQ2RUJGQjkwQzM5NkI0QTNCOTkyQjcyN0NCNDcxNEEzMkUyQTZERTQzRkRCM0VDMjY2Mjg2QUMyMjQ2RDhGRDFFMjNFMTJDMERFQjc1MkM2MzFBOTAxMUJCRjhCNTZFMkZCQUEyMEU5OUQzOTUyRjBBNTU4RDExRjk2RTdDMUM1RCc7XG4gIGNvbnN0IGFkZHJlc3NIZXggPSAnNDEyQzJCQTRBOUZGNkM1MzIwN0RDNUI2ODZCRkVDRjc1RUE3QjgwNTc3JztcbiAgY29uc3QgYmFzZTU4ID0gJ1REem0xdENYTTJZUzFQRGEzR29YU3Z4ZHk0QWd3VmJCUEUnO1xuICBjb25zdCBhZGRyQnl0ZXMgPSBbNjUsIDQ0LCA0MywgMTY0LCAxNjksIDI1NSwgMTA4LCA4MywgMzIsIDEyNSwgMTk3LCAxODIsIDEzNCwgMTkxLCAyMzYsIDI0NywgOTQsIDE2NywgMTg0LCA1LCAxMTldO1xuXG4gIC8vIHR4IGluZm9ybWF0aW9uXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGJhID0gVXRpbHMuZ2V0Qnl0ZUFycmF5RnJvbUhleEFkZHJlc3MoaGV4KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJhLCBhcnIpO1xuICB9KTtcblxuICBpdCgnYmUgYWJsZSB0byBjb252ZXJ0IGhleCB3aXRoIDB4IHRvIGJ5dGVzICcsICgpID0+IHtcbiAgICBjb25zdCBiYSA9IFV0aWxzLmdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzKCcweCcgKyBoZXgpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmEsIGFycik7XG4gIH0pO1xuXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhzID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYXJyKTtcbiAgICBhc3NlcnQuZXF1YWwoaHMsIGhleCk7XG4gIH0pO1xuXG4gIGl0KCdnZXQgYSBwdWIgZnJvbSBhIHBydicsICgpID0+IHtcbiAgICBjb25zdCBkZXJpdmVkUHViID0gVXRpbHMuZ2V0UHViS2V5RnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgZGVyaXZlZFB1YkhleCA9IFV0aWxzLmdldEhleEFkZHJlc3NGcm9tQnl0ZUFycmF5KGRlcml2ZWRQdWIpO1xuICAgIGFzc2VydC5lcXVhbChkZXJpdmVkUHViSGV4LCBwdWIpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGhleCBhZGRyZXNzIGZyb20gYSBwcnYnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkciA9IFV0aWxzLmdldEFkZHJlc3NGcm9tUHJpS2V5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBoZXhBZGRyID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGhleEFkZHIsIGFkZHJlc3NIZXgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkZHIgPSBVdGlscy5nZXRBZGRyZXNzRnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgYWRkcjU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGFkZHI1OCwgYmFzZTU4KTtcbiAgfSk7XG5cbiAgaXQoJ2dldCBhbiBiYXNlNTggYWRkcmVzcyBmcm9tIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBhZGRyNTggPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleChhZGRyZXNzSGV4KTtcbiAgICBhc3NlcnQuZXF1YWwoYWRkcjU4LCBiYXNlNTgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGhleCBmcm9tIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEFkZHIgPSBVdGlscy5nZXRIZXhBZGRyZXNzRnJvbUJhc2U1OEFkZHJlc3MoYmFzZTU4KTtcbiAgICBhc3NlcnQuZXF1YWwoaGV4QWRkciwgYWRkcmVzc0hleCk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZSBhIGhleCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4ID0gWycweGFmZmQnLCAnMHgxMSddO1xuICAgIGhleC5tYXAoKGhleCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKFV0aWxzLmlzVmFsaWRIZXgoaGV4KSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZhbGlkSGV4ID0gWycweGExMScsICcweEZGZFlZWScsICcweCcsICcnXTtcbiAgICBpbnZhbGlkSGV4Lm1hcCgoaGV4KSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMuaXNWYWxpZEhleChoZXgpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaWduIGEgc3RyaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleFRleHQgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzaWduZWQgPSBVdGlscy5zaWduU3RyaW5nKGhleFRleHQsIHBydik7XG5cbiAgICBhc3NlcnQuZXF1YWwoc2lnbmVkU3RyaW5nLCBzaWduZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBhbiBhZGRyZXNzIGZyb20gYSBwdWInLCAoKSA9PiB7XG4gICAgY29uc3QgcHViQnl0ZXMgPSBVdGlscy5nZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyhwdWIpO1xuICAgIGNvbnN0IGJ5dGVzID0gVXRpbHMuZ2V0UmF3QWRkcmVzc0Zyb21QdWJLZXkocHViQnl0ZXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYnl0ZXMsIGFkZHJCeXRlcyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4RW5jb2RlZE1lc3NhZ2UgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMudmVyaWZ5U2lnbmF0dXJlKGhleEVuY29kZWRNZXNzYWdlLCBiYXNlNTgsIHNpZ25lZFN0cmluZywgdHJ1ZSksIHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0eHQsIGJhc2U1OCwgc2lnbmVkU3RyaW5nLCB0cnVlKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduZWQgbWVzc2FnZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgaW4gYmFzZTU4JywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEVuY29kZWRTdHJpbmcgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZShoZXhFbmNvZGVkU3RyaW5nLCBhZGRyZXNzSGV4LCBzaWduZWRTdHJpbmcsIHRydWUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25lZCBtZXNzYWdlIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBoZXhFbmNvZGVkU3RyaW5nID0gQnVmZmVyLmZyb20odHh0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBVdGlscy52ZXJpZnlTaWduYXR1cmUoaGV4RW5jb2RlZFN0cmluZywgYmFzZTU4LCAnYWJjJywgdHJ1ZSkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0cmFuc2FjdGlvbiBkYXRhJywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbihVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YV9oZXgpO1xuICAgIGFzc2VydC5lcXVhbChkYXRhLnRpbWVzdGFtcCwgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEudGltZXN0YW1wKTtcbiAgICBhc3NlcnQuZXF1YWwoZGF0YS5leHBpcmF0aW9uLCBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YS5leHBpcmF0aW9uKTtcbiAgICBhc3NlcnQub2soZGF0YS5jb250cmFjdHMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhIHRyYW5zZmVyIGNvbnRyYWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4ID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHg7XG4gICAgY29uc3QgcmF3VHggPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbih0eC5yYXdfZGF0YV9oZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlO1xuICAgIGNvbnN0IHBhcnNlZENvbnRyYWN0ID0gVXRpbHMuZGVjb2RlVHJhbnNmZXJDb250cmFjdChcbiAgICAgIHJhd1R4LmNvbnRyYWN0c1swXS5wYXJhbWV0ZXIudmFsdWVcbiAgICApIGFzIEludGVyZmFjZS5UcmFuc2ZlckNvbnRyYWN0W107XG5cbiAgICBjb25zdCB0b0FkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS50b19hZGRyZXNzKTtcbiAgICBjb25zdCBvd25lckFkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS5vd25lcl9hZGRyZXNzKTtcbiAgICBjb25zdCBhbW91bnQgPSB2YWx1ZS5hbW91bnQ7XG5cbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkQ29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnRvX2FkZHJlc3MsIHRvQWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZENvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5vd25lcl9hZGRyZXNzLCBvd25lckFkZHJlc3MpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRDb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUuYW1vdW50LCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhbiBBY2NvdW50UGVybWlzc2lvblVwZGF0ZSBDb250cmFjdCcsICgpID0+IHtcbiAgICBjb25zdCB0eCA9IFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeDtcbiAgICBjb25zdCB2YWx1ZSA9IHR4LnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZTtcbiAgICBjb25zdCByYXdUeCA9IFV0aWxzLmRlY29kZVJhd1RyYW5zYWN0aW9uKHR4LnJhd19kYXRhX2hleCk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBVdGlscy5kZWNvZGVBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0KFxuICAgICAgcmF3VHguY29udHJhY3RzWzBdLnBhcmFtZXRlci52YWx1ZVxuICAgICkgYXMgSW50ZXJmYWNlLkFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3Q7XG4gICAgY29uc3Qgb3duZXJBZGRyZXNzID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodmFsdWUub3duZXJfYWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyQWRkcmVzcywgb3duZXJBZGRyZXNzKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHgub3duZXIudHlwZSwgMCk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyLnRocmVzaG9sZCwgMik7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4LmFjdGl2ZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50eXBlLCAyKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50aHJlc2hvbGQsIDIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEgcGFyYW1ldGVycyBmb3IgdHJhbnNmZXInLCAoKSA9PiB7XG4gICAgY29uc3QgdHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddO1xuICAgIGNvbnN0IGFtb3VudCA9ICcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICBjb25zdCB2YWx1ZXMgPSBbYWRkcmVzc0hleCwgYW1vdW50XTtcbiAgICBjb25zdCBtZXRob2RJZCA9ICcweGE5MDU5Y2JiJztcbiAgICBjb25zdCBkYXRhID0gVXRpbHMuZW5jb2RlRGF0YVBhcmFtcyh0eXBlcywgdmFsdWVzLCBtZXRob2RJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgZGF0YSxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IFV0aWxzLmRlY29kZURhdGFQYXJhbXMoXG4gICAgICB0eXBlcyxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKGRlY29kZWREYXRhWzBdLCBhZGRyZXNzSGV4LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgIGFzc2VydC5lcXVhbChkZWNvZGVkRGF0YVsxXS50b1N0cmluZygpLCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBtYXAgdGVzdG5ldCBhbmQgbWFpbm5ldCB0b2tlbnMnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRva2VuTWFpbm5ldENvbnRyYWN0QWRkcmVzc2VzLmluY2x1ZGVzKCdUU1NNSFllVjJ1RTlxWUg5NURxeW9DdU5DekVMMU52VTNTJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b2tlblRlc3RuZXRDb250cmFjdEFkZHJlc3Nlcy5pbmNsdWRlcygnVEdrZlVzaGRiQWlOajVHMW15bnAybWVxMkJmRjZYU0dQZicpLCB0cnVlKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyTransaction.d.ts","sourceRoot":"","sources":["../../../test/unit/verifyTransaction.ts"],"names":[],"mappings":""}
|