@bitgo-beta/abstract-eth 1.2.3-alpha.507 → 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.
@@ -8,9 +8,13 @@ exports.buildDelegationCalldata = buildDelegationCalldata;
8
8
  exports.buildMulticallDelegationCalldata = buildMulticallDelegationCalldata;
9
9
  exports.wrapInCallFromParent = wrapInCallFromParent;
10
10
  exports.decodeTokenAddressesFromDelegationCalldata = decodeTokenAddressesFromDelegationCalldata;
11
+ exports.buildConfidentialTransferByHandleCalldata = buildConfidentialTransferByHandleCalldata;
12
+ exports.buildFlushERC7984ForwarderTokenCalldata = buildFlushERC7984ForwarderTokenCalldata;
13
+ exports.decodeFlushERC7984ForwarderTokenCalldata = decodeFlushERC7984ForwarderTokenCalldata;
11
14
  const ethereumjs_util_1 = require("ethereumjs-util");
12
15
  const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
13
16
  const ethers_1 = require("ethers");
17
+ const walletUtil_1 = require("./walletUtil");
14
18
  // ---------------------------------------------------------------------------
15
19
  // Constants
16
20
  // ---------------------------------------------------------------------------
@@ -156,4 +160,61 @@ function decodeTokenAddressesFromDelegationCalldata(calldata) {
156
160
  }
157
161
  return tokenAddresses;
