@bitgo/sdk-core 38.19.0 → 38.21.0

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 (100) hide show
  1. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +5 -0
  2. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  3. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  4. package/dist/src/bitgo/environments.d.ts +5 -0
  5. package/dist/src/bitgo/environments.d.ts.map +1 -1
  6. package/dist/src/bitgo/environments.js +3 -2
  7. package/dist/src/bitgo/index.d.ts +1 -0
  8. package/dist/src/bitgo/index.d.ts.map +1 -1
  9. package/dist/src/bitgo/index.js +2 -1
  10. package/dist/src/bitgo/keychain/iKeychains.d.ts +28 -0
  11. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  12. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  13. package/dist/src/bitgo/keychain/keychains.d.ts +47 -6
  14. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  15. package/dist/src/bitgo/keychain/keychains.js +100 -24
  16. package/dist/src/bitgo/safe/iSafe.d.ts +30 -1
  17. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
  18. package/dist/src/bitgo/safe/iSafe.js +1 -1
  19. package/dist/src/bitgo/safe/rootCoin.d.ts +15 -0
  20. package/dist/src/bitgo/safe/rootCoin.d.ts.map +1 -0
  21. package/dist/src/bitgo/safe/rootCoin.js +47 -0
  22. package/dist/src/bitgo/safe/safe.d.ts +17 -1
  23. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  24. package/dist/src/bitgo/safe/safe.js +125 -5
  25. package/dist/src/bitgo/safe/safes.d.ts +0 -5
  26. package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
  27. package/dist/src/bitgo/safe/safes.js +6 -42
  28. package/dist/src/bitgo/utils/index.d.ts +1 -0
  29. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  30. package/dist/src/bitgo/utils/index.js +2 -1
  31. package/dist/src/bitgo/utils/messageTypes.d.ts +6 -0
  32. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -1
  33. package/dist/src/bitgo/utils/messageTypes.js +8 -2
  34. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/mpcUtils.js +19 -1
  36. package/dist/src/bitgo/utils/siws.d.ts +14 -0
  37. package/dist/src/bitgo/utils/siws.d.ts.map +1 -0
  38. package/dist/src/bitgo/utils/siws.js +181 -0
  39. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +2 -2
  40. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +7 -2
  42. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +17 -1
  43. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  44. package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
  45. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +3 -2
  46. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  47. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +18 -2
  48. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +16 -4
  49. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  50. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +24 -10
  51. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +4 -1
  52. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -1
  53. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +11 -1
  54. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +20 -1
  55. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -1
  56. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +55 -1
  57. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +3 -0
  58. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
  59. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +1 -1
  60. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +16 -2
  61. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
  62. package/dist/src/bitgo/utils/tss/recipientUtils.js +70 -3
  63. package/dist/src/bitgo/wallet/BuildParams.d.ts +1 -0
  64. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  65. package/dist/src/bitgo/wallet/BuildParams.js +3 -1
  66. package/dist/src/bitgo/wallet/iWallet.d.ts +26 -0
  67. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  68. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  69. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  70. package/dist/src/bitgo/wallet/wallet.js +70 -17
  71. package/dist/src/bitgo/webauthn/base64url.d.ts +16 -0
  72. package/dist/src/bitgo/webauthn/base64url.d.ts.map +1 -0
  73. package/dist/src/bitgo/webauthn/base64url.js +27 -0
  74. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts +18 -0
  75. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts.map +1 -0
  76. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.js +26 -0
  77. package/dist/src/bitgo/webauthn/derivePassword.d.ts +11 -0
  78. package/dist/src/bitgo/webauthn/derivePassword.d.ts.map +1 -0
  79. package/dist/src/bitgo/webauthn/derivePassword.js +16 -0
  80. package/dist/src/bitgo/webauthn/index.d.ts +5 -0
  81. package/dist/src/bitgo/webauthn/index.d.ts.map +1 -0
  82. package/dist/src/bitgo/webauthn/index.js +21 -0
  83. package/dist/src/bitgo/webauthn/types.d.ts +18 -0
  84. package/dist/src/bitgo/webauthn/types.d.ts.map +1 -0
  85. package/dist/src/bitgo/webauthn/types.js +3 -0
  86. package/dist/test/unit/bitgo/keychain/keychains.js +261 -1
  87. package/dist/test/unit/bitgo/recovery/initiate.js +30 -1
  88. package/dist/test/unit/bitgo/safe/safe.js +171 -1
  89. package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts +2 -0
  90. package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts.map +1 -0
  91. package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.js +109 -0
  92. package/dist/test/unit/bitgo/utils/siws.d.ts +2 -0
  93. package/dist/test/unit/bitgo/utils/siws.d.ts.map +1 -0
  94. package/dist/test/unit/bitgo/utils/siws.js +156 -0
  95. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +224 -18
  96. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +49 -1
  97. package/dist/test/unit/bitgo/wallet/BuildParams.js +14 -1
  98. package/dist/test/unit/bitgo/wallet/tokenApproval.js +10 -1
  99. package/dist/tsconfig.tsbuildinfo +1 -1
  100. package/package.json +6 -6
