@bitgo-beta/abstract-eth 1.2.3-alpha.50 → 1.2.3-alpha.501
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/abstractEthLikeCoin.d.ts +18 -9
- package/dist/src/abstractEthLikeCoin.d.ts.map +1 -1
- package/dist/src/abstractEthLikeCoin.js +39 -15
- package/dist/src/abstractEthLikeNewCoins.d.ts +847 -0
- package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -0
- package/dist/src/abstractEthLikeNewCoins.js +2531 -0
- package/dist/src/ethLikeToken.d.ts +36 -6
- package/dist/src/ethLikeToken.d.ts.map +1 -1
- package/dist/src/ethLikeToken.js +285 -10
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -2
- 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 +11 -0
- package/dist/src/lib/contractCall.d.ts +8 -0
- package/dist/src/lib/contractCall.d.ts.map +1 -0
- package/dist/src/lib/contractCall.js +17 -0
- package/dist/src/lib/iface.d.ts +133 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +8 -0
- package/dist/src/lib/index.d.ts +17 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +58 -0
- package/dist/src/lib/keyPair.d.ts +26 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +65 -0
- package/dist/src/lib/messages/eip191/eip191Message.d.ts +12 -0
- package/dist/src/lib/messages/eip191/eip191Message.d.ts.map +1 -0
- package/dist/src/lib/messages/eip191/eip191Message.js +25 -0
- package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts +19 -0
- package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
- package/dist/src/lib/messages/eip191/eip191MessageBuilder.js +27 -0
- package/dist/src/lib/messages/eip191/index.d.ts +3 -0
- package/dist/src/lib/messages/eip191/index.d.ts.map +1 -0
- package/dist/src/lib/messages/eip191/index.js +19 -0
- package/dist/src/lib/messages/eip712/eip712Message.d.ts +6 -0
- package/dist/src/lib/messages/eip712/eip712Message.d.ts.map +1 -0
- package/dist/src/lib/messages/eip712/eip712Message.js +27 -0
- package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts +7 -0
- package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
- package/dist/src/lib/messages/eip712/eip712MessageBuilder.js +15 -0
- package/dist/src/lib/messages/eip712/index.d.ts +3 -0
- package/dist/src/lib/messages/eip712/index.d.ts.map +1 -0
- package/dist/src/lib/messages/eip712/index.js +19 -0
- package/dist/src/lib/messages/index.d.ts +4 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +20 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/messages/messageBuilderFactory.js +23 -0
- package/dist/src/lib/transaction.d.ts +67 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +142 -0
- package/dist/src/lib/transactionBuilder.d.ts +270 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +827 -0
- package/dist/src/lib/transferBuilder.d.ts +76 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +307 -0
- package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts +54 -0
- package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +120 -0
- package/dist/src/lib/transferBuilders/index.d.ts +4 -0
- package/dist/src/lib/transferBuilders/index.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/index.js +20 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts +17 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +96 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts +21 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.js +91 -0
- package/dist/src/lib/types.d.ts +39 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +137 -0
- package/dist/src/lib/utils.d.ts +310 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +843 -0
- package/dist/src/lib/walletUtil.d.ts +42 -0
- package/dist/src/lib/walletUtil.d.ts.map +1 -0
- package/dist/src/lib/walletUtil.js +45 -0
- package/dist/src/types.d.ts +9 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/test/index.d.ts +2 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +18 -0
- package/dist/test/unit/coin.d.ts +8 -0
- package/dist/test/unit/coin.d.ts.map +1 -0
- package/dist/test/unit/coin.js +577 -0
- package/dist/test/unit/index.d.ts +6 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +22 -0
- package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts +3 -0
- package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts.map +1 -0
- package/dist/test/unit/messages/abstractEthMessageBuilderTests.js +110 -0
- package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts +43 -0
- package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts.map +1 -0
- package/dist/test/unit/messages/abstractEthMessageTestTypes.js +3 -0
- package/dist/test/unit/messages/abstractEthMessagesTests.d.ts +3 -0
- package/dist/test/unit/messages/abstractEthMessagesTests.d.ts.map +1 -0
- package/dist/test/unit/messages/abstractEthMessagesTests.js +129 -0
- package/dist/test/unit/messages/eip191/eip191Message.d.ts +2 -0
- package/dist/test/unit/messages/eip191/eip191Message.d.ts.map +1 -0
- package/dist/test/unit/messages/eip191/eip191Message.js +15 -0
- package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/eip191/eip191MessageBuilder.js +16 -0
- package/dist/test/unit/messages/eip191/fixtures.d.ts +109 -0
- package/dist/test/unit/messages/eip191/fixtures.d.ts.map +1 -0
- package/dist/test/unit/messages/eip191/fixtures.js +63 -0
- package/dist/test/unit/messages/eip712/eip712Message.d.ts +2 -0
- package/dist/test/unit/messages/eip712/eip712Message.d.ts.map +1 -0
- package/dist/test/unit/messages/eip712/eip712Message.js +15 -0
- package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/eip712/eip712MessageBuilder.js +16 -0
- package/dist/test/unit/messages/eip712/fixtures.d.ts +76 -0
- package/dist/test/unit/messages/eip712/fixtures.d.ts.map +1 -0
- package/dist/test/unit/messages/eip712/fixtures.js +120 -0
- package/dist/test/unit/messages/index.d.ts +4 -0
- package/dist/test/unit/messages/index.d.ts.map +1 -0
- package/dist/test/unit/messages/index.js +20 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +52 -0
- package/dist/test/unit/token.d.ts +2 -0
- package/dist/test/unit/token.d.ts.map +1 -0
- package/dist/test/unit/token.js +37 -0
- package/dist/test/unit/transaction.d.ts +3 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +60 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +8 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.js +95 -0
- package/dist/test/unit/transactionBuilder/flushNft.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/flushNft.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/flushNft.js +381 -0
- package/dist/test/unit/transactionBuilder/index.d.ts +5 -0
- package/dist/test/unit/transactionBuilder/index.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/index.js +21 -0
- package/dist/test/unit/transactionBuilder/send.d.ts +3 -0
- package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/send.js +197 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +11 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.js +137 -0
- package/dist/test/unit/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transferBuilder.js +76 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +214 -0
- package/dist/tsconfig.tsbuildinfo +1 -8566
- package/package.json +34 -10
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -178
|
@@ -0,0 +1,214 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
7
|
+
const utils_1 = require("../../src/lib/utils");
|
|
8
|
+
const transferBuilderERC721_1 = require("../../src/lib/transferBuilders/transferBuilderERC721");
|
|
9
|
+
const walletUtil_1 = require("../../src/lib/walletUtil");
|
|
10
|
+
describe('Abstract ETH Utils', () => {
|
|
11
|
+
describe('ERC721 Flush Functions', () => {
|
|
12
|
+
it('should encode flush ERC721 data correctly for v0-v3', () => {
|
|
13
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
14
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
15
|
+
const tokenId = '12345';
|
|
16
|
+
const forwarderVersion = 0;
|
|
17
|
+
const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
18
|
+
should_1.default.exist(encoded);
|
|
19
|
+
encoded.should.startWith('0x5a953d0a'); // flushERC721ForwarderTokens method ID
|
|
20
|
+
encoded.should.be.a.String();
|
|
21
|
+
encoded.length.should.be.greaterThan(10); // method ID + parameters
|
|
22
|
+
});
|
|
23
|
+
it('should encode flush ERC721 data correctly for v4+', () => {
|
|
24
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
25
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
26
|
+
const tokenId = '12345';
|
|
27
|
+
const forwarderVersion = 4;
|
|
28
|
+
const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
29
|
+
should_1.default.exist(encoded);
|
|
30
|
+
encoded.should.startWith('0x159e44d7'); // flushERC721Token method ID (v5)
|
|
31
|
+
encoded.should.be.a.String();
|
|
32
|
+
});
|
|
33
|
+
it('should decode flush ERC721 data correctly for v0-v3', () => {
|
|
34
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
35
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
36
|
+
const tokenId = '12345';
|
|
37
|
+
const forwarderVersion = 2;
|
|
38
|
+
const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
39
|
+
const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded);
|
|
40
|
+
should_1.default.exist(decoded);
|
|
41
|
+
decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
|
|
42
|
+
decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
|
|
43
|
+
decoded.tokenId.should.equal(tokenId);
|
|
44
|
+
should_1.default.not.exist(decoded.forwarderVersion);
|
|
45
|
+
});
|
|
46
|
+
it('should decode flush ERC721 data correctly for v4+', () => {
|
|
47
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
48
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
49
|
+
const tokenId = '12345';
|
|
50
|
+
const forwarderVersion = 4;
|
|
51
|
+
const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
52
|
+
const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded, forwarderAddress);
|
|
53
|
+
should_1.default.exist(decoded);
|
|
54
|
+
decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
|
|
55
|
+
decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
|
|
56
|
+
decoded.tokenId.should.equal(tokenId);
|
|
57
|
+
should_1.default.exist(decoded.forwarderVersion);
|
|
58
|
+
should_1.default.equal(decoded.forwarderVersion, 4);
|
|
59
|
+
});
|
|
60
|
+
it('should handle large token IDs for ERC721', () => {
|
|
61
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
62
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
63
|
+
const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
|
|
64
|
+
const forwarderVersion = 0;
|
|
65
|
+
const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
66
|
+
const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded);
|
|
67
|
+
decoded.tokenId.should.equal(tokenId);
|
|
68
|
+
});
|
|
69
|
+
it('should throw error for invalid flush ERC721 data', () => {
|
|
70
|
+
const invalidData = '0x12345678'; // Wrong method ID
|
|
71
|
+
should_1.default.throws(() => {
|
|
72
|
+
(0, utils_1.decodeFlushERC721TokensData)(invalidData);
|
|
73
|
+
}, /Invalid flush ERC721 bytecode/);
|
|
74
|
+
});
|
|
75
|
+
it('should throw error for missing to address in v4+ decode', () => {
|
|
76
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
77
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
78
|
+
const tokenId = '12345';
|
|
79
|
+
const forwarderVersion = 4;
|
|
80
|
+
const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
81
|
+
should_1.default.throws(() => {
|
|
82
|
+
(0, utils_1.decodeFlushERC721TokensData)(encoded); // Missing 'to' parameter
|
|
83
|
+
}, /Missing to address/);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('ERC1155 Flush Functions', () => {
|
|
87
|
+
it('should encode flush ERC1155 data correctly for v0-v3', () => {
|
|
88
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
89
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
90
|
+
const tokenId = '99999';
|
|
91
|
+
const forwarderVersion = 0;
|
|
92
|
+
const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
93
|
+
should_1.default.exist(encoded);
|
|
94
|
+
encoded.should.startWith('0xe6bd0aa4'); // flushERC1155ForwarderTokens method ID
|
|
95
|
+
encoded.should.be.a.String();
|
|
96
|
+
encoded.length.should.be.greaterThan(10); // method ID + parameters
|
|
97
|
+
});
|
|
98
|
+
it('should encode flush ERC1155 data correctly for v4+', () => {
|
|
99
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
100
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
101
|
+
const tokenId = '99999';
|
|
102
|
+
const forwarderVersion = 4;
|
|
103
|
+
const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
104
|
+
should_1.default.exist(encoded);
|
|
105
|
+
encoded.should.startWith('0x8972c17c'); // flushERC1155Tokens method ID (v5)
|
|
106
|
+
encoded.should.be.a.String();
|
|
107
|
+
});
|
|
108
|
+
it('should decode flush ERC1155 data correctly for v0-v3', () => {
|
|
109
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
110
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
111
|
+
const tokenId = '99999';
|
|
112
|
+
const forwarderVersion = 2;
|
|
113
|
+
const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
114
|
+
const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
|
|
115
|
+
should_1.default.exist(decoded);
|
|
116
|
+
decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
|
|
117
|
+
decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
|
|
118
|
+
decoded.tokenId.should.equal(tokenId);
|
|
119
|
+
should_1.default.not.exist(decoded.forwarderVersion);
|
|
120
|
+
});
|
|
121
|
+
it('should decode flush ERC1155 data correctly for v4+', () => {
|
|
122
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
123
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
124
|
+
const tokenId = '99999';
|
|
125
|
+
const forwarderVersion = 4;
|
|
126
|
+
const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
127
|
+
const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded, forwarderAddress);
|
|
128
|
+
should_1.default.exist(decoded);
|
|
129
|
+
decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
|
|
130
|
+
decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
|
|
131
|
+
decoded.tokenId.should.equal(tokenId);
|
|
132
|
+
should_1.default.exist(decoded.forwarderVersion);
|
|
133
|
+
should_1.default.equal(decoded.forwarderVersion, 4);
|
|
134
|
+
});
|
|
135
|
+
it('should handle token ID 0 for ERC1155', () => {
|
|
136
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
137
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
138
|
+
const tokenId = '0';
|
|
139
|
+
const forwarderVersion = 0;
|
|
140
|
+
const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
141
|
+
const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
|
|
142
|
+
decoded.tokenId.should.equal(tokenId);
|
|
143
|
+
});
|
|
144
|
+
it('should handle large token IDs for ERC1155', () => {
|
|
145
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
146
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
147
|
+
const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
|
|
148
|
+
const forwarderVersion = 0;
|
|
149
|
+
const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
150
|
+
const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
|
|
151
|
+
decoded.tokenId.should.equal(tokenId);
|
|
152
|
+
});
|
|
153
|
+
it('should throw error for invalid flush ERC1155 data', () => {
|
|
154
|
+
const invalidData = '0x87654321'; // Wrong method ID
|
|
155
|
+
should_1.default.throws(() => {
|
|
156
|
+
(0, utils_1.decodeFlushERC1155TokensData)(invalidData);
|
|
157
|
+
}, /Invalid flush ERC1155 bytecode/);
|
|
158
|
+
});
|
|
159
|
+
it('should throw error for missing to address in v4+ decode', () => {
|
|
160
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
161
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
162
|
+
const tokenId = '99999';
|
|
163
|
+
const forwarderVersion = 4;
|
|
164
|
+
const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
|
|
165
|
+
should_1.default.throws(() => {
|
|
166
|
+
(0, utils_1.decodeFlushERC1155TokensData)(encoded); // Missing 'to' parameter
|
|
167
|
+
}, /Missing to address/);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('ERC721TransferBuilder.buildTransferFrom', () => {
|
|
171
|
+
const owner = '0x19645032c7f1533395d44a629462e751084d3e4d';
|
|
172
|
+
const recipient = '0x19645032c7f1533395d44a629462e751084d3e4c';
|
|
173
|
+
const htsNftAddress = '0x00000000000000000000000000000000007ac203';
|
|
174
|
+
it('should encode transferFrom with selector 0x23b872dd', () => {
|
|
175
|
+
const builder = new transferBuilderERC721_1.ERC721TransferBuilder();
|
|
176
|
+
builder.tokenContractAddress(htsNftAddress).to(recipient).from(owner).tokenId('12');
|
|
177
|
+
const data = builder.buildTransferFrom();
|
|
178
|
+
should_1.default.exist(data);
|
|
179
|
+
data.should.startWith(walletUtil_1.ERC721TransferFromMethodId); // 0x23b872dd
|
|
180
|
+
});
|
|
181
|
+
it('should encode safeTransferFrom with selector 0xb88d4fde via build()', () => {
|
|
182
|
+
const builder = new transferBuilderERC721_1.ERC721TransferBuilder();
|
|
183
|
+
builder.tokenContractAddress(htsNftAddress).to(recipient).from(owner).tokenId('12');
|
|
184
|
+
const data = builder.build();
|
|
185
|
+
should_1.default.exist(data);
|
|
186
|
+
data.should.startWith(walletUtil_1.ERC721SafeTransferTypeMethodId); // 0xb88d4fde
|
|
187
|
+
});
|
|
188
|
+
it('should produce different encodings for build() vs buildTransferFrom()', () => {
|
|
189
|
+
const builder = new transferBuilderERC721_1.ERC721TransferBuilder();
|
|
190
|
+
builder.tokenContractAddress(htsNftAddress).to(recipient).from(owner).tokenId('12');
|
|
191
|
+
const safeTransferData = builder.build();
|
|
192
|
+
const transferFromData = builder.buildTransferFrom();
|
|
193
|
+
safeTransferData.should.not.equal(transferFromData);
|
|
194
|
+
// transferFrom encoding should be shorter (no bytes param)
|
|
195
|
+
transferFromData.length.should.be.lessThan(safeTransferData.length);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('Token Address Validation', () => {
|
|
199
|
+
it('should preserve address format in encoding/decoding', () => {
|
|
200
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
201
|
+
const tokenAddressChecksum = '0xDf7DECb1bAa8F529F0C8982cBB4Be50357195299'; // With checksum
|
|
202
|
+
const tokenId = '12345';
|
|
203
|
+
const forwarderVersion = 0;
|
|
204
|
+
const encoded721 = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddressChecksum, tokenId, forwarderVersion);
|
|
205
|
+
const decoded721 = (0, utils_1.decodeFlushERC721TokensData)(encoded721);
|
|
206
|
+
// Should preserve the address (though may lowercase it)
|
|
207
|
+
decoded721.tokenAddress.toLowerCase().should.equal(tokenAddressChecksum.toLowerCase());
|
|
208
|
+
const encoded1155 = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddressChecksum, tokenId, forwarderVersion);
|
|
209
|
+
const decoded1155 = (0, utils_1.decodeFlushERC1155TokensData)(encoded1155);
|
|
210
|
+
decoded1155.tokenAddress.toLowerCase().should.equal(tokenAddressChecksum.toLowerCase());
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBSzZCO0FBQzdCLGdHQUE2RjtBQUM3Rix5REFBc0c7QUFFdEcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1FBQ3RDLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztZQUN0RSxNQUFNLFlBQVksR0FBRyw0Q0FBNEMsQ0FBQztZQUNsRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFM0IsTUFBTSxPQUFPLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFFakcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUM7WUFDL0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsT0FB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QU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxvQkFBb0IsR0FBRyw0Q0FBNEMsQ0FBQyxDQUFDLGdCQUFnQjtZQUMzRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFM0IsTUFBTSxVQUFVLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUM1RyxNQUFNLFVBQVUsR0FBRyxJQUFBLG1DQUEyQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTNELHdEQUF3RDtZQUN4RCxVQUFVLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUV2RixNQUFNLFdBQVcsR0FBRyxJQUFBLDhCQUFzQixFQUFDLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlHLE1BQU0sV0FBVyxHQUFHLElBQUEsb0NBQTRCLEVBQUMsV0FBVyxDQUFDLENBQUM7WUFFOUQsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgZmx1c2hFUkM3MjFUb2tlbnNEYXRhLFxuICBmbHVzaEVSQzExNTVUb2tlbnNEYXRhLFxuICBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEsXG4gIGRlY29kZUZsdXNoRVJDMTE1NVRva2Vuc0RhdGEsXG59IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgRVJDNzIxVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXJzL3RyYW5zZmVyQnVpbGRlckVSQzcyMSc7XG5pbXBvcnQgeyBFUkM3MjFUcmFuc2ZlckZyb21NZXRob2RJZCwgRVJDNzIxU2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi93YWxsZXRVdGlsJztcblxuZGVzY3JpYmUoJ0Fic3RyYWN0IEVUSCBVdGlscycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ0VSQzcyMSBGbHVzaCBGdW5jdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgZmx1c2ggRVJDNzIxIGRhdGEgY29ycmVjdGx5IGZvciB2MC12MycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZW5jb2RlZCk7XG4gICAgICBlbmNvZGVkLnNob3VsZC5zdGFydFdpdGgoJzB4NWE5NTNkMGEnKTsgLy8gZmx1c2hFUkM3MjFGb3J3YXJkZXJUb2tlbnMgbWV0aG9kIElEXG4gICAgICBlbmNvZGVkLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgZW5jb2RlZC5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDEwKTsgLy8gbWV0aG9kIElEICsgcGFyYW1ldGVyc1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgZmx1c2ggRVJDNzIxIGRhdGEgY29ycmVjdGx5IGZvciB2NCsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDUnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGVuY29kZWQpO1xuICAgICAgZW5jb2RlZC5zaG91bGQuc3RhcnRXaXRoKCcweDE1OWU0NGQ3Jyk7IC8vIGZsdXNoRVJDNzIxVG9rZW4gbWV0aG9kIElEICh2NSlcbiAgICAgIGVuY29kZWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkM3MjEgZGF0YSBjb3JyZWN0bHkgZm9yIHYwLXYzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcbiAgICAgIGNvbnN0IGZvcndhcmRlclZlcnNpb24gPSAyO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZmx1c2hFUkM3MjFUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRmx1c2hFUkM3MjFUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLmZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwoZm9yd2FyZGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5JZC5zaG91bGQuZXF1YWwodG9rZW5JZCk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkM3MjEgZGF0YSBjb3JyZWN0bHkgZm9yIHY0KycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gNDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkLCBmb3J3YXJkZXJBZGRyZXNzKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZC5mb3J3YXJkZXJWZXJzaW9uLCA0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGxhcmdlIHRva2VuIElEcyBmb3IgRVJDNzIxJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzExNTc5MjA4OTIzNzMxNjE5NTQyMzU3MDk4NTAwODY4NzkwNzg1MzI2OTk4NDY2NTY0MDU2NDAzOTQ1NzU4NDAwNzkxMzEyOTYzOTkzNSc7IC8vIG1heCB1aW50MjU2XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkKTtcblxuICAgICAgZGVjb2RlZC50b2tlbklkLnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgZmx1c2ggRVJDNzIxIGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkRGF0YSA9ICcweDEyMzQ1Njc4JzsgLy8gV3JvbmcgbWV0aG9kIElEXG5cbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEoaW52YWxpZERhdGEpO1xuICAgICAgfSwgL0ludmFsaWQgZmx1c2ggRVJDNzIxIGJ5dGVjb2RlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtaXNzaW5nIHRvIGFkZHJlc3MgaW4gdjQrIGRlY29kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gNDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGVjb2RlRmx1c2hFUkM3MjFUb2tlbnNEYXRhKGVuY29kZWQpOyAvLyBNaXNzaW5nICd0bycgcGFyYW1ldGVyXG4gICAgICB9LCAvTWlzc2luZyB0byBhZGRyZXNzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFUkMxMTU1IEZsdXNoIEZ1bmN0aW9ucycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVuY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2MC12MycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICc5OTk5OSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGVuY29kZWQpO1xuICAgICAgZW5jb2RlZC5zaG91bGQuc3RhcnRXaXRoKCcweGU2YmQwYWE0Jyk7IC8vIGZsdXNoRVJDMTE1NUZvcndhcmRlclRva2VucyBtZXRob2QgSURcbiAgICAgIGVuY29kZWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgICBlbmNvZGVkLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMTApOyAvLyBtZXRob2QgSUQgKyBwYXJhbWV0ZXJzXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVuY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2NCsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG5cbiAgICAgIHNob3VsZC5leGlzdChlbmNvZGVkKTtcbiAgICAgIGVuY29kZWQuc2hvdWxkLnN0YXJ0V2l0aCgnMHg4OTcyYzE3YycpOyAvLyBmbHVzaEVSQzExNTVUb2tlbnMgbWV0aG9kIElEICh2NSlcbiAgICAgIGVuY29kZWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2MC12MycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICc5OTk5OSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMjtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLmZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwoZm9yd2FyZGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5JZC5zaG91bGQuZXF1YWwodG9rZW5JZCk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2NCsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShlbmNvZGVkLCBmb3J3YXJkZXJBZGRyZXNzKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZC5mb3J3YXJkZXJWZXJzaW9uLCA0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHRva2VuIElEIDAgZm9yIEVSQzExNTUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMCc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdG9rZW4gSURzIGZvciBFUkMxMTU1JywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzExNTc5MjA4OTIzNzMxNjE5NTQyMzU3MDk4NTAwODY4NzkwNzg1MzI2OTk4NDY2NTY0MDU2NDAzOTQ1NzU4NDAwNzkxMzEyOTYzOTkzNSc7IC8vIG1heCB1aW50MjU2XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBmbHVzaCBFUkMxMTU1IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkRGF0YSA9ICcweDg3NjU0MzIxJzsgLy8gV3JvbmcgbWV0aG9kIElEXG5cbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGludmFsaWREYXRhKTtcbiAgICAgIH0sIC9JbnZhbGlkIGZsdXNoIEVSQzExNTUgYnl0ZWNvZGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3NpbmcgdG8gYWRkcmVzcyBpbiB2NCsgZGVjb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzk5OTk5JztcbiAgICAgIGNvbnN0IGZvcndhcmRlclZlcnNpb24gPSA0O1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZmx1c2hFUkMxMTU1VG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShlbmNvZGVkKTsgLy8gTWlzc2luZyAndG8nIHBhcmFtZXRlclxuICAgICAgfSwgL01pc3NpbmcgdG8gYWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRVJDNzIxVHJhbnNmZXJCdWlsZGVyLmJ1aWxkVHJhbnNmZXJGcm9tJywgKCkgPT4ge1xuICAgIGNvbnN0IG93bmVyID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0ZCc7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0Yyc7XG4gICAgY29uc3QgaHRzTmZ0QWRkcmVzcyA9ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3YWMyMDMnO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgdHJhbnNmZXJGcm9tIHdpdGggc2VsZWN0b3IgMHgyM2I4NzJkZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRVJDNzIxVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKGh0c05mdEFkZHJlc3MpLnRvKHJlY2lwaWVudCkuZnJvbShvd25lcikudG9rZW5JZCgnMTInKTtcblxuICAgICAgY29uc3QgZGF0YSA9IGJ1aWxkZXIuYnVpbGRUcmFuc2ZlckZyb20oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRhdGEpO1xuICAgICAgZGF0YS5zaG91bGQuc3RhcnRXaXRoKEVSQzcyMVRyYW5zZmVyRnJvbU1ldGhvZElkKTsgLy8gMHgyM2I4NzJkZFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgc2FmZVRyYW5zZmVyRnJvbSB3aXRoIHNlbGVjdG9yIDB4Yjg4ZDRmZGUgdmlhIGJ1aWxkKCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IEVSQzcyMVRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci50b2tlbkNvbnRyYWN0QWRkcmVzcyhodHNOZnRBZGRyZXNzKS50byhyZWNpcGllbnQpLmZyb20ob3duZXIpLnRva2VuSWQoJzEyJyk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkYXRhKTtcbiAgICAgIGRhdGEuc2hvdWxkLnN0YXJ0V2l0aChFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpOyAvLyAweGI4OGQ0ZmRlXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgZGlmZmVyZW50IGVuY29kaW5ncyBmb3IgYnVpbGQoKSB2cyBidWlsZFRyYW5zZmVyRnJvbSgpJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBFUkM3MjFUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoaHRzTmZ0QWRkcmVzcykudG8ocmVjaXBpZW50KS5mcm9tKG93bmVyKS50b2tlbklkKCcxMicpO1xuXG4gICAgICBjb25zdCBzYWZlVHJhbnNmZXJEYXRhID0gYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHJhbnNmZXJGcm9tRGF0YSA9IGJ1aWxkZXIuYnVpbGRUcmFuc2ZlckZyb20oKTtcblxuICAgICAgc2FmZVRyYW5zZmVyRGF0YS5zaG91bGQubm90LmVxdWFsKHRyYW5zZmVyRnJvbURhdGEpO1xuICAgICAgLy8gdHJhbnNmZXJGcm9tIGVuY29kaW5nIHNob3VsZCBiZSBzaG9ydGVyIChubyBieXRlcyBwYXJhbSlcbiAgICAgIHRyYW5zZmVyRnJvbURhdGEubGVuZ3RoLnNob3VsZC5iZS5sZXNzVGhhbihzYWZlVHJhbnNmZXJEYXRhLmxlbmd0aCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUb2tlbiBBZGRyZXNzIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwcmVzZXJ2ZSBhZGRyZXNzIGZvcm1hdCBpbiBlbmNvZGluZy9kZWNvZGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzc0NoZWNrc3VtID0gJzB4RGY3REVDYjFiQWE4RjUyOUYwQzg5ODJjQkI0QmU1MDM1NzE5NTI5OSc7IC8vIFdpdGggY2hlY2tzdW1cbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDUnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDA7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQ3MjEgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzQ2hlY2tzdW0sIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZDcyMSA9IGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkNzIxKTtcblxuICAgICAgLy8gU2hvdWxkIHByZXNlcnZlIHRoZSBhZGRyZXNzICh0aG91Z2ggbWF5IGxvd2VyY2FzZSBpdClcbiAgICAgIGRlY29kZWQ3MjEudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzc0NoZWNrc3VtLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICBjb25zdCBlbmNvZGVkMTE1NSA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzQ2hlY2tzdW0sIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZDExNTUgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQxMTU1KTtcblxuICAgICAgZGVjb2RlZDExNTUudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzc0NoZWNrc3VtLnRvTG93ZXJDYXNlKCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|