158
162
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBcURBLDBEQVdDO0FBZUQsNEVBNkJDO0FBZ0JELG9EQVdDO0FBYUQsZ0dBeUNDO0FBN0xELHFEQUF5RDtBQUN6RCxvRUFBeUM7QUFDekMsbUNBQWdDO0FBRWhDLDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLDRCQUE0QjtBQUNmLFFBQUEsOEJBQThCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBQzNFLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELFFBQUEsaUJBQWlCLEdBQUcsQ0FBQyxTQUFTLENBQVUsQ0FBQztBQUV0RDs7O0dBR0c7QUFDVSxRQUFBLGlDQUFpQyxHQUFHLElBQUEsOEJBQVksRUFDM0Qsd0JBQVcsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxHQUFHLHNDQUE4QixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ3ZHLENBQUM7QUFFRjs7OztHQUlHO0FBQ1UsUUFBQSxvQkFBb0IsR0FBRyxJQUFBLDhCQUFZLEVBQzlDLHdCQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcseUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDMUUsQ0FBQztBQUVGOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsSUFBQSw4QkFBWSxFQUNoRCx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsMkJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDakYsQ0FBQztBQUVGLDhFQUE4RTtBQUM5RSxxQkFBcUI7QUFDckIsOEVBQThFO0FBRTlFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsZUFBdUIsRUFDdkIsb0JBQTRCLEVBQzVCLGVBQXVCO0lBRXZCLE1BQU0sTUFBTSxHQUFHLHdCQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUMsR0FBRyxzQ0FBOEIsQ0FBQyxDQUFDLENBQUM7SUFDdEcsTUFBTSxJQUFJLEdBQUcsd0JBQVcsQ0FBQyxTQUFTLENBQ2hDLENBQUMsR0FBRyxzQ0FBOEIsQ0FBQyxFQUNuQyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxlQUFlLENBQUMsQ0FDekQsQ0FBQztJQUNGLE9BQU8sSUFBQSw4QkFBWSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQzlDLGVBQXVCLEVBQ3ZCLHNCQUFnQyxFQUNoQyxlQUF1QjtJQUV2QixJQUFJLHNCQUFzQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxNQUFNLFVBQVUsR0FBYSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtRQUN2RSxNQUFNLFdBQVcsR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLEdBQUcsc0NBQThCLENBQUMsQ0FBQyxDQUFDO1FBQzNHLE1BQU0sU0FBUyxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUNyQyxDQUFDLEdBQUcsc0NBQThCLENBQUMsRUFDbkMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUNqRCxDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7SUFFSCxrQ0FBa0M7SUFDbEMsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSxtRUFBbUU7SUFDbkUsTUFBTSxXQUFXLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyx5QkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFDOUUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDM0IsSUFBSSxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcseUJBQWlCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNqRixLQUFLLENBQ04sQ0FBQztJQUNGLE9BQU8sSUFBQSw4QkFBWSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLGFBQXFCLEVBQUUsUUFBZ0I7SUFDMUUsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLDJCQUFtQixDQUFDLENBQUMsQ0FBQztJQUNoRixNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FDaEMsQ0FBQyxHQUFHLDJCQUFtQixDQUFDLEVBQ3hCO1FBQ0UsYUFBYTtRQUNiLENBQUMsRUFBRSx5QkFBeUI7UUFDNUIsSUFBQSwwQkFBUSxFQUFDLFFBQVEsQ0FBQyxFQUFFLDBCQUEwQjtLQUMvQyxDQUNGLENBQUM7SUFDRixPQUFPLElBQUEsOEJBQVksRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQiwwQ0FBMEMsQ0FBQyxRQUFnQjtJQUN6RSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRTdDLElBQUksWUFBb0IsQ0FBQztJQUV6QixJQUFJLFFBQVEsS0FBSyw4QkFBc0IsRUFBRSxDQUFDO1FBQ3hDLCtGQUErRjtRQUMvRixrR0FBa0c7UUFDbEcsc0VBQXNFO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLDJCQUFtQixDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRixZQUFZLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLDRCQUFvQixFQUFFLENBQUM7UUFDN0MsWUFBWSxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyw0QkFBb0IsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsdUZBQXVGO0lBQ3ZGLDRGQUE0RjtJQUM1RixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLFVBQVUsR0FBYyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekMsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO0lBQ3BDLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBbUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFDaEcsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksYUFBYSxLQUFLLHlDQUFpQyxFQUFFLENBQUM7WUFDeEQsU0FBUztRQUNYLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsc0NBQThCLENBQUMsRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLGNBQWMsQ0FBQyxJQUFJLENBQUUsWUFBWSxDQUFDLENBQUMsQ0FBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRIZXhQcmVmaXgsIHRvQnVmZmVyIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEFCSSBwYXJhbWV0ZXIgdHlwZSBhcnJheXNcbmV4cG9ydCBjb25zdCBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXMgPSBbJ2FkZHJlc3MnLCAnYWRkcmVzcycsICd1aW50NjQnXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBjYWxsRnJvbVBhcmVudFR5cGVzID0gWydhZGRyZXNzJywgJ3VpbnQyNTYnLCAnYnl0ZXMnXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBhY2xNdWx0aWNhbGxUeXBlcyA9IFsnYnl0ZXNbXSddIGFzIGNvbnN0O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBBQ0wuZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbihhZGRyZXNzLGFkZHJlc3MsdWludDY0KVxuICogPSBrZWNjYWsyNTYoJ2RlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCknKVswOjRdXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgQUNMLm11bHRpY2FsbChieXRlc1tdKVxuICogPSBrZWNjYWsyNTYoJ211bHRpY2FsbChieXRlc1tdKScpWzA6NF1cbiAqIEFDTCBpbmhlcml0cyBPcGVuWmVwcGVsaW4gTXVsdGljYWxsVXBncmFkZWFibGUg4oCUIHByZXNlcnZlcyBtc2cuc2VuZGVyIHZpYSBkZWxlZ2F0ZWNhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBhY2xNdWx0aWNhbGxNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ211bHRpY2FsbCcsIFsuLi5hY2xNdWx0aWNhbGxUeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQoYWRkcmVzcyx1aW50MjU2LGJ5dGVzKVxuICogPSBrZWNjYWsyNTYoJ2NhbGxGcm9tUGFyZW50KGFkZHJlc3MsdWludDI1NixieXRlcyknKVswOjRdXG4gKi9cbmV4cG9ydCBjb25zdCBjYWxsRnJvbVBhcmVudE1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY2FsbEZyb21QYXJlbnQnLCBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGluZyBmdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEVuY29kZXMgYSBzaW5nbGUgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBjYWxsLlxuICpcbiAqIEdyYW50cyBgZGVsZWdhdGVBZGRyZXNzYCB0aGUgcmlnaHQgdG8gZGVjcnlwdCBFUkMtNzk4NCB0b2tlbiBiYWxhbmNlcyBvblxuICogYmVoYWxmIG9mIHRoZSBjYWxsaW5nIGFkZHJlc3MgKG1zZy5zZW5kZXIpIGZvciB0aGUgc3BlY2lmaWVkIHRva2VuIGNvbnRyYWN0LlxuICpcbiAqIEBwYXJhbSBkZWxlZ2F0ZUFkZHJlc3MgICAgICAgQml0R28gZW50ZXJwcmlzZSB2aWV3aW5nIGtleSBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEBwYXJhbSBleHBpcnlUaW1lc3RhbXAgICAgICAgVW5peCBzZWNvbmRzOyByZWNvbW1lbmRlZDogTWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApICsgMzY1Kjg2NDAwXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKFxuICBkZWxlZ2F0ZUFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgZXhwaXJ5VGltZXN0YW1wOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdLFxuICAgIFtkZWxlZ2F0ZUFkZHJlc3MsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcnlUaW1lc3RhbXBdXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIE4gZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxscyBiYXRjaGVkIGluc2lkZSBBQ0wubXVsdGljYWxsKCkuXG4gKlxuICogUHJvZHVjZXMgYSBzaW5nbGUgVFggdGhhdCBncmFudHMgZGVsZWdhdGlvbiBmb3IgYWxsIHNwZWNpZmllZCB0b2tlbiBjb250cmFjdHMuXG4gKiBSZXF1aXJlcyB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLmxlbmd0aCA+PSAxLlxuICogTm90ZTogRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyIGFsd2F5cyB1c2VzIHRoaXMgZnVuY3Rpb24gKGV2ZW4gZm9yIGEgc2luZ2xlIHRva2VuKVxuICogdG8ga2VlcCB0aGUgdHJhbnNhY3Rpb24gc2hhcGUgY29uc2lzdGVudCByZWdhcmRsZXNzIG9mIHRva2VuIGNvdW50LlxuICpcbiAqIEBwYXJhbSBkZWxlZ2F0ZUFkZHJlc3MgICAgICAgICAgQml0R28gZW50ZXJwcmlzZSB2aWV3aW5nIGtleSBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3NlcyAgIEFycmF5IG9mIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3Nlc1xuICogQHBhcmFtIGV4cGlyeVRpbWVzdGFtcCAgICAgICAgICBVbml4IHNlY29uZHNcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEoXG4gIGRlbGVnYXRlQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzOiBzdHJpbmdbXSxcbiAgZXhwaXJ5VGltZXN0YW1wOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGlmICh0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGE6IHRva2VuQ29udHJhY3RBZGRyZXNzZXMgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIGVhY2ggaW5uZXIgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxsIGFzIHJhdyBieXRlc1xuICBjb25zdCBpbm5lckNhbGxzOiBCdWZmZXJbXSA9IHRva2VuQ29udHJhY3RBZGRyZXNzZXMubWFwKCh0b2tlbkFkZHJlc3MpID0+IHtcbiAgICBjb25zdCBpbm5lck1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uJywgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10pO1xuICAgIGNvbnN0IGlubmVyQXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICAgIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdLFxuICAgICAgW2RlbGVnYXRlQWRkcmVzcywgdG9rZW5BZGRyZXNzLCBleHBpcnlUaW1lc3RhbXBdXG4gICAgKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbaW5uZXJNZXRob2QsIGlubmVyQXJnc10pO1xuICB9KTtcblxuICAvLyBFbmNvZGUgb3V0ZXIgbXVsdGljYWxsKGJ5dGVzW10pXG4gIC8vIGV0aGVyZXVtanMtYWJpIHYwLjYueCBoYXMgYSBidWcgd2hlcmUgaXQgb21pdHMgdGhlIHBlci1lbGVtZW50IG9mZnNldCB0YWJsZVxuICAvLyBmb3IgYnl0ZXNbXSwgcHJvZHVjaW5nIG1hbGZvcm1lZCBjYWxsZGF0YSB0aGF0IG9uLWNoYWluIEFCSSBkZWNvZGVycyByZWplY3QuXG4gIC8vIFVzZSBldGhlcnMgQWJpQ29kZXIgd2hpY2ggY29ycmVjdGx5IGVtaXRzIHRoZSBoZWFkIG9mZnNldCB3b3Jkcy5cbiAgY29uc3Qgb3V0ZXJNZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnbXVsdGljYWxsJywgWy4uLmFjbE11bHRpY2FsbFR5cGVzXSk7XG4gIGNvbnN0IG91dGVyQXJncyA9IEJ1ZmZlci5mcm9tKFxuICAgIG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKS5lbmNvZGUoWy4uLmFjbE11bHRpY2FsbFR5cGVzXSwgW2lubmVyQ2FsbHNdKS5zbGljZSgyKSxcbiAgICAnaGV4J1xuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW291dGVyTWV0aG9kLCBvdXRlckFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIFdyYXBzIGNhbGxkYXRhIGluIGEgRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQodGFyZ2V0LCAwLCBkYXRhKSBjYWxsLlxuICpcbiAqIFVzZWQgd2hlbiBhIGZvcndhcmRlciBjb250cmFjdCBtdXN0IGJlIG1zZy5zZW5kZXIgZm9yIGFuIGV4dGVybmFsIGNvbnRyYWN0XG4gKiBjYWxsIOKAlCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgZm9yd2FyZGVyIGl0c2VsZiBuZWVkcyB0byBjYWxsXG4gKiBBQ0wuZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbigpIHNvIHRoYXQgaXRzIG93biBiYWxhbmNlIGNhbiBiZSBkZWNyeXB0ZWQuXG4gKlxuICogT25seSB0aGUgcGFyZW50QWRkcmVzcyAocm9vdCB3YWxsZXQpIGlzIGFsbG93ZWQgdG8gY2FsbCBjYWxsRnJvbVBhcmVudFxuICogKGVuZm9yY2VkIGJ5IHRoZSBmb3J3YXJkZXIncyBvbmx5UGFyZW50IG1vZGlmaWVyKS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0QWRkcmVzcyAgQWRkcmVzcyBvZiB0aGUgY29udHJhY3QgdGhlIGZvcndhcmRlciB3aWxsIGNhbGwgKGUuZy4gQUNMKVxuICogQHBhcmFtIGNhbGxkYXRhICAgICAgIEFCSS1lbmNvZGVkIGlubmVyIGNhbGxkYXRhIChlLmcuIGZyb20gYnVpbGREZWxlZ2F0aW9uQ2FsbGRhdGEpXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsRnJvbVBhcmVudCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbkNhbGxGcm9tUGFyZW50KHRhcmdldEFkZHJlc3M6IHN0cmluZywgY2FsbGRhdGE6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdjYWxsRnJvbVBhcmVudCcsIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdLFxuICAgIFtcbiAgICAgIHRhcmdldEFkZHJlc3MsXG4gICAgICAwLCAvLyB2YWx1ZTogbm8gRVRIIHRyYW5zZmVyXG4gICAgICB0b0J1ZmZlcihjYWxsZGF0YSksIC8vIGlubmVyIGNhbGxkYXRhIGFzIGJ5dGVzXG4gICAgXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXMgZnJvbSBkZWxlZ2F0aW9uIGNhbGxkYXRhLlxuICpcbiAqIEhhbmRsZXMgdHdvIHNoYXBlcyBvZiBjYWxsZGF0YTpcbiAqICAgLSBEaXJlY3QgQUNMLm11bHRpY2FsbChieXRlc1tdKSAocm9vdCB3YWxsZXQgcGF0aClcbiAqICAgLSBGb3J3YXJkZXJWNC5jYWxsRnJvbVBhcmVudChhZGRyZXNzLCB1aW50MjU2LCBieXRlcykgd3JhcHBpbmcgYSBtdWx0aWNhbGwgKGZvcndhcmRlciBwYXRoKVxuICpcbiAqIEBwYXJhbSBjYWxsZGF0YSAgQUJJLWVuY29kZWQgZGVsZWdhdGlvbiBjYWxsZGF0YSAoMHgtcHJlZml4ZWQgb3IgcmF3IGhleClcbiAqIEByZXR1cm5zIEFycmF5IG9mIHRva2VuIGNvbnRyYWN0IGFkZHJlc3NlcyAobG93ZXJjYXNlKSBmb3VuZCBpbiB0aGUgZGVsZWdhdGlvbiBjYWxsc1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBjYWxsZGF0YSBkb2VzIG5vdCBzdGFydCB3aXRoIGEgcmVjb2duaXNlZCBtZXRob2Qgc2VsZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YShjYWxsZGF0YTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkYXRhID0gY2FsbGRhdGEuc3RhcnRzV2l0aCgnMHgnKSA/IGNhbGxkYXRhIDogJzB4JyArIGNhbGxkYXRhO1xuICBjb25zdCBtZXRob2RJZCA9IGRhdGEuc2xpY2UoMCwgMTApO1xuICBjb25zdCBhYmlDb2RlciA9IG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKTtcblxuICBsZXQgbXVsdGljYWxsSGV4OiBzdHJpbmc7XG5cbiAgaWYgKG1ldGhvZElkID09PSBjYWxsRnJvbVBhcmVudE1ldGhvZElkKSB7XG4gICAgLy8gRGVjb2RlIGNhbGxGcm9tUGFyZW50KGFkZHJlc3MsIHVpbnQyNTYsIGJ5dGVzKSDigJQgaW5uZXIgYnl0ZXMgaXMgdGhlIGZ1bGwgbXVsdGljYWxsIGNhbGxkYXRhLlxuICAgIC8vIGV0aGVycyB2NSByZXR1cm5zIGBieXRlc2AgYXMgYSBoZXggc3RyaW5nOyB1c2UgaGV4bGlmeSB0byBub3JtYWxpc2UgdG8gYSAweC1wcmVmaXhlZCBoZXggc3RyaW5nXG4gICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBydW50aW1lIHJldHVybnMgYSBzdHJpbmcgb3IgYSBVaW50OEFycmF5LlxuICAgIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdLCAnMHgnICsgZGF0YS5zbGljZSgxMCkpO1xuICAgIG11bHRpY2FsbEhleCA9IGV0aGVycy51dGlscy5oZXhsaWZ5KGRlY29kZWRbMl0pO1xuICB9IGVsc2UgaWYgKG1ldGhvZElkID09PSBhY2xNdWx0aWNhbGxNZXRob2RJZCkge1xuICAgIG11bHRpY2FsbEhleCA9IGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBkZWxlZ2F0aW9uIGNhbGxkYXRhJyk7XG4gIH1cblxuICBpZiAobXVsdGljYWxsSGV4LnNsaWNlKDAsIDEwKSAhPT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIGRlbGVnYXRpb24gY2FsbGRhdGEnKTtcbiAgfVxuXG4gIC8vIERlY29kZSBtdWx0aWNhbGwoYnl0ZXNbXSkg4oCUIGVhY2ggZWxlbWVudCBpcyBhbiBpbm5lciBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uIGNhbGwuXG4gIC8vIGV0aGVycyB2NSByZXR1cm5zIGJ5dGVzW10gZWxlbWVudHMgYXMgaGV4IHN0cmluZ3M7IHVzZSBoZXhsaWZ5IHRvIG5vcm1hbGlzZSBlYWNoIGVsZW1lbnQuXG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWydieXRlc1tdJ10sICcweCcgKyBtdWx0aWNhbGxIZXguc2xpY2UoMTApKTtcbiAgY29uc3QgaW5uZXJDYWxsczogdW5rbm93bltdID0gZGVjb2RlZFswXTtcblxuICBjb25zdCB0b2tlbkFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBpbm5lckNhbGwgb2YgaW5uZXJDYWxscykge1xuICAgIGNvbnN0IGlubmVySGV4ID0gZXRoZXJzLnV0aWxzLmhleGxpZnkoaW5uZXJDYWxsIGFzIGV0aGVycy51dGlscy5CeXRlc0xpa2UpLnNsaWNlKDIpOyAvLyBzdHJpcCAweFxuICAgIGNvbnN0IGlubmVyTWV0aG9kSWQgPSAnMHgnICsgaW5uZXJIZXguc2xpY2UoMCwgOCk7XG4gICAgaWYgKGlubmVyTWV0aG9kSWQgIT09IGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25NZXRob2RJZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIERlY29kZSBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MgZGVsZWdhdGUsIGFkZHJlc3MgdG9rZW5BZGRyZXNzLCB1aW50NjQgZXhwaXJ5KVxuICAgIGNvbnN0IGlubmVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSwgJzB4JyArIGlubmVySGV4LnNsaWNlKDgpKTtcbiAgICB0b2tlbkFkZHJlc3Nlcy5wdXNoKChpbm5lckRlY29kZWRbMV0gYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbkFkZHJlc3Nlcztcbn1cbiJdfQ==
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==
@@ -0,0 +1,3 @@
1
+ import { TransactionBuilder } from '../../../src';
2
+ export declare function runFlushERC7984Tests(coinName: string, getBuilder: (coin: string) => TransactionBuilder): void;
3
+ //# sourceMappingURL=flushERC7984.d.ts.map
@@ -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"}
@@ -0,0 +1,292 @@
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.runFlushERC7984Tests = runFlushERC7984Tests;
7
+ /**
8
+ * TransactionBuilder tests for FlushERC7984ForwarderToken transaction type.
9
+ *
10
+ * Verifies:
11
+ * - Building a FlushERC7984ForwarderToken tx from scratch (legacy and EIP-1559 fees)
12
+ * - Signing and serialization round-trip for both signed and unsigned transactions
13
+ * - classifyTransaction correctly identifies the type
14
+ * - Error cases for missing fields
15
+ * - contractAddress !== forwarderAddress guard
16
+ */
17
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
18
+ const should_1 = __importDefault(require("should"));
19
+ const src_1 = require("../../../src");
20
+ const zamaUtils_1 = require("../../../src/lib/zamaUtils");
21
+ const utils_1 = require("../../../src/lib/utils");
22
+ const FORWARDER_ADDRESS = '0xDeADbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF';
23
+ const TOKEN_CONTRACT_ADDRESS = '0x94167129172A35ab093B44b8b96213DDbc3cD387';
24
+ const PARENT_ADDRESS = '0x1111111111111111111111111111111111111111';
25
+ const ENCRYPTED_HANDLE = '0x' + 'ab'.repeat(32); // 32-byte mock handle
26
+ const OTHER_ADDRESS = '0x2222222222222222222222222222222222222222';
27
+ // Deterministic test-only private key — never used on mainnet
28
+ const TEST_PRV_KEY = 'FAC4D04AA0025ECF200D74BC9B5E4616E4B8338B69B61362AAAD49F76E68EF28';
29
+ function runFlushERC7984Tests(coinName, getBuilder) {
30
+ describe(`${coinName} transaction builder — FlushERC7984ForwarderToken`, () => {
31
+ let txBuilder;
32
+ beforeEach(() => {
33
+ txBuilder = getBuilder(coinName);
34
+ txBuilder.fee({ fee: '1000000000', gasLimit: '200000' });
35
+ txBuilder.counter(1);
36
+ });
37
+ // -------------------------------------------------------------------------
38
+ // classifyTransaction — verify selector → type mapping
39
+ // -------------------------------------------------------------------------
40
+ describe('classifyTransaction', () => {
41
+ it('should classify callFromParent+confidentialTransfer as FlushERC7984ForwarderToken', () => {
42
+ const calldata = (0, zamaUtils_1.buildFlushERC7984ForwarderTokenCalldata)(TOKEN_CONTRACT_ADDRESS, PARENT_ADDRESS, ENCRYPTED_HANDLE);
43
+ const result = (0, utils_1.classifyTransaction)(calldata);
44
+ should_1.default.equal(result, sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
45
+ });
46
+ it('should NOT classify plain callFromParent (delegation) as FlushERC7984ForwarderToken', () => {
47
+ // A callFromParent wrapping a multicall delegation starts with 0xac9650d8 inside, not 0x5bebed7e
48
+ // Use callFromParent prefix + arbitrary non-confidentialTransfer inner data
49
+ const fakeInner = '0xac9650d8' + '00'.repeat(64); // multicall selector
50
+ const { wrapInCallFromParent } = require('../../../src/lib/zamaUtils');
51
+ const calldata = wrapInCallFromParent(TOKEN_CONTRACT_ADDRESS, fakeInner);
52
+ const result = (0, utils_1.classifyTransaction)(calldata);
53
+ // Should fall through to ContractCall, not FlushERC7984ForwarderToken
54
+ should_1.default.equal(result, sdk_core_1.TransactionType.ContractCall);
55
+ });
56
+ it('should NOT classify confidentialTransferWithProof inside sendMultiSig as FlushERC7984ForwarderToken', () => {
57
+ // SendERC7984 uses sendMultiSig wrapping confidentialTransferWithProof
58
+ // Should remain SendERC7984, not FlushERC7984ForwarderToken
59
+ const result = (0, utils_1.classifyTransaction)('0x39125215' + '00'.repeat(28));
60
+ should_1.default.equal(result, sdk_core_1.TransactionType.Send);
61
+ });
62
+ });
63
+ // -------------------------------------------------------------------------
64
+ // Build from scratch
65
+ // -------------------------------------------------------------------------
66
+ describe('build from scratch', () => {
67
+ it('should build a FlushERC7984ForwarderToken transaction', async () => {
68
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
69
+ txBuilder.contract(FORWARDER_ADDRESS);
70
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
71
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
72
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
73
+ txBuilder.parentAddress(PARENT_ADDRESS);
74
+ const tx = await txBuilder.build();
75
+ const json = tx.toJson();
76
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
77
+ json.to.toLowerCase().should.equal(FORWARDER_ADDRESS.toLowerCase());
78
+ json.data.should.startWith(zamaUtils_1.callFromParentMethodId);
79
+ json.value.should.equal('0');
80
+ });
81
+ it('tx.data should contain the inner confidentialTransfer selector', async () => {
82
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
83
+ txBuilder.contract(FORWARDER_ADDRESS);
84
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
85
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
86
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
87
+ txBuilder.parentAddress(PARENT_ADDRESS);
88
+ const tx = await txBuilder.build();
89
+ const json = tx.toJson();
90
+ const { tokenContractAddress, parentAddress, encryptedHandle } = (0, zamaUtils_1.decodeFlushERC7984ForwarderTokenCalldata)(json.data);
91
+ tokenContractAddress.toLowerCase().should.equal(TOKEN_CONTRACT_ADDRESS.toLowerCase());
92
+ parentAddress.toLowerCase().should.equal(PARENT_ADDRESS.toLowerCase());
93
+ encryptedHandle.should.equal(ENCRYPTED_HANDLE);
94
+ });
95
+ it('tx.to should equal the forwarder address', async () => {
96
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
97
+ txBuilder.contract(FORWARDER_ADDRESS);
98
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
99
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
100
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
101
+ txBuilder.parentAddress(PARENT_ADDRESS);
102
+ const tx = await txBuilder.build();
103
+ tx.toJson().to.toLowerCase().should.equal(FORWARDER_ADDRESS.toLowerCase());
104
+ });
105
+ it('should build with EIP-1559 fee model', async () => {
106
+ const builder = getBuilder(coinName);
107
+ builder.fee({
108
+ fee: '30000000000',
109
+ eip1559: {
110
+ maxFeePerGas: '30000000000',
111
+ maxPriorityFeePerGas: '1000000000',
112
+ },
113
+ gasLimit: '200000',
114
+ });
115
+ builder.counter(1);
116
+ builder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
117
+ builder.contract(FORWARDER_ADDRESS);
118
+ builder.forwarderAddress(FORWARDER_ADDRESS);
119
+ builder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
120
+ builder.encryptedHandle(ENCRYPTED_HANDLE);
121
+ builder.parentAddress(PARENT_ADDRESS);
122
+ const tx = await builder.build();
123
+ const json = tx.toJson();
124
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
125
+ json._type.should.equal(src_1.ETHTransactionType.EIP1559);
126
+ json.maxFeePerGas.should.equal('30000000000');
127
+ json.maxPriorityFeePerGas.should.equal('1000000000');
128
+ should_1.default.not.exist(json.gasPrice);
129
+ json.data.should.startWith(zamaUtils_1.callFromParentMethodId);
130
+ });
131
+ });
132
+ // -------------------------------------------------------------------------
133
+ // Signing
134
+ // -------------------------------------------------------------------------
135
+ describe('signing', () => {
136
+ it('should produce a signed transaction with v, r, s and from fields', async () => {
137
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
138
+ txBuilder.contract(FORWARDER_ADDRESS);
139
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
140
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
141
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
142
+ txBuilder.parentAddress(PARENT_ADDRESS);
143
+ txBuilder.sign({ key: TEST_PRV_KEY });
144
+ const tx = await txBuilder.build();
145
+ const json = tx.toJson();
146
+ should_1.default.exist(json.v);
147
+ should_1.default.exist(json.r);
148
+ should_1.default.exist(json.s);
149
+ should_1.default.exist(json.from);
150
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
151
+ });
152
+ it('should round-trip a signed transaction from serialized hex', async () => {
153
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
154
+ txBuilder.contract(FORWARDER_ADDRESS);
155
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
156
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
157
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
158
+ txBuilder.parentAddress(PARENT_ADDRESS);
159
+ txBuilder.sign({ key: TEST_PRV_KEY });
160
+ const originalTx = await txBuilder.build();
161
+ const rawHex = originalTx.toBroadcastFormat();
162
+ const rebuiltBuilder = getBuilder(coinName);
163
+ rebuiltBuilder.from(rawHex);
164
+ const rebuiltTx = await rebuiltBuilder.build();
165
+ rebuiltTx.toBroadcastFormat().should.equal(rawHex);
166
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
167
+ should_1.default.exist(rebuiltTx.toJson().v);
168
+ });
169
+ it('should produce a signed EIP-1559 transaction with v, r, s fields', async () => {
170
+ const builder = getBuilder(coinName);
171
+ builder.fee({
172
+ fee: '30000000000',
173
+ eip1559: {
174
+ maxFeePerGas: '30000000000',
175
+ maxPriorityFeePerGas: '1000000000',
176
+ },
177
+ gasLimit: '200000',
178
+ });
179
+ builder.counter(1);
180
+ builder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
181
+ builder.contract(FORWARDER_ADDRESS);
182
+ builder.forwarderAddress(FORWARDER_ADDRESS);
183
+ builder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
184
+ builder.encryptedHandle(ENCRYPTED_HANDLE);
185
+ builder.parentAddress(PARENT_ADDRESS);
186
+ builder.sign({ key: TEST_PRV_KEY });
187
+ const tx = await builder.build();
188
+ const json = tx.toJson();
189
+ json._type.should.equal(src_1.ETHTransactionType.EIP1559);
190
+ should_1.default.exist(json.v);
191
+ should_1.default.exist(json.r);
192
+ should_1.default.exist(json.s);
193
+ should_1.default.exist(json.from);
194
+ });
195
+ });
196
+ // -------------------------------------------------------------------------
197
+ // Serialization round-trip
198
+ // -------------------------------------------------------------------------
199
+ describe('serialization round-trip', () => {
200
+ it('should serialize and deserialize to the same transaction', async () => {
201
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
202
+ txBuilder.contract(FORWARDER_ADDRESS);
203
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
204
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
205
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
206
+ txBuilder.parentAddress(PARENT_ADDRESS);
207
+ const originalTx = await txBuilder.build();
208
+ const rawHex = originalTx.toBroadcastFormat();
209
+ const rebuiltBuilder = getBuilder(coinName);
210
+ rebuiltBuilder.from(rawHex);
211
+ const rebuiltTx = await rebuiltBuilder.build();
212
+ rebuiltTx.toBroadcastFormat().should.equal(rawHex);
213
+ });
214
+ it('deserialized tx should classify as FlushERC7984ForwarderToken', async () => {
215
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
216
+ txBuilder.contract(FORWARDER_ADDRESS);
217
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
218
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
219
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
220
+ txBuilder.parentAddress(PARENT_ADDRESS);
221
+ const originalTx = await txBuilder.build();
222
+ const rawHex = originalTx.toBroadcastFormat();
223
+ const rebuiltBuilder = getBuilder(coinName);
224
+ rebuiltBuilder.from(rawHex);
225
+ const rebuiltTx = await rebuiltBuilder.build();
226
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
227
+ });
228
+ });
229
+ // -------------------------------------------------------------------------
230
+ // Error cases — missing required fields
231
+ // -------------------------------------------------------------------------
232
+ describe('missing field errors', () => {
233
+ it('should throw when forwarderAddress is not set', async () => {
234
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
235
+ txBuilder.contract(FORWARDER_ADDRESS);
236
+ // no forwarderAddress
237
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
238
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
239
+ txBuilder.parentAddress(PARENT_ADDRESS);
240
+ await txBuilder.build().should.be.rejectedWith(/missing forwarder address/i);
241
+ });
242
+ it('should throw when tokenContractAddress is not set', async () => {
243
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
244
+ txBuilder.contract(FORWARDER_ADDRESS);
245
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
246
+ // no tokenContractAddress
247
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
248
+ txBuilder.parentAddress(PARENT_ADDRESS);
249
+ await txBuilder.build().should.be.rejectedWith(/missing tokenContractAddress/i);
250
+ });
251
+ it('should throw when encryptedHandle is not set', async () => {
252
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
253
+ txBuilder.contract(FORWARDER_ADDRESS);
254
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
255
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
256
+ // no encryptedHandle
257
+ txBuilder.parentAddress(PARENT_ADDRESS);
258
+ await txBuilder.build().should.be.rejectedWith(/missing encryptedHandle/i);
259
+ });
260
+ it('should throw when parentAddress is not set', async () => {
261
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
262
+ txBuilder.contract(FORWARDER_ADDRESS);
263
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
264
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
265
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
266
+ // no parentAddress
267
+ await txBuilder.build().should.be.rejectedWith(/missing parentAddress/i);
268
+ });
269
+ it('should throw when contractAddress !== forwarderAddress', async () => {
270
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
271
+ txBuilder.contract(OTHER_ADDRESS); // different from forwarder
272
+ txBuilder.forwarderAddress(FORWARDER_ADDRESS);
273
+ txBuilder.tokenContractAddress(TOKEN_CONTRACT_ADDRESS);
274
+ txBuilder.encryptedHandle(ENCRYPTED_HANDLE);
275
+ txBuilder.parentAddress(PARENT_ADDRESS);
276
+ await txBuilder.build().should.be.rejectedWith(/contractAddress must equal forwarderAddress/);
277
+ });
278
+ });
279
+ // -------------------------------------------------------------------------
280
+ // Setter validation
281
+ // -------------------------------------------------------------------------
282
+ describe('setter validation', () => {
283
+ it('tokenContractAddress should reject invalid address', () => {
284
+ should_1.default.throws(() => txBuilder.tokenContractAddress('not-an-address'), /Invalid address/);
285
+ });
286
+ it('parentAddress should reject invalid address', () => {
287
+ should_1.default.throws(() => txBuilder.parentAddress('not-an-address'), /Invalid address/);
288
+ });
289
+ });
290
+ });
291
+ }
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hFUkM3OTg0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9mbHVzaEVSQzc5ODQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE0QkEsb0RBeVRDO0FBclZEOzs7Ozs7Ozs7R0FTRztBQUNILG1EQUF1RDtBQUN2RCxvREFBNEI7QUFDNUIsc0NBQXNFO0FBQ3RFLDBEQUlvQztBQUNwQyxrREFBNkQ7QUFFN0QsTUFBTSxpQkFBaUIsR0FBRyw0Q0FBNEMsQ0FBQztBQUN2RSxNQUFNLHNCQUFzQixHQUFHLDRDQUE0QyxDQUFDO0FBQzVFLE1BQU0sY0FBYyxHQUFHLDRDQUE0QyxDQUFDO0FBQ3BFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7QUFDdkUsTUFBTSxhQUFhLEdBQUcsNENBQTRDLENBQUM7QUFDbkUsOERBQThEO0FBQzlELE1BQU0sWUFBWSxHQUFHLGtFQUFrRSxDQUFDO0FBRXhGLFNBQWdCLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsVUFBZ0Q7SUFDckcsUUFBUSxDQUFDLEdBQUcsUUFBUSxtREFBbUQsRUFBRSxHQUFHLEVBQUU7UUFDNUUsSUFBSSxTQUE2QixDQUFDO1FBRWxDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFFSCw0RUFBNEU7UUFDNUUsdURBQXVEO1FBQ3ZELDRFQUE0RTtRQUM1RSxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FB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QyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1aWxkZXIgdGVzdHMgZm9yIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIHRyYW5zYWN0aW9uIHR5cGUuXG4gKlxuICogVmVyaWZpZXM6XG4gKiAgIC0gQnVpbGRpbmcgYSBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbiB0eCBmcm9tIHNjcmF0Y2ggKGxlZ2FjeSBhbmQgRUlQLTE1NTkgZmVlcylcbiAqICAgLSBTaWduaW5nIGFuZCBzZXJpYWxpemF0aW9uIHJvdW5kLXRyaXAgZm9yIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCB0cmFuc2FjdGlvbnNcbiAqICAgLSBjbGFzc2lmeVRyYW5zYWN0aW9uIGNvcnJlY3RseSBpZGVudGlmaWVzIHRoZSB0eXBlXG4gKiAgIC0gRXJyb3IgY2FzZXMgZm9yIG1pc3NpbmcgZmllbGRzXG4gKiAgIC0gY29udHJhY3RBZGRyZXNzICE9PSBmb3J3YXJkZXJBZGRyZXNzIGd1YXJkXG4gKi9cbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEVUSFRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7XG4gIGJ1aWxkRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YSxcbiAgY2FsbEZyb21QYXJlbnRNZXRob2RJZCxcbiAgZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YSxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMnO1xuaW1wb3J0IHsgY2xhc3NpZnlUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5jb25zdCBGT1JXQVJERVJfQUREUkVTUyA9ICcweERlQURiZWVmZEVBZGJlZWZkRWFkYkVFRmRlYWRiZUVGZEVhRGJlZUYnO1xuY29uc3QgVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyA9ICcweDk0MTY3MTI5MTcyQTM1YWIwOTNCNDRiOGI5NjIxM0REYmMzY0QzODcnO1xuY29uc3QgUEFSRU5UX0FERFJFU1MgPSAnMHgxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJztcbmNvbnN0IEVOQ1JZUFRFRF9IQU5ETEUgPSAnMHgnICsgJ2FiJy5yZXBlYXQoMzIpOyAvLyAzMi1ieXRlIG1vY2sgaGFuZGxlXG5jb25zdCBPVEhFUl9BRERSRVNTID0gJzB4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMic7XG4vLyBEZXRlcm1pbmlzdGljIHRlc3Qtb25seSBwcml2YXRlIGtleSDigJQgbmV2ZXIgdXNlZCBvbiBtYWlubmV0XG5jb25zdCBURVNUX1BSVl9LRVkgPSAnRkFDNEQwNEFBMDAyNUVDRjIwMEQ3NEJDOUI1RTQ2MTZFNEI4MzM4QjY5QjYxMzYyQUFBRDQ5Rjc2RTY4RUYyOCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5GbHVzaEVSQzc5ODRUZXN0cyhjb2luTmFtZTogc3RyaW5nLCBnZXRCdWlsZGVyOiAoY29pbjogc3RyaW5nKSA9PiBUcmFuc2FjdGlvbkJ1aWxkZXIpOiB2b2lkIHtcbiAgZGVzY3JpYmUoYCR7Y29pbk5hbWV9IHRyYW5zYWN0aW9uIGJ1aWxkZXIg4oCUIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuYCwgKCkgPT4ge1xuICAgIGxldCB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcjtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAwMDAwMDAwMCcsIGdhc0xpbWl0OiAnMjAwMDAwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgIH0pO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGNsYXNzaWZ5VHJhbnNhY3Rpb24g4oCUIHZlcmlmeSBzZWxlY3RvciDihpIgdHlwZSBtYXBwaW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGRlc2NyaWJlKCdjbGFzc2lmeVRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBjbGFzc2lmeSBjYWxsRnJvbVBhcmVudCtjb25maWRlbnRpYWxUcmFuc2ZlciBhcyBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuQ2FsbGRhdGEoXG4gICAgICAgICAgVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyxcbiAgICAgICAgICBQQVJFTlRfQUREUkVTUyxcbiAgICAgICAgICBFTkNSWVBURURfSEFORExFXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNsYXNzaWZ5VHJhbnNhY3Rpb24oY2FsbGRhdGEpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmVzdWx0LCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgTk9UIGNsYXNzaWZ5IHBsYWluIGNhbGxGcm9tUGFyZW50IChkZWxlZ2F0aW9uKSBhcyBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbicsICgpID0+IHtcbiAgICAgICAgLy8gQSBjYWxsRnJvbVBhcmVudCB3cmFwcGluZyBhIG11bHRpY2FsbCBkZWxlZ2F0aW9uIHN0YXJ0cyB3aXRoIDB4YWM5NjUwZDggaW5zaWRlLCBub3QgMHg1YmViZWQ3ZVxuICAgICAgICAvLyBVc2UgY2FsbEZyb21QYXJlbnQgcHJlZml4ICsgYXJiaXRyYXJ5IG5vbi1jb25maWRlbnRpYWxUcmFuc2ZlciBpbm5lciBkYXRhXG4gICAgICAgIGNvbnN0IGZha2VJbm5lciA9ICcweGFjOTY1MGQ4JyArICcwMCcucmVwZWF0KDY0KTsgLy8gbXVsdGljYWxsIHNlbGVjdG9yXG4gICAgICAgIGNvbnN0IHsgd3JhcEluQ2FsbEZyb21QYXJlbnQgfSA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9saWIvemFtYVV0aWxzJyk7XG4gICAgICAgIGNvbnN0IGNhbGxkYXRhID0gd3JhcEluQ2FsbEZyb21QYXJlbnQoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUywgZmFrZUlubmVyKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2xhc3NpZnlUcmFuc2FjdGlvbihjYWxsZGF0YSk7XG4gICAgICAgIC8vIFNob3VsZCBmYWxsIHRocm91Z2ggdG8gQ29udHJhY3RDYWxsLCBub3QgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlc3VsdCwgVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBOT1QgY2xhc3NpZnkgY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2YgaW5zaWRlIHNlbmRNdWx0aVNpZyBhcyBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbicsICgpID0+IHtcbiAgICAgICAgLy8gU2VuZEVSQzc5ODQgdXNlcyBzZW5kTXVsdGlTaWcgd3JhcHBpbmcgY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2ZcbiAgICAgICAgLy8gU2hvdWxkIHJlbWFpbiBTZW5kRVJDNzk4NCwgbm90IEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNsYXNzaWZ5VHJhbnNhY3Rpb24oJzB4MzkxMjUyMTUnICsgJzAwJy5yZXBlYXQoMjgpKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlc3VsdCwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQnVpbGQgZnJvbSBzY3JhdGNoXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGRlc2NyaWJlKCdidWlsZCBmcm9tIHNjcmF0Y2gnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbik7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChGT1JXQVJERVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKFRPS0VOX0NPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIuZW5jcnlwdGVkSGFuZGxlKEVOQ1JZUFRFRF9IQU5ETEUpO1xuICAgICAgICB0eEJ1aWxkZXIucGFyZW50QWRkcmVzcyhQQVJFTlRfQUREUkVTUyk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgICBqc29uLnRvLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKEZPUldBUkRFUl9BRERSRVNTLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBqc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aChjYWxsRnJvbVBhcmVudE1ldGhvZElkKTtcbiAgICAgICAganNvbi52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgndHguZGF0YSBzaG91bGQgY29udGFpbiB0aGUgaW5uZXIgY29uZmlkZW50aWFsVHJhbnNmZXIgc2VsZWN0b3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbik7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChGT1JXQVJERVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKFRPS0VOX0NPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIuZW5jcnlwdGVkSGFuZGxlKEVOQ1JZUFRFRF9IQU5ETEUpO1xuICAgICAgICB0eEJ1aWxkZXIucGFyZW50QWRkcmVzcyhQQVJFTlRfQUREUkVTUyk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSB9ID0gZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShcbiAgICAgICAgICBqc29uLmRhdGFcbiAgICAgICAgKTtcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcGFyZW50QWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChQQVJFTlRfQUREUkVTUy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgZW5jcnlwdGVkSGFuZGxlLnNob3VsZC5lcXVhbChFTkNSWVBURURfSEFORExFKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgndHgudG8gc2hvdWxkIGVxdWFsIHRoZSBmb3J3YXJkZXIgYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5lbmNyeXB0ZWRIYW5kbGUoRU5DUllQVEVEX0hBTkRMRSk7XG4gICAgICAgIHR4QnVpbGRlci5wYXJlbnRBZGRyZXNzKFBBUkVOVF9BRERSRVNTKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICB0eC50b0pzb24oKS50by50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChGT1JXQVJERVJfQUREUkVTUy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggRUlQLTE1NTkgZmVlIG1vZGVsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICAgIGJ1aWxkZXIuZmVlKHtcbiAgICAgICAgICBmZWU6ICczMDAwMDAwMDAwMCcsXG4gICAgICAgICAgZWlwMTU1OToge1xuICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiAnMzAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6ICcxMDAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdhc0xpbWl0OiAnMjAwMDAwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgICAgYnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbik7XG4gICAgICAgIGJ1aWxkZXIuY29udHJhY3QoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLmZvcndhcmRlckFkZHJlc3MoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKFRPS0VOX0NPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLmVuY3J5cHRlZEhhbmRsZShFTkNSWVBURURfSEFORExFKTtcbiAgICAgICAgYnVpbGRlci5wYXJlbnRBZGRyZXNzKFBBUkVOVF9BRERSRVNTKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgICBqc29uLl90eXBlLnNob3VsZC5lcXVhbChFVEhUcmFuc2FjdGlvblR5cGUuRUlQMTU1OSk7XG4gICAgICAgIGpzb24ubWF4RmVlUGVyR2FzIS5zaG91bGQuZXF1YWwoJzMwMDAwMDAwMDAwJyk7XG4gICAgICAgIGpzb24ubWF4UHJpb3JpdHlGZWVQZXJHYXMhLnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMCcpO1xuICAgICAgICBzaG91bGQubm90LmV4aXN0KChqc29uIGFzIGFueSkuZ2FzUHJpY2UpO1xuICAgICAgICBqc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aChjYWxsRnJvbVBhcmVudE1ldGhvZElkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFNpZ25pbmdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZGVzY3JpYmUoJ3NpZ25pbmcnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHByb2R1Y2UgYSBzaWduZWQgdHJhbnNhY3Rpb24gd2l0aCB2LCByLCBzIGFuZCBmcm9tIGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5lbmNyeXB0ZWRIYW5kbGUoRU5DUllQVEVEX0hBTkRMRSk7XG4gICAgICAgIHR4QnVpbGRlci5wYXJlbnRBZGRyZXNzKFBBUkVOVF9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IFRFU1RfUFJWX0tFWSB9KTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KGpzb24udik7XG4gICAgICAgIHNob3VsZC5leGlzdChqc29uLnIpO1xuICAgICAgICBzaG91bGQuZXhpc3QoanNvbi5zKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGpzb24uZnJvbSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcm91bmQtdHJpcCBhIHNpZ25lZCB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQgaGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhGT1JXQVJERVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkNvbnRyYWN0QWRkcmVzcyhUT0tFTl9DT05UUkFDVF9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLmVuY3J5cHRlZEhhbmRsZShFTkNSWVBURURfSEFORExFKTtcbiAgICAgICAgdHhCdWlsZGVyLnBhcmVudEFkZHJlc3MoUEFSRU5UX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogVEVTVF9QUlZfS0VZIH0pO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3SGV4ID0gb3JpZ2luYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICAgIHJlYnVpbHRCdWlsZGVyLmZyb20ocmF3SGV4KTtcbiAgICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3SGV4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVidWlsdFR4LnRvSnNvbigpLnYpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIHNpZ25lZCBFSVAtMTU1OSB0cmFuc2FjdGlvbiB3aXRoIHYsIHIsIHMgZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICAgIGJ1aWxkZXIuZmVlKHtcbiAgICAgICAgICBmZWU6ICczMDAwMDAwMDAwMCcsXG4gICAgICAgICAgZWlwMTU1OToge1xuICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiAnMzAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6ICcxMDAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdhc0xpbWl0OiAnMjAwMDAwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgICAgYnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbik7XG4gICAgICAgIGJ1aWxkZXIuY29udHJhY3QoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLmZvcndhcmRlckFkZHJlc3MoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKFRPS0VOX0NPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLmVuY3J5cHRlZEhhbmRsZShFTkNSWVBURURfSEFORExFKTtcbiAgICAgICAgYnVpbGRlci5wYXJlbnRBZGRyZXNzKFBBUkVOVF9BRERSRVNTKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBURVNUX1BSVl9LRVkgfSk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBqc29uLl90eXBlLnNob3VsZC5lcXVhbChFVEhUcmFuc2FjdGlvblR5cGUuRUlQMTU1OSk7XG4gICAgICAgIHNob3VsZC5leGlzdChqc29uLnYpO1xuICAgICAgICBzaG91bGQuZXhpc3QoanNvbi5yKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGpzb24ucyk7XG4gICAgICAgIHNob3VsZC5leGlzdChqc29uLmZyb20pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU2VyaWFsaXphdGlvbiByb3VuZC10cmlwXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGRlc2NyaWJlKCdzZXJpYWxpemF0aW9uIHJvdW5kLXRyaXAnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgdG8gdGhlIHNhbWUgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbik7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChGT1JXQVJERVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKFRPS0VOX0NPTlRSQUNUX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIuZW5jcnlwdGVkSGFuZGxlKEVOQ1JZUFRFRF9IQU5ETEUpO1xuICAgICAgICB0eEJ1aWxkZXIucGFyZW50QWRkcmVzcyhQQVJFTlRfQUREUkVTUyk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdIZXggPSBvcmlnaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgY29uc3QgcmVidWlsdEJ1aWxkZXIgPSBnZXRCdWlsZGVyKGNvaW5OYW1lKTtcbiAgICAgICAgcmVidWlsdEJ1aWxkZXIuZnJvbShyYXdIZXgpO1xuICAgICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWx0QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdIZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkZXNlcmlhbGl6ZWQgdHggc2hvdWxkIGNsYXNzaWZ5IGFzIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhGT1JXQVJERVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkNvbnRyYWN0QWRkcmVzcyhUT0tFTl9DT05UUkFDVF9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLmVuY3J5cHRlZEhhbmRsZShFTkNSWVBURURfSEFORExFKTtcbiAgICAgICAgdHhCdWlsZGVyLnBhcmVudEFkZHJlc3MoUEFSRU5UX0FERFJFU1MpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3SGV4ID0gb3JpZ2luYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICAgIHJlYnVpbHRCdWlsZGVyLmZyb20ocmF3SGV4KTtcbiAgICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBFcnJvciBjYXNlcyDigJQgbWlzc2luZyByZXF1aXJlZCBmaWVsZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZGVzY3JpYmUoJ21pc3NpbmcgZmllbGQgZXJyb3JzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGZvcndhcmRlckFkZHJlc3MgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgLy8gbm8gZm9yd2FyZGVyQWRkcmVzc1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5lbmNyeXB0ZWRIYW5kbGUoRU5DUllQVEVEX0hBTkRMRSk7XG4gICAgICAgIHR4QnVpbGRlci5wYXJlbnRBZGRyZXNzKFBBUkVOVF9BRERSRVNTKTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9taXNzaW5nIGZvcndhcmRlciBhZGRyZXNzL2kpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0b2tlbkNvbnRyYWN0QWRkcmVzcyBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4pO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhGT1JXQVJERVJfQUREUkVTUyk7XG4gICAgICAgIC8vIG5vIHRva2VuQ29udHJhY3RBZGRyZXNzXG4gICAgICAgIHR4QnVpbGRlci5lbmNyeXB0ZWRIYW5kbGUoRU5DUllQVEVEX0hBTkRMRSk7XG4gICAgICAgIHR4QnVpbGRlci5wYXJlbnRBZGRyZXNzKFBBUkVOVF9BRERSRVNTKTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9taXNzaW5nIHRva2VuQ29udHJhY3RBZGRyZXNzL2kpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBlbmNyeXB0ZWRIYW5kbGUgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIC8vIG5vIGVuY3J5cHRlZEhhbmRsZVxuICAgICAgICB0eEJ1aWxkZXIucGFyZW50QWRkcmVzcyhQQVJFTlRfQUREUkVTUyk7XG5cbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbWlzc2luZyBlbmNyeXB0ZWRIYW5kbGUvaSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHBhcmVudEFkZHJlc3MgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KEZPUldBUkRFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5lbmNyeXB0ZWRIYW5kbGUoRU5DUllQVEVEX0hBTkRMRSk7XG4gICAgICAgIC8vIG5vIHBhcmVudEFkZHJlc3NcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9taXNzaW5nIHBhcmVudEFkZHJlc3MvaSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNvbnRyYWN0QWRkcmVzcyAhPT0gZm9yd2FyZGVyQWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KE9USEVSX0FERFJFU1MpOyAvLyBkaWZmZXJlbnQgZnJvbSBmb3J3YXJkZXJcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoRk9SV0FSREVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoVE9LRU5fQ09OVFJBQ1RfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci5lbmNyeXB0ZWRIYW5kbGUoRU5DUllQVEVEX0hBTkRMRSk7XG4gICAgICAgIHR4QnVpbGRlci5wYXJlbnRBZGRyZXNzKFBBUkVOVF9BRERSRVNTKTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9jb250cmFjdEFkZHJlc3MgbXVzdCBlcXVhbCBmb3J3YXJkZXJBZGRyZXNzLyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTZXR0ZXIgdmFsaWRhdGlvblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBkZXNjcmliZSgnc2V0dGVyIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgICBpdCgndG9rZW5Db250cmFjdEFkZHJlc3Mgc2hvdWxkIHJlamVjdCBpbnZhbGlkIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKCdub3QtYW4tYWRkcmVzcycpLCAvSW52YWxpZCBhZGRyZXNzLyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3BhcmVudEFkZHJlc3Mgc2hvdWxkIHJlamVjdCBpbnZhbGlkIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnBhcmVudEFkZHJlc3MoJ25vdC1hbi1hZGRyZXNzJyksIC9JbnZhbGlkIGFkZHJlc3MvKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
@@ -3,4 +3,5 @@ export * from './send';
3
3
  export * from './walletInitialization';
4
4
  export * from './flushNft';
5
5
  export * from './decryptionDelegation';
6
+ export * from './flushERC7984';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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;AAC3B,cAAc,wBAAwB,CAAC"}
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;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
@@ -19,4 +19,5 @@ __exportStar(require("./send"), exports);
19
19
  __exportStar(require("./walletInitialization"), exports);
20
20
  __exportStar(require("./flushNft"), exports);
21
21
  __exportStar(require("./decryptionDelegation"), exports);
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwREFBd0M7QUFDeEMseUNBQXVCO0FBQ3ZCLHlEQUF1QztBQUN2Qyw2Q0FBMkI7QUFDM0IseURBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hZGRyZXNzSW5pdGlhbGl6YXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zZW5kJztcbmV4cG9ydCAqIGZyb20gJy4vd2FsbGV0SW5pdGlhbGl6YXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9mbHVzaE5mdCc7XG5leHBvcnQgKiBmcm9tICcuL2RlY3J5cHRpb25EZWxlZ2F0aW9uJztcbiJdfQ==
22
+ __exportStar(require("./flushERC7984"), exports);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwREFBd0M7QUFDeEMseUNBQXVCO0FBQ3ZCLHlEQUF1QztBQUN2Qyw2Q0FBMkI7QUFDM0IseURBQXVDO0FBQ3ZDLGlEQUErQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYWRkcmVzc0luaXRpYWxpemF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vc2VuZCc7XG5leHBvcnQgKiBmcm9tICcuL3dhbGxldEluaXRpYWxpemF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vZmx1c2hOZnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kZWNyeXB0aW9uRGVsZWdhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2ZsdXNoRVJDNzk4NCc7XG4iXX0=