@@ -0,0 +1,109 @@
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
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const sinon = __importStar(require("sinon"));
41
+ const mpcUtils_1 = require("../../../../src/bitgo/utils/mpcUtils");
42
+ const src_1 = require("../../../../src");
43
+ class TestMpcUtils extends mpcUtils_1.MpcUtils {
44
+ createKeychains() {
45
+ return Promise.reject(new Error('unused'));
46
+ }
47
+ }
48
+ describe('populateIntent unwrap', function () {
49
+ const reqId = new src_1.RequestTracer();
50
+ let mpcUtils;
51
+ let coin;
52
+ beforeEach(function () {
53
+ const mockBitgo = { getEnv: sinon.stub().returns('test') };
54
+ coin = {
55
+ getChain: () => 'hteth',
56
+ getFamily: () => 'eth',
57
+ isEVM: () => true,
58
+ supportsTss: () => true,
59
+ };
60
+ mpcUtils = new TestMpcUtils(mockBitgo, coin);
61
+ });
62
+ afterEach(function () {
63
+ sinon.restore();
64
+ });
65
+ it('flattens unwrapParams onto unwrap intent', function () {
66
+ const unwrapParams = { tokenName: 'hteth:cusdt', amount: '1000000' };
67
+ const feeOptions = { maxFeePerGas: 3000000000, maxPriorityFeePerGas: 2000000000 };
68
+ const intent = mpcUtils.populateIntent(coin, {
69
+ reqId,
70
+ intentType: 'unwrap',
71
+ unwrapParams,
72
+ feeOptions,
73
+ });
74
+ assert_1.default.strictEqual(intent.intentType, 'unwrap');
75
+ assert_1.default.strictEqual(intent.tokenName, unwrapParams.tokenName);
76
+ assert_1.default.strictEqual(intent.amount, unwrapParams.amount);
77
+ assert_1.default.deepStrictEqual(intent.feeOptions, feeOptions);
78
+ assert_1.default.strictEqual(intent.recipients, undefined);
79
+ });
80
+ it('allows partial unshield amounts', function () {
81
+ const unwrapParams = { tokenName: 'hteth:cusdt', amount: '1' };
82
+ const intent = mpcUtils.populateIntent(coin, {
83
+ reqId,
84
+ intentType: 'unwrap',
85
+ unwrapParams,
86
+ });
87
+ assert_1.default.strictEqual(intent.amount, '1');
88
+ });
89
+ it('requires unwrapParams for unwrap', function () {
90
+ assert_1.default.throws(() => mpcUtils.populateIntent(coin, {
91
+ reqId,
92
+ intentType: 'unwrap',
93
+ }), /unwrapParams/);
94
+ });
95
+ it('rejects non-positive unwrapParams.amount', function () {
96
+ assert_1.default.throws(() => mpcUtils.populateIntent(coin, {
97
+ reqId,
98
+ intentType: 'unwrap',
99
+ unwrapParams: { tokenName: 'hteth:cusdt', amount: '0' },
100
+ }), /unwrapParams.amount/);
101
+ });
102
+ it('rejects client-side finalizeUnwrap creation (WP-created only, CHALO-1139)', function () {
103
+ assert_1.default.throws(() => mpcUtils.populateIntent(coin, {
104
+ reqId,
105
+ intentType: 'finalizeUnwrap',
106
+ }), /created by Wallet Platform/);
107
+ });
108
+ });
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBjVXRpbHMudW53cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3V0aWxzL21wY1V0aWxzLnVud3JhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw2Q0FBK0I7QUFHL0IsbUVBQWdFO0FBQ2hFLHlDQUFnRDtBQUVoRCxNQUFNLFlBQWEsU0FBUSxtQkFBUTtJQUNqQyxlQUFlO1FBQ2IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBRUQsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQWEsRUFBRSxDQUFDO0lBQ2xDLElBQUksUUFBc0IsQ0FBQztJQUMzQixJQUFJLElBQWUsQ0FBQztJQUVwQixVQUFVLENBQUM7UUFDVCxNQUFNLFNBQVMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUEwQixDQUFDO1FBQ25GLElBQUksR0FBRztZQUNMLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPO1lBQ3ZCLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ3RCLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1lBQ2pCLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1NBQ0EsQ0FBQztRQUMxQixRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1FBQzdDLE1BQU0sWUFBWSxHQUFHLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDckUsTUFBTSxVQUFVLEdBQUcsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxDQUFDO1FBRWxGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFO1lBQzNDLEtBQUs7WUFDTCxVQUFVLEVBQUUsUUFBUTtZQUNwQixZQUFZO1lBQ1osVUFBVTtTQUNYLENBQUMsQ0FBQztRQUVILGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFL0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUU7WUFDM0MsS0FBSztZQUNMLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFlBQVk7U0FDYixDQUFDLENBQUM7UUFFSCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1FBQ3JDLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUNILFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFO1lBQzVCLEtBQUs7WUFDTCxVQUFVLEVBQUUsUUFBUTtTQUNyQixDQUFDLEVBQ0osY0FBYyxDQUNmLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtRQUM3QyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRTtZQUM1QixLQUFLO1lBQ0wsVUFBVSxFQUFFLFFBQVE7WUFDcEIsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO1NBQ3hELENBQUMsRUFDSixxQkFBcUIsQ0FDdEIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJFQUEyRSxFQUFFO1FBQzlFLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUNILFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFO1lBQzVCLEtBQUs7WUFDTCxVQUFVLEVBQUUsZ0JBQWdCO1NBQzdCLENBQUMsRUFDSiw0QkFBNEIsQ0FDN0IsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBJQmFzZUNvaW4sIEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBNcGNVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy9tcGNVdGlscyc7XG5pbXBvcnQgeyBSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuY2xhc3MgVGVzdE1wY1V0aWxzIGV4dGVuZHMgTXBjVXRpbHMge1xuICBjcmVhdGVLZXljaGFpbnMoKTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndW51c2VkJykpO1xuICB9XG59XG5cbmRlc2NyaWJlKCdwb3B1bGF0ZUludGVudCB1bndyYXAnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgbGV0IG1wY1V0aWxzOiBUZXN0TXBjVXRpbHM7XG4gIGxldCBjb2luOiBJQmFzZUNvaW47XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9ja0JpdGdvID0geyBnZXRFbnY6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0ZXN0JykgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbiAgICBjb2luID0ge1xuICAgICAgZ2V0Q2hhaW46ICgpID0+ICdodGV0aCcsXG4gICAgICBnZXRGYW1pbHk6ICgpID0+ICdldGgnLFxuICAgICAgaXNFVk06ICgpID0+IHRydWUsXG4gICAgICBzdXBwb3J0c1RzczogKCkgPT4gdHJ1ZSxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIG1wY1V0aWxzID0gbmV3IFRlc3RNcGNVdGlscyhtb2NrQml0Z28sIGNvaW4pO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2ZsYXR0ZW5zIHVud3JhcFBhcmFtcyBvbnRvIHVud3JhcCBpbnRlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdW53cmFwUGFyYW1zID0geyB0b2tlbk5hbWU6ICdodGV0aDpjdXNkdCcsIGFtb3VudDogJzEwMDAwMDAnIH07XG4gICAgY29uc3QgZmVlT3B0aW9ucyA9IHsgbWF4RmVlUGVyR2FzOiAzMDAwMDAwMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMjAwMDAwMDAwMCB9O1xuXG4gICAgY29uc3QgaW50ZW50ID0gbXBjVXRpbHMucG9wdWxhdGVJbnRlbnQoY29pbiwge1xuICAgICAgcmVxSWQsXG4gICAgICBpbnRlbnRUeXBlOiAndW53cmFwJyxcbiAgICAgIHVud3JhcFBhcmFtcyxcbiAgICAgIGZlZU9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW50ZW50LmludGVudFR5cGUsICd1bndyYXAnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW50ZW50LnRva2VuTmFtZSwgdW53cmFwUGFyYW1zLnRva2VuTmFtZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGludGVudC5hbW91bnQsIHVud3JhcFBhcmFtcy5hbW91bnQpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoaW50ZW50LmZlZU9wdGlvbnMsIGZlZU9wdGlvbnMpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbnRlbnQucmVjaXBpZW50cywgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ2FsbG93cyBwYXJ0aWFsIHVuc2hpZWxkIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdW53cmFwUGFyYW1zID0geyB0b2tlbk5hbWU6ICdodGV0aDpjdXNkdCcsIGFtb3VudDogJzEnIH07XG5cbiAgICBjb25zdCBpbnRlbnQgPSBtcGNVdGlscy5wb3B1bGF0ZUludGVudChjb2luLCB7XG4gICAgICByZXFJZCxcbiAgICAgIGludGVudFR5cGU6ICd1bndyYXAnLFxuICAgICAgdW53cmFwUGFyYW1zLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGludGVudC5hbW91bnQsICcxJyk7XG4gIH0pO1xuXG4gIGl0KCdyZXF1aXJlcyB1bndyYXBQYXJhbXMgZm9yIHVud3JhcCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgbXBjVXRpbHMucG9wdWxhdGVJbnRlbnQoY29pbiwge1xuICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgIGludGVudFR5cGU6ICd1bndyYXAnLFxuICAgICAgICB9KSxcbiAgICAgIC91bndyYXBQYXJhbXMvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgbm9uLXBvc2l0aXZlIHVud3JhcFBhcmFtcy5hbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIG1wY1V0aWxzLnBvcHVsYXRlSW50ZW50KGNvaW4sIHtcbiAgICAgICAgICByZXFJZCxcbiAgICAgICAgICBpbnRlbnRUeXBlOiAndW53cmFwJyxcbiAgICAgICAgICB1bndyYXBQYXJhbXM6IHsgdG9rZW5OYW1lOiAnaHRldGg6Y3VzZHQnLCBhbW91bnQ6ICcwJyB9LFxuICAgICAgICB9KSxcbiAgICAgIC91bndyYXBQYXJhbXMuYW1vdW50L1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGNsaWVudC1zaWRlIGZpbmFsaXplVW53cmFwIGNyZWF0aW9uIChXUC1jcmVhdGVkIG9ubHksIENIQUxPLTExMzkpJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBtcGNVdGlscy5wb3B1bGF0ZUludGVudChjb2luLCB7XG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbmFsaXplVW53cmFwJyxcbiAgICAgICAgfSksXG4gICAgICAvY3JlYXRlZCBieSBXYWxsZXQgUGxhdGZvcm0vXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=siws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siws.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/utils/siws.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("should");
4
+ const src_1 = require("../../../../src");
5
+ describe('SIWS message validation', () => {
6
+ const SIWS_ADDRESS = '8knfAmJm9BmaX9mZWjAdHBcYPYp3LmuykRQnGwkWQCyj';
7
+ const buildSiws = (overrides = {}) => {
8
+ const domain = overrides.domain ?? 'hastra.io';
9
+ const lines = [
10
+ `${domain} wants you to sign in with your Solana account:`,
11
+ overrides.address ?? SIWS_ADDRESS,
12
+ '',
13
+ ];
14
+ if (overrides.statement !== undefined && overrides.statement !== null) {
15
+ lines.push(overrides.statement, '');
16
+ }
17
+ const fields = [
18
+ `URI: https://${domain}`,
19
+ `Version: ${overrides.version ?? '1'}`,
20
+ `Chain ID: ${overrides.chainId ?? 'mainnet'}`,
21
+ `Nonce: ${overrides.nonce ?? '31a6bab5'}`,
22
+ `Issued At: ${overrides.issuedAt ?? '2026-09-21T10:00:00Z'}`,
23
+ ];
24
+ if (overrides.expirationTime) {
25
+ fields.push(`Expiration Time: ${overrides.expirationTime}`);
26
+ }
27
+ if (overrides.notBefore) {
28
+ fields.push(`Not Before: ${overrides.notBefore}`);
29
+ }
30
+ if (overrides.requestId) {
31
+ fields.push(`Request ID: ${overrides.requestId}`);
32
+ }
33
+ if (overrides.resources) {
34
+ fields.push('Resources:', ...overrides.resources.map((r) => `- ${r}`));
35
+ }
36
+ if (overrides.omit) {
37
+ const omit = overrides.omit;
38
+ for (const o of omit) {
39
+ const i = fields.findIndex((f) => f.startsWith(o));
40
+ if (i >= 0) {
41
+ fields.splice(i, 1);
42
+ }
43
+ }
44
+ }
45
+ lines.push(...fields, ...(overrides.extraLines ?? []));
46
+ return lines.join('\n') + (overrides.trailingNewlines ? '\n' : '');
47
+ };
48
+ describe('valid messages', () => {
49
+ it('accepts a SIWS message with statement and resources', () => {
50
+ (() => (0, src_1.validateSiwsMessage)(buildSiws({ statement: `You are proving you own ${SIWS_ADDRESS}.`, resources: ['https://privy.io'] }))).should.not.throw();
51
+ });
52
+ it('accepts a SIWS message without statement', () => {
53
+ (() => (0, src_1.validateSiwsMessage)(buildSiws({ domain: 'example.com' }))).should.not.throw();
54
+ });
55
+ it('accepts a SIWS message with all optional fields', () => {
56
+ (() => (0, src_1.validateSiwsMessage)(buildSiws({
57
+ domain: 'example.com',
58
+ statement: 'I am the wallet owner.',
59
+ expirationTime: '2026-09-28T10:00:00Z',
60
+ notBefore: '2026-09-21T09:00:00Z',
61
+ requestId: '31a6bab5-1',
62
+ resources: ['https://a.example.com', 'https://b.example.com'],
63
+ }))).should.not.throw();
64
+ });
65
+ it('accepts a multibyte utf-8 statement, solana: chain id and fractional seconds', () => {
66
+ (() => (0, src_1.validateSiwsMessage)(buildSiws({
67
+ domain: 'example.com',
68
+ statement: 'こんにちは、Тестовое сообщение',
69
+ chainId: 'solana:mainnet',
70
+ issuedAt: '2026-09-21T10:00:00.500Z',
71
+ }))).should.not.throw();
72
+ });
73
+ it('accepts trailing newlines and a +05:30 offset', () => {
74
+ (() => (0, src_1.validateSiwsMessage)(buildSiws({
75
+ domain: 'example.com',
76
+ chainId: 'testnet',
77
+ issuedAt: '2026-09-21T10:00:00+05:30',
78
+ trailingNewlines: true,
79
+ }))).should.not.throw();
80
+ });
81
+ });
82
+ describe('rejections', () => {
83
+ const rejects = (message) => (() => (0, src_1.validateSiwsMessage)(message)).should.throw(/not a valid SIWS message/);
84
+ it('rejects an empty message', () => {
85
+ rejects('');
86
+ });
87
+ it('rejects plain text', () => {
88
+ rejects('Hello from dapp');
89
+ });
90
+ it('rejects JSON', () => {
91
+ rejects('{"action":"login"}');
92
+ });
93
+ it('rejects a wrong skeleton', () => {
94
+ rejects('example.com login:\n' +
95
+ SIWS_ADDRESS +
96
+ '\n\nVersion: 1\nChain ID: mainnet\nNonce: 31a6bab5\nIssued At: 2026-09-21T10:00:00Z');
97
+ });
98
+ it('rejects a missing Version, Chain ID, Nonce or Issued At', () => {
99
+ rejects(buildSiws({ omit: ['Version:'] }));
100
+ rejects(buildSiws({ omit: ['Chain ID:'] }));
101
+ rejects(buildSiws({ omit: ['Nonce:'] }));
102
+ rejects(buildSiws({ omit: ['Issued At:'] }));
103
+ });
104
+ it('rejects invalid field values', () => {
105
+ rejects(buildSiws({ version: '2' }));
106
+ rejects(buildSiws({ chainId: 'polygon' }));
107
+ rejects(buildSiws({ nonce: 'abc' }));
108
+ rejects(buildSiws({ nonce: '31a6 bab5!' }));
109
+ rejects(buildSiws({ issuedAt: '2026-09-21 10:00:00Z' }));
110
+ rejects(buildSiws({ issuedAt: '2026-09-21T10:00:61Z' }));
111
+ rejects(buildSiws({ issuedAt: '2026-09-21T24:00:00Z' }));
112
+ rejects(buildSiws({ issuedAt: '2026-09-21T10:00:00+24:00' }));
113
+ });
114
+ it('rejects out-of-order fields', () => {
115
+ const message = [
116
+ 'hastra.io wants you to sign in with your Solana account:',
117
+ SIWS_ADDRESS,
118
+ '',
119
+ 'Nonce: 31a6bab5',
120
+ 'Version: 1',
121
+ 'Chain ID: mainnet',
122
+ 'Issued At: 2026-09-21T10:00:00Z',
123
+ ].join('\n');
124
+ rejects(message);
125
+ });
126
+ it('rejects a stray line after the fields section', () => {
127
+ rejects(buildSiws({ extraLines: ['stray line'] }));
128
+ });
129
+ it('rejects an invalid address line', () => {
130
+ rejects(buildSiws({ address: 'short' }));
131
+ rejects(buildSiws({ address: '0OIl-invalid-base58-characters-000000000000000000' }));
132
+ });
133
+ it('rejects a valued Resources line', () => {
134
+ rejects(buildSiws({ resources: [] }).replace('Resources:', 'Resources: https://x.example.com'));
135
+ });
136
+ it('rejects a blank line inside the fields section', () => {
137
+ const message = [
138
+ 'hastra.io wants you to sign in with your Solana account:',
139
+ SIWS_ADDRESS,
140
+ '',
141
+ 'Version: 1',
142
+ '',
143
+ 'Chain ID: mainnet',
144
+ 'Nonce: 31a6bab5',
145
+ 'Issued At: 2026-09-21T10:00:00Z',
146
+ ].join('\n');
147
+ rejects(message);
148
+ });
149
+ });
150
+ describe('utf-8 strictness', () => {
151
+ it('rejects lone surrogates that Buffer.from would mangle to U+FFFD', () => {
152
+ (() => (0, src_1.validateSiwsMessage)(buildSiws({ statement: 'bad \uD800 statement' }))).should.throw(/message is not valid UTF-8/);
153
+ });
154
+ });
155
+ });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l3cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy9zaXdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0JBQWdCO0FBQ2hCLHlDQUFzRDtBQUV0RCxRQUFRLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO0lBQ3ZDLE1BQU0sWUFBWSxHQUFHLDhDQUE4QyxDQUFDO0lBRXBFLE1BQU0sU0FBUyxHQUFHLENBQUMsWUFBcUMsRUFBRSxFQUFVLEVBQUU7UUFDcEUsTUFBTSxNQUFNLEdBQUksU0FBUyxDQUFDLE1BQWlCLElBQUksV0FBVyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHO1lBQ1osR0FBRyxNQUFNLGlEQUFpRDtZQUN6RCxTQUFTLENBQUMsT0FBa0IsSUFBSSxZQUFZO1lBQzdDLEVBQUU7U0FDSCxDQUFDO1FBQ0YsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3RFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHO1lBQ2IsZ0JBQWdCLE1BQU0sRUFBRTtZQUN4QixZQUFZLFNBQVMsQ0FBQyxPQUFPLElBQUksR0FBRyxFQUFFO1lBQ3RDLGFBQWEsU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUU7WUFDN0MsVUFBVSxTQUFTLENBQUMsS0FBSyxJQUFJLFVBQVUsRUFBRTtZQUN6QyxjQUFjLFNBQVMsQ0FBQyxRQUFRLElBQUksc0JBQXNCLEVBQUU7U0FDN0QsQ0FBQztRQUNGLElBQUksU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFD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QWtDLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtZQUN4RCxNQUFNLE9BQU8sR0FBRztnQkFDZCwwREFBMEQ7Z0JBQzFELFlBQVk7Z0JBQ1osRUFBRTtnQkFDRixZQUFZO2dCQUNaLEVBQUU7Z0JBQ0YsbUJBQW1CO2dCQUNuQixpQkFBaUI7Z0JBQ2pCLGlDQUFpQzthQUNsQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNiLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtRQUNoQyxFQUFFLENBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFO1lBQ3pFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSx5QkFBbUIsRUFBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN4Riw0QkFBNEIsQ0FDN0IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IHZhbGlkYXRlU2l3c01lc3NhZ2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnU0lXUyBtZXNzYWdlIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IFNJV1NfQUREUkVTUyA9ICc4a25mQW1KbTlCbWFYOW1aV2pBZEhCY1lQWXAzTG11eWtSUW5Hd2tXUUN5aic7XG5cbiAgY29uc3QgYnVpbGRTaXdzID0gKG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgZG9tYWluID0gKG92ZXJyaWRlcy5kb21haW4gYXMgc3RyaW5nKSA/PyAnaGFzdHJhLmlvJztcbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGAke2RvbWFpbn0gd2FudHMgeW91IHRvIHNpZ24gaW4gd2l0aCB5b3VyIFNvbGFuYSBhY2NvdW50OmAsXG4gICAgICAob3ZlcnJpZGVzLmFkZHJlc3MgYXMgc3RyaW5nKSA/PyBTSVdTX0FERFJFU1MsXG4gICAgICAnJyxcbiAgICBdO1xuICAgIGlmIChvdmVycmlkZXMuc3RhdGVtZW50ICE9PSB1bmRlZmluZWQgJiYgb3ZlcnJpZGVzLnN0YXRlbWVudCAhPT0gbnVsbCkge1xuICAgICAgbGluZXMucHVzaChvdmVycmlkZXMuc3RhdGVtZW50IGFzIHN0cmluZywgJycpO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICBgVVJJOiBodHRwczovLyR7ZG9tYWlufWAsXG4gICAgICBgVmVyc2lvbjogJHtvdmVycmlkZXMudmVyc2lvbiA/PyAnMSd9YCxcbiAgICAgIGBDaGFpbiBJRDogJHtvdmVycmlkZXMuY2hhaW5JZCA/PyAnbWFpbm5ldCd9YCxcbiAgICAgIGBOb25jZTogJHtvdmVycmlkZXMubm9uY2UgPz8gJzMxYTZiYWI1J31gLFxuICAgICAgYElzc3VlZCBBdDogJHtvdmVycmlkZXMuaXNzdWVkQXQgPz8gJzIwMjYtMDktMjFUMTA6MDA6MDBaJ31gLFxuICAgIF07XG4gICAgaWYgKG92ZXJyaWRlcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgZmllbGRzLnB1c2goYEV4cGlyYXRpb24gVGltZTogJHtvdmVycmlkZXMuZXhwaXJhdGlvblRpbWV9YCk7XG4gICAgfVxuICAgIGlmIChvdmVycmlkZXMubm90QmVmb3JlKSB7XG4gICAgICBmaWVsZHMucHVzaChgTm90IEJlZm9yZTogJHtvdmVycmlkZXMubm90QmVmb3JlfWApO1xuICAgIH1cbiAgICBpZiAob3ZlcnJpZGVzLnJlcXVlc3RJZCkge1xuICAgICAgZmllbGRzLnB1c2goYFJlcXVlc3QgSUQ6ICR7b3ZlcnJpZGVzLnJlcXVlc3RJZH1gKTtcbiAgICB9XG4gICAgaWYgKG92ZXJyaWRlcy5yZXNvdXJjZXMpIHtcbiAgICAgIGZpZWxkcy5wdXNoKCdSZXNvdXJjZXM6JywgLi4uKG92ZXJyaWRlcy5yZXNvdXJjZXMgYXMgc3RyaW5nW10pLm1hcCgocikgPT4gYC0gJHtyfWApKTtcbiAgICB9XG4gICAgaWYgKG92ZXJyaWRlcy5vbWl0KSB7XG4gICAgICBjb25zdCBvbWl0ID0gb3ZlcnJpZGVzLm9taXQgYXMgc3RyaW5nW107XG4gICAgICBmb3IgKGNvbnN0IG8gb2Ygb21pdCkge1xuICAgICAgICBjb25zdCBpID0gZmllbGRzLmZpbmRJbmRleCgoZikgPT4gZi5zdGFydHNXaXRoKG8pKTtcbiAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgIGZpZWxkcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGluZXMucHVzaCguLi5maWVsZHMsIC4uLigob3ZlcnJpZGVzLmV4dHJhTGluZXMgYXMgc3RyaW5nW10pID8/IFtdKSk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpICsgKG92ZXJyaWRlcy50cmFpbGluZ05ld2xpbmVzID8gJ1xcbicgOiAnJyk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkIG1lc3NhZ2VzJywgKCkgPT4ge1xuICAgIGl0KCdhY2NlcHRzIGEgU0lXUyBtZXNzYWdlIHdpdGggc3RhdGVtZW50IGFuZCByZXNvdXJjZXMnLCAoKSA9PiB7XG4gICAgICAoKCkgPT5cbiAgICAgICAgdmFsaWRhdGVTaXdzTWVzc2FnZShcbiAgICAgICAgICBidWlsZFNpd3MoeyBzdGF0ZW1lbnQ6IGBZb3UgYXJlIHByb3ZpbmcgeW91IG93biAke1NJV1NfQUREUkVTU30uYCwgcmVzb3VyY2VzOiBbJ2h0dHBzOi8vcHJpdnkuaW8nXSB9KVxuICAgICAgICApKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWNjZXB0cyBhIFNJV1MgbWVzc2FnZSB3aXRob3V0IHN0YXRlbWVudCcsICgpID0+IHtcbiAgICAgICgoKSA9PiB2YWxpZGF0ZVNpd3NNZXNzYWdlKGJ1aWxkU2l3cyh7IGRvbWFpbjogJ2V4YW1wbGUuY29tJyB9KSkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdhY2NlcHRzIGEgU0lXUyBtZXNzYWdlIHdpdGggYWxsIG9wdGlvbmFsIGZpZWxkcycsICgpID0+IHtcbiAgICAgICgoKSA9PlxuICAgICAgICB2YWxpZGF0ZVNpd3NNZXNzYWdlKFxuICAgICAgICAgIGJ1aWxkU2l3cyh7XG4gICAgICAgICAgICBkb21haW46ICdleGFtcGxlLmNvbScsXG4gICAgICAgICAgICBzdGF0ZW1lbnQ6ICdJIGFtIHRoZSB3YWxsZXQgb3duZXIuJyxcbiAgICAgICAgICAgIGV4cGlyYXRpb25UaW1lOiAnMjAyNi0wOS0yOFQxMDowMDowMFonLFxuICAgICAgICAgICAgbm90QmVmb3JlOiAnMjAyNi0wOS0yMVQwOTowMDowMFonLFxuICAgICAgICAgICAgcmVxdWVzdElkOiAnMzFhNmJhYjUtMScsXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnaHR0cHM6Ly9hLmV4YW1wbGUuY29tJywgJ2h0dHBzOi8vYi5leGFtcGxlLmNvbSddLFxuICAgICAgICAgIH0pXG4gICAgICAgICkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdhY2NlcHRzIGEgbXVsdGlieXRlIHV0Zi04IHN0YXRlbWVudCwgc29sYW5hOiBjaGFpbiBpZCBhbmQgZnJhY3Rpb25hbCBzZWNvbmRzJywgKCkgPT4ge1xuICAgICAgKCgpID0+XG4gICAgICAgIHZhbGlkYXRlU2l3c01lc3NhZ2UoXG4gICAgICAgICAgYnVpbGRTaXdzKHtcbiAgICAgICAgICAgIGRvbWFpbjogJ2V4YW1wbGUuY29tJyxcbiAgICAgICAgICAgIHN0YXRlbWVudDogJ+OBk+OCk+OBq+OBoeOBr+OAgdCi0LXRgdGC0L7QstC+0LUg0YHQvtC+0LHRidC10L3QuNC1JyxcbiAgICAgICAgICAgIGNoYWluSWQ6ICdzb2xhbmE6bWFpbm5ldCcsXG4gICAgICAgICAgICBpc3N1ZWRBdDogJzIwMjYtMDktMjFUMTA6MDA6MDAuNTAwWicsXG4gICAgICAgICAgfSlcbiAgICAgICAgKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FjY2VwdHMgdHJhaWxpbmcgbmV3bGluZXMgYW5kIGEgKzA1OjMwIG9mZnNldCcsICgpID0+IHtcbiAgICAgICgoKSA9PlxuICAgICAgICB2YWxpZGF0ZVNpd3NNZXNzYWdlKFxuICAgICAgICAgIGJ1aWxkU2l3cyh7XG4gICAgICAgICAgICBkb21haW46ICdleGFtcGxlLmNvbScsXG4gICAgICAgICAgICBjaGFpbklkOiAndGVzdG5ldCcsXG4gICAgICAgICAgICBpc3N1ZWRBdDogJzIwMjYtMDktMjFUMTA6MDA6MDArMDU6MzAnLFxuICAgICAgICAgICAgdHJhaWxpbmdOZXdsaW5lczogdHJ1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICApKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWplY3Rpb25zJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlamVjdHMgPSAobWVzc2FnZTogc3RyaW5nKSA9PiAoKCkgPT4gdmFsaWRhdGVTaXdzTWVzc2FnZShtZXNzYWdlKSkuc2hvdWxkLnRocm93KC9ub3QgYSB2YWxpZCBTSVdTIG1lc3NhZ2UvKTtcblxuICAgIGl0KCdyZWplY3RzIGFuIGVtcHR5IG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICByZWplY3RzKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIHBsYWluIHRleHQnLCAoKSA9PiB7XG4gICAgICByZWplY3RzKCdIZWxsbyBmcm9tIGRhcHAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIEpTT04nLCAoKSA9PiB7XG4gICAgICByZWplY3RzKCd7XCJhY3Rpb25cIjpcImxvZ2luXCJ9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHdyb25nIHNrZWxldG9uJywgKCkgPT4ge1xuICAgICAgcmVqZWN0cyhcbiAgICAgICAgJ2V4YW1wbGUuY29tIGxvZ2luOlxcbicgK1xuICAgICAgICAgIFNJV1NfQUREUkVTUyArXG4gICAgICAgICAgJ1xcblxcblZlcnNpb246IDFcXG5DaGFpbiBJRDogbWFpbm5ldFxcbk5vbmNlOiAzMWE2YmFiNVxcbklzc3VlZCBBdDogMjAyNi0wOS0yMVQxMDowMDowMFonXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBtaXNzaW5nIFZlcnNpb24sIENoYWluIElELCBOb25jZSBvciBJc3N1ZWQgQXQnLCAoKSA9PiB7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IG9taXQ6IFsnVmVyc2lvbjonXSB9KSk7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IG9taXQ6IFsnQ2hhaW4gSUQ6J10gfSkpO1xuICAgICAgcmVqZWN0cyhidWlsZFNpd3MoeyBvbWl0OiBbJ05vbmNlOiddIH0pKTtcbiAgICAgIHJlamVjdHMoYnVpbGRTaXdzKHsgb21pdDogWydJc3N1ZWQgQXQ6J10gfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgaW52YWxpZCBmaWVsZCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IHZlcnNpb246ICcyJyB9KSk7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IGNoYWluSWQ6ICdwb2x5Z29uJyB9KSk7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IG5vbmNlOiAnYWJjJyB9KSk7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IG5vbmNlOiAnMzFhNiBiYWI1IScgfSkpO1xuICAgICAgcmVqZWN0cyhidWlsZFNpd3MoeyBpc3N1ZWRBdDogJzIwMjYtMDktMjEgMTA6MDA6MDBaJyB9KSk7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IGlzc3VlZEF0OiAnMjAyNi0wOS0yMVQxMDowMDo2MVonIH0pKTtcbiAgICAgIHJlamVjdHMoYnVpbGRTaXdzKHsgaXNzdWVkQXQ6ICcyMDI2LTA5LTIxVDI0OjAwOjAwWicgfSkpO1xuICAgICAgcmVqZWN0cyhidWlsZFNpd3MoeyBpc3N1ZWRBdDogJzIwMjYtMDktMjFUMTA6MDA6MDArMjQ6MDAnIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIG91dC1vZi1vcmRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gW1xuICAgICAgICAnaGFzdHJhLmlvIHdhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBTb2xhbmEgYWNjb3VudDonLFxuICAgICAgICBTSVdTX0FERFJFU1MsXG4gICAgICAgICcnLFxuICAgICAgICAnTm9uY2U6IDMxYTZiYWI1JyxcbiAgICAgICAgJ1ZlcnNpb246IDEnLFxuICAgICAgICAnQ2hhaW4gSUQ6IG1haW5uZXQnLFxuICAgICAgICAnSXNzdWVkIEF0OiAyMDI2LTA5LTIxVDEwOjAwOjAwWicsXG4gICAgICBdLmpvaW4oJ1xcbicpO1xuICAgICAgcmVqZWN0cyhtZXNzYWdlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgc3RyYXkgbGluZSBhZnRlciB0aGUgZmllbGRzIHNlY3Rpb24nLCAoKSA9PiB7XG4gICAgICByZWplY3RzKGJ1aWxkU2l3cyh7IGV4dHJhTGluZXM6IFsnc3RyYXkgbGluZSddIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGFuIGludmFsaWQgYWRkcmVzcyBsaW5lJywgKCkgPT4ge1xuICAgICAgcmVqZWN0cyhidWlsZFNpd3MoeyBhZGRyZXNzOiAnc2hvcnQnIH0pKTtcbiAgICAgIHJlamVjdHMoYnVpbGRTaXdzKHsgYWRkcmVzczogJzBPSWwtaW52YWxpZC1iYXNlNTgtY2hhcmFjdGVycy0wMDAwMDAwMDAwMDAwMDAwMDAnIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgdmFsdWVkIFJlc291cmNlcyBsaW5lJywgKCkgPT4ge1xuICAgICAgcmVqZWN0cyhidWlsZFNpd3MoeyByZXNvdXJjZXM6IFtdIH0pLnJlcGxhY2UoJ1Jlc291cmNlczonLCAnUmVzb3VyY2VzOiBodHRwczovL3guZXhhbXBsZS5jb20nKSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIGJsYW5rIGxpbmUgaW5zaWRlIHRoZSBmaWVsZHMgc2VjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXG4gICAgICAgICdoYXN0cmEuaW8gd2FudHMgeW91IHRvIHNpZ24gaW4gd2l0aCB5b3VyIFNvbGFuYSBhY2NvdW50OicsXG4gICAgICAgIFNJV1NfQUREUkVTUyxcbiAgICAgICAgJycsXG4gICAgICAgICdWZXJzaW9uOiAxJyxcbiAgICAgICAgJycsXG4gICAgICAgICdDaGFpbiBJRDogbWFpbm5ldCcsXG4gICAgICAgICdOb25jZTogMzFhNmJhYjUnLFxuICAgICAgICAnSXNzdWVkIEF0OiAyMDI2LTA5LTIxVDEwOjAwOjAwWicsXG4gICAgICBdLmpvaW4oJ1xcbicpO1xuICAgICAgcmVqZWN0cyhtZXNzYWdlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3V0Zi04IHN0cmljdG5lc3MnLCAoKSA9PiB7XG4gICAgaXQoJ3JlamVjdHMgbG9uZSBzdXJyb2dhdGVzIHRoYXQgQnVmZmVyLmZyb20gd291bGQgbWFuZ2xlIHRvIFUrRkZGRCcsICgpID0+IHtcbiAgICAgICgoKSA9PiB2YWxpZGF0ZVNpd3NNZXNzYWdlKGJ1aWxkU2l3cyh7IHN0YXRlbWVudDogJ2JhZCBcXHVEODAwIHN0YXRlbWVudCcgfSkpKS5zaG91bGQudGhyb3coXG4gICAgICAgIC9tZXNzYWdlIGlzIG5vdCB2YWxpZCBVVEYtOC9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=