@bitgo-beta/sdk-coin-tempo 1.0.1-beta.31 → 1.0.1-beta.310

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.
Files changed (51) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/lib/constants.d.ts +21 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +25 -5
  7. package/dist/src/lib/index.d.ts +4 -0
  8. package/dist/src/lib/index.d.ts.map +1 -1
  9. package/dist/src/lib/index.js +5 -1
  10. package/dist/src/lib/keyPair.d.ts +5 -25
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +9 -97
  13. package/dist/src/lib/tip20Abi.d.ts +98 -0
  14. package/dist/src/lib/tip20Abi.d.ts.map +1 -0
  15. package/dist/src/lib/tip20Abi.js +62 -0
  16. package/dist/src/lib/transaction.d.ts +144 -0
  17. package/dist/src/lib/transaction.d.ts.map +1 -0
  18. package/dist/src/lib/transaction.js +216 -0
  19. package/dist/src/lib/transactionBuilder.d.ts +139 -0
  20. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/transactionBuilder.js +408 -0
  22. package/dist/src/lib/types.d.ts +27 -0
  23. package/dist/src/lib/types.d.ts.map +1 -0
  24. package/dist/src/lib/types.js +3 -0
  25. package/dist/src/lib/utils.d.ts +70 -7
  26. package/dist/src/lib/utils.d.ts.map +1 -1
  27. package/dist/src/lib/utils.js +148 -16
  28. package/dist/src/register.d.ts.map +1 -1
  29. package/dist/src/register.js +5 -1
  30. package/dist/src/tempo.d.ts +95 -41
  31. package/dist/src/tempo.d.ts.map +1 -1
  32. package/dist/src/tempo.js +447 -76
  33. package/dist/src/tip20Token.d.ts +83 -0
  34. package/dist/src/tip20Token.d.ts.map +1 -0
  35. package/dist/src/tip20Token.js +202 -0
  36. package/dist/test/integration/tip20.d.ts +7 -0
  37. package/dist/test/integration/tip20.d.ts.map +1 -0
  38. package/dist/test/integration/tip20.js +178 -0
  39. package/dist/test/resources/tempo.d.ts +61 -0
  40. package/dist/test/resources/tempo.d.ts.map +1 -0
  41. package/dist/test/resources/tempo.js +79 -0
  42. package/dist/test/unit/index.js +172 -3
  43. package/dist/test/unit/tempo.d.ts +2 -0
  44. package/dist/test/unit/tempo.d.ts.map +1 -0
  45. package/dist/test/unit/tempo.js +207 -0
  46. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder.js +858 -0
  49. package/dist/test/unit/utils.js +6 -5
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +12 -7
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * Test resources for Tempo SDK
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ERROR_MESSAGES = exports.MEMO_TEST_CASES = exports.SIGNATURE_TEST_DATA = exports.TX_PARAMS = exports.TEST_RECIPIENT_ADDRESS = exports.TESTNET_TOKENS = void 0;
7
+ // ============================================================================
8
+ // TIP-20 Token Addresses (Tempo Testnet)
9
+ // ============================================================================
10
+ exports.TESTNET_TOKENS = {
11
+ pathUSD: {
12
+ address: '0x20c0000000000000000000000000000000000000',
13
+ name: 'ttempo:pathusd',
14
+ },
15
+ alphaUSD: {
16
+ address: '0x20c0000000000000000000000000000000000001',
17
+ name: 'ttempo:alphausd',
18
+ },
19
+ betaUSD: {
20
+ address: '0x20c0000000000000000000000000000000000002',
21
+ name: 'ttempo:betausd',
22
+ },
23
+ thetaUSD: {
24
+ address: '0x20c0000000000000000000000000000000000003',
25
+ name: 'ttempo:thetausd',
26
+ },
27
+ usd1: {
28
+ address: '0x20c00000000000000000000008bb598f4db17f78',
29
+ name: 'ttempo:usd1',
30
+ },
31
+ stgUSD1: {
32
+ address: '0x20c000000000000000000000e4662b69291ab60a',
33
+ name: 'ttempo:stgusd1',
34
+ },
35
+ };
36
+ // Valid checksummed test recipient address
37
+ exports.TEST_RECIPIENT_ADDRESS = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
38
+ // ============================================================================
39
+ // Transaction Parameters
40
+ // ============================================================================
41
+ exports.TX_PARAMS = {
42
+ defaultGas: BigInt('100000'),
43
+ defaultMaxFeePerGas: BigInt('2000000000'),
44
+ defaultMaxPriorityFeePerGas: BigInt('1000000000'),
45
+ };
46
+ // ============================================================================
47
+ // Signature Test Data
48
+ // ============================================================================
49
+ exports.SIGNATURE_TEST_DATA = {
50
+ validSignature: {
51
+ r: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
52
+ s: '0xfedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321',
53
+ yParity: 0,
54
+ },
55
+ };
56
+ // ============================================================================
57
+ // Memo Test Cases
58
+ // ============================================================================
59
+ exports.MEMO_TEST_CASES = {
60
+ valid: [
61
+ { input: '12345', description: 'numeric' },
62
+ { input: 'INV-001', description: 'alphanumeric with dash' },
63
+ { input: 'a'.repeat(32), description: 'max length 32 bytes' },
64
+ { input: '', description: 'empty string' },
65
+ ],
66
+ invalid: [{ input: 'a'.repeat(33), description: '33 bytes - exceeds limit' }],
67
+ };
68
+ // ============================================================================
69
+ // Error Messages
70
+ // ============================================================================
71
+ exports.ERROR_MESSAGES = {
72
+ noOperations: /At least one operation or raw call is required/,
73
+ missingNonce: /Nonce is required/,
74
+ missingGas: /Gas limit is required/,
75
+ missingMaxFeePerGas: /maxFeePerGas is required/,
76
+ missingMaxPriorityFeePerGas: /maxPriorityFeePerGas is required/,
77
+ invalidMemo: /Invalid memo/,
78
+ };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3Jlc291cmNlcy90ZW1wby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQUVILCtFQUErRTtBQUMvRSx5Q0FBeUM7QUFDekMsK0VBQStFO0FBRWxFLFFBQUEsY0FBYyxHQUFHO0lBQzVCLE9BQU8sRUFBRTtRQUNQLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGdCQUFnQjtLQUN2QjtJQUNELFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGlCQUFpQjtLQUN4QjtJQUNELE9BQU8sRUFBRTtRQUNQLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGdCQUFnQjtLQUN2QjtJQUNELFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGlCQUFpQjtLQUN4QjtJQUNELElBQUksRUFBRTtRQUNKLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGFBQWE7S0FDcEI7SUFDRCxPQUFPLEVBQUU7UUFDUCxPQUFPLEVBQUUsNENBQTRDO1FBQ3JELElBQUksRUFBRSxnQkFBZ0I7S0FDdkI7Q0FDRixDQUFDO0FBRUYsMkNBQTJDO0FBQzlCLFFBQUEsc0JBQXNCLEdBQUcsNENBQTRDLENBQUM7QUFFbkYsK0VBQStFO0FBQy9FLHlCQUF5QjtBQUN6QiwrRUFBK0U7QUFFbEUsUUFBQSxTQUFTLEdBQUc7SUFDdkIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDNUIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUN6QywyQkFBMkIsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDO0NBQ2xELENBQUM7QUFFRiwrRUFBK0U7QUFDL0Usc0JBQXNCO0FBQ3RCLCtFQUErRTtBQUVsRSxRQUFBLG1CQUFtQixHQUFHO0lBQ2pDLGNBQWMsRUFBRTtRQUNkLENBQUMsRUFBRSxvRUFBcUY7UUFDeEYsQ0FBQyxFQUFFLG9FQUFxRjtRQUN4RixPQUFPLEVBQUUsQ0FBQztLQUNYO0NBQ0YsQ0FBQztBQUVGLCtFQUErRTtBQUMvRSxrQkFBa0I7QUFDbEIsK0VBQStFO0FBRWxFLFFBQUEsZUFBZSxHQUFHO0lBQzdCLEtBQUssRUFBRTtRQUNMLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFO1FBQzFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7UUFDM0QsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUU7UUFDN0QsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7S0FDM0M7SUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSwwQkFBMEIsRUFBRSxDQUFDO0NBQzlFLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLCtFQUErRTtBQUVsRSxRQUFBLGNBQWMsR0FBRztJQUM1QixZQUFZLEVBQUUsZ0RBQWdEO0lBQzlELFlBQVksRUFBRSxtQkFBbUI7SUFDakMsVUFBVSxFQUFFLHVCQUF1QjtJQUNuQyxtQkFBbUIsRUFBRSwwQkFBMEI7SUFDL0MsMkJBQTJCLEVBQUUsa0NBQWtDO0lBQy9ELFdBQVcsRUFBRSxjQUFjO0NBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlc3QgcmVzb3VyY2VzIGZvciBUZW1wbyBTREtcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUSVAtMjAgVG9rZW4gQWRkcmVzc2VzIChUZW1wbyBUZXN0bmV0KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgVEVTVE5FVF9UT0tFTlMgPSB7XG4gIHBhdGhVU0Q6IHtcbiAgICBhZGRyZXNzOiAnMHgyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICBuYW1lOiAndHRlbXBvOnBhdGh1c2QnLFxuICB9LFxuICBhbHBoYVVTRDoge1xuICAgIGFkZHJlc3M6ICcweDIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLFxuICAgIG5hbWU6ICd0dGVtcG86YWxwaGF1c2QnLFxuICB9LFxuICBiZXRhVVNEOiB7XG4gICAgYWRkcmVzczogJzB4MjBjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMicsXG4gICAgbmFtZTogJ3R0ZW1wbzpiZXRhdXNkJyxcbiAgfSxcbiAgdGhldGFVU0Q6IHtcbiAgICBhZGRyZXNzOiAnMHgyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzJyxcbiAgICBuYW1lOiAndHRlbXBvOnRoZXRhdXNkJyxcbiAgfSxcbiAgdXNkMToge1xuICAgIGFkZHJlc3M6ICcweDIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4YmI1OThmNGRiMTdmNzgnLFxuICAgIG5hbWU6ICd0dGVtcG86dXNkMScsXG4gIH0sXG4gIHN0Z1VTRDE6IHtcbiAgICBhZGRyZXNzOiAnMHgyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDBlNDY2MmI2OTI5MWFiNjBhJyxcbiAgICBuYW1lOiAndHRlbXBvOnN0Z3VzZDEnLFxuICB9LFxufTtcblxuLy8gVmFsaWQgY2hlY2tzdW1tZWQgdGVzdCByZWNpcGllbnQgYWRkcmVzc1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVDSVBJRU5UX0FERFJFU1MgPSAnMHg3NDJkMzVDYzY2MzRDMDUzMjkyNWEzYjg0NEJjNDU0ZTQ0MzhmNDRlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHJhbnNhY3Rpb24gUGFyYW1ldGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgVFhfUEFSQU1TID0ge1xuICBkZWZhdWx0R2FzOiBCaWdJbnQoJzEwMDAwMCcpLFxuICBkZWZhdWx0TWF4RmVlUGVyR2FzOiBCaWdJbnQoJzIwMDAwMDAwMDAnKSxcbiAgZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzOiBCaWdJbnQoJzEwMDAwMDAwMDAnKSxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNpZ25hdHVyZSBUZXN0IERhdGFcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFNJR05BVFVSRV9URVNUX0RBVEEgPSB7XG4gIHZhbGlkU2lnbmF0dXJlOiB7XG4gICAgcjogJzB4MTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZicgYXMgYDB4JHtzdHJpbmd9YCxcbiAgICBzOiAnMHhmZWRjYmEwOTg3NjU0MzIxZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzIxJyBhcyBgMHgke3N0cmluZ31gLFxuICAgIHlQYXJpdHk6IDAsXG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZW1vIFRlc3QgQ2FzZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IE1FTU9fVEVTVF9DQVNFUyA9IHtcbiAgdmFsaWQ6IFtcbiAgICB7IGlucHV0OiAnMTIzNDUnLCBkZXNjcmlwdGlvbjogJ251bWVyaWMnIH0sXG4gICAgeyBpbnB1dDogJ0lOVi0wMDEnLCBkZXNjcmlwdGlvbjogJ2FscGhhbnVtZXJpYyB3aXRoIGRhc2gnIH0sXG4gICAgeyBpbnB1dDogJ2EnLnJlcGVhdCgzMiksIGRlc2NyaXB0aW9uOiAnbWF4IGxlbmd0aCAzMiBieXRlcycgfSxcbiAgICB7IGlucHV0OiAnJywgZGVzY3JpcHRpb246ICdlbXB0eSBzdHJpbmcnIH0sXG4gIF0sXG4gIGludmFsaWQ6IFt7IGlucHV0OiAnYScucmVwZWF0KDMzKSwgZGVzY3JpcHRpb246ICczMyBieXRlcyAtIGV4Y2VlZHMgbGltaXQnIH1dLFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXJyb3IgTWVzc2FnZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IEVSUk9SX01FU1NBR0VTID0ge1xuICBub09wZXJhdGlvbnM6IC9BdCBsZWFzdCBvbmUgb3BlcmF0aW9uIG9yIHJhdyBjYWxsIGlzIHJlcXVpcmVkLyxcbiAgbWlzc2luZ05vbmNlOiAvTm9uY2UgaXMgcmVxdWlyZWQvLFxuICBtaXNzaW5nR2FzOiAvR2FzIGxpbWl0IGlzIHJlcXVpcmVkLyxcbiAgbWlzc2luZ01heEZlZVBlckdhczogL21heEZlZVBlckdhcyBpcyByZXF1aXJlZC8sXG4gIG1pc3NpbmdNYXhQcmlvcml0eUZlZVBlckdhczogL21heFByaW9yaXR5RmVlUGVyR2FzIGlzIHJlcXVpcmVkLyxcbiAgaW52YWxpZE1lbW86IC9JbnZhbGlkIG1lbW8vLFxufTtcbiJdfQ==
@@ -1,9 +1,44 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  const tempo_1 = require("../../src/tempo");
4
37
  const ttempo_1 = require("../../src/ttempo");
