@cubist-labs/cubesigner-sdk 0.2.28 → 0.3.1

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 (143) hide show
  1. package/README.md +30 -28
  2. package/dist/cjs/package.json +41 -0
  3. package/dist/cjs/spec/env/beta.json +9 -0
  4. package/dist/cjs/spec/env/gamma.json +9 -0
  5. package/dist/cjs/spec/env/prod.json +9 -0
  6. package/dist/cjs/src/api.d.ts +634 -0
  7. package/dist/cjs/src/api.js +1309 -0
  8. package/dist/cjs/src/client.d.ts +575 -0
  9. package/dist/cjs/src/client.js +378 -0
  10. package/dist/cjs/src/env.d.ts +15 -0
  11. package/dist/cjs/src/env.js +35 -0
  12. package/dist/cjs/src/error.d.ts +29 -0
  13. package/dist/cjs/src/error.js +36 -0
  14. package/dist/cjs/src/events.d.ts +84 -0
  15. package/dist/cjs/src/events.js +195 -0
  16. package/dist/cjs/src/index.d.ts +203 -0
  17. package/dist/cjs/src/index.js +298 -0
  18. package/dist/cjs/src/key.d.ts +152 -0
  19. package/dist/cjs/src/key.js +242 -0
  20. package/dist/{src/fido.d.ts → cjs/src/mfa.d.ts} +33 -15
  21. package/dist/cjs/src/mfa.js +169 -0
  22. package/dist/cjs/src/org.d.ts +99 -0
  23. package/dist/cjs/src/org.js +95 -0
  24. package/dist/cjs/src/paginator.d.ts +76 -0
  25. package/dist/cjs/src/paginator.js +99 -0
  26. package/dist/cjs/src/response.d.ts +101 -0
  27. package/dist/cjs/src/response.js +164 -0
  28. package/dist/cjs/src/role.d.ts +283 -0
  29. package/dist/cjs/src/role.js +253 -0
  30. package/dist/cjs/src/schema.d.ts +6209 -0
  31. package/dist/cjs/src/schema.js +7 -0
  32. package/dist/cjs/src/schema_types.d.ts +113 -0
  33. package/dist/cjs/src/schema_types.js +3 -0
  34. package/dist/cjs/src/session/session_storage.d.ts +27 -0
  35. package/dist/cjs/src/session/session_storage.js +47 -0
  36. package/dist/cjs/src/session/signer_session_manager.d.ts +125 -0
  37. package/dist/cjs/src/session/signer_session_manager.js +239 -0
  38. package/dist/cjs/src/signer_session.d.ts +41 -0
  39. package/dist/cjs/src/signer_session.js +77 -0
  40. package/dist/cjs/src/user_export.d.ts +52 -0
  41. package/dist/cjs/src/user_export.js +129 -0
  42. package/dist/cjs/src/util.d.ts +56 -0
  43. package/dist/cjs/src/util.js +86 -0
  44. package/dist/esm/package.json +41 -0
  45. package/dist/esm/spec/env/beta.json +9 -0
  46. package/dist/esm/spec/env/gamma.json +9 -0
  47. package/dist/esm/spec/env/prod.json +9 -0
  48. package/dist/esm/src/api.d.ts +634 -0
  49. package/dist/esm/src/api.js +1299 -0
  50. package/dist/esm/src/client.d.ts +575 -0
  51. package/dist/esm/src/client.js +374 -0
  52. package/dist/esm/src/env.d.ts +15 -0
  53. package/dist/esm/src/env.js +9 -0
  54. package/dist/esm/src/error.d.ts +29 -0
  55. package/dist/esm/src/error.js +31 -0
  56. package/dist/esm/src/events.d.ts +84 -0
  57. package/dist/esm/src/events.js +189 -0
  58. package/dist/esm/src/index.d.ts +203 -0
  59. package/dist/esm/src/index.js +276 -0
  60. package/dist/esm/src/key.d.ts +152 -0
  61. package/dist/esm/src/key.js +236 -0
  62. package/dist/esm/src/mfa.d.ts +94 -0
  63. package/dist/esm/src/mfa.js +163 -0
  64. package/dist/esm/src/org.d.ts +99 -0
  65. package/dist/esm/src/org.js +91 -0
  66. package/dist/esm/src/paginator.d.ts +76 -0
  67. package/dist/esm/src/paginator.js +94 -0
  68. package/dist/esm/src/response.d.ts +101 -0
  69. package/dist/esm/src/response.js +159 -0
  70. package/dist/esm/src/role.d.ts +283 -0
  71. package/dist/esm/src/role.js +248 -0
  72. package/dist/esm/src/schema.d.ts +6209 -0
  73. package/dist/esm/src/schema.js +6 -0
  74. package/dist/esm/src/schema_types.d.ts +113 -0
  75. package/dist/esm/src/schema_types.js +2 -0
  76. package/dist/esm/src/session/session_storage.d.ts +27 -0
  77. package/dist/esm/src/session/session_storage.js +43 -0
  78. package/dist/esm/src/session/signer_session_manager.d.ts +125 -0
  79. package/dist/esm/src/session/signer_session_manager.js +235 -0
  80. package/dist/esm/src/signer_session.d.ts +41 -0
  81. package/dist/esm/src/signer_session.js +72 -0
  82. package/dist/esm/src/user_export.d.ts +52 -0
  83. package/dist/esm/src/user_export.js +99 -0
  84. package/dist/esm/src/util.d.ts +56 -0
  85. package/dist/esm/src/util.js +76 -0
  86. package/dist/package.json +13 -45
  87. package/dist/src/api.d.ts +29 -1
  88. package/dist/src/api.js +66 -1
  89. package/dist/src/client.d.ts +35 -14
  90. package/dist/src/client.js +12 -8
  91. package/dist/src/events.js +1 -1
  92. package/dist/src/index.d.ts +6 -11
  93. package/dist/src/index.js +9 -25
  94. package/dist/src/key.d.ts +18 -7
  95. package/dist/src/key.js +52 -19
  96. package/dist/src/role.d.ts +46 -3
  97. package/dist/src/role.js +60 -8
  98. package/dist/src/schema.d.ts +206 -72
  99. package/dist/src/schema.js +1 -1
  100. package/dist/src/schema_types.d.ts +3 -0
  101. package/dist/src/schema_types.js +1 -1
  102. package/dist/src/session/signer_session_manager.d.ts +38 -14
  103. package/dist/src/session/signer_session_manager.js +93 -33
  104. package/dist/src/util.d.ts +14 -0
  105. package/dist/src/util.js +24 -27
  106. package/package.json +19 -46
  107. package/src/api.ts +79 -0
  108. package/src/client.ts +12 -8
  109. package/src/events.ts +2 -0
  110. package/src/index.ts +10 -24
  111. package/src/key.ts +36 -18
  112. package/src/role.ts +78 -7
  113. package/src/schema.ts +269 -110
  114. package/src/schema_types.ts +3 -0
  115. package/src/session/session_storage.ts +0 -32
  116. package/src/session/signer_session_manager.ts +124 -36
  117. package/src/util.ts +19 -10
  118. package/tsconfig.json +1 -21
  119. package/LICENSE-APACHE +0 -177
  120. package/LICENSE-MIT +0 -25
  121. package/NOTICE +0 -13
  122. package/dist/examples/ethers.d.ts +0 -1
  123. package/dist/examples/ethers.js +0 -142
  124. package/dist/src/ethers/index.d.ts +0 -95
  125. package/dist/src/ethers/index.js +0 -215
  126. package/dist/src/fido.js +0 -148
  127. package/dist/src/session/cognito_manager.d.ts +0 -71
  128. package/dist/src/session/cognito_manager.js +0 -129
  129. package/dist/src/session/generic.d.ts +0 -47
  130. package/dist/src/session/generic.js +0 -3
  131. package/dist/src/session/management_session_manager.d.ts +0 -59
  132. package/dist/src/session/management_session_manager.js +0 -111
  133. package/dist/src/session/oidc_session_manager.d.ts +0 -78
  134. package/dist/src/session/oidc_session_manager.js +0 -142
  135. package/dist/src/session/session_manager.d.ts +0 -99
  136. package/dist/src/session/session_manager.js +0 -136
  137. package/dist/src/sign.d.ts +0 -114
  138. package/dist/src/sign.js +0 -248
  139. package/dist/test/sessions.d.ts +0 -35
  140. package/dist/test/sessions.js +0 -56
  141. package/src/ethers/index.ts +0 -253
  142. package/src/session/cognito_manager.ts +0 -161
  143. package/src/session/session_manager.ts +0 -165
