@bitgo-beta/abstract-eth 1.2.3-alpha.506 → 1.2.3-alpha.508
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 +2 -0
- package/dist/src/abstractEthLikeCoin.d.ts.map +1 -1
- package/dist/src/abstractEthLikeCoin.js +8 -1
- package/dist/src/abstractEthLikeNewCoins.d.ts +30 -1
- package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -1
- package/dist/src/abstractEthLikeNewCoins.js +128 -9
- package/dist/src/ethLikeToken.d.ts +2 -0
- package/dist/src/ethLikeToken.d.ts.map +1 -1
- package/dist/src/ethLikeToken.js +7 -3
- package/dist/src/lib/iface.d.ts +10 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/transaction.d.ts +2 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +8 -1
- package/dist/src/lib/transactionBuilder.d.ts +46 -3
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +93 -1
- package/dist/src/lib/transferBuilders/index.d.ts +1 -0
- package/dist/src/lib/transferBuilders/index.d.ts.map +1 -1
- package/dist/src/lib/transferBuilders/index.js +2 -1
- package/dist/src/lib/transferBuilders/transferBuilderERC7984.d.ts +35 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC7984.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC7984.js +113 -0
- package/dist/src/lib/types.d.ts +1 -0
- package/dist/src/lib/types.d.ts.map +1 -1
- package/dist/src/lib/types.js +4 -1
- package/dist/src/lib/utils.d.ts +25 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +73 -1
- package/dist/src/lib/walletUtil.d.ts +4 -0
- package/dist/src/lib/walletUtil.d.ts.map +1 -1
- package/dist/src/lib/walletUtil.js +10 -2
- package/dist/src/lib/zamaUtils.d.ts +46 -0
- package/dist/src/lib/zamaUtils.d.ts.map +1 -1
- package/dist/src/lib/zamaUtils.js +117 -2
- package/dist/test/unit/transaction.d.ts.map +1 -1
- package/dist/test/unit/transaction.js +14 -1
- package/dist/test/unit/transactionBuilder/flushERC7984.d.ts +3 -0
- package/dist/test/unit/transactionBuilder/flushERC7984.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/flushERC7984.js +292 -0
- package/dist/test/unit/transactionBuilder/index.d.ts +1 -0
- package/dist/test/unit/transactionBuilder/index.d.ts.map +1 -1
- package/dist/test/unit/transactionBuilder/index.js +2 -1
- package/dist/test/unit/zamaUtils.js +102 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -58,4 +58,50 @@ export declare function buildMulticallDelegationCalldata(delegateAddress: string
|
|
|
58
58
|
* @returns ABI-encoded callFromParent calldata hex string (0x-prefixed)
|
|
59
59
|
*/
|
|
60
60
|
export declare function wrapInCallFromParent(targetAddress: string, calldata: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Decodes token contract addresses from delegation calldata.
|
|
63
|
+
*
|
|
64
|
+
* Handles two shapes of calldata:
|
|
65
|
+
* - Direct ACL.multicall(bytes[]) (root wallet path)
|
|
66
|
+
* - ForwarderV4.callFromParent(address, uint256, bytes) wrapping a multicall (forwarder path)
|
|
67
|
+
*
|
|
68
|
+
* @param calldata ABI-encoded delegation calldata (0x-prefixed or raw hex)
|
|
69
|
+
* @returns Array of token contract addresses (lowercase) found in the delegation calls
|
|
70
|
+
* @throws {Error} if the calldata does not start with a recognised method selector
|
|
71
|
+
*/
|
|
72
|
+
export declare function decodeTokenAddressesFromDelegationCalldata(calldata: string): string[];
|
|
73
|
+
/**
|
|
74
|
+
* Encodes confidentialTransfer(address to, bytes32 encryptedHandle) calldata.
|
|
75
|
+
* Uses the no-proof variant (selector 0x5bebed7e) — valid when the caller (forwarder)
|
|
76
|
+
* is already ACL-allowed on the handle from when it received the tokens.
|
|
77
|
+
*
|
|
78
|
+
* @param toAddress Address that will receive the tokens
|
|
79
|
+
* @param encryptedHandle bytes32 encrypted balance handle from confidentialBalanceOf
|
|
80
|
+
* @returns ABI-encoded calldata hex string (0x-prefixed)
|
|
81
|
+
*/
|
|
82
|
+
export declare function buildConfidentialTransferByHandleCalldata(toAddress: string, encryptedHandle: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* Encodes the full flush calldata for ERC-7984 forwarder consolidation:
|
|
85
|
+
* callFromParent(tokenContractAddress, 0, confidentialTransfer(parentAddress, encryptedHandle))
|
|
86
|
+
* The forwarder executes the inner confidentialTransfer with msg.sender = forwarder.
|
|
87
|
+
*
|
|
88
|
+
* @param tokenContractAddress ERC-7984 token contract address
|
|
89
|
+
* @param parentAddress Root wallet address (destination of flushed tokens)
|
|
90
|
+
* @param encryptedHandle bytes32 encrypted balance handle from confidentialBalanceOf
|
|
91
|
+
* @returns ABI-encoded calldata hex string (0x-prefixed)
|
|
92
|
+
*/
|
|
93
|
+
export declare function buildFlushERC7984ForwarderTokenCalldata(tokenContractAddress: string, parentAddress: string, encryptedHandle: string): string;
|
|
94
|
+
/**
|
|
95
|
+
* Decodes a FlushERC7984ForwarderToken calldata.
|
|
96
|
+
* Strips the outer callFromParent wrapper and the inner confidentialTransfer.
|
|
97
|
+
* Returns { tokenContractAddress, parentAddress, encryptedHandle }.
|
|
98
|
+
*
|
|
99
|
+
* @param data ABI-encoded flush calldata (0x-prefixed)
|
|
100
|
+
* @returns Decoded fields
|
|
101
|
+
*/
|
|
102
|
+
export declare function decodeFlushERC7984ForwarderTokenCalldata(data: string): {
|
|
103
|
+
tokenContractAddress: string;
|
|
104
|
+
parentAddress: string;
|
|
105
|
+
encryptedHandle: string;
|
|
106
|
+
};
|
|
61
107
|
//# sourceMappingURL=zamaUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zamaUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/zamaUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"zamaUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/zamaUtils.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,8BAA8B,2CAA4C,CAAC;AACxF,eAAO,MAAM,mBAAmB,0CAA2C,CAAC;AAC5E,eAAO,MAAM,iBAAiB,sBAAuB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,iCAAiC,QAE7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAElC,CAAC;AAMF;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,MAAM,GACtB,MAAM,CAOR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,CAC9C,eAAe,EAAE,MAAM,EACvB,sBAAsB,EAAE,MAAM,EAAE,EAChC,eAAe,EAAE,MAAM,GACtB,MAAM,CAyBR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0CAA0C,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAyCrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAK5G;AAED;;;;;;;;;GASG;AACH,wBAAgB,uCAAuC,CACrD,oBAAoB,EAAE,MAAM,EAC5B,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GACtB,MAAM,CAGR;AAED;;;;;;;GAOG;AACH,wBAAgB,wCAAwC,CAAC,IAAI,EAAE,MAAM,GAAG;IACtE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,CA8BA"}
|
|
@@ -7,8 +7,14 @@ exports.callFromParentMethodId = exports.aclMulticallMethodId = exports.delegate
|
|
|
7
7
|
exports.buildDelegationCalldata = buildDelegationCalldata;
|
|
8
8
|
exports.buildMulticallDelegationCalldata = buildMulticallDelegationCalldata;
|
|
9
9
|
exports.wrapInCallFromParent = wrapInCallFromParent;
|
|
10
|
+
exports.decodeTokenAddressesFromDelegationCalldata = decodeTokenAddressesFromDelegationCalldata;
|
|
11
|
+
exports.buildConfidentialTransferByHandleCalldata = buildConfidentialTransferByHandleCalldata;
|
|
12
|
+
exports.buildFlushERC7984ForwarderTokenCalldata = buildFlushERC7984ForwarderTokenCalldata;
|
|
13
|
+
exports.decodeFlushERC7984ForwarderTokenCalldata = decodeFlushERC7984ForwarderTokenCalldata;
|
|
10
14
|
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
11
15
|
const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
|
|
16
|
+
const ethers_1 = require("ethers");
|
|
17
|
+
const walletUtil_1 = require("./walletUtil");
|
|
12
18
|
// ---------------------------------------------------------------------------
|
|
13
19
|
// Constants
|
|
14
20
|
// ---------------------------------------------------------------------------
|
|
@@ -75,8 +81,11 @@ function buildMulticallDelegationCalldata(delegateAddress, tokenContractAddresse
|
|
|
75
81
|
return Buffer.concat([innerMethod, innerArgs]);
|
|
76
82
|
});
|
|
77
83
|
// Encode outer multicall(bytes[])
|
|
84
|
+
// ethereumjs-abi v0.6.x has a bug where it omits the per-element offset table
|
|
85
|
+
// for bytes[], producing malformed calldata that on-chain ABI decoders reject.
|
|
86
|
+
// Use ethers AbiCoder which correctly emits the head offset words.
|
|
78
87
|
const outerMethod = ethereumjs_abi_1.default.methodID('multicall', [...exports.aclMulticallTypes]);
|
|
79
|
-
const outerArgs =
|
|
88
|
+
const outerArgs = Buffer.from(new ethers_1.ethers.utils.AbiCoder().encode([...exports.aclMulticallTypes], [innerCalls]).slice(2), 'hex');
|
|
80
89
|
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([outerMethod, outerArgs]).toString('hex'));
|
|
81
90
|
}
|
|
82
91
|
/**
|
|
@@ -102,4 +111,110 @@ function wrapInCallFromParent(targetAddress, calldata) {
|
|
|
102
111
|
]);
|
|
103
112
|
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
|
|
104
113
|
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBb0RBLDBEQVdDO0FBZUQsNEVBdUJDO0FBZ0JELG9EQVdDO0FBaElELHFEQUF5RDtBQUN6RCxvRUFBeUM7QUFFekMsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsNEJBQTRCO0FBQ2YsUUFBQSw4QkFBOEIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFDM0UsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDL0QsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsQ0FBVSxDQUFDO0FBRXREOzs7R0FHRztBQUNVLFFBQUEsaUNBQWlDLEdBQUcsSUFBQSw4QkFBWSxFQUMzRCx3QkFBVyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLEdBQUcsc0NBQThCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDdkcsQ0FBQztBQUVGOzs7O0dBSUc7QUFDVSxRQUFBLG9CQUFvQixHQUFHLElBQUEsOEJBQVksRUFDOUMsd0JBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyx5QkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMxRSxDQUFDO0FBRUY7OztHQUdHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxJQUFBLDhCQUFZLEVBQ2hELHdCQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsR0FBRywyQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNqRixDQUFDO0FBRUYsOEVBQThFO0FBQzlFLHFCQUFxQjtBQUNyQiw4RUFBOEU7QUFFOUU7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxlQUF1QixFQUN2QixvQkFBNEIsRUFDNUIsZUFBdUI7SUFFdkIsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxHQUFHLHNDQUE4QixDQUFDLENBQUMsQ0FBQztJQUN0RyxNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FDaEMsQ0FBQyxHQUFHLHNDQUE4QixDQUFDLEVBQ25DLENBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFFLGVBQWUsQ0FBQyxDQUN6RCxDQUFDO0lBQ0YsT0FBTyxJQUFBLDhCQUFZLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixnQ0FBZ0MsQ0FDOUMsZUFBdUIsRUFDdkIsc0JBQWdDLEVBQ2hDLGVBQXVCO0lBRXZCLElBQUksc0JBQXNCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEVBQTRFLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELE1BQU0sVUFBVSxHQUFhLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1FBQ3ZFLE1BQU0sV0FBVyxHQUFHLHdCQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUMsR0FBRyxzQ0FBOEIsQ0FBQyxDQUFDLENBQUM7UUFDM0csTUFBTSxTQUFTLEdBQUcsd0JBQVcsQ0FBQyxTQUFTLENBQ3JDLENBQUMsR0FBRyxzQ0FBOEIsQ0FBQyxFQUNuQyxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQ2pELENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILGtDQUFrQztJQUNsQyxNQUFNLFdBQVcsR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLHlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM5RSxNQUFNLFNBQVMsR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcseUJBQWlCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDOUUsT0FBTyxJQUFBLDhCQUFZLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsYUFBcUIsRUFBRSxRQUFnQjtJQUMxRSxNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsMkJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sSUFBSSxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUNoQyxDQUFDLEdBQUcsMkJBQW1CLENBQUMsRUFDeEI7UUFDRSxhQUFhO1FBQ2IsQ0FBQyxFQUFFLHlCQUF5QjtRQUM1QixJQUFBLDBCQUFRLEVBQUMsUUFBUSxDQUFDLEVBQUUsMEJBQTBCO0tBQy9DLENBQ0YsQ0FBQztJQUNGLE9BQU8sSUFBQSw4QkFBWSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRkSGV4UHJlZml4LCB0b0J1ZmZlciB9IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEFCSSBwYXJhbWV0ZXIgdHlwZSBhcnJheXNcbmV4cG9ydCBjb25zdCBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXMgPSBbJ2FkZHJlc3MnLCAnYWRkcmVzcycsICd1aW50NjQnXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBjYWxsRnJvbVBhcmVudFR5cGVzID0gWydhZGRyZXNzJywgJ3VpbnQyNTYnLCAnYnl0ZXMnXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBhY2xNdWx0aWNhbGxUeXBlcyA9IFsnYnl0ZXNbXSddIGFzIGNvbnN0O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBBQ0wuZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbihhZGRyZXNzLGFkZHJlc3MsdWludDY0KVxuICogPSBrZWNjYWsyNTYoJ2RlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCknKVswOjRdXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgQUNMLm11bHRpY2FsbChieXRlc1tdKVxuICogPSBrZWNjYWsyNTYoJ211bHRpY2FsbChieXRlc1tdKScpWzA6NF1cbiAqIEFDTCBpbmhlcml0cyBPcGVuWmVwcGVsaW4gTXVsdGljYWxsVXBncmFkZWFibGUg4oCUIHByZXNlcnZlcyBtc2cuc2VuZGVyIHZpYSBkZWxlZ2F0ZWNhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBhY2xNdWx0aWNhbGxNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ211bHRpY2FsbCcsIFsuLi5hY2xNdWx0aWNhbGxUeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQoYWRkcmVzcyx1aW50MjU2LGJ5dGVzKVxuICogPSBrZWNjYWsyNTYoJ2NhbGxGcm9tUGFyZW50KGFkZHJlc3MsdWludDI1NixieXRlcyknKVswOjRdXG4gKi9cbmV4cG9ydCBjb25zdCBjYWxsRnJvbVBhcmVudE1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY2FsbEZyb21QYXJlbnQnLCBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGluZyBmdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEVuY29kZXMgYSBzaW5nbGUgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBjYWxsLlxuICpcbiAqIEdyYW50cyBgZGVsZWdhdGVBZGRyZXNzYCB0aGUgcmlnaHQgdG8gZGVjcnlwdCBFUkMtNzk4NCB0b2tlbiBiYWxhbmNlcyBvblxuICogYmVoYWxmIG9mIHRoZSBjYWxsaW5nIGFkZHJlc3MgKG1zZy5zZW5kZXIpIGZvciB0aGUgc3BlY2lmaWVkIHRva2VuIGNvbnRyYWN0LlxuICpcbiAqIEBwYXJhbSBkZWxlZ2F0ZUFkZHJlc3MgICAgICAgQml0R28gZW50ZXJwcmlzZSB2aWV3aW5nIGtleSBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEBwYXJhbSBleHBpcnlUaW1lc3RhbXAgICAgICAgVW5peCBzZWNvbmRzOyByZWNvbW1lbmRlZDogTWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApICsgMzY1Kjg2NDAwXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKFxuICBkZWxlZ2F0ZUFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgZXhwaXJ5VGltZXN0YW1wOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdLFxuICAgIFtkZWxlZ2F0ZUFkZHJlc3MsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcnlUaW1lc3RhbXBdXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIE4gZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxscyBiYXRjaGVkIGluc2lkZSBBQ0wubXVsdGljYWxsKCkuXG4gKlxuICogUHJvZHVjZXMgYSBzaW5nbGUgVFggdGhhdCBncmFudHMgZGVsZWdhdGlvbiBmb3IgYWxsIHNwZWNpZmllZCB0b2tlbiBjb250cmFjdHMuXG4gKiBSZXF1aXJlcyB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLmxlbmd0aCA+PSAxLlxuICogTm90ZTogRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyIGFsd2F5cyB1c2VzIHRoaXMgZnVuY3Rpb24gKGV2ZW4gZm9yIGEgc2luZ2xlIHRva2VuKVxuICogdG8ga2VlcCB0aGUgdHJhbnNhY3Rpb24gc2hhcGUgY29uc2lzdGVudCByZWdhcmRsZXNzIG9mIHRva2VuIGNvdW50LlxuICpcbiAqIEBwYXJhbSBkZWxlZ2F0ZUFkZHJlc3MgICAgICAgICAgQml0R28gZW50ZXJwcmlzZSB2aWV3aW5nIGtleSBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3NlcyAgIEFycmF5IG9mIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3Nlc1xuICogQHBhcmFtIGV4cGlyeVRpbWVzdGFtcCAgICAgICAgICBVbml4IHNlY29uZHNcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEoXG4gIGRlbGVnYXRlQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzOiBzdHJpbmdbXSxcbiAgZXhwaXJ5VGltZXN0YW1wOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGlmICh0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGE6IHRva2VuQ29udHJhY3RBZGRyZXNzZXMgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIGVhY2ggaW5uZXIgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxsIGFzIHJhdyBieXRlc1xuICBjb25zdCBpbm5lckNhbGxzOiBCdWZmZXJbXSA9IHRva2VuQ29udHJhY3RBZGRyZXNzZXMubWFwKCh0b2tlbkFkZHJlc3MpID0+IHtcbiAgICBjb25zdCBpbm5lck1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pO1xuICAgIGNvbnN0IGlubmVyQXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICAgIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdLFxuICAgICAgW2RlbGVnYXRlQWRkcmVzcywgdG9rZW5BZGRyZXNzLCBleHBpcnlUaW1lc3RhbXBdXG4gICAgKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbaW5uZXJNZXRob2QsIGlubmVyQXJnc10pO1xuICB9KTtcblxuICAvLyBFbmNvZGUgb3V0ZXIgbXVsdGljYWxsKGJ5dGVzW10pXG4gIGNvbnN0IG91dGVyTWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ211bHRpY2FsbCcsIFsuLi5hY2xNdWx0aWNhbGxUeXBlc10pO1xuICBjb25zdCBvdXRlckFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoWy4uLmFjbE11bHRpY2FsbFR5cGVzXSwgW2lubmVyQ2FsbHNdKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFtvdXRlck1ldGhvZCwgb3V0ZXJBcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBjYWxsZGF0YSBpbiBhIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KHRhcmdldCwgMCwgZGF0YSkgY2FsbC5cbiAqXG4gKiBVc2VkIHdoZW4gYSBmb3J3YXJkZXIgY29udHJhY3QgbXVzdCBiZSBtc2cuc2VuZGVyIGZvciBhbiBleHRlcm5hbCBjb250cmFjdFxuICogY2FsbCDigJQgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGZvcndhcmRlciBpdHNlbGYgbmVlZHMgdG8gY2FsbFxuICogQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBzbyB0aGF0IGl0cyBvd24gYmFsYW5jZSBjYW4gYmUgZGVjcnlwdGVkLlxuICpcbiAqIE9ubHkgdGhlIHBhcmVudEFkZHJlc3MgKHJvb3Qgd2FsbGV0KSBpcyBhbGxvd2VkIHRvIGNhbGwgY2FsbEZyb21QYXJlbnRcbiAqIChlbmZvcmNlZCBieSB0aGUgZm9yd2FyZGVyJ3Mgb25seVBhcmVudCBtb2RpZmllcikuXG4gKlxuICogQHBhcmFtIHRhcmdldEFkZHJlc3MgIEFkZHJlc3Mgb2YgdGhlIGNvbnRyYWN0IHRoZSBmb3J3YXJkZXIgd2lsbCBjYWxsIChlLmcuIEFDTClcbiAqIEBwYXJhbSBjYWxsZGF0YSAgICAgICBBQkktZW5jb2RlZCBpbm5lciBjYWxsZGF0YSAoZS5nLiBmcm9tIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbEZyb21QYXJlbnQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0YXJnZXRBZGRyZXNzOiBzdHJpbmcsIGNhbGxkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY2FsbEZyb21QYXJlbnQnLCBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSxcbiAgICBbXG4gICAgICB0YXJnZXRBZGRyZXNzLFxuICAgICAgMCwgLy8gdmFsdWU6IG5vIEVUSCB0cmFuc2ZlclxuICAgICAgdG9CdWZmZXIoY2FsbGRhdGEpLCAvLyBpbm5lciBjYWxsZGF0YSBhcyBieXRlc1xuICAgIF1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuIl19
|
|
114
|
+
/**
|
|
115
|
+
* Decodes token contract addresses from delegation calldata.
|
|
116
|
+
*
|
|
117
|
+
* Handles two shapes of calldata:
|
|
118
|
+
* - Direct ACL.multicall(bytes[]) (root wallet path)
|
|
119
|
+
* - ForwarderV4.callFromParent(address, uint256, bytes) wrapping a multicall (forwarder path)
|
|
120
|
+
*
|
|
121
|
+
* @param calldata ABI-encoded delegation calldata (0x-prefixed or raw hex)
|
|
122
|
+
* @returns Array of token contract addresses (lowercase) found in the delegation calls
|
|
123
|
+
* @throws {Error} if the calldata does not start with a recognised method selector
|
|
124
|
+
*/
|
|
125
|
+
function decodeTokenAddressesFromDelegationCalldata(calldata) {
|
|
126
|
+
const data = calldata.startsWith('0x') ? calldata : '0x' + calldata;
|
|
127
|
+
const methodId = data.slice(0, 10);
|
|
128
|
+
const abiCoder = new ethers_1.ethers.utils.AbiCoder();
|
|
129
|
+
let multicallHex;
|
|
130
|
+
if (methodId === exports.callFromParentMethodId) {
|
|
131
|
+
// Decode callFromParent(address, uint256, bytes) — inner bytes is the full multicall calldata.
|
|
132
|
+
// ethers v5 returns `bytes` as a hex string; use hexlify to normalise to a 0x-prefixed hex string
|
|
133
|
+
// regardless of whether the runtime returns a string or a Uint8Array.
|
|
134
|
+
const decoded = abiCoder.decode([...exports.callFromParentTypes], '0x' + data.slice(10));
|
|
135
|
+
multicallHex = ethers_1.ethers.utils.hexlify(decoded[2]);
|
|
136
|
+
}
|
|
137
|
+
else if (methodId === exports.aclMulticallMethodId) {
|
|
138
|
+
multicallHex = data;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
throw new Error('Not a valid delegation calldata');
|
|
142
|
+
}
|
|
143
|
+
if (multicallHex.slice(0, 10) !== exports.aclMulticallMethodId) {
|
|
144
|
+
throw new Error('Not a valid delegation calldata');
|
|
145
|
+
}
|
|
146
|
+
// Decode multicall(bytes[]) — each element is an inner delegateForUserDecryption call.
|
|
147
|
+
// ethers v5 returns bytes[] elements as hex strings; use hexlify to normalise each element.
|
|
148
|
+
const decoded = abiCoder.decode(['bytes[]'], '0x' + multicallHex.slice(10));
|
|
149
|
+
const innerCalls = decoded[0];
|
|
150
|
+
const tokenAddresses = [];
|
|
151
|
+
for (const innerCall of innerCalls) {
|
|
152
|
+
const innerHex = ethers_1.ethers.utils.hexlify(innerCall).slice(2); // strip 0x
|
|
153
|
+
const innerMethodId = '0x' + innerHex.slice(0, 8);
|
|
154
|
+
if (innerMethodId !== exports.delegateForUserDecryptionMethodId) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// Decode delegateForUserDecryption(address delegate, address tokenAddress, uint64 expiry)
|
|
158
|
+
const innerDecoded = abiCoder.decode([...exports.delegateForUserDecryptionTypes], '0x' + innerHex.slice(8));
|
|
159
|
+
tokenAddresses.push(innerDecoded[1].toLowerCase());
|
|
160
|
+
}
|
|
161
|
+
return tokenAddresses;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Encodes confidentialTransfer(address to, bytes32 encryptedHandle) calldata.
|
|
165
|
+
* Uses the no-proof variant (selector 0x5bebed7e) — valid when the caller (forwarder)
|
|
166
|
+
* is already ACL-allowed on the handle from when it received the tokens.
|
|
167
|
+
*
|
|
168
|
+
* @param toAddress Address that will receive the tokens
|
|
169
|
+
* @param encryptedHandle bytes32 encrypted balance handle from confidentialBalanceOf
|
|
170
|
+
* @returns ABI-encoded calldata hex string (0x-prefixed)
|
|
171
|
+
*/
|
|
172
|
+
function buildConfidentialTransferByHandleCalldata(toAddress, encryptedHandle) {
|
|
173
|
+
const method = Buffer.from(walletUtil_1.confidentialTransferNoProofMethodId.slice(2), 'hex');
|
|
174
|
+
const handleBuffer = (0, ethereumjs_util_1.toBuffer)(encryptedHandle);
|
|
175
|
+
const args = ethereumjs_abi_1.default.rawEncode([...walletUtil_1.confidentialTransferNoProofTypes], [toAddress, handleBuffer]);
|
|
176
|
+
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Encodes the full flush calldata for ERC-7984 forwarder consolidation:
|
|
180
|
+
* callFromParent(tokenContractAddress, 0, confidentialTransfer(parentAddress, encryptedHandle))
|
|
181
|
+
* The forwarder executes the inner confidentialTransfer with msg.sender = forwarder.
|
|
182
|
+
*
|
|
183
|
+
* @param tokenContractAddress ERC-7984 token contract address
|
|
184
|
+
* @param parentAddress Root wallet address (destination of flushed tokens)
|
|
185
|
+
* @param encryptedHandle bytes32 encrypted balance handle from confidentialBalanceOf
|
|
186
|
+
* @returns ABI-encoded calldata hex string (0x-prefixed)
|
|
187
|
+
*/
|
|
188
|
+
function buildFlushERC7984ForwarderTokenCalldata(tokenContractAddress, parentAddress, encryptedHandle) {
|
|
189
|
+
const innerCalldata = buildConfidentialTransferByHandleCalldata(parentAddress, encryptedHandle);
|
|
190
|
+
return wrapInCallFromParent(tokenContractAddress, innerCalldata);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Decodes a FlushERC7984ForwarderToken calldata.
|
|
194
|
+
* Strips the outer callFromParent wrapper and the inner confidentialTransfer.
|
|
195
|
+
* Returns { tokenContractAddress, parentAddress, encryptedHandle }.
|
|
196
|
+
*
|
|
197
|
+
* @param data ABI-encoded flush calldata (0x-prefixed)
|
|
198
|
+
* @returns Decoded fields
|
|
199
|
+
*/
|
|
200
|
+
function decodeFlushERC7984ForwarderTokenCalldata(data) {
|
|
201
|
+
if (!data.startsWith(exports.callFromParentMethodId)) {
|
|
202
|
+
throw new Error(`Invalid FlushERC7984ForwarderToken calldata: expected callFromParent selector, got ${data.slice(0, 10)}`);
|
|
203
|
+
}
|
|
204
|
+
const abiCoder = new ethers_1.ethers.utils.AbiCoder();
|
|
205
|
+
const outerDecoded = abiCoder.decode([...exports.callFromParentTypes], '0x' + data.slice(10));
|
|
206
|
+
const tokenContractAddress = outerDecoded[0];
|
|
207
|
+
const innerCalldata = ethers_1.ethers.utils.hexlify(outerDecoded[2]);
|
|
208
|
+
if (!innerCalldata.startsWith(walletUtil_1.confidentialTransferNoProofMethodId)) {
|
|
209
|
+
throw new Error(`Invalid FlushERC7984ForwarderToken inner calldata: expected confidentialTransfer selector, got ${innerCalldata.slice(0, 10)}`);
|
|
210
|
+
}
|
|
211
|
+
const innerDecoded = abiCoder.decode([...walletUtil_1.confidentialTransferNoProofTypes], '0x' + innerCalldata.slice(10));
|
|
212
|
+
const parentAddress = innerDecoded[0];
|
|
213
|
+
const encryptedHandle = (0, ethereumjs_util_1.bufferToHex)((0, ethereumjs_util_1.toBuffer)(innerDecoded[1]));
|
|
214
|
+
return {
|
|
215
|
+
tokenContractAddress,
|
|
216
|
+
parentAddress,
|
|
217
|
+
encryptedHandle,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBc0RBLDBEQVdDO0FBZUQsNEVBNkJDO0FBZ0JELG9EQVdDO0FBYUQsZ0dBeUNDO0FBV0QsOEZBS0M7QUFZRCwwRkFPQztBQVVELDRGQWtDQztBQTdRRCxxREFBc0U7QUFDdEUsb0VBQXlDO0FBQ3pDLG1DQUFnQztBQUNoQyw2Q0FBcUc7QUFFckcsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsNEJBQTRCO0FBQ2YsUUFBQSw4QkFBOEIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFDM0UsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDL0QsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsQ0FBVSxDQUFDO0FBRXREOzs7R0FHRztBQUNVLFFBQUEsaUNBQWlDLEdBQUcsSUFBQSw4QkFBWSxFQUMzRCx3QkFBVyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLEdBQUcsc0NBQThCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDdkcsQ0FBQztBQUVGOzs7O0dBSUc7QUFDVSxRQUFBLG9CQUFvQixHQUFHLElBQUEsOEJBQVksRUFDOUMsd0JBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyx5QkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMxRSxDQUFDO0FBRUY7OztHQUdHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxJQUFBLDhCQUFZLEVBQ2hELHdCQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsR0FBRywyQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUss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QUM7SUFDckQsTUFBTSxhQUFhLEdBQVcsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZ0RBQW1DLENBQUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0dBQWtHLGFBQWEsQ0FBQyxLQUFLLENBQ25ILENBQUMsRUFDRCxFQUFFLENBQ0gsRUFBRSxDQUNKLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsNkNBQWdDLENBQUMsRUFBRSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVHLE1BQU0sYUFBYSxHQUFXLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLGVBQWUsR0FBVyxJQUFBLDZCQUFXLEVBQUMsSUFBQSwwQkFBUSxFQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsT0FBTztRQUNMLG9CQUFvQjtRQUNwQixhQUFhO1FBQ2IsZUFBZTtLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFkZEhleFByZWZpeCwgYnVmZmVyVG9IZXgsIHRvQnVmZmVyIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQsIGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZlR5cGVzIH0gZnJvbSAnLi93YWxsZXRVdGlsJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBBQkkgcGFyYW1ldGVyIHR5cGUgYXJyYXlzXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzID0gWydhZGRyZXNzJywgJ2FkZHJlc3MnLCAndWludDY0J10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRUeXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2JywgJ2J5dGVzJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsVHlwZXMgPSBbJ2J5dGVzW10nXSBhcyBjb25zdDtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NClcbiAqID0ga2VjY2FrMjU2KCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSlcbiAqID0ga2VjY2FrMjU2KCdtdWx0aWNhbGwoYnl0ZXNbXSknKVswOjRdXG4gKiBBQ0wgaW5oZXJpdHMgT3BlblplcHBlbGluIE11bHRpY2FsbFVwZ3JhZGVhYmxlIOKAlCBwcmVzZXJ2ZXMgbXNnLnNlbmRlciB2aWEgZGVsZWdhdGVjYWxsLlxuICovXG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdtdWx0aWNhbGwnLCBbLi4uYWNsTXVsdGljYWxsVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KGFkZHJlc3MsdWludDI1NixieXRlcylcbiAqID0ga2VjY2FrMjU2KCdjYWxsRnJvbVBhcmVudChhZGRyZXNzLHVpbnQyNTYsYnl0ZXMpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NhbGxGcm9tUGFyZW50JywgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jb2RpbmcgZnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFbmNvZGVzIGEgc2luZ2xlIEFDTC5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKCkgY2FsbC5cbiAqXG4gKiBHcmFudHMgYGRlbGVnYXRlQWRkcmVzc2AgdGhlIHJpZ2h0IHRvIGRlY3J5cHQgRVJDLTc5ODQgdG9rZW4gYmFsYW5jZXMgb25cbiAqIGJlaGFsZiBvZiB0aGUgY2FsbGluZyBhZGRyZXNzIChtc2cuc2VuZGVyKSBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzICBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0gZXhwaXJ5VGltZXN0YW1wICAgICAgIFVuaXggc2Vjb25kczsgcmVjb21tZW5kZWQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKSArIDM2NSo4NjQwMFxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbGVnYXRpb25DYWxsZGF0YShcbiAgZGVsZWdhdGVBZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICBbZGVsZWdhdGVBZGRyZXNzLCB0b2tlbkNvbnRyYWN0QWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyBOIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbHMgYmF0Y2hlZCBpbnNpZGUgQUNMLm11bHRpY2FsbCgpLlxuICpcbiAqIFByb2R1Y2VzIGEgc2luZ2xlIFRYIHRoYXQgZ3JhbnRzIGRlbGVnYXRpb24gZm9yIGFsbCBzcGVjaWZpZWQgdG9rZW4gY29udHJhY3RzLlxuICogUmVxdWlyZXMgdG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPj0gMS5cbiAqIE5vdGU6IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciBhbHdheXMgdXNlcyB0aGlzIGZ1bmN0aW9uIChldmVuIGZvciBhIHNpbmdsZSB0b2tlbilcbiAqIHRvIGtlZXAgdGhlIHRyYW5zYWN0aW9uIHNoYXBlIGNvbnNpc3RlbnQgcmVnYXJkbGVzcyBvZiB0b2tlbiBjb3VudC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzZXMgICBBcnJheSBvZiBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXNcbiAqIEBwYXJhbSBleHBpcnlUaW1lc3RhbXAgICAgICAgICAgVW5peCBzZWNvbmRzXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKFxuICBkZWxlZ2F0ZUFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5Db250cmFjdEFkZHJlc3Nlczogc3RyaW5nW10sXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBpZiAodG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhOiB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzIG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICAvLyBCdWlsZCBlYWNoIGlubmVyIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbCBhcyByYXcgYnl0ZXNcbiAgY29uc3QgaW5uZXJDYWxsczogQnVmZmVyW10gPSB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLm1hcCgodG9rZW5BZGRyZXNzKSA9PiB7XG4gICAgY29uc3QgaW5uZXJNZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgICBjb25zdCBpbm5lckFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICAgIFtkZWxlZ2F0ZUFkZHJlc3MsIHRva2VuQWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICAgICk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2lubmVyTWV0aG9kLCBpbm5lckFyZ3NdKTtcbiAgfSk7XG5cbiAgLy8gRW5jb2RlIG91dGVyIG11bHRpY2FsbChieXRlc1tdKVxuICAvLyBldGhlcmV1bWpzLWFiaSB2MC42LnggaGFzIGEgYnVnIHdoZXJlIGl0IG9taXRzIHRoZSBwZXItZWxlbWVudCBvZmZzZXQgdGFibGVcbiAgLy8gZm9yIGJ5dGVzW10sIHByb2R1Y2luZyBtYWxmb3JtZWQgY2FsbGRhdGEgdGhhdCBvbi1jaGFpbiBBQkkgZGVjb2RlcnMgcmVqZWN0LlxuICAvLyBVc2UgZXRoZXJzIEFiaUNvZGVyIHdoaWNoIGNvcnJlY3RseSBlbWl0cyB0aGUgaGVhZCBvZmZzZXQgd29yZHMuXG4gIGNvbnN0IG91dGVyTWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ211bHRpY2FsbCcsIFsuLi5hY2xNdWx0aWNhbGxUeXBlc10pO1xuICBjb25zdCBvdXRlckFyZ3MgPSBCdWZmZXIuZnJvbShcbiAgICBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCkuZW5jb2RlKFsuLi5hY2xNdWx0aWNhbGxUeXBlc10sIFtpbm5lckNhbGxzXSkuc2xpY2UoMiksXG4gICAgJ2hleCdcbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFtvdXRlck1ldGhvZCwgb3V0ZXJBcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBjYWxsZGF0YSBpbiBhIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KHRhcmdldCwgMCwgZGF0YSkgY2FsbC5cbiAqXG4gKiBVc2VkIHdoZW4gYSBmb3J3YXJkZXIgY29udHJhY3QgbXVzdCBiZSBtc2cuc2VuZGVyIGZvciBhbiBleHRlcm5hbCBjb250cmFjdFxuICogY2FsbCDigJQgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGZvcndhcmRlciBpdHNlbGYgbmVlZHMgdG8gY2FsbFxuICogQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBzbyB0aGF0IGl0cyBvd24gYmFsYW5jZSBjYW4gYmUgZGVjcnlwdGVkLlxuICpcbiAqIE9ubHkgdGhlIHBhcmVudEFkZHJlc3MgKHJvb3Qgd2FsbGV0KSBpcyBhbGxvd2VkIHRvIGNhbGwgY2FsbEZyb21QYXJlbnRcbiAqIChlbmZvcmNlZCBieSB0aGUgZm9yd2FyZGVyJ3Mgb25seVBhcmVudCBtb2RpZmllcikuXG4gKlxuICogQHBhcmFtIHRhcmdldEFkZHJlc3MgIEFkZHJlc3Mgb2YgdGhlIGNvbnRyYWN0IHRoZSBmb3J3YXJkZXIgd2lsbCBjYWxsIChlLmcuIEFDTClcbiAqIEBwYXJhbSBjYWxsZGF0YSAgICAgICBBQkktZW5jb2RlZCBpbm5lciBjYWxsZGF0YSAoZS5nLiBmcm9tIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbEZyb21QYXJlbnQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0YXJnZXRBZGRyZXNzOiBzdHJpbmcsIGNhbGxkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY2FsbEZyb21QYXJlbnQnLCBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSxcbiAgICBbXG4gICAgICB0YXJnZXRBZGRyZXNzLFxuICAgICAgMCwgLy8gdmFsdWU6IG5vIEVUSCB0cmFuc2ZlclxuICAgICAgdG9CdWZmZXIoY2FsbGRhdGEpLCAvLyBpbm5lciBjYWxsZGF0YSBhcyBieXRlc1xuICAgIF1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIERlY29kZXMgdG9rZW4gY29udHJhY3QgYWRkcmVzc2VzIGZyb20gZGVsZWdhdGlvbiBjYWxsZGF0YS5cbiAqXG4gKiBIYW5kbGVzIHR3byBzaGFwZXMgb2YgY2FsbGRhdGE6XG4gKiAgIC0gRGlyZWN0IEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSkgKHJvb3Qgd2FsbGV0IHBhdGgpXG4gKiAgIC0gRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQoYWRkcmVzcywgdWludDI1NiwgYnl0ZXMpIHdyYXBwaW5nIGEgbXVsdGljYWxsIChmb3J3YXJkZXIgcGF0aClcbiAqXG4gKiBAcGFyYW0gY2FsbGRhdGEgIEFCSS1lbmNvZGVkIGRlbGVnYXRpb24gY2FsbGRhdGEgKDB4LXByZWZpeGVkIG9yIHJhdyBoZXgpXG4gKiBAcmV0dXJucyBBcnJheSBvZiB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXMgKGxvd2VyY2FzZSkgZm91bmQgaW4gdGhlIGRlbGVnYXRpb24gY2FsbHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgY2FsbGRhdGEgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHJlY29nbmlzZWQgbWV0aG9kIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEoY2FsbGRhdGE6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGF0YSA9IGNhbGxkYXRhLnN0YXJ0c1dpdGgoJzB4JykgPyBjYWxsZGF0YSA6ICcweCcgKyBjYWxsZGF0YTtcbiAgY29uc3QgbWV0aG9kSWQgPSBkYXRhLnNsaWNlKDAsIDEwKTtcbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG5cbiAgbGV0IG11bHRpY2FsbEhleDogc3RyaW5nO1xuXG4gIGlmIChtZXRob2RJZCA9PT0gY2FsbEZyb21QYXJlbnRNZXRob2RJZCkge1xuICAgIC8vIERlY29kZSBjYWxsRnJvbVBhcmVudChhZGRyZXNzLCB1aW50MjU2LCBieXRlcykg4oCUIGlubmVyIGJ5dGVzIGlzIHRoZSBmdWxsIG11bHRpY2FsbCBjYWxsZGF0YS5cbiAgICAvLyBldGhlcnMgdjUgcmV0dXJucyBgYnl0ZXNgIGFzIGEgaGV4IHN0cmluZzsgdXNlIGhleGxpZnkgdG8gbm9ybWFsaXNlIHRvIGEgMHgtcHJlZml4ZWQgaGV4IHN0cmluZ1xuICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcnVudGltZSByZXR1cm5zIGEgc3RyaW5nIG9yIGEgVWludDhBcnJheS5cbiAgICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgICBtdWx0aWNhbGxIZXggPSBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKTtcbiAgfSBlbHNlIGlmIChtZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICBtdWx0aWNhbGxIZXggPSBkYXRhO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgZGVsZWdhdGlvbiBjYWxsZGF0YScpO1xuICB9XG5cbiAgaWYgKG11bHRpY2FsbEhleC5zbGljZSgwLCAxMCkgIT09IGFjbE11bHRpY2FsbE1ldGhvZElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBkZWxlZ2F0aW9uIGNhbGxkYXRhJyk7XG4gIH1cblxuICAvLyBEZWNvZGUgbXVsdGljYWxsKGJ5dGVzW10pIOKAlCBlYWNoIGVsZW1lbnQgaXMgYW4gaW5uZXIgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxsLlxuICAvLyBldGhlcnMgdjUgcmV0dXJucyBieXRlc1tdIGVsZW1lbnRzIGFzIGhleCBzdHJpbmdzOyB1c2UgaGV4bGlmeSB0byBub3JtYWxpc2UgZWFjaCBlbGVtZW50LlxuICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsnYnl0ZXNbXSddLCAnMHgnICsgbXVsdGljYWxsSGV4LnNsaWNlKDEwKSk7XG4gIGNvbnN0IGlubmVyQ2FsbHM6IHVua25vd25bXSA9IGRlY29kZWRbMF07XG5cbiAgY29uc3QgdG9rZW5BZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgaW5uZXJDYWxsIG9mIGlubmVyQ2FsbHMpIHtcbiAgICBjb25zdCBpbm5lckhleCA9IGV0aGVycy51dGlscy5oZXhsaWZ5KGlubmVyQ2FsbCBhcyBldGhlcnMudXRpbHMuQnl0ZXNMaWtlKS5zbGljZSgyKTsgLy8gc3RyaXAgMHhcbiAgICBjb25zdCBpbm5lck1ldGhvZElkID0gJzB4JyArIGlubmVySGV4LnNsaWNlKDAsIDgpO1xuICAgIGlmIChpbm5lck1ldGhvZElkICE9PSBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uTWV0aG9kSWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBEZWNvZGUgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbihhZGRyZXNzIGRlbGVnYXRlLCBhZGRyZXNzIHRva2VuQWRkcmVzcywgdWludDY0IGV4cGlyeSlcbiAgICBjb25zdCBpbm5lckRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10sICcweCcgKyBpbm5lckhleC5zbGljZSg4KSk7XG4gICAgdG9rZW5BZGRyZXNzZXMucHVzaCgoaW5uZXJEZWNvZGVkWzFdIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5BZGRyZXNzZXM7XG59XG5cbi8qKlxuICogRW5jb2RlcyBjb25maWRlbnRpYWxUcmFuc2ZlcihhZGRyZXNzIHRvLCBieXRlczMyIGVuY3J5cHRlZEhhbmRsZSkgY2FsbGRhdGEuXG4gKiBVc2VzIHRoZSBuby1wcm9vZiB2YXJpYW50IChzZWxlY3RvciAweDViZWJlZDdlKSDigJQgdmFsaWQgd2hlbiB0aGUgY2FsbGVyIChmb3J3YXJkZXIpXG4gKiBpcyBhbHJlYWR5IEFDTC1hbGxvd2VkIG9uIHRoZSBoYW5kbGUgZnJvbSB3aGVuIGl0IHJlY2VpdmVkIHRoZSB0b2tlbnMuXG4gKlxuICogQHBhcmFtIHRvQWRkcmVzcyAgICAgICBBZGRyZXNzIHRoYXQgd2lsbCByZWNlaXZlIHRoZSB0b2tlbnNcbiAqIEBwYXJhbSBlbmNyeXB0ZWRIYW5kbGUgYnl0ZXMzMiBlbmNyeXB0ZWQgYmFsYW5jZSBoYW5kbGUgZnJvbSBjb25maWRlbnRpYWxCYWxhbmNlT2ZcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEodG9BZGRyZXNzOiBzdHJpbmcsIGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWV0aG9kID0gQnVmZmVyLmZyb20oY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQuc2xpY2UoMiksICdoZXgnKTtcbiAgY29uc3QgaGFuZGxlQnVmZmVyID0gdG9CdWZmZXIoZW5jcnlwdGVkSGFuZGxlKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCBbdG9BZGRyZXNzLCBoYW5kbGVCdWZmZXJdKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGZ1bGwgZmx1c2ggY2FsbGRhdGEgZm9yIEVSQy03OTg0IGZvcndhcmRlciBjb25zb2xpZGF0aW9uOlxuICogICBjYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlKSlcbiAqIFRoZSBmb3J3YXJkZXIgZXhlY3V0ZXMgdGhlIGlubmVyIGNvbmZpZGVudGlhbFRyYW5zZmVyIHdpdGggbXNnLnNlbmRlciA9IGZvcndhcmRlci5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEBwYXJhbSBwYXJlbnRBZGRyZXNzICAgICAgICAgUm9vdCB3YWxsZXQgYWRkcmVzcyAoZGVzdGluYXRpb24gb2YgZmx1c2hlZCB0b2tlbnMpXG4gKiBAcGFyYW0gZW5jcnlwdGVkSGFuZGxlICAgICAgIGJ5dGVzMzIgZW5jcnlwdGVkIGJhbGFuY2UgaGFuZGxlIGZyb20gY29uZmlkZW50aWFsQmFsYW5jZU9mXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgcGFyZW50QWRkcmVzczogc3RyaW5nLFxuICBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgaW5uZXJDYWxsZGF0YSA9IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJCeUhhbmRsZUNhbGxkYXRhKHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSk7XG4gIHJldHVybiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgaW5uZXJDYWxsZGF0YSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIGNhbGxkYXRhLlxuICogU3RyaXBzIHRoZSBvdXRlciBjYWxsRnJvbVBhcmVudCB3cmFwcGVyIGFuZCB0aGUgaW5uZXIgY29uZmlkZW50aWFsVHJhbnNmZXIuXG4gKiBSZXR1cm5zIHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSB9LlxuICpcbiAqIEBwYXJhbSBkYXRhICBBQkktZW5jb2RlZCBmbHVzaCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKiBAcmV0dXJucyBEZWNvZGVkIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShkYXRhOiBzdHJpbmcpOiB7XG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHBhcmVudEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoY2FsbEZyb21QYXJlbnRNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbiBjYWxsZGF0YTogZXhwZWN0ZWQgY2FsbEZyb21QYXJlbnQgc2VsZWN0b3IsIGdvdCAke2RhdGEuc2xpY2UoMCwgMTApfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IG91dGVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcgPSBvdXRlckRlY29kZWRbMF07XG4gIGNvbnN0IGlubmVyQ2FsbGRhdGE6IHN0cmluZyA9IGV0aGVycy51dGlscy5oZXhsaWZ5KG91dGVyRGVjb2RlZFsyXSk7XG5cbiAgaWYgKCFpbm5lckNhbGxkYXRhLnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gaW5uZXIgY2FsbGRhdGE6IGV4cGVjdGVkIGNvbmZpZGVudGlhbFRyYW5zZmVyIHNlbGVjdG9yLCBnb3QgJHtpbm5lckNhbGxkYXRhLnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICAxMFxuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGlubmVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCAnMHgnICsgaW5uZXJDYWxsZGF0YS5zbGljZSgxMCkpO1xuICBjb25zdCBwYXJlbnRBZGRyZXNzOiBzdHJpbmcgPSBpbm5lckRlY29kZWRbMF07XG4gIGNvbnN0IGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nID0gYnVmZmVyVG9IZXgodG9CdWZmZXIoaW5uZXJEZWNvZGVkWzFdKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICBwYXJlbnRBZGRyZXNzLFxuICAgIGVuY3J5cHRlZEhhbmRsZSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transaction.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transaction.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,QAsElF"}
|
|
@@ -55,6 +55,19 @@ function runTransactionTests(coinName, testData, common) {
|
|
|
55
55
|
should_1.default.equal(tx.toBroadcastFormat(), testData.ENCODED_TRANSACTION);
|
|
56
56
|
});
|
|
57
57
|
});
|
|
58
|
+
describe('signablePayload', () => {
|
|
59
|
+
it('should throw on an empty transaction', () => {
|
|
60
|
+
const tx = getTransaction();
|
|
61
|
+
should_1.default.throws(() => tx.signablePayload);
|
|
62
|
+
});
|
|
63
|
+
it('should return a 32-byte keccak256 hash for an unsigned transaction', () => {
|
|
64
|
+
const tx = getTransaction();
|
|
65
|
+
tx.setTransactionData(testData.TXDATA);
|
|
66
|
+
const payload = tx.signablePayload;
|
|
67
|
+
payload.should.be.instanceof(Buffer);
|
|
68
|
+
payload.length.should.equal(32);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
58
71
|
});
|
|
59
72
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSxrREFzRUM7QUEzRUQsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1QyxtQ0FBd0M7QUFHeEMsU0FBZ0IsbUJBQW1CLENBQUMsUUFBZ0IsRUFBRSxRQUFhLEVBQUUsTUFBYztJQUNqRixRQUFRLENBQUMsR0FBRyxRQUFRLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DOztXQUVHO1FBQ0gsU0FBUyxjQUFjO1lBQ3JCLE9BQU8sSUFBSSxpQkFBVyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDN0IsRUFBRSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtnQkFDOUIsTUFBTSxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBQzVCLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtvQkFDakIsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2dCQUNILGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtvQkFDakIsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1lBQzdCLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7Z0JBQzdCLE1BQU0sRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUM1QixFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQzNCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUNqQixNQUFNLEVBQUUsR0FBRyxjQUFjLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7Z0JBQ2YsTUFBTSxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBQzVCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtZQUN4QyxFQUFFLENBQUMsWUFBWSxFQUFFLEtBQUs7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUM1QixFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtZQUMvQixFQUFFLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO2dCQUM5QyxNQUFNLEVBQUUsR0FBRyxjQUFjLEVBQUUsQ0FBQztnQkFDNUIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRTtnQkFDNUUsTUFBTSxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBQzVCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IENvbW1vbiBmcm9tICdAZXRoZXJldW1qcy9jb21tb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gcnVuVHJhbnNhY3Rpb25UZXN0cyhjb2luTmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogYW55LCBjb21tb246IENvbW1vbikge1xuICBkZXNjcmliZShgJHtjb2luTmFtZX0gVHJhbnNhY3Rpb25gLCAoKSA9PiB7XG4gICAgY29uc3QgY29pbiA9IHRlc3REYXRhLkNPSU47XG4gICAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldChjb2luKTtcblxuICAgIC8qKlxuICAgICAqIHJldHVybiBhIG5ldyB0cmFuc2FjdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKGNvaW5Db25maWcsIGNvbW1vbik7XG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCB0aHJvdyAnLCAoKSA9PiB7XG4gICAgICBpdCgnYW4gZW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4ID0gZ2V0VHJhbnNhY3Rpb24oKTtcbiAgICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB7XG4gICAgICAgICAgdHgudG9Kc29uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCByZXR1cm4nLCAoKSA9PiB7XG4gICAgICBpdCgnYSB2YWxpZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHggPSBnZXRUcmFuc2FjdGlvbigpO1xuICAgICAgICB0eC5zZXRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuVFhEQVRBKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0pzb24oKSwgdGVzdERhdGEuVFhEQVRBKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlVOU0lHTkVEX1RYKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBzaWduJywgKCkgPT4ge1xuICAgICAgaXQoJ2ludmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4ID0gZ2V0VHJhbnNhY3Rpb24oKTtcbiAgICAgICAgcmV0dXJuIHR4LnNpZ24odGVzdERhdGEuS0VZUEFJUl9QUlYpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd2YWxpZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHggPSBnZXRUcmFuc2FjdGlvbigpO1xuICAgICAgICB0eC5zZXRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuVFhEQVRBKTtcbiAgICAgICAgcmV0dXJuIHR4LnNpZ24odGVzdERhdGEuS0VZUEFJUl9QUlYpLnNob3VsZC5iZS5mdWxmaWxsZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCByZXR1cm4gZW5jb2RlZCB0eCcsICgpID0+IHtcbiAgICAgIGl0KCd2YWxpZCBzaWduJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eCA9IGdldFRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHR4LnNldFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5UWERBVEEpO1xuICAgICAgICBhd2FpdCB0eC5zaWduKHRlc3REYXRhLktFWVBBSVJfUFJWKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLkVOQ09ERURfVFJBTlNBQ1RJT04pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2lnbmFibGVQYXlsb2FkJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBhbiBlbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHggPSBnZXRUcmFuc2FjdGlvbigpO1xuICAgICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LnNpZ25hYmxlUGF5bG9hZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSAzMi1ieXRlIGtlY2NhazI1NiBoYXNoIGZvciBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHggPSBnZXRUcmFuc2FjdGlvbigpO1xuICAgICAgICB0eC5zZXRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuVFhEQVRBKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5zaG91bGQuYmUuaW5zdGFuY2VvZihCdWZmZXIpO1xuICAgICAgICBwYXlsb2FkLmxlbmd0aC5zaG91bGQuZXF1YWwoMzIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flushERC7984.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/flushERC7984.ts"],"names":[],"mappings":"AAYA,OAAO,EAAsB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAgBtE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,kBAAkB,GAAG,IAAI,CAyT7G"}
|