5
38
  const sdk_api_1 = require("@bitgo-beta/sdk-api");
6
39
  const sdk_test_1 = require("@bitgo-beta/sdk-test");
40
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
+ const should = __importStar(require("should"));
7
42
  describe('Tempo Coin', function () {
8
43
  let bitgo;
9
44
  let basecoin;
@@ -34,7 +69,138 @@ describe('Tempo Coin', function () {
34
69
  it('should return the correct coin name', function () {
35
70
  basecoin.getChain().should.equal('tempo');
36
71
  basecoin.getFullName().should.equal('Tempo');
37
- basecoin.getBaseFactor().should.equal(1e18);
72
+ basecoin.getBaseFactor().should.equal(1e6);
73
+ });
74
+ describe('Address Validation', function () {
75
+ it('should validate plain EVM address', function () {
76
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f').should.equal(true);
77
+ basecoin.isValidAddress('0x0000000000000000000000000000000000000000').should.equal(true);
78
+ });
79
+ it('should validate address with memoId', function () {
80
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8').should.equal(true);
81
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=0').should.equal(true);
82
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=12345').should.equal(true);
83
+ });
84
+ it('should reject invalid addresses', function () {
85
+ basecoin.isValidAddress('invalid').should.equal(false);
86
+ basecoin.isValidAddress('').should.equal(false);
87
+ basecoin.isValidAddress('0x123').should.equal(false); // Too short
88
+ });
89
+ it('should reject address with invalid memoId', function () {
90
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=abc').should.equal(false);
91
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=-1').should.equal(false);
92
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1.5').should.equal(false);
93
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=01').should.equal(false); // Leading zero
94
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=').should.equal(false); // Empty memoId
95
+ });
96
+ it('should reject address with unknown query parameters', function () {
97
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?invalid=123').should.equal(false);
98
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?foo=bar').should.equal(false);
99
+ });
100
+ it('should reject address with multiple memoId parameters', function () {
101
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&memoId=2').should.equal(false);
102
+ });
103
+ it('should reject address with extra query parameters besides memoId', function () {
104
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&foo=bar').should.equal(false);
105
+ });
106
+ });
107
+ describe('getAddressDetails', function () {
108
+ it('should get address details without memoId', function () {
109
+ const addressDetails = basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f');
110
+ addressDetails.address.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
111
+ addressDetails.baseAddress.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
112
+ should.not.exist(addressDetails.memoId);
113
+ });
114
+ it('should get address details with memoId', function () {
115
+ const addressDetails = basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8');
116
+ addressDetails.address.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8');
117
+ addressDetails.baseAddress.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
118
+ addressDetails.memoId.should.equal('8');
119
+ });
120
+ it('should throw on invalid memoId address', function () {
121
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=abc')).should.throw(sdk_core_1.InvalidMemoIdError);
122
+ });
123
+ it('should throw on multiple memoId address', function () {
124
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&memoId=2')).should.throw(sdk_core_1.InvalidAddressError);
125
+ });
126
+ it('should throw on unknown query parameters', function () {
127
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?invalid=8')).should.throw(sdk_core_1.InvalidAddressError);
128
+ });
129
+ it('should throw on empty memoId', function () {
130
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=')).should.throw(sdk_core_1.InvalidAddressError);
131
+ });
132
+ it('should throw on extra query parameters besides memoId', function () {
133
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&foo=bar')).should.throw(sdk_core_1.InvalidAddressError);
134
+ });
135
+ });
136
+ describe('isValidMemoId', function () {
137
+ it('should validate correct memoIds', function () {
138
+ basecoin.isValidMemoId('0').should.equal(true);
139
+ basecoin.isValidMemoId('1').should.equal(true);
140
+ basecoin.isValidMemoId('12345').should.equal(true);
141
+ basecoin.isValidMemoId('999999999999').should.equal(true);
142
+ });
143
+ it('should reject invalid memoIds', function () {
144
+ basecoin.isValidMemoId('').should.equal(false);
145
+ basecoin.isValidMemoId('-1').should.equal(false);
146
+ basecoin.isValidMemoId('1.5').should.equal(false);
147
+ basecoin.isValidMemoId('abc').should.equal(false);
148
+ basecoin.isValidMemoId('01').should.equal(false); // Leading zero
149
+ basecoin.isValidMemoId('00').should.equal(false);
150
+ });
151
+ });
152
+ describe('isWalletAddress', function () {
153
+ const baseAddress = '0x2476602c78e9a5e0563320c78878faa3952b256f';
154
+ it('should verify a plain address matching the base address', async function () {
155
+ const result = await basecoin.isWalletAddress({
156
+ address: baseAddress,
157
+ baseAddress,
158
+ coinSpecific: {},
159
+ });
160
+ result.should.equal(true);
161
+ });
162
+ it('should verify a memoId address whose base matches the wallet base address', async function () {
163
+ const result = await basecoin.isWalletAddress({
164
+ address: `${baseAddress}?memoId=8`,
165
+ baseAddress,
166
+ coinSpecific: {},
167
+ });
168
+ result.should.equal(true);
169
+ });
170
+ it('should verify using rootAddress when baseAddress is not provided', async function () {
171
+ const result = await basecoin.isWalletAddress({
172
+ address: `${baseAddress}?memoId=42`,
173
+ rootAddress: baseAddress,
174
+ coinSpecific: {},
175
+ });
176
+ result.should.equal(true);
177
+ });
178
+ it('should reject address with mismatched base address', async function () {
179
+ await basecoin
180
+ .isWalletAddress({
181
+ address: '0x0000000000000000000000000000000000000001?memoId=8',
182
+ baseAddress,
183
+ coinSpecific: {},
184
+ })
185
+ .should.be.rejectedWith(sdk_core_1.UnexpectedAddressError);
186
+ });
187
+ it('should reject an invalid address', async function () {
188
+ await basecoin
189
+ .isWalletAddress({
190
+ address: 'not-a-valid-address',
191
+ baseAddress,
192
+ coinSpecific: {},
193
+ })
194
+ .should.be.rejectedWith(sdk_core_1.InvalidAddressError);
195
+ });
196
+ it('should not require forwarderVersion (no forwarder contracts)', async function () {
197
+ const result = await basecoin.isWalletAddress({
198
+ address: `${baseAddress}?memoId=100`,
199
+ baseAddress,
200
+ coinSpecific: { forwarderVersion: undefined },
201
+ });
202
+ result.should.equal(true);
203
+ });
38
204
  });
39
205
  describe('Testnet', function () {
40
206
  let testnetBasecoin;
@@ -48,8 +214,11 @@ describe('Tempo Coin', function () {
48
214
  it('should return the correct testnet coin name', function () {
49
215
  testnetBasecoin.getChain().should.equal('ttempo');
50
216
  testnetBasecoin.getFullName().should.equal('Testnet Tempo');
51
- testnetBasecoin.getBaseFactor().should.equal(1e18);
217
+ testnetBasecoin.getBaseFactor().should.equal(1e6);
218
+ });
219
+ it('should validate address with memoId on testnet', function () {
220
+ testnetBasecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8').should.equal(true);
52
221
  });
53
222
  });
54
223
  });
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBd0M7QUFDeEMsNkNBQTBDO0FBQzFDLGlEQUErQztBQUMvQyxtREFBK0Q7QUFJL0QsUUFBUSxDQUFDLFlBQVksRUFBRTtJQUNyQixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxTQUF1QyxFQUFRLEVBQUU7UUFDbkYsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDNUMsNkJBQTZCO1lBQzdCLE1BQU0sZUFBZSxHQUE4QjtnQkFDakQsSUFBSTtnQkFDSixRQUFRLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlO2dCQUN0RCxPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDeEM7Z0JBQ1IsUUFBUSxFQUFFLEVBQUU7YUFDTixDQUFDO1lBQ1QsT0FBTyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFLLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLElBQUksZUFBZSxDQUFDO1FBRXBCLE1BQU0sQ0FBQztZQUNMLFlBQVksQ0FBQyxRQUFRLEVBQUUsZUFBTSxDQUFDLENBQUM7WUFDL0IsZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7WUFDeEMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFNLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RCxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbyB9IGZyb20gJy4uLy4uL3NyYy90ZW1wbyc7XG5pbXBvcnQgeyBUdGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdHRlbXBvJztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnVGVtcG8gQ29pbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjtcblxuICBjb25zdCByZWdpc3RlckNvaW4gPSAobmFtZTogc3RyaW5nLCBjb2luQ2xhc3M6IHR5cGVvZiBUZW1wbyB8IHR5cGVvZiBUdGVtcG8pOiB2b2lkID0+IHtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIobmFtZSwgKGJpdGdvOiBCaXRHb0Jhc2UpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG1vY2sgc3RhdGljcyBjb2luXG4gICAgICBjb25zdCBtb2NrU3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4gPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZ1bGxOYW1lOiBuYW1lID09PSAndGVtcG8nID8gJ1RlbXBvJyA6ICdUZXN0bmV0IFRlbXBvJyxcbiAgICAgICAgbmV0d29yazoge1xuICAgICAgICAgIHR5cGU6IG5hbWUgPT09ICd0ZW1wbycgPyAnbWFpbm5ldCcgOiAndGVzdG5ldCcsXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICB9IGFzIGFueTtcbiAgICAgIHJldHVybiBjb2luQ2xhc3MuY3JlYXRlSW5zdGFuY2UoYml0Z28sIG1vY2tTdGF0aWNzQ29pbik7XG4gICAgfSk7XG4gIH07XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICByZWdpc3RlckNvaW4oJ3RlbXBvJywgVGVtcG8pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RlbXBvJyk7XG4gICAgYmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVGVtcG8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RlbXBvJyk7XG4gICAgYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1RlbXBvJyk7XG4gICAgYmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3RuZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRlc3RuZXRCYXNlY29pbjtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlckNvaW4oJ3R0ZW1wbycsIFR0ZW1wbyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4gPSBiaXRnby5jb2luKCd0dGVtcG8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIHRlc3RuZXQgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3RuZXRCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUdGVtcG8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdGVzdG5ldCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0ZW1wbycpO1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IFRlbXBvJyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBd0M7QUFDeEMsNkNBQTBDO0FBQzFDLGlEQUErQztBQUMvQyxtREFBK0Q7QUFDL0QsbURBQWtIO0FBRWxILCtDQUFpQztBQUVqQyxRQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQVEsQ0FBQztJQUViLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQXVDLEVBQVEsRUFBRTtRQUNuRixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUM1Qyw2QkFBNkI7WUFDN0IsTUFBTSxlQUFlLEdBQThCO2dCQUNqRCxJQUFJO2dCQUNKLFFBQVEsRUFBRSxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWU7Z0JBQ3RELE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUN4QztnQkFDUixRQUFRLEVBQUUsRUFBRTthQUNOLENBQUM7WUFDVCxPQUFPLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxZQUFZLENBQUMsT0FBTyxFQUFFLGFBQUssQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxrQkFBa0IsRUFB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LENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUQsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsZUFBZSxDQUFDLGNBQWMsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0csQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdGVtcG8nO1xuaW1wb3J0IHsgVHRlbXBvIH0gZnJvbSAnLi4vLi4vc3JjL3R0ZW1wbyc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UsIEludmFsaWRBZGRyZXNzRXJyb3IsIEludmFsaWRNZW1vSWRFcnJvciwgVW5leHBlY3RlZEFkZHJlc3NFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmRlc2NyaWJlKCdUZW1wbyBDb2luJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGNvbnN0IHJlZ2lzdGVyQ29pbiA9IChuYW1lOiBzdHJpbmcsIGNvaW5DbGFzczogdHlwZW9mIFRlbXBvIHwgdHlwZW9mIFR0ZW1wbyk6IHZvaWQgPT4ge1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcihuYW1lLCAoYml0Z286IEJpdEdvQmFzZSkgPT4ge1xuICAgICAgLy8gQ3JlYXRlIGEgbW9jayBzdGF0aWNzIGNvaW5cbiAgICAgIGNvbnN0IG1vY2tTdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPiA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZnVsbE5hbWU6IG5hbWUgPT09ICd0ZW1wbycgPyAnVGVtcG8nIDogJ1Rlc3RuZXQgVGVtcG8nLFxuICAgICAgICBuZXR3b3JrOiB7XG4gICAgICAgICAgdHlwZTogbmFtZSA9PT0gJ3RlbXBvJyA/ICdtYWlubmV0JyA6ICd0ZXN0bmV0JyxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgIH0gYXMgYW55O1xuICAgICAgcmV0dXJuIGNvaW5DbGFzcy5jcmVhdGVJbnN0YW5jZShiaXRnbywgbW9ja1N0YXRpY3NDb2luKTtcbiAgICB9KTtcbiAgfTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIHJlZ2lzdGVyQ29pbigndGVtcG8nLCBUZW1wbyk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmFzZWNvaW4gPSBiaXRnby5jb2luKCd0ZW1wbycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKTtcbiAgICBiYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUZW1wbyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGNvaW4gbmFtZScsIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgndGVtcG8nKTtcbiAgICBiYXNlY29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVtcG8nKTtcbiAgICBiYXNlY29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlNik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBZGRyZXNzIFZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwbGFpbiBFVk0gYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmYnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzIHdpdGggbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9OCcpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTAnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0xMjM0NScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ2ludmFsaWQnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgxMjMnKS5zaG91bGQuZXF1YWwoZmFsc2UpOyAvLyBUb28gc2hvcnRcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3Mgd2l0aCBpbnZhbGlkIG1lbW9JZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPWFiYycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0tMScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0xLjUnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9MDEnKS5zaG91bGQuZXF1YWwoZmFsc2UpOyAvLyBMZWFkaW5nIHplcm9cbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPScpLnNob3VsZC5lcXVhbChmYWxzZSk7IC8vIEVtcHR5IG1lbW9JZFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzcyB3aXRoIHVua25vd24gcXVlcnkgcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/aW52YWxpZD0xMjMnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9mb289YmFyJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3Mgd2l0aCBtdWx0aXBsZSBtZW1vSWQgcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTEmbWVtb0lkPTInKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzcyB3aXRoIGV4dHJhIHF1ZXJ5IHBhcmFtZXRlcnMgYmVzaWRlcyBtZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0xJmZvbz1iYXInKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QWRkcmVzc0RldGFpbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYWRkcmVzcyBkZXRhaWxzIHdpdGhvdXQgbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5iYXNlQWRkcmVzcy5zaG91bGQuZXF1YWwoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2ZicpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChhZGRyZXNzRGV0YWlscy5tZW1vSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYWRkcmVzcyBkZXRhaWxzIHdpdGggbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD04Jyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD04Jyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5iYXNlQWRkcmVzcy5zaG91bGQuZXF1YWwoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2ZicpO1xuICAgICAgYWRkcmVzc0RldGFpbHMubWVtb0lkLnNob3VsZC5lcXVhbCgnOCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBpbnZhbGlkIG1lbW9JZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPWFiYycpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRNZW1vSWRFcnJvclxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gbXVsdGlwbGUgbWVtb0lkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9MSZtZW1vSWQ9MicpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRBZGRyZXNzRXJyb3JcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIHVua25vd24gcXVlcnkgcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP2ludmFsaWQ9OCcpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRBZGRyZXNzRXJyb3JcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGVtcHR5IG1lbW9JZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0nKSkuc2hvdWxkLnRocm93KFxuICAgICAgICBJbnZhbGlkQWRkcmVzc0Vycm9yXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBleHRyYSBxdWVyeSBwYXJhbWV0ZXJzIGJlc2lkZXMgbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTEmZm9vPWJhcicpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRBZGRyZXNzRXJyb3JcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkTWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBtZW1vSWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnMCcpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzEnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcxMjM0NScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzk5OTk5OTk5OTk5OScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgbWVtb0lkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCctMScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcxLjUnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnYWJjJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzAxJykuc2hvdWxkLmVxdWFsKGZhbHNlKTsgLy8gTGVhZGluZyB6ZXJvXG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcwMCcpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1dhbGxldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSAnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJztcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgcGxhaW4gYWRkcmVzcyBtYXRjaGluZyB0aGUgYmFzZSBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHtcbiAgICAgICAgYWRkcmVzczogYmFzZUFkZHJlc3MsXG4gICAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBtZW1vSWQgYWRkcmVzcyB3aG9zZSBiYXNlIG1hdGNoZXMgdGhlIHdhbGxldCBiYXNlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3Moe1xuICAgICAgICBhZGRyZXNzOiBgJHtiYXNlQWRkcmVzc30/bWVtb0lkPThgLFxuICAgICAgICBiYXNlQWRkcmVzcyxcbiAgICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHVzaW5nIHJvb3RBZGRyZXNzIHdoZW4gYmFzZUFkZHJlc3MgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHtcbiAgICAgICAgYWRkcmVzczogYCR7YmFzZUFkZHJlc3N9P21lbW9JZD00MmAsXG4gICAgICAgIHJvb3RBZGRyZXNzOiBiYXNlQWRkcmVzcyxcbiAgICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3Mgd2l0aCBtaXNtYXRjaGVkIGJhc2UgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5pc1dhbGxldEFkZHJlc3Moe1xuICAgICAgICAgIGFkZHJlc3M6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE/bWVtb0lkPTgnLFxuICAgICAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gaW52YWxpZCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgICAgYWRkcmVzczogJ25vdC1hLXZhbGlkLWFkZHJlc3MnLFxuICAgICAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKEludmFsaWRBZGRyZXNzRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVxdWlyZSBmb3J3YXJkZXJWZXJzaW9uIChubyBmb3J3YXJkZXIgY29udHJhY3RzKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgIGFkZHJlc3M6IGAke2Jhc2VBZGRyZXNzfT9tZW1vSWQ9MTAwYCxcbiAgICAgICAgYmFzZUFkZHJlc3MsXG4gICAgICAgIGNvaW5TcGVjaWZpYzogeyBmb3J3YXJkZXJWZXJzaW9uOiB1bmRlZmluZWQgfSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3RuZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRlc3RuZXRCYXNlY29pbjtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlckNvaW4oJ3R0ZW1wbycsIFR0ZW1wbyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4gPSBiaXRnby5jb2luKCd0dGVtcG8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIHRlc3RuZXQgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3RuZXRCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUdGVtcG8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdGVzdG5ldCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0ZW1wbycpO1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IFRlbXBvJyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzIHdpdGggbWVtb0lkIG9uIHRlc3RuZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9OCcpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tempo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../../test/unit/tempo.ts"],"names":[],"mappings":""}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sinon_1 = __importDefault(require("sinon"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
9
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
10
+ const statics_1 = require("@bitgo-beta/statics");
11
+ const tempo_1 = require("../../src/tempo");
12
+ const PATH_USD_ADDRESS = '0x20c0000000000000000000000000000000000000';
13
+ // secp256k1 generator point G (33 bytes) + 32-byte chaincode — valid commonKeyChain for deriveUnhardened
14
+ const TEST_BACKUP_KEY = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798' +
15
+ '0000000000000000000000000000000000000000000000000000000000000001';
16
+ const TEST_RECOVERY_DESTINATION = '0x80151ebf635e6ec8a5455258f617be6cda1fbd7e';
17
+ describe('Tempo Recovery', function () {
18
+ let bitgo;
19
+ let basecoin;
20
+ let sandbox;
21
+ before(function () {
22
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
23
+ bitgo.safeRegister('tempo', (b) => {
24
+ const mockStaticsCoin = {
25
+ name: 'tempo',
26
+ fullName: 'Tempo',
27
+ family: statics_1.CoinFamily.TEMPO,
28
+ network: { type: 'mainnet' },
29
+ features: [],
30
+ };
31
+ return tempo_1.Tempo.createInstance(b, mockStaticsCoin);
32
+ });
33
+ bitgo.initializeTestVars();
34
+ basecoin = bitgo.coin('tempo');
35
+ });
36
+ beforeEach(function () {
37
+ sandbox = sinon_1.default.createSandbox();
38
+ });
39
+ afterEach(function () {
40
+ sandbox.restore();
41
+ });
42
+ describe('queryTempoRpc (via recoveryBlockchainExplorerQuery)', function () {
43
+ function mockFetch(responseBody) {
44
+ return sandbox.stub(global, 'fetch').resolves({
45
+ ok: true,
46
+ json: async () => responseBody,
47
+ });
48
+ }
49
+ it('returns { result: "0" } for account/balance without calling RPC', async function () {
50
+ const fetchStub = mockFetch({});
51
+ const result = await basecoin.recoveryBlockchainExplorerQuery({
52
+ module: 'account',
53
+ action: 'balance',
54
+ address: '0xabc',
55
+ });
56
+ result.should.deepEqual({ result: '0' });
57
+ fetchStub.called.should.equal(false);
58
+ });
59
+ it('calls eth_call with balanceOf selector for account/tokenbalance', async function () {
60
+ const fetchStub = mockFetch({ result: '0x4e20' }); // 20000 decimal
61
+ const result = await basecoin.recoveryBlockchainExplorerQuery({
62
+ module: 'account',
63
+ action: 'tokenbalance',
64
+ address: '0x1234567890123456789012345678901234567890',
65
+ contractaddress: PATH_USD_ADDRESS,
66
+ tag: 'latest',
67
+ });
68
+ result.should.deepEqual({ result: '20000' });
69
+ const body = JSON.parse(fetchStub.firstCall.args[1].body);
70
+ body.method.should.equal('eth_call');
71
+ body.params[0].data.should.startWith('0x70a08231');
72
+ });
73
+ it('calls eth_getTransactionCount for account/txlist and parses nonce', async function () {
74
+ mockFetch({ result: '0x5' });
75
+ const result = await basecoin.recoveryBlockchainExplorerQuery({
76
+ module: 'account',
77
+ action: 'txlist',
78
+ address: '0xabc',
79
+ });
80
+ result.should.deepEqual({ nonce: 5 });
81
+ });
82
+ it('returns { result: "0" } when RPC returns null body.result', async function () {
83
+ mockFetch({ result: null });
84
+ const result = await basecoin.recoveryBlockchainExplorerQuery({
85
+ module: 'account',
86
+ action: 'tokenbalance',
87
+ address: '0xabc',
88
+ contractaddress: PATH_USD_ADDRESS,
89
+ });
90
+ result.should.deepEqual({ result: '0' });
91
+ });
92
+ it('returns { result: "0" } when RPC returns malformed body.result', async function () {
93
+ mockFetch({ result: 'not-a-number' });
94
+ const result = await basecoin.recoveryBlockchainExplorerQuery({
95
+ module: 'account',
96
+ action: 'tokenbalance',
97
+ address: '0xabc',
98
+ contractaddress: PATH_USD_ADDRESS,
99
+ });
100
+ result.should.deepEqual({ result: '0' });
101
+ });
102
+ it('throws when the RPC returns an error field', async function () {
103
+ mockFetch({ error: { message: 'execution reverted' } });
104
+ await basecoin
105
+ .recoveryBlockchainExplorerQuery({
106
+ module: 'account',
107
+ action: 'tokenbalance',
108
+ address: '0xabc',
109
+ contractaddress: PATH_USD_ADDRESS,
110
+ })
111
+ .should.be.rejectedWith('Tempo RPC error: execution reverted');
112
+ });
113
+ it('throws for unsupported module/action', async function () {
114
+ await basecoin
115
+ .recoveryBlockchainExplorerQuery({ module: 'proxy', action: 'eth_blockNumber' })
116
+ .should.be.rejectedWith('queryTempoRpc: unsupported module=proxy action=eth_blockNumber');
117
+ });
118
+ });
119
+ describe('buildUnsignedSweepTxnTSS — gas margin calculation', function () {
120
+ function stubBalanceAndNonce(balance, nonce = 0) {
121
+ sandbox.stub(basecoin, 'queryAddressTokenBalance').resolves(balance);
122
+ sandbox.stub(basecoin, 'getAddressNonce').resolves(nonce);
123
+ }
124
+ it('deducts gasLimit × maxFeePerGas / 10^12 from pathUSD balance', async function () {
125
+ // gasMargin = 1_000_000 * 20_000_000_000 * 1.75 / 10^12 = 35_000
126
+ // sweepAmount = 1_000_000 - 35_000 = 965_000
127
+ stubBalanceAndNonce('1000000');
128
+ const result = (await basecoin.buildUnsignedSweepTxnTSS({
129
+ backupKey: TEST_BACKUP_KEY,
130
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
131
+ tokenContractAddress: PATH_USD_ADDRESS,
132
+ gasLimit: 1000000,
133
+ eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
134
+ }));
135
+ should_1.default.exist(result.txRequests);
136
+ result.txRequests[0].transactions[0].unsignedTx.should.have.property('serializedTxHex');
137
+ });
138
+ it('uses smaller margin when gasLimit is halved', async function () {
139
+ // gasMargin = 500_000 * 20_000_000_000 * 1.75 / 10^12 = 17_500
140
+ // sweepAmount = 50_000 - 17_500 = 32_500
141
+ stubBalanceAndNonce('50000');
142
+ const result = (await basecoin.buildUnsignedSweepTxnTSS({
143
+ backupKey: TEST_BACKUP_KEY,
144
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
145
+ tokenContractAddress: PATH_USD_ADDRESS,
146
+ gasLimit: 500000,
147
+ eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
148
+ }));
149
+ should_1.default.exist(result.txRequests);
150
+ });
151
+ it('throws when balance exactly equals the gas margin', async function () {
152
+ // gasMargin = 1_000_000 * 20_000_000_000 / 10^12 = 20_000; balance = 20_000 → sweepAmount = 0
153
+ stubBalanceAndNonce('20000');
154
+ await basecoin
155
+ .buildUnsignedSweepTxnTSS({
156
+ backupKey: TEST_BACKUP_KEY,
157
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
158
+ tokenContractAddress: PATH_USD_ADDRESS,
159
+ gasLimit: 1000000,
160
+ eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
161
+ })
162
+ .should.be.rejectedWith(/Insufficient balance/);
163
+ });
164
+ it('does not deduct margin when sweeping a non-pathUSD token', async function () {
165
+ const otherToken = '0x1111111111111111111111111111111111111111';
166
+ stubBalanceAndNonce('500');
167
+ const result = (await basecoin.buildUnsignedSweepTxnTSS({
168
+ backupKey: TEST_BACKUP_KEY,
169
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
170
+ tokenContractAddress: otherToken,
171
+ gasLimit: 1000000,
172
+ eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
173
+ }));
174
+ // Full balance of 500 swept; no margin deducted
175
+ should_1.default.exist(result.txRequests);
176
+ });
177
+ it('returns correct UnsignedSweepTxMPCv2 structure', async function () {
178
+ stubBalanceAndNonce('1000000');
179
+ const result = (await basecoin.buildUnsignedSweepTxnTSS({
180
+ backupKey: TEST_BACKUP_KEY,
181
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
182
+ tokenContractAddress: PATH_USD_ADDRESS,
183
+ gasLimit: 1000000,
184
+ eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
185
+ }));
186
+ const tx = result.txRequests[0].transactions[0];
187
+ tx.unsignedTx.derivationPath.should.equal('m/0');
188
+ tx.unsignedTx.coinSpecific.commonKeyChain.should.equal(TEST_BACKUP_KEY);
189
+ tx.signatureShares.should.deepEqual([]);
190
+ tx.nonce.should.equal(0);
191
+ });
192
+ });
193
+ describe('recoverTSS — unsigned sweep dispatch', function () {
194
+ it('routes to buildUnsignedSweepTxnTSS when keys are plain public keys', async function () {
195
+ const buildStub = sandbox.stub(basecoin, 'buildUnsignedSweepTxnTSS').resolves({ txRequests: [] });
196
+ sandbox.stub(basecoin, 'validateRecoveryParams').returns(undefined);
197
+ await basecoin.recoverTSS({
198
+ userKey: TEST_BACKUP_KEY,
199
+ backupKey: TEST_BACKUP_KEY,
200
+ isTss: true,
201
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
202
+ });
203
+ buildStub.calledOnce.should.equal(true);
204
+ });
205
+ });
206
+ });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLGlEQUErQztBQUMvQyxtREFBK0Q7QUFFL0QsaURBQThFO0FBQzlFLDJDQUF3QztBQUN4QyxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO0FBRXRFLHlHQUF5RztBQUN6RyxNQUFNLGVBQWUsR0FDbkIsb0VBQW9FO0lBQ3BFLGtFQUFrRSxDQUFDO0FBQ3JFLE1BQU0seUJBQXlCLEdBQUcsNENBQTRDLENBQUM7QUFFL0UsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWUsQ0FBQztJQUNwQixJQUFJLE9BQTJCLENBQUM7SUFFaEMsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQVksRUFBRSxFQUFFO1lBQzNDLE1BQU0sZUFBZSxHQUE4QjtnQkFDakQsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE1BQU0sRUFBRSxvQkFBVSxDQUFDLEtBQUs7Z0JBQ3hCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQzVCLFFBQVEsRUFBRSxFQUFFO2FBQ04sQ0FBQztZQUNULE9BQU8sYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQVUsQ0FB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QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0NBQXNDLEVBQUU7UUFDL0MsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEtBQUs7WUFDNUUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFlLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQWUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUzRSxNQUFPLFFBQWdCLENBQUMsVUFBVSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2dCQUNYLG1CQUFtQixFQUFFLHlCQUF5QjthQUMvQyxDQUFDLENBQUM7WUFFSCxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgQ29pbkZhbWlseSB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdGVtcG8nO1xuY29uc3QgUEFUSF9VU0RfQUREUkVTUyA9ICcweDIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuXG4vLyBzZWNwMjU2azEgZ2VuZXJhdG9yIHBvaW50IEcgKDMzIGJ5dGVzKSArIDMyLWJ5dGUgY2hhaW5jb2RlIOKAlCB2YWxpZCBjb21tb25LZXlDaGFpbiBmb3IgZGVyaXZlVW5oYXJkZW5lZFxuY29uc3QgVEVTVF9CQUNLVVBfS0VZID1cbiAgJzAyNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcgK1xuICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSc7XG5jb25zdCBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OID0gJzB4ODAxNTFlYmY2MzVlNmVjOGE1NDU1MjU4ZjYxN2JlNmNkYTFmYmQ3ZSc7XG5cbmRlc2NyaWJlKCdUZW1wbyBSZWNvdmVyeScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGVtcG87XG4gIGxldCBzYW5kYm94OiBzaW5vbi5TaW5vblNhbmRib3g7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RlbXBvJywgKGI6IEJpdEdvQmFzZSkgPT4ge1xuICAgICAgY29uc3QgbW9ja1N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+ID0ge1xuICAgICAgICBuYW1lOiAndGVtcG8nLFxuICAgICAgICBmdWxsTmFtZTogJ1RlbXBvJyxcbiAgICAgICAgZmFtaWx5OiBDb2luRmFtaWx5LlRFTVBPLFxuICAgICAgICBuZXR3b3JrOiB7IHR5cGU6ICdtYWlubmV0JyB9LFxuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICB9IGFzIGFueTtcbiAgICAgIHJldHVybiBUZW1wby5jcmVhdGVJbnN0YW5jZShiLCBtb2NrU3RhdGljc0NvaW4pO1xuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKSBhcyBUZW1wbztcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3F1ZXJ5VGVtcG9ScGMgKHZpYSByZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KScsIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBtb2NrRmV0Y2gocmVzcG9uc2VCb2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHNpbm9uLlNpbm9uU3R1YiB7XG4gICAgICByZXR1cm4gc2FuZGJveC5zdHViKGdsb2JhbCwgJ2ZldGNoJyBhcyBhbnkpLnJlc29sdmVzKHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGpzb246IGFzeW5jICgpID0+IHJlc3BvbnNlQm9keSxcbiAgICAgIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSBmb3IgYWNjb3VudC9iYWxhbmNlIHdpdGhvdXQgY2FsbGluZyBSUEMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goe30pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICdiYWxhbmNlJyxcbiAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICAgIGZldGNoU3R1Yi5jYWxsZWQuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBldGhfY2FsbCB3aXRoIGJhbGFuY2VPZiBzZWxlY3RvciBmb3IgYWNjb3VudC90b2tlbmJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDRlMjAnIH0pOyAvLyAyMDAwMCBkZWNpbWFsXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIHRhZzogJ2xhdGVzdCcsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMjAwMDAnIH0pO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZmV0Y2hTdHViLmZpcnN0Q2FsbC5hcmdzWzFdLmJvZHkpO1xuICAgICAgYm9keS5tZXRob2Quc2hvdWxkLmVxdWFsKCdldGhfY2FsbCcpO1xuICAgICAgYm9keS5wYXJhbXNbMF0uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDcwYTA4MjMxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgZXRoX2dldFRyYW5zYWN0aW9uQ291bnQgZm9yIGFjY291bnQvdHhsaXN0IGFuZCBwYXJzZXMgbm9uY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDUnIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0eGxpc3QnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IG5vbmNlOiA1IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgeyByZXN1bHQ6IFwiMFwiIH0gd2hlbiBSUEMgcmV0dXJucyBudWxsIGJvZHkucmVzdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0ZldGNoKHsgcmVzdWx0OiBudWxsIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0b2tlbmJhbGFuY2UnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSB3aGVuIFJQQyByZXR1cm5zIG1hbGZvcm1lZCBib2R5LnJlc3VsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tGZXRjaCh7IHJlc3VsdDogJ25vdC1hLW51bWJlcicgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweGFiYycsXG4gICAgICAgIGNvbnRyYWN0YWRkcmVzczogUEFUSF9VU0RfQUREUkVTUyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiB0aGUgUlBDIHJldHVybnMgYW4gZXJyb3IgZmllbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyBlcnJvcjogeyBtZXNzYWdlOiAnZXhlY3V0aW9uIHJldmVydGVkJyB9IH0pO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoe1xuICAgICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUZW1wbyBSUEMgZXJyb3I6IGV4ZWN1dGlvbiByZXZlcnRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBmb3IgdW5zdXBwb3J0ZWQgbW9kdWxlL2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHsgbW9kdWxlOiAncHJveHknLCBhY3Rpb246ICdldGhfYmxvY2tOdW1iZXInIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdxdWVyeVRlbXBvUnBjOiB1bnN1cHBvcnRlZCBtb2R1bGU9cHJveHkgYWN0aW9uPWV0aF9ibG9ja051bWJlcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTIOKAlCBnYXMgbWFyZ2luIGNhbGN1bGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHN0dWJCYWxhbmNlQW5kTm9uY2UoYmFsYW5jZTogc3RyaW5nLCBub25jZSA9IDApIHtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdxdWVyeUFkZHJlc3NUb2tlbkJhbGFuY2UnKS5yZXNvbHZlcyhiYWxhbmNlKTtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdnZXRBZGRyZXNzTm9uY2UnKS5yZXNvbHZlcyhub25jZSk7XG4gICAgfVxuXG4gICAgaXQoJ2RlZHVjdHMgZ2FzTGltaXQgw5cgbWF4RmVlUGVyR2FzIC8gMTBeMTIgZnJvbSBwYXRoVVNEIGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSAxXzAwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAqIDEuNzUgLyAxMF4xMiA9IDM1XzAwMFxuICAgICAgLy8gc3dlZXBBbW91bnQgPSAxXzAwMF8wMDAgLSAzNV8wMDAgPSA5NjVfMDAwXG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogMV8wMDBfMDAwLFxuICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgfSkpIGFzIGFueTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQudHhSZXF1ZXN0cyk7XG4gICAgICByZXN1bHQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc2VyaWFsaXplZFR4SGV4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBzbWFsbGVyIG1hcmdpbiB3aGVuIGdhc0xpbWl0IGlzIGhhbHZlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGdhc01hcmdpbiA9IDUwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAqIDEuNzUgLyAxMF4xMiA9IDE3XzUwMFxuICAgICAgLy8gc3dlZXBBbW91bnQgPSA1MF8wMDAgLSAxN181MDAgPSAzMl81MDBcbiAgICAgIHN0dWJCYWxhbmNlQW5kTm9uY2UoJzUwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogNTAwXzAwMCxcbiAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgIH0pKSBhcyBhbnk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIGJhbGFuY2UgZXhhY3RseSBlcXVhbHMgdGhlIGdhcyBtYXJnaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSAxXzAwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAvIDEwXjEyID0gMjBfMDAwOyBiYWxhbmNlID0gMjBfMDAwIOKGkiBzd2VlcEFtb3VudCA9IDBcbiAgICAgIHN0dWJCYWxhbmNlQW5kTm9uY2UoJzIwMDAwJyk7XG4gICAgICBhd2FpdCAoYmFzZWNvaW4gYXMgYW55KVxuICAgICAgICAuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICAgIGdhc0xpbWl0OiAxXzAwMF8wMDAsXG4gICAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0luc3VmZmljaWVudCBiYWxhbmNlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgZGVkdWN0IG1hcmdpbiB3aGVuIHN3ZWVwaW5nIGEgbm9uLXBhdGhVU0QgdG9rZW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdGhlclRva2VuID0gJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCc1MDAnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCAoYmFzZWNvaW4gYXMgYW55KS5idWlsZFVuc2lnbmVkU3dlZXBUeG5UU1Moe1xuICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogVEVTVF9SRUNPVkVSWV9ERVNUSU5BVElPTixcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IG90aGVyVG9rZW4sXG4gICAgICAgIGdhc0xpbWl0OiAxXzAwMF8wMDAsXG4gICAgICAgIGVpcDE1NTk6IHsgbWF4RmVlUGVyR2FzOiAyMF8wMDBfMDAwXzAwMCwgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IDEwXzAwMF8wMDBfMDAwIH0sXG4gICAgICB9KSkgYXMgYW55O1xuICAgICAgLy8gRnVsbCBiYWxhbmNlIG9mIDUwMCBzd2VwdDsgbm8gbWFyZ2luIGRlZHVjdGVkXG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBVbnNpZ25lZFN3ZWVwVHhNUEN2MiBzdHJ1Y3R1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogMV8wMDBfMDAwLFxuICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgfSkpIGFzIGFueTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzdWx0LnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHgudW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMCcpO1xuICAgICAgdHgudW5zaWduZWRUeC5jb2luU3BlY2lmaWMuY29tbW9uS2V5Q2hhaW4uc2hvdWxkLmVxdWFsKFRFU1RfQkFDS1VQX0tFWSk7XG4gICAgICB0eC5zaWduYXR1cmVTaGFyZXMuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gICAgICB0eC5ub25jZS5zaG91bGQuZXF1YWwoMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWNvdmVyVFNTIOKAlCB1bnNpZ25lZCBzd2VlcCBkaXNwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncm91dGVzIHRvIGJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyB3aGVuIGtleXMgYXJlIHBsYWluIHB1YmxpYyBrZXlzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRTdHViID0gc2FuZGJveC5zdHViKGJhc2Vjb2luIGFzIGFueSwgJ2J1aWxkVW5zaWduZWRTd2VlcFR4blRTUycpLnJlc29sdmVzKHsgdHhSZXF1ZXN0czogW10gfSk7XG4gICAgICBzYW5kYm94LnN0dWIoYmFzZWNvaW4gYXMgYW55LCAndmFsaWRhdGVSZWNvdmVyeVBhcmFtcycpLnJldHVybnModW5kZWZpbmVkKTtcblxuICAgICAgYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkucmVjb3ZlclRTUyh7XG4gICAgICAgIHVzZXJLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkU3R1Yi5jYWxsZWRPbmNlLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transactionBuilder.ts"],"names":[],"mappings":""}