@bitgo-beta/abstract-eth 1.2.3-alpha.39 → 1.2.3-alpha.391
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/CHANGELOG.md +1760 -0
- 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 +749 -0
- package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -0
- package/dist/src/abstractEthLikeNewCoins.js +2229 -0
- package/dist/src/ethLikeToken.d.ts +36 -6
- package/dist/src/ethLikeToken.d.ts.map +1 -1
- package/dist/src/ethLikeToken.js +286 -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/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 +16 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +57 -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 +821 -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 +16 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.js +81 -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 +829 -0
- package/dist/src/lib/walletUtil.d.ts +40 -0
- package/dist/src/lib/walletUtil.d.ts.map +1 -0
- package/dist/src/lib/walletUtil.js +43 -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 +10 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.js +124 -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 +184 -0
- package/dist/tsconfig.tsbuildinfo +1 -8244
- package/index.ts +2 -0
- package/package.json +30 -9
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
exports.testAddressInitializationWithoutContractAddress = testAddressInitializationWithoutContractAddress;
|
|
7
|
+
exports.testFailsWithInvalidForwarderVersion = testFailsWithInvalidForwarderVersion;
|
|
8
|
+
exports.testAddressInitializationBuildsCorrectlyAndReturnsAddress = testAddressInitializationBuildsCorrectlyAndReturnsAddress;
|
|
9
|
+
exports.testAddressInitializationBuildsFromSerializedData = testAddressInitializationBuildsFromSerializedData;
|
|
10
|
+
exports.testAddressInitializationBuildsFromSignedSerializedData = testAddressInitializationBuildsFromSignedSerializedData;
|
|
11
|
+
exports.testContractCallForCreateForwarder = testContractCallForCreateForwarder;
|
|
12
|
+
const should_1 = __importDefault(require("should"));
|
|
13
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
14
|
+
async function testAddressInitializationWithoutContractAddress(txBuilder) {
|
|
15
|
+
it('should fail if there is no contract address', async () => {
|
|
16
|
+
txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
|
|
17
|
+
txBuilder.fee({
|
|
18
|
+
fee: '10',
|
|
19
|
+
gasLimit: '1000',
|
|
20
|
+
});
|
|
21
|
+
txBuilder.counter(1);
|
|
22
|
+
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing contract address');
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async function testFailsWithInvalidForwarderVersion(txBuilder, testData) {
|
|
26
|
+
it('should fail if forwarder version is invalid', async () => {
|
|
27
|
+
try {
|
|
28
|
+
txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
|
|
29
|
+
txBuilder.fee({
|
|
30
|
+
fee: '10',
|
|
31
|
+
gasLimit: '1000',
|
|
32
|
+
});
|
|
33
|
+
txBuilder.contract(testData.FORWARDER_FACTORY_ADDRESS);
|
|
34
|
+
txBuilder.forwarderVersion(3);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
should_1.default.equal(e.message, 'Invalid forwarder version: 3');
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function testAddressInitializationBuildsCorrectlyAndReturnsAddress(txBuilder, testData) {
|
|
42
|
+
it('should build properly and return a correct address', async () => {
|
|
43
|
+
txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
|
|
44
|
+
txBuilder.fee({
|
|
45
|
+
fee: '10',
|
|
46
|
+
gasLimit: '1000',
|
|
47
|
+
});
|
|
48
|
+
txBuilder.counter(1);
|
|
49
|
+
txBuilder.contract(testData.FORWARDER_FACTORY_ADDRESS);
|
|
50
|
+
txBuilder.baseAddress(testData.BASE_ADDRESS);
|
|
51
|
+
txBuilder.feeAddress(testData.FEE_ADDRESS);
|
|
52
|
+
txBuilder.forwarderVersion(4);
|
|
53
|
+
txBuilder.salt('0x1');
|
|
54
|
+
txBuilder.initCode(testData.FORWARDER_IMPLEMENTATION_ADDRESS);
|
|
55
|
+
txBuilder.sign({ key: testData.KEYPAIR_PRV.getKeys().prv });
|
|
56
|
+
const tx = await txBuilder.build();
|
|
57
|
+
const txJson = tx.toJson();
|
|
58
|
+
should_1.default.equal(txJson.deployedAddress, testData.DEPLOYED_ADDRESS);
|
|
59
|
+
should_1.default.equal(txJson.to, testData.FORWARDER_FACTORY_ADDRESS);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async function testAddressInitializationBuildsFromSerializedData(txBuilder, testData) {
|
|
63
|
+
it('should build properly from serialized', async () => {
|
|
64
|
+
txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
|
|
65
|
+
txBuilder.from(testData.UNSIGNED_ADDRESS_INIT);
|
|
66
|
+
const tx = await txBuilder.build();
|
|
67
|
+
const txJson = tx.toJson();
|
|
68
|
+
should_1.default.equal(txJson.to, testData.FORWARDER_FACTORY_ADDRESS);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async function testAddressInitializationBuildsFromSignedSerializedData(txBuilder, testData) {
|
|
72
|
+
it('should build properly from signed serialized', async () => {
|
|
73
|
+
txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
|
|
74
|
+
txBuilder.from(testData.SIGNED_ADDRESS_INIT);
|
|
75
|
+
const tx = await txBuilder.build();
|
|
76
|
+
const txJson = tx.toJson();
|
|
77
|
+
should_1.default.equal(txJson.to, testData.FORWARDER_FACTORY_ADDRESS);
|
|
78
|
+
should_1.default.equal(txJson.from, testData.ACCOUNT_1);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async function testContractCallForCreateForwarder(txBuilder, testData) {
|
|
82
|
+
it('should build properly createForwarder call for recovery', async () => {
|
|
83
|
+
txBuilder.type(sdk_core_1.TransactionType.ContractCall);
|
|
84
|
+
txBuilder.contract(testData.BASE_ADDRESS);
|
|
85
|
+
txBuilder.data(testData.CREATE_FORWARDER_METHOD);
|
|
86
|
+
txBuilder.fee({
|
|
87
|
+
fee: '10',
|
|
88
|
+
gasLimit: '1000',
|
|
89
|
+
});
|
|
90
|
+
const tx = await txBuilder.build();
|
|
91
|
+
const txJson = tx.toJson();
|
|
92
|
+
should_1.default.equal(txJson.to, testData.BASE_ADDRESS);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0luaXRpYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9hZGRyZXNzSW5pdGlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSwwR0FVQztBQUVELG9GQWNDO0FBRUQsOEhBd0JDO0FBRUQsOEdBUUM7QUFFRCwwSEFZQztBQUVELGdGQWFDO0FBL0ZELG9EQUE0QjtBQUM1QixtREFBdUQ7QUFHaEQsS0FBSyxVQUFVLCtDQUErQyxDQUFDLFNBQTZCO0lBQ2pHLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzRCxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RCxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ1osR0FBRyxFQUFFLElBQUk7WUFDVCxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbEcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRU0sS0FBSyxVQUFVLG9DQUFvQyxDQUFDLFNBQTZCLEVBQUUsUUFBYTtJQUNyRyxFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDM0QsSUFBSSxDQUFDO1lBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDdEQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEVBQUUsSUFBSTtnQkFDVCxRQUFRLEVBQUUsTUFBTTthQUNqQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEs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QUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFTSxLQUFLLFVBQVUsa0NBQWtDLENBQUMsU0FBNkIsRUFBRSxRQUFhO0lBQ25HLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNqRCxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ1osR0FBRyxFQUFFLElBQUk7WUFDVCxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RBZGRyZXNzSW5pdGlhbGl6YXRpb25XaXRob3V0Q29udHJhY3RBZGRyZXNzKHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyKSB7XG4gIGl0KCdzaG91bGQgZmFpbCBpZiB0aGVyZSBpcyBubyBjb250cmFjdCBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAnLFxuICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGNvbnRyYWN0IGFkZHJlc3MnKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0RmFpbHNXaXRoSW52YWxpZEZvcndhcmRlclZlcnNpb24odHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsIHRlc3REYXRhOiBhbnkpIHtcbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIGZvcndhcmRlciB2ZXJzaW9uIGlzIGludmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oMyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvdWxkLmVxdWFsKGUubWVzc2FnZSwgJ0ludmFsaWQgZm9yd2FyZGVyIHZlcnNpb246IDMnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEFkZHJlc3NJbml0aWFsaXphdGlvbkJ1aWxkc0NvcnJlY3RseUFuZFJldHVybnNBZGRyZXNzKFxuICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgdGVzdERhdGE6IGFueVxuKSB7XG4gIGl0KCdzaG91bGQgYnVpbGQgcHJvcGVybHkgYW5kIHJldHVybiBhIGNvcnJlY3QgYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzEwJyxcbiAgICAgIGdhc0xpbWl0OiAnMTAwMCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICAgIHR4QnVpbGRlci5iYXNlQWRkcmVzcyh0ZXN0RGF0YS5CQVNFX0FERFJFU1MpO1xuICAgIHR4QnVpbGRlci5mZWVBZGRyZXNzKHRlc3REYXRhLkZFRV9BRERSRVNTKTtcbiAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcbiAgICB0eEJ1aWxkZXIuc2FsdCgnMHgxJyk7XG4gICAgdHhCdWlsZGVyLmluaXRDb2RlKHRlc3REYXRhLkZPUldBUkRFUl9JTVBMRU1FTlRBVElPTl9BRERSRVNTKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuS0VZUEFJUl9QUlYuZ2V0S2V5cygpLnBydiB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5kZXBsb3llZEFkZHJlc3MsIHRlc3REYXRhLkRFUExPWUVEX0FERFJFU1MpO1xuICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RBZGRyZXNzSW5pdGlhbGl6YXRpb25CdWlsZHNGcm9tU2VyaWFsaXplZERhdGEodHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsIHRlc3REYXRhOiBhbnkpIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCBwcm9wZXJseSBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbik7XG4gICAgdHhCdWlsZGVyLmZyb20odGVzdERhdGEuVU5TSUdORURfQUREUkVTU19JTklUKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RBZGRyZXNzSW5pdGlhbGl6YXRpb25CdWlsZHNGcm9tU2lnbmVkU2VyaWFsaXplZERhdGEoXG4gIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICB0ZXN0RGF0YTogYW55XG4pIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCBwcm9wZXJseSBmcm9tIHNpZ25lZCBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pO1xuICAgIHR4QnVpbGRlci5mcm9tKHRlc3REYXRhLlNJR05FRF9BRERSRVNTX0lOSVQpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgdGVzdERhdGEuRk9SV0FSREVSX0ZBQ1RPUllfQUREUkVTUyk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCB0ZXN0RGF0YS5BQ0NPVU5UXzEpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb250cmFjdENhbGxGb3JDcmVhdGVGb3J3YXJkZXIodHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsIHRlc3REYXRhOiBhbnkpIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCBwcm9wZXJseSBjcmVhdGVGb3J3YXJkZXIgY2FsbCBmb3IgcmVjb3ZlcnknLCBhc3luYyAoKSA9PiB7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLkJBU0VfQUREUkVTUyk7XG4gICAgdHhCdWlsZGVyLmRhdGEodGVzdERhdGEuQ1JFQVRFX0ZPUldBUkRFUl9NRVRIT0QpO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAnLFxuICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIHRlc3REYXRhLkJBU0VfQUREUkVTUyk7XG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flushNft.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/flushNft.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,KAAA,GAAG,IAAI,CAucnE"}
|
|
@@ -0,0 +1,381 @@
|
|
|
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
|
+
exports.runFlushNftTests = runFlushNftTests;
|
|
7
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const should_1 = __importDefault(require("should"));
|
|
9
|
+
function runFlushNftTests(coinName, getBuilder) {
|
|
10
|
+
describe(`${coinName} transaction builder flush NFTs`, () => {
|
|
11
|
+
let txBuilder;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
txBuilder = getBuilder(coinName);
|
|
14
|
+
txBuilder.fee({
|
|
15
|
+
fee: '1000000000',
|
|
16
|
+
gasLimit: '100000',
|
|
17
|
+
});
|
|
18
|
+
txBuilder.counter(1);
|
|
19
|
+
});
|
|
20
|
+
describe('ERC721 Flush', () => {
|
|
21
|
+
it('should build a flush ERC721 transaction with forwarder v4', async () => {
|
|
22
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
23
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
24
|
+
const tokenId = '12345';
|
|
25
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
26
|
+
txBuilder.contract(forwarderAddress);
|
|
27
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
28
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
29
|
+
txBuilder.forwarderVersion(4);
|
|
30
|
+
txBuilder.tokenId(tokenId);
|
|
31
|
+
const tx = await txBuilder.build();
|
|
32
|
+
const txJson = tx.toJson();
|
|
33
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
|
|
34
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
35
|
+
should_1.default.exist(txJson.data);
|
|
36
|
+
txJson.data.should.startWith('0x159e44d7');
|
|
37
|
+
should_1.default.exist(txJson.value);
|
|
38
|
+
txJson.value.should.equal('0');
|
|
39
|
+
should_1.default.exist(txJson.gasLimit);
|
|
40
|
+
txJson.gasLimit.should.equal('100000');
|
|
41
|
+
should_1.default.exist(txJson.gasPrice);
|
|
42
|
+
txJson.gasPrice.should.equal('1000000000');
|
|
43
|
+
// Verify the encoded parameters in the data
|
|
44
|
+
const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
45
|
+
const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
|
|
46
|
+
txJson.data.should.containEql(encodedTokenAddress);
|
|
47
|
+
txJson.data.should.containEql(encodedTokenId);
|
|
48
|
+
});
|
|
49
|
+
it('should build a flush ERC721 transaction with forwarder version < v4', async () => {
|
|
50
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
51
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
52
|
+
const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
|
|
53
|
+
const tokenId = '54321';
|
|
54
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
55
|
+
txBuilder.contract(contractAddress);
|
|
56
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
57
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
58
|
+
txBuilder.forwarderVersion(2);
|
|
59
|
+
txBuilder.tokenId(tokenId);
|
|
60
|
+
const tx = await txBuilder.build();
|
|
61
|
+
const txJson = tx.toJson();
|
|
62
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
|
|
63
|
+
should_1.default.equal(txJson.to, contractAddress);
|
|
64
|
+
should_1.default.exist(txJson.data);
|
|
65
|
+
txJson.data.should.startWith('0x5a953d0a'); // flushERC721Tokens method ID for v2 and below
|
|
66
|
+
should_1.default.equal(txJson.value, '0');
|
|
67
|
+
// Verify the encoded parameters
|
|
68
|
+
const encodedForwarderAddress = forwarderAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
69
|
+
const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
70
|
+
const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
|
|
71
|
+
txJson.data.should.containEql(encodedForwarderAddress);
|
|
72
|
+
txJson.data.should.containEql(encodedTokenAddress);
|
|
73
|
+
txJson.data.should.containEql(encodedTokenId);
|
|
74
|
+
});
|
|
75
|
+
it('should build a flush ERC721 with large token ID', async () => {
|
|
76
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
77
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
78
|
+
const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
|
|
79
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
80
|
+
txBuilder.contract(forwarderAddress);
|
|
81
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
82
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
83
|
+
txBuilder.forwarderVersion(4);
|
|
84
|
+
txBuilder.tokenId(tokenId);
|
|
85
|
+
const tx = await txBuilder.build();
|
|
86
|
+
const txJson = tx.toJson();
|
|
87
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
|
|
88
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
89
|
+
should_1.default.exist(txJson.data);
|
|
90
|
+
txJson.data.should.startWith('0x159e44d7');
|
|
91
|
+
// Verify large token ID is properly encoded
|
|
92
|
+
const maxUint256Hex = 'f'.repeat(64);
|
|
93
|
+
txJson.data.should.containEql(maxUint256Hex);
|
|
94
|
+
});
|
|
95
|
+
it('should build flush ERC721 with token ID as string zero', async () => {
|
|
96
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
97
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
98
|
+
const tokenId = '0';
|
|
99
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
100
|
+
txBuilder.contract(forwarderAddress);
|
|
101
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
102
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
103
|
+
txBuilder.forwarderVersion(4);
|
|
104
|
+
txBuilder.tokenId(tokenId);
|
|
105
|
+
const tx = await txBuilder.build();
|
|
106
|
+
const txJson = tx.toJson();
|
|
107
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
|
|
108
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
109
|
+
should_1.default.exist(txJson.data);
|
|
110
|
+
// Verify token ID 0 is properly encoded
|
|
111
|
+
const encodedZeroTokenId = '0'.padStart(64, '0');
|
|
112
|
+
txJson.data.should.containEql(encodedZeroTokenId);
|
|
113
|
+
});
|
|
114
|
+
it('should fail to build flush ERC721 without token address', async () => {
|
|
115
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
116
|
+
const tokenId = '12345';
|
|
117
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
118
|
+
txBuilder.contract(forwarderAddress);
|
|
119
|
+
txBuilder.tokenId(tokenId);
|
|
120
|
+
txBuilder.forwarderVersion(4);
|
|
121
|
+
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing token address');
|
|
122
|
+
});
|
|
123
|
+
it('should fail to build flush ERC721 without token ID', async () => {
|
|
124
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
125
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
126
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
127
|
+
txBuilder.contract(forwarderAddress);
|
|
128
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
129
|
+
txBuilder.forwarderVersion(4);
|
|
130
|
+
await txBuilder.build().should.be.rejectedWith('Token ID is required for ERC721 flush');
|
|
131
|
+
});
|
|
132
|
+
it('should fail to build flush ERC721 without contract address', async () => {
|
|
133
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
134
|
+
const tokenId = '12345';
|
|
135
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
136
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
137
|
+
txBuilder.tokenId(tokenId);
|
|
138
|
+
txBuilder.forwarderVersion(4);
|
|
139
|
+
await txBuilder.build().should.be.rejected();
|
|
140
|
+
});
|
|
141
|
+
it('should decode flush ERC721 transaction from raw tx with v4', async () => {
|
|
142
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
143
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
144
|
+
const tokenId = '12345';
|
|
145
|
+
// Build a transaction first
|
|
146
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
147
|
+
txBuilder.contract(forwarderAddress);
|
|
148
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
149
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
150
|
+
txBuilder.tokenId(tokenId);
|
|
151
|
+
txBuilder.forwarderVersion(4);
|
|
152
|
+
const builtTx = await txBuilder.build();
|
|
153
|
+
const txHex = builtTx.toBroadcastFormat();
|
|
154
|
+
// Create a new builder and parse the transaction
|
|
155
|
+
const rebuilder = getBuilder(coinName);
|
|
156
|
+
rebuilder.from(txHex);
|
|
157
|
+
const rebuiltTx = await rebuilder.build();
|
|
158
|
+
should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC721);
|
|
159
|
+
const txJson = rebuiltTx.toJson();
|
|
160
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
161
|
+
should_1.default.exist(txJson.data);
|
|
162
|
+
txJson.data.should.startWith('0x159e44d7');
|
|
163
|
+
});
|
|
164
|
+
it('should decode flush ERC721 transaction from raw tx with version < v4', async () => {
|
|
165
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
166
|
+
const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
|
|
167
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
168
|
+
const tokenId = '99999';
|
|
169
|
+
// Build a transaction first
|
|
170
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
|
|
171
|
+
txBuilder.contract(contractAddress);
|
|
172
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
173
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
174
|
+
txBuilder.tokenId(tokenId);
|
|
175
|
+
txBuilder.forwarderVersion(2);
|
|
176
|
+
const builtTx = await txBuilder.build();
|
|
177
|
+
const txHex = builtTx.toBroadcastFormat();
|
|
178
|
+
// Create a new builder and parse the transaction
|
|
179
|
+
const rebuilder = getBuilder(coinName);
|
|
180
|
+
rebuilder.from(txHex);
|
|
181
|
+
const rebuiltTx = await rebuilder.build();
|
|
182
|
+
should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC721);
|
|
183
|
+
const txJson = rebuiltTx.toJson();
|
|
184
|
+
should_1.default.equal(txJson.to, contractAddress);
|
|
185
|
+
should_1.default.exist(txJson.data);
|
|
186
|
+
txJson.data.should.startWith('0x5a953d0a');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('ERC1155 Flush', () => {
|
|
190
|
+
it('should build a flush ERC1155 transaction with forwarder v4', async () => {
|
|
191
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
192
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
193
|
+
const tokenId = '99999';
|
|
194
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
195
|
+
txBuilder.contract(forwarderAddress);
|
|
196
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
197
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
198
|
+
txBuilder.tokenId(tokenId);
|
|
199
|
+
txBuilder.forwarderVersion(4);
|
|
200
|
+
const tx = await txBuilder.build();
|
|
201
|
+
const txJson = tx.toJson();
|
|
202
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
|
|
203
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
204
|
+
should_1.default.exist(txJson.data);
|
|
205
|
+
txJson.data.should.startWith('0x8972c17c'); // flushERC1155Tokens v4 method ID
|
|
206
|
+
should_1.default.exist(txJson.value);
|
|
207
|
+
txJson.value.should.equal('0');
|
|
208
|
+
should_1.default.exist(txJson.gasLimit);
|
|
209
|
+
txJson.gasLimit.should.equal('100000');
|
|
210
|
+
should_1.default.exist(txJson.gasPrice);
|
|
211
|
+
txJson.gasPrice.should.equal('1000000000');
|
|
212
|
+
// Verify the encoded parameters in the data
|
|
213
|
+
const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
214
|
+
const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
|
|
215
|
+
txJson.data.should.containEql(encodedTokenAddress);
|
|
216
|
+
txJson.data.should.containEql(encodedTokenId);
|
|
217
|
+
});
|
|
218
|
+
it('should build a flush ERC1155 transaction with forwarder version < v4', async () => {
|
|
219
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
220
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
221
|
+
const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
|
|
222
|
+
const tokenId = '555';
|
|
223
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
224
|
+
txBuilder.contract(contractAddress);
|
|
225
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
226
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
227
|
+
txBuilder.forwarderVersion(2);
|
|
228
|
+
txBuilder.tokenId(tokenId);
|
|
229
|
+
const tx = await txBuilder.build();
|
|
230
|
+
const txJson = tx.toJson();
|
|
231
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
|
|
232
|
+
should_1.default.equal(txJson.to, contractAddress);
|
|
233
|
+
should_1.default.exist(txJson.data);
|
|
234
|
+
txJson.data.should.startWith('0xe6bd0aa4'); // flushForwarderERC1155Tokens method ID for v3 and below
|
|
235
|
+
should_1.default.equal(txJson.value, '0');
|
|
236
|
+
// Verify the encoded parameters
|
|
237
|
+
const encodedForwarderAddress = forwarderAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
238
|
+
const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
|
|
239
|
+
const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
|
|
240
|
+
txJson.data.should.containEql(encodedForwarderAddress);
|
|
241
|
+
txJson.data.should.containEql(encodedTokenAddress);
|
|
242
|
+
txJson.data.should.containEql(encodedTokenId);
|
|
243
|
+
});
|
|
244
|
+
it('should fail to build flush ERC1155 without token address', async () => {
|
|
245
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
246
|
+
const tokenId = '99999';
|
|
247
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
248
|
+
txBuilder.contract(forwarderAddress);
|
|
249
|
+
txBuilder.tokenId(tokenId);
|
|
250
|
+
txBuilder.forwarderVersion(4);
|
|
251
|
+
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing token address');
|
|
252
|
+
});
|
|
253
|
+
it('should fail to build flush ERC1155 without token ID', async () => {
|
|
254
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
255
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
256
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
257
|
+
txBuilder.contract(forwarderAddress);
|
|
258
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
259
|
+
txBuilder.forwarderVersion(4);
|
|
260
|
+
await txBuilder.build().should.be.rejectedWith('Token ID is required for ERC1155 flush');
|
|
261
|
+
});
|
|
262
|
+
it('should fail to build flush ERC1155 without contract address', async () => {
|
|
263
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
264
|
+
const tokenId = '12345';
|
|
265
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
266
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
267
|
+
txBuilder.tokenId(tokenId);
|
|
268
|
+
txBuilder.forwarderVersion(4);
|
|
269
|
+
await txBuilder.build().should.be.rejected();
|
|
270
|
+
});
|
|
271
|
+
it('should build flush ERC1155 with token ID as string zero', async () => {
|
|
272
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
273
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
274
|
+
const tokenId = '0';
|
|
275
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
276
|
+
txBuilder.contract(forwarderAddress);
|
|
277
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
278
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
279
|
+
txBuilder.tokenId(tokenId);
|
|
280
|
+
txBuilder.forwarderVersion(4);
|
|
281
|
+
const tx = await txBuilder.build();
|
|
282
|
+
const txJson = tx.toJson();
|
|
283
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
|
|
284
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
285
|
+
should_1.default.exist(txJson.data);
|
|
286
|
+
// Verify token ID 0 is properly encoded
|
|
287
|
+
const encodedZeroTokenId = '0'.padStart(64, '0');
|
|
288
|
+
txJson.data.should.containEql(encodedZeroTokenId);
|
|
289
|
+
});
|
|
290
|
+
it('should handle large token IDs for ERC1155 with v4', async () => {
|
|
291
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
292
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
293
|
+
const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
|
|
294
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
295
|
+
txBuilder.contract(forwarderAddress);
|
|
296
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
297
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
298
|
+
txBuilder.tokenId(tokenId);
|
|
299
|
+
txBuilder.forwarderVersion(4);
|
|
300
|
+
const tx = await txBuilder.build();
|
|
301
|
+
const txJson = tx.toJson();
|
|
302
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
|
|
303
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
304
|
+
should_1.default.exist(txJson.data);
|
|
305
|
+
txJson.data.should.startWith('0x8972c17c');
|
|
306
|
+
// Verify large token ID is properly encoded
|
|
307
|
+
const maxUint256Hex = 'f'.repeat(64);
|
|
308
|
+
txJson.data.should.containEql(maxUint256Hex);
|
|
309
|
+
});
|
|
310
|
+
it('should handle large token IDs for ERC1155 with version < v4', async () => {
|
|
311
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
312
|
+
const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
|
|
313
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
314
|
+
const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
|
|
315
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
316
|
+
txBuilder.contract(contractAddress);
|
|
317
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
318
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
319
|
+
txBuilder.tokenId(tokenId);
|
|
320
|
+
txBuilder.forwarderVersion(2);
|
|
321
|
+
const tx = await txBuilder.build();
|
|
322
|
+
const txJson = tx.toJson();
|
|
323
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
|
|
324
|
+
should_1.default.equal(txJson.to, contractAddress);
|
|
325
|
+
should_1.default.exist(txJson.data);
|
|
326
|
+
txJson.data.should.startWith('0xe6bd0aa4');
|
|
327
|
+
// Verify large token ID is properly encoded
|
|
328
|
+
const maxUint256Hex = 'f'.repeat(64);
|
|
329
|
+
txJson.data.should.containEql(maxUint256Hex);
|
|
330
|
+
});
|
|
331
|
+
it('should decode flush ERC1155 transaction from raw tx with v4', async () => {
|
|
332
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
333
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
334
|
+
const tokenId = '99999';
|
|
335
|
+
// Build a transaction first
|
|
336
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
337
|
+
txBuilder.contract(forwarderAddress);
|
|
338
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
339
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
340
|
+
txBuilder.tokenId(tokenId);
|
|
341
|
+
txBuilder.forwarderVersion(4);
|
|
342
|
+
const builtTx = await txBuilder.build();
|
|
343
|
+
const txHex = builtTx.toBroadcastFormat();
|
|
344
|
+
// Create a new builder and parse the transaction
|
|
345
|
+
const rebuilder = getBuilder(coinName);
|
|
346
|
+
rebuilder.from(txHex);
|
|
347
|
+
const rebuiltTx = await rebuilder.build();
|
|
348
|
+
should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC1155);
|
|
349
|
+
const txJson = rebuiltTx.toJson();
|
|
350
|
+
should_1.default.equal(txJson.to, forwarderAddress);
|
|
351
|
+
should_1.default.exist(txJson.data);
|
|
352
|
+
txJson.data.should.startWith('0x8972c17c');
|
|
353
|
+
});
|
|
354
|
+
it('should decode flush ERC1155 transaction from raw tx with version < v4', async () => {
|
|
355
|
+
const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
356
|
+
const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
|
|
357
|
+
const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
|
|
358
|
+
const tokenId = '7777';
|
|
359
|
+
// Build a transaction first
|
|
360
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
|
|
361
|
+
txBuilder.contract(contractAddress);
|
|
362
|
+
txBuilder.tokenAddress(tokenAddress);
|
|
363
|
+
txBuilder.forwarderAddress(forwarderAddress);
|
|
364
|
+
txBuilder.tokenId(tokenId);
|
|
365
|
+
txBuilder.forwarderVersion(1);
|
|
366
|
+
const builtTx = await txBuilder.build();
|
|
367
|
+
const txHex = builtTx.toBroadcastFormat();
|
|
368
|
+
// Create a new builder and parse the transaction
|
|
369
|
+
const rebuilder = getBuilder(coinName);
|
|
370
|
+
rebuilder.from(txHex);
|
|
371
|
+
const rebuiltTx = await rebuilder.build();
|
|
372
|
+
should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC1155);
|
|
373
|
+
const txJson = rebuiltTx.toJson();
|
|
374
|
+
should_1.default.equal(txJson.to, contractAddress);
|
|
375
|
+
should_1.default.exist(txJson.data);
|
|
376
|
+
txJson.data.should.startWith('0xe6bd0aa4');
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hOZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL2ZsdXNoTmZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBSUEsNENBdWNDO0FBM2NELG1EQUF1RDtBQUN2RCxvREFBNEI7QUFHNUIsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBZ0IsRUFBRSxVQUFVO0lBQzNELFFBQVEsQ0FBQyxHQUFHLFFBQVEsaUNBQWlDLEVBQUUsR0FBRyxFQUFFO1FBQzFELElBQUksU0FBNkIsQ0FBQztRQUVsQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQXVCLENBQUM7WUFDdkQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEVBQUUsWUFBWTtnQkFDakIsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO1lBQzVCLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDekUsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztnQkFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7Z0JBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFFeEIsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM1QyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUM3QyxTQUFTLENBQUMsZ0JBQWdCLENBQUMs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Z0JBQ3RCLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUUxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5GbHVzaE5mdFRlc3RzKGNvaW5OYW1lOiBzdHJpbmcsIGdldEJ1aWxkZXIpOiB2b2lkIHtcbiAgZGVzY3JpYmUoYCR7Y29pbk5hbWV9IHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmx1c2ggTkZUc2AsICgpID0+IHtcbiAgICBsZXQgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXI7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoY29pbk5hbWUpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFUkM3MjEgRmx1c2gnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZmx1c2ggRVJDNzIxIHRyYW5zYWN0aW9uIHdpdGggZm9yd2FyZGVyIHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDQpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5zdGFydFdpdGgoJzB4MTU5ZTQ0ZDcnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi52YWx1ZSk7XG4gICAgICAgIHR4SnNvbi52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5nYXNMaW1pdCk7XG4gICAgICAgIHR4SnNvbi5nYXNMaW1pdC5zaG91bGQuZXF1YWwoJzEwMDAwMCcpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmdhc1ByaWNlKTtcbiAgICAgICAgdHhKc29uLmdhc1ByaWNlLnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzIGluIHRoZSBkYXRhXG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbkFkZHJlc3MgPSB0b2tlbkFkZHJlc3Muc2xpY2UoMikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFRva2VuSWQgPSBCaWdJbnQodG9rZW5JZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZFRva2VuSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBmbHVzaCBFUkM3MjEgdHJhbnNhY3Rpb24gd2l0aCBmb3J3YXJkZXIgdmVyc2lvbiA8IHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSAnMHg5ZTJjNTcxMmFiNGNhZjQwMmE5OGM0YmY1OGM3OWEwZGZlNzE4YWQxJztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICc1NDMyMSc7XG5cbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDIpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHg1YTk1M2QwYScpOyAvLyBmbHVzaEVSQzcyMVRva2VucyBtZXRob2QgSUQgZm9yIHYyIGFuZCBiZWxvd1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnZhbHVlLCAnMCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzXG4gICAgICAgIGNvbnN0IGVuY29kZWRGb3J3YXJkZXJBZGRyZXNzID0gZm9yd2FyZGVyQWRkcmVzcy5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICBjb25zdCBlbmNvZGVkVG9rZW5BZGRyZXNzID0gdG9rZW5BZGRyZXNzLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCkucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbklkID0gQmlnSW50KHRva2VuSWQpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZEZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZFRva2VuSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBmbHVzaCBFUkM3MjEgd2l0aCBsYXJnZSB0b2tlbiBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUnOyAvLyBtYXggdWludDI1NlxuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzcyMSk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHgxNTllNDRkNycpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBsYXJnZSB0b2tlbiBJRCBpcyBwcm9wZXJseSBlbmNvZGVkXG4gICAgICAgIGNvbnN0IG1heFVpbnQyNTZIZXggPSAnZicucmVwZWF0KDY0KTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwobWF4VWludDI1NkhleCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBmbHVzaCBFUkM3MjEgd2l0aCB0b2tlbiBJRCBhcyBzdHJpbmcgemVybycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcwJztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDQpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRva2VuIElEIDAgaXMgcHJvcGVybHkgZW5jb2RlZFxuICAgICAgICBjb25zdCBlbmNvZGVkWmVyb1Rva2VuSWQgPSAnMCcucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5jb250YWluRXFsKGVuY29kZWRaZXJvVG9rZW5JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzcyMSB3aXRob3V0IHRva2VuIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG5cbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB0b2tlbiBhZGRyZXNzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzcyMSB3aXRob3V0IHRva2VuIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzcyMSk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUb2tlbiBJRCBpcyByZXF1aXJlZCBmb3IgRVJDNzIxIGZsdXNoJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzcyMSB3aXRob3V0IGNvbnRyYWN0IGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5BZGRyZXNzKHRva2VuQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkM3MjEgdHJhbnNhY3Rpb24gZnJvbSByYXcgdHggd2l0aCB2NCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG5cbiAgICAgICAgLy8gQnVpbGQgYSB0cmFuc2FjdGlvbiBmaXJzdFxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5BZGRyZXNzKHRva2VuQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWlsZGVyIGFuZCBwYXJzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgcmVidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSkgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgICByZWJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gcmVidWlsdFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHgxNTllNDRkNycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZGVjb2RlIGZsdXNoIEVSQzcyMSB0cmFuc2FjdGlvbiBmcm9tIHJhdyB0eCB3aXRoIHZlcnNpb24gPCB2NCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSAnMHg5ZTJjNTcxMmFiNGNhZjQwMmE5OGM0YmY1OGM3OWEwZGZlNzE4YWQxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgdHJhbnNhY3Rpb24gZmlyc3RcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbigyKTtcblxuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWlsZGVyIGFuZCBwYXJzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgcmVidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSkgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgICByZWJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gcmVidWlsdFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBjb250cmFjdEFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmRhdGEpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDVhOTUzZDBhJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFUkMxMTU1IEZsdXNoJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhIGZsdXNoIEVSQzExNTUgdHJhbnNhY3Rpb24gd2l0aCBmb3J3YXJkZXIgdjQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmRhdGEpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDg5NzJjMTdjJyk7IC8vIGZsdXNoRVJDMTE1NVRva2VucyB2NCBtZXRob2QgSURcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi52YWx1ZSk7XG4gICAgICAgIHR4SnNvbi52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5nYXNMaW1pdCk7XG4gICAgICAgIHR4SnNvbi5nYXNMaW1pdC5zaG91bGQuZXF1YWwoJzEwMDAwMCcpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmdhc1ByaWNlKTtcbiAgICAgICAgdHhKc29uLmdhc1ByaWNlLnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzIGluIHRoZSBkYXRhXG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbkFkZHJlc3MgPSB0b2tlbkFkZHJlc3Muc2xpY2UoMikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFRva2VuSWQgPSBCaWdJbnQodG9rZW5JZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZFRva2VuSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBmbHVzaCBFUkMxMTU1IHRyYW5zYWN0aW9uIHdpdGggZm9yd2FyZGVyIHZlcnNpb24gPCB2NCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgY29udHJhY3RBZGRyZXNzID0gJzB4OWUyYzU3MTJhYjRjYWY0MDJhOThjNGJmNThjNzlhMGRmZTcxOGFkMSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnNTU1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDIpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5zdGFydFdpdGgoJzB4ZTZiZDBhYTQnKTsgLy8gZmx1c2hGb3J3YXJkZXJFUkMxMTU1VG9rZW5zIG1ldGhvZCBJRCBmb3IgdjMgYW5kIGJlbG93XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udmFsdWUsICcwJyk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBlbmNvZGVkIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgZW5jb2RlZEZvcndhcmRlckFkZHJlc3MgPSBmb3J3YXJkZXJBZGRyZXNzLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCkucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbkFkZHJlc3MgPSB0b2tlbkFkZHJlc3Muc2xpY2UoMikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFRva2VuSWQgPSBCaWdJbnQodG9rZW5JZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkRm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5jb250YWluRXFsKGVuY29kZWRUb2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzExNTUgd2l0aG91dCB0b2tlbiBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHRva2VuIGFkZHJlc3MnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgZmx1c2ggRVJDMTE1NSB3aXRob3V0IHRva2VuIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVG9rZW4gSUQgaXMgcmVxdWlyZWQgZm9yIEVSQzExNTUgZmx1c2gnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgZmx1c2ggRVJDMTE1NSB3aXRob3V0IGNvbnRyYWN0IGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBmbHVzaCBFUkMxMTU1IHdpdGggdG9rZW4gSUQgYXMgc3RyaW5nIHplcm8nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnMCc7XG5cbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDQpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRva2VuIElEIDAgaXMgcHJvcGVybHkgZW5jb2RlZFxuICAgICAgICBjb25zdCBlbmNvZGVkWmVyb1Rva2VuSWQgPSAnMCcucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5jb250YWluRXFsKGVuY29kZWRaZXJvVG9rZW5JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdG9rZW4gSURzIGZvciBFUkMxMTU1IHdpdGggdjQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTE1NzkyMDg5MjM3MzE2MTk1NDIzNTcwOTg1MDA4Njg3OTA3ODUzMjY5OTg0NjY1NjQwNTY0MDM5NDU3NTg0MDA3OTEzMTI5NjM5OTM1JzsgLy8gbWF4IHVpbnQyNTZcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHg4OTcyYzE3YycpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBsYXJnZSB0b2tlbiBJRCBpcyBwcm9wZXJseSBlbmNvZGVkXG4gICAgICAgIGNvbnN0IG1heFVpbnQyNTZIZXggPSAnZicucmVwZWF0KDY0KTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwobWF4VWludDI1NkhleCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdG9rZW4gSURzIGZvciBFUkMxMTU1IHdpdGggdmVyc2lvbiA8IHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9ICcweDllMmM1NzEyYWI0Y2FmNDAyYTk4YzRiZjU4Yzc5YTBkZmU3MThhZDEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUnOyAvLyBtYXggdWludDI1NlxuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDIpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHhlNmJkMGFhNCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBsYXJnZSB0b2tlbiBJRCBpcyBwcm9wZXJseSBlbmNvZGVkXG4gICAgICAgIGNvbnN0IG1heFVpbnQyNTZIZXggPSAnZicucmVwZWF0KDY0KTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwobWF4VWludDI1NkhleCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBkZWNvZGUgZmx1c2ggRVJDMTE1NSB0cmFuc2FjdGlvbiBmcm9tIHJhdyB0eCB3aXRoIHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzk5OTk5JztcblxuICAgICAgICAvLyBCdWlsZCBhIHRyYW5zYWN0aW9uIGZpcnN0XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5BZGRyZXNzKHRva2VuQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWlsZGVyIGFuZCBwYXJzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgcmVidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSkgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgICByZWJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHJlYnVpbHRUeC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5zdGFydFdpdGgoJzB4ODk3MmMxN2MnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkMxMTU1IHRyYW5zYWN0aW9uIGZyb20gcmF3IHR4IHdpdGggdmVyc2lvbiA8IHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9ICcweDllMmM1NzEyYWI0Y2FmNDAyYTk4YzRiZjU4Yzc5YTBkZmU3MThhZDEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICc3Nzc3JztcblxuICAgICAgICAvLyBCdWlsZCBhIHRyYW5zYWN0aW9uIGZpcnN0XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDEpO1xuXG4gICAgICAgIGNvbnN0IGJ1aWx0VHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhIZXggPSBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJ1aWxkZXIgYW5kIHBhcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgICAgICBjb25zdCByZWJ1aWxkZXIgPSBnZXRCdWlsZGVyKGNvaW5OYW1lKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICAgIHJlYnVpbGRlci5mcm9tKHR4SGV4KTtcbiAgICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gcmVidWlsdFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBjb250cmFjdEFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmRhdGEpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweGU2YmQwYWE0Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC"}
|