package/dist/src/sign.js DELETED
@@ -1,248 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
- if (kind === "m") throw new TypeError("Private method is not writable");
9
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
- };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
- var _SignResponse_cs, _SignResponse_orgId, _SignResponse_roleId, _SignResponse_signFn, _SignResponse_resp, _Sign_orgId, _Sign_ss;
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.Sign = exports.SignResponse = void 0;
19
- const assert_1 = __importDefault(require("assert"));
20
- const _1 = require(".");
21
- const env_1 = require("./env");
22
- /**
23
- * A response of a signing request.
24
- */
25
- class SignResponse {
26
- /** @return {boolean} True if this signing request requires an MFA approval */
27
- requiresMfa() {
28
- return __classPrivateFieldGet(this, _SignResponse_resp, "f").accepted?.MfaRequired !== undefined;
29
- }
30
- /** @return {U} The signed data */
31
- data() {
32
- return __classPrivateFieldGet(this, _SignResponse_resp, "f");
33
- }
34
- /**
35
- * Approves the MFA request.
36
- *
37
- * Note: This only works for MFA requests that require a single approval.
38
- *
39
- * @return {SignResponse<U>} The result of signing with the approval
40
- */
41
- async approve() {
42
- const mfaRequired = __classPrivateFieldGet(this, _SignResponse_resp, "f").accepted?.MfaRequired;
43
- if (!mfaRequired) {
44
- throw new Error("Request does not require MFA approval");
45
- }
46
- const mfaId = mfaRequired.id;
47
- const mfaApproval = await _1.Role.mfaApprove(__classPrivateFieldGet(this, _SignResponse_cs, "f"), __classPrivateFieldGet(this, _SignResponse_orgId, "f"), __classPrivateFieldGet(this, _SignResponse_roleId, "f"), mfaId);
48
- (0, assert_1.default)(mfaApproval.id === mfaId);
49
- (0, assert_1.default)(mfaApproval.receipt);
50
- const mfaConf = mfaApproval.receipt?.confirmation;
51
- if (!mfaConf) {
52
- throw new Error("MfaRequest has not been approved yet");
53
- }
54
- const headers = {
55
- "x-cubist-mfa-id": mfaId,
56
- "x-cubist-mfa-confirmation": mfaConf,
57
- };
58
- return new SignResponse(__classPrivateFieldGet(this, _SignResponse_cs, "f"), __classPrivateFieldGet(this, _SignResponse_orgId, "f"), __classPrivateFieldGet(this, _SignResponse_roleId, "f"), __classPrivateFieldGet(this, _SignResponse_signFn, "f"), await __classPrivateFieldGet(this, _SignResponse_signFn, "f").call(this, headers));
59
- }
60
- // --------------------------------------------------------------------------
61
- // -- INTERNAL --------------------------------------------------------------
62
- // --------------------------------------------------------------------------
63
- /**
64
- * Constructor.
65
- *
66
- * @param {CubeSigner} cs The CubeSigner instance to use for requests
67
- * @param {string} orgId The org id of the corresponding signing request
68
- * @param {string} roleId The role id of the corresponding signing request
69
- * @param {SignFn} signFn The signing function that this response is from.
70
- * This argument is used to resend requests with
71
- * different headers if needed.
72
- * @param {U | AcceptedResponse} resp The response as returned by the OpenAPI
73
- * client.
74
- */
75
- constructor(cs, orgId, roleId, signFn, resp) {
76
- _SignResponse_cs.set(this, void 0);
77
- _SignResponse_orgId.set(this, void 0);
78
- _SignResponse_roleId.set(this, void 0);
79
- _SignResponse_signFn.set(this, void 0);
80
- _SignResponse_resp.set(this, void 0);
81
- __classPrivateFieldSet(this, _SignResponse_cs, cs, "f");
82
- __classPrivateFieldSet(this, _SignResponse_orgId, orgId, "f");
83
- __classPrivateFieldSet(this, _SignResponse_roleId, roleId, "f");
84
- __classPrivateFieldSet(this, _SignResponse_signFn, signFn, "f");
85
- __classPrivateFieldSet(this, _SignResponse_resp, resp, "f");
86
- }
87
- }
88
- exports.SignResponse = SignResponse;
89
- _SignResponse_cs = new WeakMap(), _SignResponse_orgId = new WeakMap(), _SignResponse_roleId = new WeakMap(), _SignResponse_signFn = new WeakMap(), _SignResponse_resp = new WeakMap();
90
- /**
91
- * Wrapper around sign operations.
92
- */
93
- class Sign {
94
- /**
95
- * Submit an 'eth1' sign request.
96
- * @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
97
- * @param {Eth1SignRequest} req What to sign.
98
- * @return {Promise<Eth1SignResponse | AcceptedResponse>} Signature
99
- */
100
- async eth1(key, req) {
101
- const pubkey = typeof key === "string" ? key : key.materialId;
102
- const sign = async (headers) => {
103
- const resp = await (await __classPrivateFieldGet(this, _Sign_ss, "f").client()).post("/v1/org/{org_id}/eth1/sign/{pubkey}", {
104
- params: { path: { org_id: __classPrivateFieldGet(this, _Sign_orgId, "f"), pubkey } },
105
- body: req,
106
- headers: headers,
107
- parseAs: "json",
108
- });
109
- return (0, env_1.assertOk)(resp);
110
- };
111
- return new SignResponse(__classPrivateFieldGet(this, _Sign_ss, "f").cs, __classPrivateFieldGet(this, _Sign_orgId, "f"), __classPrivateFieldGet(this, _Sign_ss, "f").roleId, sign, await sign());
112
- }
113
- /**
114
- * Submit an 'eth2' sign request.
115
- * @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
116
- * @param {Eth2SignRequest} req What to sign.
117
- * @return {Promise<Eth2SignResponse | AcceptedResponse>} Signature
118
- */
119
- async eth2(key, req) {
120
- const pubkey = typeof key === "string" ? key : key.materialId;
121
- const sign = async (headers) => {
122
- const resp = await (await __classPrivateFieldGet(this, _Sign_ss, "f").client()).post("/v1/org/{org_id}/eth2/sign/{pubkey}", {
123
- params: { path: { org_id: __classPrivateFieldGet(this, _Sign_orgId, "f"), pubkey } },
124
- body: req,
125
- headers: headers,
126
- parseAs: "json",
127
- });
128
- return (0, env_1.assertOk)(resp);
129
- };
130
- return new SignResponse(__classPrivateFieldGet(this, _Sign_ss, "f").cs, __classPrivateFieldGet(this, _Sign_orgId, "f"), __classPrivateFieldGet(this, _Sign_ss, "f").roleId, sign, await sign());
131
- }
132
- /**
133
- * Sign a stake request.
134
- * @param {Eth2StakeRequest} req The request to sign.
135
- * @return {Promise<Eth2StakeResponse | AcceptedResponse>} The response.
136
- */
137
- async stake(req) {
138
- const sign = async (headers) => {
139
- const resp = await (await __classPrivateFieldGet(this, _Sign_ss, "f").client()).post("/v1/org/{org_id}/eth2/stake", {
140
- params: { path: { org_id: __classPrivateFieldGet(this, _Sign_orgId, "f") } },
141
- body: req,
142
- headers: headers,
143
- parseAs: "json",
144
- });
145
- return (0, env_1.assertOk)(resp);
146
- };
147
- return new SignResponse(__classPrivateFieldGet(this, _Sign_ss, "f").cs, __classPrivateFieldGet(this, _Sign_orgId, "f"), __classPrivateFieldGet(this, _Sign_ss, "f").roleId, sign, await sign());
148
- }
149
- /**
150
- * Sign an unstake request.
151
- * @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
152
- * @param {Eth2UnstakeRequest} req The request to sign.
153
- * @return {Promise<Eth2UnstakeResponse | AcceptedResponse>} The response.
154
- */
155
- async unstake(key, req) {
156
- const pubkey = typeof key === "string" ? key : key.materialId;
157
- const sign = async (headers) => {
158
- const resp = await (await __classPrivateFieldGet(this, _Sign_ss, "f").client()).post("/v1/org/{org_id}/eth2/unstake/{pubkey}", {
159
- params: { path: { org_id: __classPrivateFieldGet(this, _Sign_orgId, "f"), pubkey } },
160
- body: req,
161
- headers: headers,
162
- parseAs: "json",
163
- });
164
- return (0, env_1.assertOk)(resp);
165
- };
166
- return new SignResponse(__classPrivateFieldGet(this, _Sign_ss, "f").cs, __classPrivateFieldGet(this, _Sign_orgId, "f"), __classPrivateFieldGet(this, _Sign_ss, "f").roleId, sign, await sign());
167
- }
168
- /**
169
- * Sign a raw blob.
170
- * @param {Key | string} key The key to sign with (either {@link Key} or its ID).
171
- * @param {BlobSignRequest} req What to sign
172
- * @return {Promise<BlobSignResponse | AcceptedResponse>} The response.
173
- */
174
- async blob(key, req) {
175
- const key_id = typeof key === "string" ? key : key.id;
176
- const sign = async (headers) => {
177
- const resp = await (await __classPrivateFieldGet(this, _Sign_ss, "f").client()).post("/v1/org/{org_id}/blob/sign/{key_id}", {
178
- params: {
179
- path: { org_id: __classPrivateFieldGet(this, _Sign_orgId, "f"), key_id },
180
- },
181
- body: req,
182
- headers: headers,
183
- parseAs: "json",
184
- });
185
- return (0, env_1.assertOk)(resp);
186
- };
187
- return new SignResponse(__classPrivateFieldGet(this, _Sign_ss, "f").cs, __classPrivateFieldGet(this, _Sign_orgId, "f"), __classPrivateFieldGet(this, _Sign_ss, "f").roleId, sign, await sign());
188
- }
189
- /**
190
- * Sign a bitcoin message.
191
- * @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
192
- * @param {BtcSignRequest} req What to sign
193
- * @return {Promise<BtcSignResponse | AcceptedResponse>} The response.
194
- */
195
- async btc(key, req) {
196
- const pubkey = typeof key === "string" ? key : key.materialId;
197
- const sign = async (headers) => {
198
- const resp = await (await __classPrivateFieldGet(this, _Sign_ss, "f").client()).post("/v0/org/{org_id}/btc/sign/{pubkey}", {
199
- params: {
200
- path: { org_id: __classPrivateFieldGet(this, _Sign_orgId, "f"), pubkey },
201
- },
202
- body: req,
203
- headers: headers,
204
- parseAs: "json",
205
- });
206
- return (0, env_1.assertOk)(resp);
207
- };
208
- return new SignResponse(__classPrivateFieldGet(this, _Sign_ss, "f").cs, __classPrivateFieldGet(this, _Sign_orgId, "f"), __classPrivateFieldGet(this, _Sign_ss, "f").roleId, sign, await sign());
209
- }
210
- /**
211
- * Sign a solana message.
212
- * @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
213
- * @param {SolanaSignRequest} req What to sign
214
- * @return {Promise<SolanaSignResponse | AcceptedResponse>} The response.
215
- */
216
- async solana(key, req) {
217
- const pubkey = typeof key === "string" ? key : key.materialId;
218
- const sign = async (headers) => {
219
- const resp = await (await __classPrivateFieldGet(this, _Sign_ss, "f").client()).post("/v1/org/{org_id}/solana/sign/{pubkey}", {
220
- params: { path: { org_id: __classPrivateFieldGet(this, _Sign_orgId, "f"), pubkey } },
221
- body: req,
222
- headers: headers,
223
- parseAs: "json",
224
- });
225
- return (0, env_1.assertOk)(resp);
226
- };
227
- return new SignResponse(__classPrivateFieldGet(this, _Sign_ss, "f").cs, __classPrivateFieldGet(this, _Sign_orgId, "f"), __classPrivateFieldGet(this, _Sign_ss, "f").roleId, sign, await sign());
228
- }
229
- // --------------------------------------------------------------------------
230
- // -- INTERNAL --------------------------------------------------------------
231
- // --------------------------------------------------------------------------
232
- /* eslint-disable require-jsdoc */
233
- /**
234
- * Constructor.
235
- *
236
- * @param {string} orgId Organization ID
237
- * @param {SignerSession} ss The signer session to use for signing requests
238
- */
239
- constructor(orgId, ss) {
240
- _Sign_orgId.set(this, void 0);
241
- _Sign_ss.set(this, void 0);
242
- __classPrivateFieldSet(this, _Sign_orgId, orgId, "f");
243
- __classPrivateFieldSet(this, _Sign_ss, ss, "f");
244
- }
245
- }
246
- exports.Sign = Sign;
247
- _Sign_orgId = new WeakMap(), _Sign_ss = new WeakMap();
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qix3QkFBeUQ7QUFFekQsK0JBQWlDO0FBMENqQzs7R0FFRztBQUNILE1BQWEsWUFBWTtJQU92Qiw4RUFBOEU7SUFDOUUsV0FBVztRQUNULE9BQVEsdUJBQUEsSUFBSSwwQkFBMkIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxLQUFLLFNBQVMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUk7UUFDRixPQUFPLHVCQUFBLElBQUksMEJBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLFdBQVcsR0FBSSx1QkFBQSxJQUFJLDBCQUEyQixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUM7UUFDM0UsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDMUQ7UUFFRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBSSxDQUFDLFVBQVUsQ0FBQyx1QkFBQSxJQUFJLHdCQUFJLEVBQUUsdUJBQUEsSUFBSSwyQkFBTyxFQUFFLHVCQUFBLElBQUksNEJBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RixJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFz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Ozs7OztPQUtHO0lBQ0gsWUFBWSxLQUFhLEVBQUUsRUFBaUI7UUFqTG5DLDhCQUFlO1FBQ2YsMkJBQW1CO1FBaUwxQix1QkFBQSxJQUFJLGVBQVUsS0FBSyxNQUFBLENBQUM7UUFDcEIsdUJBQUEsSUFBSSxZQUFPLEVBQUUsTUFBQSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQXRMRCxvQkFzTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IEN1YmVTaWduZXIsIEtleSwgUm9sZSwgU2lnbmVyU2Vzc2lvbiB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBjb21wb25lbnRzLCBwYXRocyB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgYXNzZXJ0T2sgfSBmcm9tIFwiLi9lbnZcIjtcblxuLyogZXNsaW50LWRpc2FibGUgKi9cbmV4cG9ydCB0eXBlIEV0aDFTaWduUmVxdWVzdCA9XG4gIHBhdGhzW1wiL3YxL29yZy97b3JnX2lkfS9ldGgxL3NpZ24ve3B1YmtleX1cIl1bXCJwb3N0XCJdW1wicmVxdWVzdEJvZHlcIl1bXCJjb250ZW50XCJdW1wiYXBwbGljYXRpb24vanNvblwiXTtcbmV4cG9ydCB0eXBlIEV0aDJTaWduUmVxdWVzdCA9XG4gIHBhdGhzW1wiL3YxL29yZy97b3JnX2lkfS9ldGgyL3NpZ24ve3B1YmtleX1cIl1bXCJwb3N0XCJdW1wicmVxdWVzdEJvZHlcIl1bXCJjb250ZW50XCJdW1wiYXBwbGljYXRpb24vanNvblwiXTtcbmV4cG9ydCB0eXBlIEV0aDJTdGFrZVJlcXVlc3QgPVxuICBwYXRoc1tcIi92MS9vcmcve29yZ19pZH0vZXRoMi9zdGFrZVwiXVtcInBvc3RcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgRXRoMlVuc3Rha2VSZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjEvb3JnL3tvcmdfaWR9L2V0aDIvdW5zdGFrZS97cHVia2V5fVwiXVtcInBvc3RcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgQmxvYlNpZ25SZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjEvb3JnL3tvcmdfaWR9L2Jsb2Ivc2lnbi97a2V5X2lkfVwiXVtcInBvc3RcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgQnRjU2lnblJlcXVlc3QgPVxuICBwYXRoc1tcIi92MC9vcmcve29yZ19pZH0vYnRjL3NpZ24ve3B1YmtleX1cIl1bXCJwb3N0XCJdW1wicmVxdWVzdEJvZHlcIl1bXCJjb250ZW50XCJdW1wiYXBwbGljYXRpb24vanNvblwiXTtcbmV4cG9ydCB0eXBlIFNvbGFuYVNpZ25SZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjEvb3JnL3tvcmdfaWR9L3NvbGFuYS9zaWduL3twdWJrZXl9XCJdW1wicG9zdFwiXVtcInJlcXVlc3RCb2R5XCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5cbmV4cG9ydCB0eXBlIEV0aDFTaWduUmVzcG9uc2UgPVxuICBjb21wb25lbnRzW1wicmVzcG9uc2VzXCJdW1wiRXRoMVNpZ25SZXNwb25zZVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgRXRoMlNpZ25SZXNwb25zZSA9XG4gIGNvbXBvbmVudHNbXCJyZXNwb25zZXNcIl1bXCJFdGgyU2lnblJlc3BvbnNlXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBFdGgyU3Rha2VSZXNwb25zZSA9XG4gIGNvbXBvbmVudHNbXCJyZXNwb25zZXNcIl1bXCJTdGFrZVJlc3BvbnNlXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBFdGgyVW5zdGFrZVJlc3BvbnNlID1cbiAgY29tcG9uZW50c1tcInJlc3BvbnNlc1wiXVtcIlVuc3Rha2VSZXNwb25zZVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgQmxvYlNpZ25SZXNwb25zZSA9XG4gIGNvbXBvbmVudHNbXCJyZXNwb25zZXNcIl1bXCJCbG9iU2lnblJlc3BvbnNlXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBCdGNTaWduUmVzcG9uc2UgPVxuICBjb21wb25lbnRzW1wicmVzcG9uc2VzXCJdW1wiQnRjU2lnblJlc3BvbnNlXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBTb2xhbmFTaWduUmVzcG9uc2UgPVxuICBjb21wb25lbnRzW1wicmVzcG9uc2VzXCJdW1wiU29sYW5hU2lnblJlc3BvbnNlXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBNZmFSZXF1ZXN0SW5mbyA9XG4gIGNvbXBvbmVudHNbXCJyZXNwb25zZXNcIl1bXCJNZmFSZXF1ZXN0SW5mb1wiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuXG5leHBvcnQgdHlwZSBBY2NlcHRlZFJlc3BvbnNlID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJBY2NlcHRlZFJlc3BvbnNlXCJdO1xuZXhwb3J0IHR5cGUgRXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiRXJyb3JSZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIEJ0Y1NpZ25hdHVyZUtpbmQgPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIkJ0Y1NpZ25hdHVyZUtpbmRcIl07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnR5cGUgU2lnbkZuPFU+ID0gKGhlYWRlcnM/OiBIZWFkZXJzSW5pdCkgPT4gUHJvbWlzZTxVIHwgQWNjZXB0ZWRSZXNwb25zZT47XG5cbi8qKlxuICogQSByZXNwb25zZSBvZiBhIHNpZ25pbmcgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25SZXNwb25zZTxVPiB7XG4gIHJlYWRvbmx5ICNjczogQ3ViZVNpZ25lcjtcbiAgcmVhZG9ubHkgI29yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5ICNyb2xlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgI3NpZ25GbjogU2lnbkZuPFU+O1xuICByZWFkb25seSAjcmVzcDogVSB8IEFjY2VwdGVkUmVzcG9uc2U7XG5cbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaWduaW5nIHJlcXVlc3QgcmVxdWlyZXMgYW4gTUZBIGFwcHJvdmFsICovXG4gIHJlcXVpcmVzTWZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy4jcmVzcCBhcyBBY2NlcHRlZFJlc3BvbnNlKS5hY2NlcHRlZD8uTWZhUmVxdWlyZWQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJuIHtVfSBUaGUgc2lnbmVkIGRhdGEgKi9cbiAgZGF0YSgpOiBVIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzcCBhcyBVO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmVzIHRoZSBNRkEgcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZTogVGhpcyBvbmx5IHdvcmtzIGZvciBNRkEgcmVxdWVzdHMgdGhhdCByZXF1aXJlIGEgc2luZ2xlIGFwcHJvdmFsLlxuICAgKlxuICAgKiBAcmV0dXJuIHtTaWduUmVzcG9uc2U8VT59IFRoZSByZXN1bHQgb2Ygc2lnbmluZyB3aXRoIHRoZSBhcHByb3ZhbFxuICAgKi9cbiAgYXN5bmMgYXBwcm92ZSgpOiBQcm9taXNlPFNpZ25SZXNwb25zZTxVPj4ge1xuICAgIGNvbnN0IG1mYVJlcXVpcmVkID0gKHRoaXMuI3Jlc3AgYXMgQWNjZXB0ZWRSZXNwb25zZSkuYWNjZXB0ZWQ/Lk1mYVJlcXVpcmVkO1xuICAgIGlmICghbWZhUmVxdWlyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlcXVlc3QgZG9lcyBub3QgcmVxdWlyZSBNRkEgYXBwcm92YWxcIik7XG4gICAgfVxuXG4gICAgY29uc3QgbWZhSWQgPSBtZmFSZXF1aXJlZC5pZDtcbiAgICBjb25zdCBtZmFBcHByb3ZhbCA9IGF3YWl0IFJvbGUubWZhQXBwcm92ZSh0aGlzLiNjcywgdGhpcy4jb3JnSWQsIHRoaXMuI3JvbGVJZCwgbWZhSWQpO1xuICAgIGFzc2VydChtZmFBcHByb3ZhbC5pZCA9PT0gbWZhSWQpO1xuICAgIGFzc2VydChtZmFBcHByb3ZhbC5yZWNlaXB0KTtcblxuICAgIGNvbnN0IG1mYUNvbmYgPSBtZmFBcHByb3ZhbC5yZWNlaXB0Py5jb25maXJtYXRpb247XG4gICAgaWYgKCFtZmFDb25mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZmFSZXF1ZXN0IGhhcyBub3QgYmVlbiBhcHByb3ZlZCB5ZXRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIFwieC1jdWJpc3QtbWZhLWlkXCI6IG1mYUlkLFxuICAgICAgXCJ4LWN1YmlzdC1tZmEtY29uZmlybWF0aW9uXCI6IG1mYUNvbmYsXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFNpZ25SZXNwb25zZShcbiAgICAgIHRoaXMuI2NzLFxuICAgICAgdGhpcy4jb3JnSWQsXG4gICAgICB0aGlzLiNyb2xlSWQsXG4gICAgICB0aGlzLiNzaWduRm4sXG4gICAgICBhd2FpdCB0aGlzLiNzaWduRm4oaGVhZGVycyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tIElOVEVSTkFMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1YmVTaWduZXJ9IGNzIFRoZSBDdWJlU2lnbmVyIGluc3RhbmNlIHRvIHVzZSBmb3IgcmVxdWVzdHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9yZ0lkIFRoZSBvcmcgaWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmluZyByZXF1ZXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb2xlSWQgVGhlIHJvbGUgaWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmluZyByZXF1ZXN0XG4gICAqIEBwYXJhbSB7U2lnbkZufSBzaWduRm4gVGhlIHNpZ25pbmcgZnVuY3Rpb24gdGhhdCB0aGlzIHJlc3BvbnNlIGlzIGZyb20uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIHJlc2VuZCByZXF1ZXN0cyB3aXRoXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGhlYWRlcnMgaWYgbmVlZGVkLlxuICAgKiBAcGFyYW0ge1UgfCBBY2NlcHRlZFJlc3BvbnNlfSByZXNwIFRoZSByZXNwb25zZSBhcyByZXR1cm5lZCBieSB0aGUgT3BlbkFQSVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNzOiBDdWJlU2lnbmVyLFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgcm9sZUlkOiBzdHJpbmcsXG4gICAgc2lnbkZuOiBTaWduRm48VT4sXG4gICAgcmVzcDogVSB8IEFjY2VwdGVkUmVzcG9uc2UsXG4gICkge1xuICAgIHRoaXMuI2NzID0gY3M7XG4gICAgdGhpcy4jb3JnSWQgPSBvcmdJZDtcbiAgICB0aGlzLiNyb2xlSWQgPSByb2xlSWQ7XG4gICAgdGhpcy4jc2lnbkZuID0gc2lnbkZuO1xuICAgIHRoaXMuI3Jlc3AgPSByZXNwO1xuICB9XG59XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgc2lnbiBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgU2lnbiB7XG4gIHJlYWRvbmx5ICNvcmdJZDogc3RyaW5nO1xuICByZWFkb25seSAjc3M6IFNpZ25lclNlc3Npb247XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhbiAnZXRoMScgc2lnbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0tleSB8IHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gc2lnbiB3aXRoIChlaXRoZXIge0BsaW5rIEtleX0gb3IgaXRzIG1hdGVyaWFsIElEKS5cbiAgICogQHBhcmFtIHtFdGgxU2lnblJlcXVlc3R9IHJlcSBXaGF0IHRvIHNpZ24uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXRoMVNpZ25SZXNwb25zZSB8IEFjY2VwdGVkUmVzcG9uc2U+fSBTaWduYXR1cmVcbiAgICovXG4gIGFzeW5jIGV0aDEoa2V5OiBLZXkgfCBzdHJpbmcsIHJlcTogRXRoMVNpZ25SZXF1ZXN0KTogUHJvbWlzZTxTaWduUmVzcG9uc2U8RXRoMVNpZ25SZXNwb25zZT4+IHtcbiAgICBjb25zdCBwdWJrZXkgPSB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiID8gKGtleSBhcyBzdHJpbmcpIDoga2V5Lm1hdGVyaWFsSWQ7XG4gICAgY29uc3Qgc2lnbiA9IGFzeW5jIChoZWFkZXJzPzogSGVhZGVyc0luaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IHRoaXMuI3NzLmNsaWVudCgpXG4gICAgICApLnBvc3QoXCIvdjEvb3JnL3tvcmdfaWR9L2V0aDEvc2lnbi97cHVia2V5fVwiLCB7XG4gICAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHB1YmtleSB9IH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuI3NzLmNzLCB0aGlzLiNvcmdJZCwgdGhpcy4jc3Mucm9sZUlkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhbiAnZXRoMicgc2lnbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0tleSB8IHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gc2lnbiB3aXRoIChlaXRoZXIge0BsaW5rIEtleX0gb3IgaXRzIG1hdGVyaWFsIElEKS5cbiAgICogQHBhcmFtIHtFdGgyU2lnblJlcXVlc3R9IHJlcSBXaGF0IHRvIHNpZ24uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXRoMlNpZ25SZXNwb25zZSB8IEFjY2VwdGVkUmVzcG9uc2U+fSBTaWduYXR1cmVcbiAgICovXG4gIGFzeW5jIGV0aDIoa2V5OiBLZXkgfCBzdHJpbmcsIHJlcTogRXRoMlNpZ25SZXF1ZXN0KTogUHJvbWlzZTxTaWduUmVzcG9uc2U8RXRoMlNpZ25SZXNwb25zZT4+IHtcbiAgICBjb25zdCBwdWJrZXkgPSB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiID8gKGtleSBhcyBzdHJpbmcpIDoga2V5Lm1hdGVyaWFsSWQ7XG4gICAgY29uc3Qgc2lnbiA9IGFzeW5jIChoZWFkZXJzPzogSGVhZGVyc0luaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IHRoaXMuI3NzLmNsaWVudCgpXG4gICAgICApLnBvc3QoXCIvdjEvb3JnL3tvcmdfaWR9L2V0aDIvc2lnbi97cHVia2V5fVwiLCB7XG4gICAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHB1YmtleSB9IH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuI3NzLmNzLCB0aGlzLiNvcmdJZCwgdGhpcy4jc3Mucm9sZUlkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBzdGFrZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0V0aDJTdGFrZVJlcXVlc3R9IHJlcSBUaGUgcmVxdWVzdCB0byBzaWduLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV0aDJTdGFrZVJlc3BvbnNlIHwgQWNjZXB0ZWRSZXNwb25zZT59IFRoZSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIHN0YWtlKHJlcTogRXRoMlN0YWtlUmVxdWVzdCk6IFByb21pc2U8U2lnblJlc3BvbnNlPEV0aDJTdGFrZVJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHNpZ24gPSBhc3luYyAoaGVhZGVycz86IEhlYWRlcnNJbml0KSA9PiB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCB0aGlzLiNzcy5jbGllbnQoKVxuICAgICAgKS5wb3N0KFwiL3YxL29yZy97b3JnX2lkfS9ldGgyL3N0YWtlXCIsIHtcbiAgICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLiNvcmdJZCB9IH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuI3NzLmNzLCB0aGlzLiNvcmdJZCwgdGhpcy4jc3Mucm9sZUlkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYW4gdW5zdGFrZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0tleSB8IHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gc2lnbiB3aXRoIChlaXRoZXIge0BsaW5rIEtleX0gb3IgaXRzIG1hdGVyaWFsIElEKS5cbiAgICogQHBhcmFtIHtFdGgyVW5zdGFrZVJlcXVlc3R9IHJlcSBUaGUgcmVxdWVzdCB0byBzaWduLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV0aDJVbnN0YWtlUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gVGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgdW5zdGFrZShcbiAgICBrZXk6IEtleSB8IHN0cmluZyxcbiAgICByZXE6IEV0aDJVbnN0YWtlUmVxdWVzdCxcbiAgKTogUHJvbWlzZTxTaWduUmVzcG9uc2U8RXRoMlVuc3Rha2VSZXNwb25zZT4+IHtcbiAgICBjb25zdCBwdWJrZXkgPSB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiID8gKGtleSBhcyBzdHJpbmcpIDoga2V5Lm1hdGVyaWFsSWQ7XG4gICAgY29uc3Qgc2lnbiA9IGFzeW5jIChoZWFkZXJzPzogSGVhZGVyc0luaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IHRoaXMuI3NzLmNsaWVudCgpXG4gICAgICApLnBvc3QoXCIvdjEvb3JnL3tvcmdfaWR9L2V0aDIvdW5zdGFrZS97cHVia2V5fVwiLCB7XG4gICAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHB1YmtleSB9IH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuI3NzLmNzLCB0aGlzLiNvcmdJZCwgdGhpcy4jc3Mucm9sZUlkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSByYXcgYmxvYi5cbiAgICogQHBhcmFtIHtLZXkgfCBzdHJpbmd9IGtleSBUaGUga2V5IHRvIHNpZ24gd2l0aCAoZWl0aGVyIHtAbGluayBLZXl9IG9yIGl0cyBJRCkuXG4gICAqIEBwYXJhbSB7QmxvYlNpZ25SZXF1ZXN0fSByZXEgV2hhdCB0byBzaWduXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QmxvYlNpZ25SZXNwb25zZSB8IEFjY2VwdGVkUmVzcG9uc2U+fSBUaGUgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyBibG9iKGtleTogS2V5IHwgc3RyaW5nLCByZXE6IEJsb2JTaWduUmVxdWVzdCk6IFByb21pc2U8U2lnblJlc3BvbnNlPEJsb2JTaWduUmVzcG9uc2U+PiB7XG4gICAgY29uc3Qga2V5X2lkID0gdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IChrZXkgYXMgc3RyaW5nKSA6IGtleS5pZDtcbiAgICBjb25zdCBzaWduID0gYXN5bmMgKGhlYWRlcnM/OiBIZWFkZXJzSW5pdCkgPT4ge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgICAgYXdhaXQgdGhpcy4jc3MuY2xpZW50KClcbiAgICAgICkucG9zdChcIi92MS9vcmcve29yZ19pZH0vYmxvYi9zaWduL3trZXlfaWR9XCIsIHtcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcGF0aDogeyBvcmdfaWQ6IHRoaXMuI29yZ0lkLCBrZXlfaWQgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogcmVxLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBTaWduUmVzcG9uc2UodGhpcy4jc3MuY3MsIHRoaXMuI29yZ0lkLCB0aGlzLiNzcy5yb2xlSWQsIHNpZ24sIGF3YWl0IHNpZ24oKSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIGJpdGNvaW4gbWVzc2FnZS5cbiAgICogQHBhcmFtIHtLZXkgfCBzdHJpbmd9IGtleSBUaGUga2V5IHRvIHNpZ24gd2l0aCAoZWl0aGVyIHtAbGluayBLZXl9IG9yIGl0cyBtYXRlcmlhbCBJRCkuXG4gICAqIEBwYXJhbSB7QnRjU2lnblJlcXVlc3R9IHJlcSBXaGF0IHRvIHNpZ25cbiAgICogQHJldHVybiB7UHJvbWlzZTxCdGNTaWduUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gVGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgYnRjKGtleTogS2V5IHwgc3RyaW5nLCByZXE6IEJ0Y1NpZ25SZXF1ZXN0KTogUHJvbWlzZTxTaWduUmVzcG9uc2U8QnRjU2lnblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHB1YmtleSA9IHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgPyAoa2V5IGFzIHN0cmluZykgOiBrZXkubWF0ZXJpYWxJZDtcbiAgICBjb25zdCBzaWduID0gYXN5bmMgKGhlYWRlcnM/OiBIZWFkZXJzSW5pdCkgPT4ge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgICAgYXdhaXQgdGhpcy4jc3MuY2xpZW50KClcbiAgICAgICkucG9zdChcIi92MC9vcmcve29yZ19pZH0vYnRjL3NpZ24ve3B1YmtleX1cIiwge1xuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHB1YmtleSB9LFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiByZXEsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXNzZXJ0T2socmVzcCk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFNpZ25SZXNwb25zZSh0aGlzLiNzcy5jcywgdGhpcy4jb3JnSWQsIHRoaXMuI3NzLnJvbGVJZCwgc2lnbiwgYXdhaXQgc2lnbigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgc29sYW5hIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7S2V5IHwgc3RyaW5nfSBrZXkgVGhlIGtleSB0byBzaWduIHdpdGggKGVpdGhlciB7QGxpbmsgS2V5fSBvciBpdHMgbWF0ZXJpYWwgSUQpLlxuICAgKiBAcGFyYW0ge1NvbGFuYVNpZ25SZXF1ZXN0fSByZXEgV2hhdCB0byBzaWduXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U29sYW5hU2lnblJlc3BvbnNlIHwgQWNjZXB0ZWRSZXNwb25zZT59IFRoZSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIHNvbGFuYShcbiAgICBrZXk6IEtleSB8IHN0cmluZyxcbiAgICByZXE6IFNvbGFuYVNpZ25SZXF1ZXN0LFxuICApOiBQcm9taXNlPFNpZ25SZXNwb25zZTxTb2xhbmFTaWduUmVzcG9uc2U+PiB7XG4gICAgY29uc3QgcHVia2V5ID0gdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IChrZXkgYXMgc3RyaW5nKSA6IGtleS5tYXRlcmlhbElkO1xuICAgIGNvbnN0IHNpZ24gPSBhc3luYyAoaGVhZGVycz86IEhlYWRlcnNJbml0KSA9PiB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCB0aGlzLiNzcy5jbGllbnQoKVxuICAgICAgKS5wb3N0KFwiL3YxL29yZy97b3JnX2lkfS9zb2xhbmEvc2lnbi97cHVia2V5fVwiLCB7XG4gICAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHB1YmtleSB9IH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuI3NzLmNzLCB0aGlzLiNvcmdJZCwgdGhpcy4jc3Mucm9sZUlkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0gSU5URVJOQUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWpzZG9jICovXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnSWQgT3JnYW5pemF0aW9uIElEXG4gICAqIEBwYXJhbSB7U2lnbmVyU2Vzc2lvbn0gc3MgVGhlIHNpZ25lciBzZXNzaW9uIHRvIHVzZSBmb3Igc2lnbmluZyByZXF1ZXN0c1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3JnSWQ6IHN0cmluZywgc3M6IFNpZ25lclNlc3Npb24pIHtcbiAgICB0aGlzLiNvcmdJZCA9IG9yZ0lkO1xuICAgIHRoaXMuI3NzID0gc3M7XG4gIH1cbn1cbiJdfQ==
@@ -1,35 +0,0 @@
1
- import { EnvInterface } from "../src/env";
2
- /**
3
- * Defaults.
4
- */
5
- export declare class CubeSignerDefaults {
6
- /** Default signer-session.json file path
7
- * @return {string} Default signer-session.json file path
8
- */
9
- static signerSessionFile(): string;
10
- /** Default management-session.json file path
11
- * @return {string} Default management-session.json file path
12
- */
13
- static managementSessionFile(): string;
14
- }
15
- /** JSON representation of our "management session" file format */
16
- export interface ManagementSession {
17
- email: string;
18
- id_token: string;
19
- access_token: string;
20
- refresh_token: string;
21
- expiration: string;
22
- env: {
23
- ["Dev-CubeSignerStack"]: EnvInterface;
24
- };
25
- }
26
- /** JSON representation of our "signer session" file format */
27
- export interface SignerSession {
28
- org_id: string;
29
- role_id: string;
30
- purpose: string;
31
- token: string;
32
- env: {
33
- ["Dev-CubeSignerStack"]: EnvInterface;
34
- };
35
- }
@@ -1,56 +0,0 @@
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 (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.CubeSignerDefaults = void 0;
27
- const path = __importStar(require("path"));
28
- /**
29
- * Directory where CubeSigner stores config files.
30
- * @return {string} Config dir
31
- */
32
- function configDir() {
33
- const configDir = process.platform === "darwin"
34
- ? `${process.env.HOME}/Library/Application Support`
35
- : `${process.env.HOME}/.config`;
36
- return path.join(configDir, "cubesigner");
37
- }
38
- /**
39
- * Defaults.
40
- */
41
- class CubeSignerDefaults {
42
- /** Default signer-session.json file path
43
- * @return {string} Default signer-session.json file path
44
- */
45
- static signerSessionFile() {
46
- return path.join(configDir(), "signer-session.json");
47
- }
48
- /** Default management-session.json file path
49
- * @return {string} Default management-session.json file path
50
- */
51
- static managementSessionFile() {
52
- return path.join(configDir(), "management-session.json");
53
- }
54
- }
55
- exports.CubeSignerDefaults = CubeSignerDefaults;
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L3Nlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBRzdCOzs7R0FHRztBQUNILFNBQVMsU0FBUztJQUNoQixNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLDhCQUE4QjtRQUNuRCxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDN0I7O09BRUc7SUFDSCxNQUFNLENBQUMsaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBZEQsZ0RBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBFbnZJbnRlcmZhY2UgfSBmcm9tIFwiLi4vc3JjL2VudlwiO1xuXG4vKipcbiAqIERpcmVjdG9yeSB3aGVyZSBDdWJlU2lnbmVyIHN0b3JlcyBjb25maWcgZmlsZXMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IENvbmZpZyBkaXJcbiAqL1xuZnVuY3Rpb24gY29uZmlnRGlyKCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZ0RpciA9XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIlxuICAgICAgPyBgJHtwcm9jZXNzLmVudi5IT01FfS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnRgXG4gICAgICA6IGAke3Byb2Nlc3MuZW52LkhPTUV9Ly5jb25maWdgO1xuICByZXR1cm4gcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJjdWJlc2lnbmVyXCIpO1xufVxuXG4vKipcbiAqIERlZmF1bHRzLlxuICovXG5leHBvcnQgY2xhc3MgQ3ViZVNpZ25lckRlZmF1bHRzIHtcbiAgLyoqIERlZmF1bHQgc2lnbmVyLXNlc3Npb24uanNvbiBmaWxlIHBhdGhcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZWZhdWx0IHNpZ25lci1zZXNzaW9uLmpzb24gZmlsZSBwYXRoXG4gICAqL1xuICBzdGF0aWMgc2lnbmVyU2Vzc2lvbkZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGNvbmZpZ0RpcigpLCBcInNpZ25lci1zZXNzaW9uLmpzb25cIik7XG4gIH1cblxuICAvKiogRGVmYXVsdCBtYW5hZ2VtZW50LXNlc3Npb24uanNvbiBmaWxlIHBhdGhcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZWZhdWx0IG1hbmFnZW1lbnQtc2Vzc2lvbi5qc29uIGZpbGUgcGF0aFxuICAgKi9cbiAgc3RhdGljIG1hbmFnZW1lbnRTZXNzaW9uRmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oY29uZmlnRGlyKCksIFwibWFuYWdlbWVudC1zZXNzaW9uLmpzb25cIik7XG4gIH1cbn1cblxuLyoqIEpTT04gcmVwcmVzZW50YXRpb24gb2Ygb3VyIFwibWFuYWdlbWVudCBzZXNzaW9uXCIgZmlsZSBmb3JtYXQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlbWVudFNlc3Npb24ge1xuICBlbWFpbDogc3RyaW5nO1xuICBpZF90b2tlbjogc3RyaW5nO1xuICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgcmVmcmVzaF90b2tlbjogc3RyaW5nO1xuICBleHBpcmF0aW9uOiBzdHJpbmc7XG4gIGVudjoge1xuICAgIFtcIkRldi1DdWJlU2lnbmVyU3RhY2tcIl06IEVudkludGVyZmFjZTtcbiAgfTtcbn1cblxuLyoqIEpTT04gcmVwcmVzZW50YXRpb24gb2Ygb3VyIFwic2lnbmVyIHNlc3Npb25cIiBmaWxlIGZvcm1hdCAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduZXJTZXNzaW9uIHtcbiAgb3JnX2lkOiBzdHJpbmc7XG4gIHJvbGVfaWQ6IHN0cmluZztcbiAgcHVycG9zZTogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICBlbnY6IHtcbiAgICBbXCJEZXYtQ3ViZVNpZ25lclN0YWNrXCJdOiBFbnZJbnRlcmZhY2U7XG4gIH07XG59XG4iXX0=
@@ -1,253 +0,0 @@
1
- import {
2
- JsonRpcApiProvider,
3
- TypedDataDomain,
4
- TypedDataEncoder,
5
- TypedDataField,
6
- ethers,
7
- getBytes,
8
- toBeHex,
9
- } from "ethers";
10
- import { SignerSession } from "../signer_session";
11
- import { CubeSignerResponse } from "../response";
12
- import { BlobSignRequest, EvmSignRequest, MfaRequestInfo } from "../schema_types";
13
- import { KeyInfo } from "../key";
14
- import assert from "assert";
15
-
16
- /** Options for the signer */
17
- interface SignerOptions {
18
- /** Optional provider to use */
19
- provider?: null | ethers.Provider;
20
- /**
21
- * The function to call when MFA information is retrieved. If this callback
22
- * throws, no transaction is broadcast.
23
- */
24
- onMfaPoll?: (arg0: MfaRequestInfo) => void;
25
- /**
26
- * The amount of time (in milliseconds) to wait between checks for MFA
27
- * updates. Default is 1000ms
28
- */
29
- mfaPollIntervalMs?: number;
30
- }
31
-
32
- /**
33
- * A ethers.js Signer using CubeSigner
34
- */
35
- export class Signer extends ethers.AbstractSigner {
36
- /** The address of the account */
37
- readonly #address: string;
38
-
39
- /** The key to use for signing */
40
- #key?: KeyInfo;
41
-
42
- /** The underlying session */
43
- readonly #signerSession: SignerSession;
44
-
45
- /**
46
- * The function to call when MFA information is retrieved. If this callback
47
- * throws, no transaction is broadcast.
48
- */
49
- readonly #onMfaPoll: (arg0: MfaRequestInfo) => void;
50
-
51
- /** The amount of time to wait between checks for MFA updates */
52
- readonly #mfaPollIntervalMs: number;
53
-
54
- /**
55
- * Create new Signer instance
56
- * @param {KeyInfo | string} address The key or the eth address of the account to use.
57
- * @param {SignerSession} signerSession The underlying Signer session.
58
- * @param {SignerOptions} options The options to use for the Signer instance
59
- */
60
- constructor(address: KeyInfo | string, signerSession: SignerSession, options?: SignerOptions) {
61
- super(options?.provider);
62
- if (typeof address === "string") {
63
- this.#address = address;
64
- } else {
65
- this.#address = address.materialId;
66
- this.#key = address as KeyInfo;
67
- }
68
- this.#signerSession = signerSession;
69
- this.#onMfaPoll = options?.onMfaPoll ?? ((/* _mfaInfo: MfaRequestInfo */) => {}); // eslint-disable-line @typescript-eslint/no-empty-function
70
- this.#mfaPollIntervalMs = options?.mfaPollIntervalMs ?? 1000;
71
- }
72
-
73
- /** Resolves to the signer address. */
74
- async getAddress(): Promise<string> {
75
- return this.#address;
76
- }
77
-
78
- /**
79
- * Returns the signer connected to %%provider%%.
80
- * @param {null | ethers.Provider} provider The optional provider instance to use.
81
- * @return {Signer} The signer connected to signer.
82
- */
83
- connect(provider: null | ethers.Provider): Signer {
84
- return new Signer(this.#address, this.#signerSession, { provider });
85
- }
86
-
87
- /**
88
- * Construct a signing request from a transaction. This populates the transaction
89
- * type to `0x02` (EIP-1559) unless set.
90
- *
91
- * @param {ethers.TransactionRequest} tx The transaction
92
- * @return {EvmSignRequest} The EVM sign request to be sent to CubeSigner
93
- */
94
- async evmSignRequestFromTx(tx: ethers.TransactionRequest): Promise<EvmSignRequest> {
95
- // get the chain id from the network or tx
96
- let chainId = tx.chainId;
97
- if (chainId === undefined) {
98
- const network = await this.provider?.getNetwork();
99
- chainId = network?.chainId?.toString() ?? "1";
100
- }
101
-
102
- // Convert the transaction into a JSON-RPC transaction
103
- const rpcTx =
104
- this.provider instanceof JsonRpcApiProvider
105
- ? this.provider.getRpcTransaction(tx)
106
- : // We can just call the getRpcTransaction with a
107
- // null receiver since it doesn't actually use it
108
- // (and really should be declared static).
109
- JsonRpcApiProvider.prototype.getRpcTransaction.call(null, tx);
110
- rpcTx.type = toBeHex(tx.type ?? 0x02, 1); // we expect 0x0[0-2]
111
-
112
- return <EvmSignRequest>{
113
- chain_id: Number(chainId),
114
- tx: rpcTx,
115
- };
116
- }
117
-
118
- /**
119
- * Sign a transaction. This method will block if the key requires MFA approval.
120
- * @param {ethers.TransactionRequest} tx The transaction to sign.
121
- * @return {Promise<string>} Hex-encoded RLP encoding of the transaction and its signature.
122
- */
123
- async signTransaction(tx: ethers.TransactionRequest): Promise<string> {
124
- const req = await this.evmSignRequestFromTx(tx);
125
- const res = await this.#signerSession.signEvm(this.#address, req);
126
- const data = await this.#handleMfa(res);
127
- return data.rlp_signed_tx;
128
- }
129
-
130
- /**
131
- * Signs arbitrary messages. This uses ethers.js's [hashMessage](https://docs.ethers.org/v6/api/hashing/#hashMessage)
132
- * to compute the EIP-191 digest and signs this digest using {@link Key#signBlob}.
133
- * The key (for this session) must have the `"AllowRawBlobSigning"` policy attached.
134
- * @param {string | Uint8Array} message The message to sign.
135
- * @return {Promise<string>} The signature.
136
- */
137
- async signMessage(message: string | Uint8Array): Promise<string> {
138
- const digest = ethers.hashMessage(message);
139
- return this.signBlob(digest);
140
- }
141
-
142
- /**
143
- * Signs EIP-712 typed data. This uses ethers.js's
144
- * [TypedDataEncoder.hash](https://docs.ethers.org/v6/api/hashing/#TypedDataEncoder_hash)
145
- * to compute the EIP-712 digest and signs this digest using {@link Key#signBlob}.
146
- * The key (for this session) must have the `"AllowRawBlobSigning"` policy attached.
147
- * @param {TypedDataDomain} domain The domain of the typed data.
148
- * @param {Record<string, Array<TypedDataField>>} types The types of the typed data.
149
- * @param {Record<string, any>} value The value of the typed data.
150
- * @return {Promise<string>} The signature.
151
- */
152
- async signTypedData(
153
- domain: TypedDataDomain,
154
- types: Record<string, Array<TypedDataField>>,
155
- value: Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any
156
- ): Promise<string> {
157
- const digest = TypedDataEncoder.hash(domain, types, value);
158
- return this.signBlob(digest);
159
- }
160
-
161
- /**
162
- * Sign arbitrary digest. This uses {@link Key#signBlob}.
163
- * @param {string} digest The digest to sign.
164
- * @return {Promise<string>} The signature.
165
- */
166
- private async signBlob(digest: string): Promise<string> {
167
- const blobReq = <BlobSignRequest>{
168
- message_base64: Buffer.from(getBytes(digest)).toString("base64"),
169
- };
170
- // Get the key corresponding to this address
171
- if (this.#key === undefined) {
172
- const key = (await this.#signerSession.keys()).find((k) => k.material_id === this.#address);
173
- if (key === undefined) {
174
- throw new Error(`Cannot access key '${this.#address}'`);
175
- }
176
- this.#key = key;
177
- }
178
-
179
- const res = await this.#signerSession.signBlob(this.#key.key_id, blobReq);
180
- const data = await this.#handleMfa(res);
181
-
182
- const signature = data.signature;
183
- assert(signature.startsWith("0x"));
184
- assert(signature.length == 132);
185
- const vAdj = (parseInt(signature.slice(130), 16) + 27).toString(16);
186
- return signature.slice(0, 130) + vAdj;
187
- }
188
-
189
- /**
190
- * Initialize the signing a message using MFA approvals. This method populates
191
- * missing fields. If the signing does not require MFA, this method throws.
192
- * @param {ethers.TransactionRequest} tx The transaction to send.
193
- * @return {string} The MFA id associated with the signing request.
194
- */
195
- async sendTransactionMfaInit(tx: ethers.TransactionRequest): Promise<string> {
196
- const popTx = await this.populateTransaction(tx);
197
- const req = await this.evmSignRequestFromTx(popTx);
198
- const res = await this.#signerSession.signEvm(this.#address, req);
199
- return res.mfaId();
200
- }
201
-
202
- /**
203
- * Send a transaction from an approved MFA request. The MFA request contains
204
- * information about the approved signing request, which this method will
205
- * execute.
206
- * @param {MfaRequestInfo} mfaInfo The approved MFA request.
207
- * @return {ethers.TransactionResponse} The result of submitting the transaction
208
- */
209
- async sendTransactionMfaApproved(mfaInfo: MfaRequestInfo): Promise<ethers.TransactionResponse> {
210
- if (!mfaInfo.request.path.includes("/eth1/sign/")) {
211
- throw new Error(`Expected EVM transaction signing request, got ${mfaInfo.request.path}`);
212
- }
213
- if (!mfaInfo.request.path.includes(this.#address)) {
214
- throw new Error(
215
- `Expected signing request for ${this.#address} but got ${mfaInfo.request.path}`,
216
- );
217
- }
218
-
219
- const signedTx = await this.#signerSession.signEvm(
220
- this.#address,
221
- mfaInfo.request.body as EvmSignRequest,
222
- {
223
- mfaId: mfaInfo.id,
224
- mfaOrgId: this.#signerSession.orgId,
225
- mfaConf: mfaInfo.receipt!.confirmation,
226
- },
227
- );
228
- return await this.provider!.broadcastTransaction(signedTx.data().rlp_signed_tx);
229
- }
230
-
231
- /**
232
- * If the sign request requires MFA, this method waits for approvals
233
- * @param {CubeSignerResponse<U>} res The response of a sign request
234
- * @return {Promise<U>} The sign data after MFA approvals
235
- */
236
- async #handleMfa<U>(res: CubeSignerResponse<U>): Promise<U> {
237
- while (res.requiresMfa()) {
238
- await new Promise((resolve) => setTimeout(resolve, this.#mfaPollIntervalMs));
239
-
240
- const mfaId = res.mfaId();
241
- const mfaInfo = await this.#signerSession.getMfaInfo(mfaId);
242
- this.#onMfaPoll(mfaInfo);
243
- if (mfaInfo.receipt) {
244
- res = await res.signWithMfaApproval({
245
- mfaId,
246
- mfaOrgId: this.#signerSession.orgId,
247
- mfaConf: mfaInfo.receipt.confirmation,
248
- });
249
- }
250
- }
251
- return res.data();
252
- }
253
- }