@0xsequence/guard 2.3.18 → 2.3.20

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.
@@ -0,0 +1,768 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var core = require('@0xsequence/core');
6
+ var signhub = require('@0xsequence/signhub');
7
+ var utils = require('@0xsequence/utils');
8
+ var ethers = require('ethers');
9
+
10
+ function _extends() {
11
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
12
+ for (var e = 1; e < arguments.length; e++) {
13
+ var t = arguments[e];
14
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
15
+ }
16
+ return n;
17
+ }, _extends.apply(null, arguments);
18
+ }
19
+
20
+ /* eslint-disable */
21
+ // sequence-guard v0.4.0 776b307c2145ac7a994eec63240acae042c96067
22
+ // --
23
+ // Code generated by webrpc-gen@v0.25.3 with typescript generator. DO NOT EDIT.
24
+ //
25
+ // webrpc-gen -schema=guard.ridl -target=typescript -client -out=./clients/guard.gen.ts
26
+
27
+ const WebrpcHeader = 'Webrpc';
28
+ const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-guard@v0.4.0';
29
+
30
+ //
31
+ // Types
32
+ //
33
+
34
+ //
35
+ // Client
36
+ //
37
+ class Guard {
38
+ constructor(hostname, fetch) {
39
+ this.hostname = void 0;
40
+ this.fetch = void 0;
41
+ this.path = '/rpc/Guard/';
42
+ this.ping = (headers, signal) => {
43
+ return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then(res => {
44
+ return buildResponse(res).then(_data => {
45
+ return {
46
+ status: _data.status
47
+ };
48
+ });
49
+ }, error => {
50
+ throw WebrpcRequestFailedError.new({
51
+ cause: `fetch(): ${error.message || ''}`
52
+ });
53
+ });
54
+ };
55
+ this.version = (headers, signal) => {
56
+ return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then(res => {
57
+ return buildResponse(res).then(_data => {
58
+ return {
59
+ version: _data.version
60
+ };
61
+ });
62
+ }, error => {
63
+ throw WebrpcRequestFailedError.new({
64
+ cause: `fetch(): ${error.message || ''}`
65
+ });
66
+ });
67
+ };
68
+ this.runtimeStatus = (headers, signal) => {
69
+ return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then(res => {
70
+ return buildResponse(res).then(_data => {
71
+ return {
72
+ status: _data.status
73
+ };
74
+ });
75
+ }, error => {
76
+ throw WebrpcRequestFailedError.new({
77
+ cause: `fetch(): ${error.message || ''}`
78
+ });
79
+ });
80
+ };
81
+ this.getSignerConfig = (args, headers, signal) => {
82
+ return this.fetch(this.url('GetSignerConfig'), createHTTPRequest(args, headers, signal)).then(res => {
83
+ return buildResponse(res).then(_data => {
84
+ return {
85
+ signerConfig: _data.signerConfig
86
+ };
87
+ });
88
+ }, error => {
89
+ throw WebrpcRequestFailedError.new({
90
+ cause: `fetch(): ${error.message || ''}`
91
+ });
92
+ });
93
+ };
94
+ this.sign = (args, headers, signal) => {
95
+ return this.fetch(this.url('Sign'), createHTTPRequest(args, headers, signal)).then(res => {
96
+ return buildResponse(res).then(_data => {
97
+ return {
98
+ sig: _data.sig
99
+ };
100
+ });
101
+ }, error => {
102
+ throw WebrpcRequestFailedError.new({
103
+ cause: `fetch(): ${error.message || ''}`
104
+ });
105
+ });
106
+ };
107
+ this.signWith = (args, headers, signal) => {
108
+ return this.fetch(this.url('SignWith'), createHTTPRequest(args, headers, signal)).then(res => {
109
+ return buildResponse(res).then(_data => {
110
+ return {
111
+ sig: _data.sig
112
+ };
113
+ });
114
+ }, error => {
115
+ throw WebrpcRequestFailedError.new({
116
+ cause: `fetch(): ${error.message || ''}`
117
+ });
118
+ });
119
+ };
120
+ this.patch = (args, headers, signal) => {
121
+ return this.fetch(this.url('Patch'), createHTTPRequest(args, headers, signal)).then(res => {
122
+ return buildResponse(res).then(_data => {
123
+ return {
124
+ txs: _data.txs
125
+ };
126
+ });
127
+ }, error => {
128
+ throw WebrpcRequestFailedError.new({
129
+ cause: `fetch(): ${error.message || ''}`
130
+ });
131
+ });
132
+ };
133
+ this.authMethods = (args, headers, signal) => {
134
+ return this.fetch(this.url('AuthMethods'), createHTTPRequest(args, headers, signal)).then(res => {
135
+ return buildResponse(res).then(_data => {
136
+ return {
137
+ methods: _data.methods,
138
+ active: _data.active
139
+ };
140
+ });
141
+ }, error => {
142
+ throw WebrpcRequestFailedError.new({
143
+ cause: `fetch(): ${error.message || ''}`
144
+ });
145
+ });
146
+ };
147
+ this.setPIN = (args, headers, signal) => {
148
+ return this.fetch(this.url('SetPIN'), createHTTPRequest(args, headers, signal)).then(res => {
149
+ return buildResponse(res).then(_data => {
150
+ return {};
151
+ });
152
+ }, error => {
153
+ throw WebrpcRequestFailedError.new({
154
+ cause: `fetch(): ${error.message || ''}`
155
+ });
156
+ });
157
+ };
158
+ this.resetPIN = (args, headers, signal) => {
159
+ return this.fetch(this.url('ResetPIN'), createHTTPRequest(args, headers, signal)).then(res => {
160
+ return buildResponse(res).then(_data => {
161
+ return {};
162
+ });
163
+ }, error => {
164
+ throw WebrpcRequestFailedError.new({
165
+ cause: `fetch(): ${error.message || ''}`
166
+ });
167
+ });
168
+ };
169
+ this.createTOTP = (args, headers, signal) => {
170
+ return this.fetch(this.url('CreateTOTP'), createHTTPRequest(args, headers, signal)).then(res => {
171
+ return buildResponse(res).then(_data => {
172
+ return {
173
+ uri: _data.uri
174
+ };
175
+ });
176
+ }, error => {
177
+ throw WebrpcRequestFailedError.new({
178
+ cause: `fetch(): ${error.message || ''}`
179
+ });
180
+ });
181
+ };
182
+ this.commitTOTP = (args, headers, signal) => {
183
+ return this.fetch(this.url('CommitTOTP'), createHTTPRequest(args, headers, signal)).then(res => {
184
+ return buildResponse(res).then(_data => {
185
+ return {
186
+ codes: _data.codes
187
+ };
188
+ });
189
+ }, error => {
190
+ throw WebrpcRequestFailedError.new({
191
+ cause: `fetch(): ${error.message || ''}`
192
+ });
193
+ });
194
+ };
195
+ this.resetTOTP = (args, headers, signal) => {
196
+ return this.fetch(this.url('ResetTOTP'), createHTTPRequest(args, headers, signal)).then(res => {
197
+ return buildResponse(res).then(_data => {
198
+ return {};
199
+ });
200
+ }, error => {
201
+ throw WebrpcRequestFailedError.new({
202
+ cause: `fetch(): ${error.message || ''}`
203
+ });
204
+ });
205
+ };
206
+ this.reset2FA = (args, headers, signal) => {
207
+ return this.fetch(this.url('Reset2FA'), createHTTPRequest(args, headers, signal)).then(res => {
208
+ return buildResponse(res).then(_data => {
209
+ return {};
210
+ });
211
+ }, error => {
212
+ throw WebrpcRequestFailedError.new({
213
+ cause: `fetch(): ${error.message || ''}`
214
+ });
215
+ });
216
+ };
217
+ this.recoveryCodes = (args, headers, signal) => {
218
+ return this.fetch(this.url('RecoveryCodes'), createHTTPRequest(args, headers, signal)).then(res => {
219
+ return buildResponse(res).then(_data => {
220
+ return {
221
+ codes: _data.codes
222
+ };
223
+ });
224
+ }, error => {
225
+ throw WebrpcRequestFailedError.new({
226
+ cause: `fetch(): ${error.message || ''}`
227
+ });
228
+ });
229
+ };
230
+ this.resetRecoveryCodes = (args, headers, signal) => {
231
+ return this.fetch(this.url('ResetRecoveryCodes'), createHTTPRequest(args, headers, signal)).then(res => {
232
+ return buildResponse(res).then(_data => {
233
+ return {
234
+ codes: _data.codes
235
+ };
236
+ });
237
+ }, error => {
238
+ throw WebrpcRequestFailedError.new({
239
+ cause: `fetch(): ${error.message || ''}`
240
+ });
241
+ });
242
+ };
243
+ this.hostname = hostname.replace(/\/*$/, '');
244
+ this.fetch = (input, init) => fetch(input, init);
245
+ }
246
+ url(name) {
247
+ return this.hostname + this.path + name;
248
+ }
249
+ }
250
+ const createHTTPRequest = (body = {}, headers = {}, signal = null) => {
251
+ const reqHeaders = _extends({}, headers, {
252
+ 'Content-Type': 'application/json'
253
+ });
254
+ reqHeaders[WebrpcHeader] = WebrpcHeaderValue;
255
+ return {
256
+ method: 'POST',
257
+ headers: reqHeaders,
258
+ body: JSON.stringify(body || {}),
259
+ signal
260
+ };
261
+ };
262
+ const buildResponse = res => {
263
+ return res.text().then(text => {
264
+ let data;
265
+ try {
266
+ data = JSON.parse(text);
267
+ } catch (error) {
268
+ let message = '';
269
+ if (error instanceof Error) {
270
+ message = error.message;
271
+ }
272
+ throw WebrpcBadResponseError.new({
273
+ status: res.status,
274
+ cause: `JSON.parse(): ${message}: response text: ${text}`
275
+ });
276
+ }
277
+ if (!res.ok) {
278
+ const code = typeof data.code === 'number' ? data.code : 0;
279
+ throw (webrpcErrorByCode[code] || WebrpcError).new(data);
280
+ }
281
+ return data;
282
+ });
283
+ };
284
+
285
+ //
286
+ // Errors
287
+ //
288
+
289
+ class WebrpcError extends Error {
290
+ constructor(name, code, message, status, cause) {
291
+ super(message);
292
+ this.name = void 0;
293
+ this.code = void 0;
294
+ this.message = void 0;
295
+ this.status = void 0;
296
+ this.cause = void 0;
297
+ /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */
298
+ this.msg = void 0;
299
+ this.name = name || 'WebrpcError';
300
+ this.code = typeof code === 'number' ? code : 0;
301
+ this.message = message || `endpoint error ${this.code}`;
302
+ this.msg = this.message;
303
+ this.status = typeof status === 'number' ? status : 0;
304
+ this.cause = cause;
305
+ Object.setPrototypeOf(this, WebrpcError.prototype);
306
+ }
307
+ static new(payload) {
308
+ return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause);
309
+ }
310
+ }
311
+
312
+ // Webrpc errors
313
+
314
+ class WebrpcEndpointError extends WebrpcError {
315
+ constructor(name = 'WebrpcEndpoint', code = 0, message = `endpoint error`, status = 0, cause) {
316
+ super(name, code, message, status, cause);
317
+ Object.setPrototypeOf(this, WebrpcEndpointError.prototype);
318
+ }
319
+ }
320
+ class WebrpcRequestFailedError extends WebrpcError {
321
+ constructor(name = 'WebrpcRequestFailed', code = -1, message = `request failed`, status = 0, cause) {
322
+ super(name, code, message, status, cause);
323
+ Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype);
324
+ }
325
+ }
326
+ class WebrpcBadRouteError extends WebrpcError {
327
+ constructor(name = 'WebrpcBadRoute', code = -2, message = `bad route`, status = 0, cause) {
328
+ super(name, code, message, status, cause);
329
+ Object.setPrototypeOf(this, WebrpcBadRouteError.prototype);
330
+ }
331
+ }
332
+ class WebrpcBadMethodError extends WebrpcError {
333
+ constructor(name = 'WebrpcBadMethod', code = -3, message = `bad method`, status = 0, cause) {
334
+ super(name, code, message, status, cause);
335
+ Object.setPrototypeOf(this, WebrpcBadMethodError.prototype);
336
+ }
337
+ }
338
+ class WebrpcBadRequestError extends WebrpcError {
339
+ constructor(name = 'WebrpcBadRequest', code = -4, message = `bad request`, status = 0, cause) {
340
+ super(name, code, message, status, cause);
341
+ Object.setPrototypeOf(this, WebrpcBadRequestError.prototype);
342
+ }
343
+ }
344
+ class WebrpcBadResponseError extends WebrpcError {
345
+ constructor(name = 'WebrpcBadResponse', code = -5, message = `bad response`, status = 0, cause) {
346
+ super(name, code, message, status, cause);
347
+ Object.setPrototypeOf(this, WebrpcBadResponseError.prototype);
348
+ }
349
+ }
350
+ class WebrpcServerPanicError extends WebrpcError {
351
+ constructor(name = 'WebrpcServerPanic', code = -6, message = `server panic`, status = 0, cause) {
352
+ super(name, code, message, status, cause);
353
+ Object.setPrototypeOf(this, WebrpcServerPanicError.prototype);
354
+ }
355
+ }
356
+ class WebrpcInternalErrorError extends WebrpcError {
357
+ constructor(name = 'WebrpcInternalError', code = -7, message = `internal error`, status = 0, cause) {
358
+ super(name, code, message, status, cause);
359
+ Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype);
360
+ }
361
+ }
362
+ class WebrpcClientDisconnectedError extends WebrpcError {
363
+ constructor(name = 'WebrpcClientDisconnected', code = -8, message = `client disconnected`, status = 0, cause) {
364
+ super(name, code, message, status, cause);
365
+ Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype);
366
+ }
367
+ }
368
+ class WebrpcStreamLostError extends WebrpcError {
369
+ constructor(name = 'WebrpcStreamLost', code = -9, message = `stream lost`, status = 0, cause) {
370
+ super(name, code, message, status, cause);
371
+ Object.setPrototypeOf(this, WebrpcStreamLostError.prototype);
372
+ }
373
+ }
374
+ class WebrpcStreamFinishedError extends WebrpcError {
375
+ constructor(name = 'WebrpcStreamFinished', code = -10, message = `stream finished`, status = 0, cause) {
376
+ super(name, code, message, status, cause);
377
+ Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype);
378
+ }
379
+ }
380
+
381
+ // Schema errors
382
+
383
+ class UnauthorizedError extends WebrpcError {
384
+ constructor(name = 'Unauthorized', code = 1000, message = `Unauthorized access`, status = 0, cause) {
385
+ super(name, code, message, status, cause);
386
+ Object.setPrototypeOf(this, UnauthorizedError.prototype);
387
+ }
388
+ }
389
+ class PermissionDeniedError extends WebrpcError {
390
+ constructor(name = 'PermissionDenied', code = 1001, message = `Permission denied`, status = 0, cause) {
391
+ super(name, code, message, status, cause);
392
+ Object.setPrototypeOf(this, PermissionDeniedError.prototype);
393
+ }
394
+ }
395
+ class SessionExpiredError extends WebrpcError {
396
+ constructor(name = 'SessionExpired', code = 1002, message = `Session expired`, status = 0, cause) {
397
+ super(name, code, message, status, cause);
398
+ Object.setPrototypeOf(this, SessionExpiredError.prototype);
399
+ }
400
+ }
401
+ class MethodNotFoundError extends WebrpcError {
402
+ constructor(name = 'MethodNotFound', code = 1003, message = `Method not found`, status = 0, cause) {
403
+ super(name, code, message, status, cause);
404
+ Object.setPrototypeOf(this, MethodNotFoundError.prototype);
405
+ }
406
+ }
407
+ class RequestConflictError extends WebrpcError {
408
+ constructor(name = 'RequestConflict', code = 1004, message = `Conflict with target resource`, status = 0, cause) {
409
+ super(name, code, message, status, cause);
410
+ Object.setPrototypeOf(this, RequestConflictError.prototype);
411
+ }
412
+ }
413
+ class AbortedError extends WebrpcError {
414
+ constructor(name = 'Aborted', code = 1005, message = `Request aborted`, status = 0, cause) {
415
+ super(name, code, message, status, cause);
416
+ Object.setPrototypeOf(this, AbortedError.prototype);
417
+ }
418
+ }
419
+ class GeoblockedError extends WebrpcError {
420
+ constructor(name = 'Geoblocked', code = 1006, message = `Geoblocked region`, status = 0, cause) {
421
+ super(name, code, message, status, cause);
422
+ Object.setPrototypeOf(this, GeoblockedError.prototype);
423
+ }
424
+ }
425
+ class RateLimitedError extends WebrpcError {
426
+ constructor(name = 'RateLimited', code = 1007, message = `Rate-limited. Please slow down.`, status = 0, cause) {
427
+ super(name, code, message, status, cause);
428
+ Object.setPrototypeOf(this, RateLimitedError.prototype);
429
+ }
430
+ }
431
+ class InvalidArgumentError extends WebrpcError {
432
+ constructor(name = 'InvalidArgument', code = 2001, message = `Invalid argument`, status = 0, cause) {
433
+ super(name, code, message, status, cause);
434
+ Object.setPrototypeOf(this, InvalidArgumentError.prototype);
435
+ }
436
+ }
437
+ class UnavailableError extends WebrpcError {
438
+ constructor(name = 'Unavailable', code = 2002, message = `Unavailable resource`, status = 0, cause) {
439
+ super(name, code, message, status, cause);
440
+ Object.setPrototypeOf(this, UnavailableError.prototype);
441
+ }
442
+ }
443
+ class QueryFailedError extends WebrpcError {
444
+ constructor(name = 'QueryFailed', code = 2003, message = `Query failed`, status = 0, cause) {
445
+ super(name, code, message, status, cause);
446
+ Object.setPrototypeOf(this, QueryFailedError.prototype);
447
+ }
448
+ }
449
+ class ValidationFailedError extends WebrpcError {
450
+ constructor(name = 'ValidationFailed', code = 2004, message = `Validation Failed`, status = 0, cause) {
451
+ super(name, code, message, status, cause);
452
+ Object.setPrototypeOf(this, ValidationFailedError.prototype);
453
+ }
454
+ }
455
+ class NotFoundError extends WebrpcError {
456
+ constructor(name = 'NotFound', code = 3000, message = `Resource not found`, status = 0, cause) {
457
+ super(name, code, message, status, cause);
458
+ Object.setPrototypeOf(this, NotFoundError.prototype);
459
+ }
460
+ }
461
+ const webrpcErrorByCode = {
462
+ [0]: WebrpcEndpointError,
463
+ [-1]: WebrpcRequestFailedError,
464
+ [-2]: WebrpcBadRouteError,
465
+ [-3]: WebrpcBadMethodError,
466
+ [-4]: WebrpcBadRequestError,
467
+ [-5]: WebrpcBadResponseError,
468
+ [-6]: WebrpcServerPanicError,
469
+ [-7]: WebrpcInternalErrorError,
470
+ [-8]: WebrpcClientDisconnectedError,
471
+ [-9]: WebrpcStreamLostError,
472
+ [-10]: WebrpcStreamFinishedError,
473
+ [1000]: UnauthorizedError,
474
+ [1001]: PermissionDeniedError,
475
+ [1002]: SessionExpiredError,
476
+ [1003]: MethodNotFoundError,
477
+ [1004]: RequestConflictError,
478
+ [1005]: AbortedError,
479
+ [1006]: GeoblockedError,
480
+ [1007]: RateLimitedError,
481
+ [2001]: InvalidArgumentError,
482
+ [2002]: UnavailableError,
483
+ [2003]: QueryFailedError,
484
+ [2004]: ValidationFailedError,
485
+ [3000]: NotFoundError
486
+ };
487
+
488
+ class GuardSigner {
489
+ constructor(address, url, appendSuffix = false, projectAccessKey) {
490
+ this.address = address;
491
+ this.url = url;
492
+ this.appendSuffix = appendSuffix;
493
+ this.projectAccessKey = projectAccessKey;
494
+ this.guard = void 0;
495
+ this._fetch = (input, init) => {
496
+ const headers = {};
497
+ const projectAccessKey = this.projectAccessKey;
498
+ if (projectAccessKey && projectAccessKey.length > 0) {
499
+ headers['X-Access-Key'] = projectAccessKey;
500
+ }
501
+
502
+ // before the request is made
503
+ init.headers = _extends({}, init.headers, headers);
504
+ return fetch(input, init);
505
+ };
506
+ this.guard = new Guard(url, this._fetch);
507
+ }
508
+ async getAddress() {
509
+ return this.address;
510
+ }
511
+ async buildDeployTransaction(_metadata) {
512
+ return undefined;
513
+ }
514
+ async predecorateSignedTransactions(_metadata) {
515
+ return [];
516
+ }
517
+ async decorateTransactions(bundle, _metadata) {
518
+ return bundle;
519
+ }
520
+ async sign(message, metadata) {
521
+ var _metadata$parts;
522
+ if (!core.commons.isWalletSignRequestMetadata(metadata)) {
523
+ throw new Error('expected sequence signature request metadata');
524
+ }
525
+ const guardTotpCode = metadata.guardTotpCode;
526
+
527
+ // Building auxData, notice: this uses the old v1 format
528
+ // TODO: We should update the guard API so we can pass the metadata directly
529
+ const coder = core.universal.genericCoderFor(metadata.config.version);
530
+ const {
531
+ encoded
532
+ } = coder.signature.encodeSigners(metadata.config, (_metadata$parts = metadata.parts) != null ? _metadata$parts : new Map(), [], metadata.chainId);
533
+ return (await this.guard.signWith({
534
+ signer: this.address,
535
+ request: {
536
+ msg: ethers.ethers.hexlify(message),
537
+ auxData: this.packMsgAndSig(metadata.address, metadata.digest, encoded, metadata.chainId),
538
+ chainId: Number(metadata.chainId)
539
+ },
540
+ token: guardTotpCode ? {
541
+ id: AuthMethod.TOTP,
542
+ token: guardTotpCode
543
+ } : undefined
544
+ })).sig;
545
+ }
546
+ notifyStatusChange(_id, _status, _metadata) {}
547
+ async getAuthMethods(proof) {
548
+ let response;
549
+ if ('jwt' in proof) {
550
+ response = await this.guard.authMethods({}, {
551
+ Authorization: `BEARER ${proof.jwt}`
552
+ });
553
+ } else {
554
+ const signedProof = await signOwnershipProof(proof);
555
+ response = await this.guard.authMethods({
556
+ proof: {
557
+ wallet: signedProof.walletAddress,
558
+ timestamp: signedProof.timestamp.getTime(),
559
+ signer: signedProof.signerAddress,
560
+ signature: signedProof.signature
561
+ }
562
+ });
563
+ }
564
+ return _extends({}, response, {
565
+ methods: response.methods.map(parseAuthMethod)
566
+ });
567
+ }
568
+ async setPin(pin, proof) {
569
+ const signedProof = await signAuthUpdateProof(proof);
570
+ if (pin === undefined) {
571
+ await this.guard.resetPIN({
572
+ timestamp: signedProof.timestamp.getTime(),
573
+ signature: signedProof.signature
574
+ }, {
575
+ Authorization: `BEARER ${proof.jwt}`
576
+ });
577
+ } else {
578
+ await this.guard.setPIN({
579
+ pin,
580
+ timestamp: signedProof.timestamp.getTime(),
581
+ signature: signedProof.signature
582
+ }, {
583
+ Authorization: `BEARER ${proof.jwt}`
584
+ });
585
+ }
586
+ }
587
+ resetPin(proof) {
588
+ return this.setPin(undefined, proof);
589
+ }
590
+ async createTotp(proof) {
591
+ const signedProof = await signAuthUpdateProof(proof);
592
+ const {
593
+ uri
594
+ } = await this.guard.createTOTP({
595
+ timestamp: signedProof.timestamp.getTime(),
596
+ signature: signedProof.signature
597
+ }, {
598
+ Authorization: `BEARER ${proof.jwt}`
599
+ });
600
+ return new URL(uri);
601
+ }
602
+ async commitTotp(token, jwt) {
603
+ const {
604
+ codes
605
+ } = await this.guard.commitTOTP({
606
+ token
607
+ }, {
608
+ Authorization: `BEARER ${jwt}`
609
+ });
610
+ return codes;
611
+ }
612
+ async resetTotp(proof) {
613
+ const signedProof = await signAuthUpdateProof(proof);
614
+ await this.guard.resetTOTP({
615
+ timestamp: signedProof.timestamp.getTime(),
616
+ signature: signedProof.signature
617
+ }, {
618
+ Authorization: `BEARER ${proof.jwt}`
619
+ });
620
+ }
621
+ async reset2fa(recoveryCode, proof) {
622
+ if ('jwt' in proof) {
623
+ await this.guard.reset2FA({
624
+ code: recoveryCode
625
+ }, {
626
+ Authorization: `BEARER ${proof.jwt}`
627
+ });
628
+ } else {
629
+ const signedProof = await signOwnershipProof(proof);
630
+ await this.guard.reset2FA({
631
+ code: recoveryCode,
632
+ proof: {
633
+ wallet: signedProof.walletAddress,
634
+ timestamp: signedProof.timestamp.getTime(),
635
+ signer: signedProof.signerAddress,
636
+ signature: signedProof.signature
637
+ }
638
+ });
639
+ }
640
+ }
641
+ async getRecoveryCodes(proof) {
642
+ const signedProof = await signAuthUpdateProof(proof);
643
+ const {
644
+ codes
645
+ } = await this.guard.recoveryCodes({
646
+ timestamp: signedProof.timestamp.getTime(),
647
+ signature: signedProof.signature
648
+ }, {
649
+ Authorization: `BEARER ${proof.jwt}`
650
+ });
651
+ return codes;
652
+ }
653
+ async resetRecoveryCodes(proof) {
654
+ const signedProof = await signAuthUpdateProof(proof);
655
+ const {
656
+ codes
657
+ } = await this.guard.resetRecoveryCodes({
658
+ timestamp: signedProof.timestamp.getTime(),
659
+ signature: signedProof.signature
660
+ }, {
661
+ Authorization: `BEARER ${proof.jwt}`
662
+ });
663
+ return codes;
664
+ }
665
+ packMsgAndSig(address, msg, sig, chainId) {
666
+ return ethers.ethers.AbiCoder.defaultAbiCoder().encode(['address', 'uint256', 'bytes', 'bytes'], [address, chainId, msg, sig]);
667
+ }
668
+ suffix() {
669
+ return new Uint8Array(this.appendSuffix ? [3] : []);
670
+ }
671
+ }
672
+ let AuthMethod = /*#__PURE__*/function (AuthMethod) {
673
+ AuthMethod["PIN"] = "PIN";
674
+ AuthMethod["TOTP"] = "TOTP";
675
+ return AuthMethod;
676
+ }({});
677
+ function parseAuthMethod(method) {
678
+ switch (method) {
679
+ case AuthMethod.PIN:
680
+ case AuthMethod.TOTP:
681
+ return method;
682
+ default:
683
+ throw new Error(`unknown auth method '${method}'`);
684
+ }
685
+ }
686
+ function isSignedOwnershipProof(proof) {
687
+ return 'signerAddress' in proof && typeof proof.signerAddress === 'string';
688
+ }
689
+ async function signOwnershipProof(proof) {
690
+ if (isSignedOwnershipProof(proof)) {
691
+ return proof;
692
+ } else {
693
+ const signer = signhub.signers.isSapientSigner(proof.signer) ? proof.signer : new signhub.signers.SignerWrapper(proof.signer);
694
+ const signerAddress = await signer.getAddress();
695
+ const timestamp = new Date();
696
+ const typedData = getOwnershipProofTypedData(proof.walletAddress, timestamp);
697
+ const digest = utils.encodeTypedDataDigest(typedData);
698
+ return {
699
+ walletAddress: proof.walletAddress,
700
+ timestamp,
701
+ signerAddress,
702
+ signature: ethers.ethers.hexlify(await signer.sign(digest, {}))
703
+ };
704
+ }
705
+ }
706
+ async function signAuthUpdateProof(proof) {
707
+ if ('wallet' in proof) {
708
+ var _typedData$domain$cha;
709
+ const timestamp = new Date();
710
+ const typedData = getAuthUpdateProofTypedData(timestamp);
711
+ const signature = await proof.wallet.signTypedData(typedData.domain, typedData.types, typedData.message, (_typedData$domain$cha = typedData.domain.chainId) != null ? _typedData$domain$cha : 1, 'eip6492');
712
+ return {
713
+ jwt: proof.jwt,
714
+ timestamp,
715
+ signature
716
+ };
717
+ } else {
718
+ return proof;
719
+ }
720
+ }
721
+ function getOwnershipProofTypedData(wallet, timestamp) {
722
+ return {
723
+ domain,
724
+ types: {
725
+ AuthMethods: [{
726
+ name: 'wallet',
727
+ type: 'address'
728
+ }, {
729
+ name: 'timestamp',
730
+ type: 'string'
731
+ }]
732
+ },
733
+ message: {
734
+ wallet: ethers.ethers.getAddress(wallet),
735
+ timestamp: toUTCString(timestamp)
736
+ }
737
+ };
738
+ }
739
+ function getAuthUpdateProofTypedData(timestamp) {
740
+ return {
741
+ domain,
742
+ types: {
743
+ AuthUpdate: [{
744
+ name: 'timestamp',
745
+ type: 'string'
746
+ }]
747
+ },
748
+ message: {
749
+ timestamp: toUTCString(timestamp)
750
+ }
751
+ };
752
+ }
753
+ const domain = {
754
+ name: 'Sequence Guard',
755
+ version: '1',
756
+ chainId: 1
757
+ };
758
+ function toUTCString(date) {
759
+ return date.toUTCString().replace('GMT', 'UTC');
760
+ }
761
+
762
+ exports.AuthMethod = AuthMethod;
763
+ exports.Guard = Guard;
764
+ exports.GuardSigner = GuardSigner;
765
+ exports.getAuthUpdateProofTypedData = getAuthUpdateProofTypedData;
766
+ exports.getOwnershipProofTypedData = getOwnershipProofTypedData;
767
+ exports.isSignedOwnershipProof = isSignedOwnershipProof;
768
+ exports.signOwnershipProof = signOwnershipProof;