@imtbl/passport 2.0.0-alpha.7 → 2.0.0-alpha.8

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.
@@ -1,12 +1,12 @@
1
- import axios, { isAxiosError } from 'axios';
2
- import * as GeneratedClients2 from '@imtbl/generated-clients';
1
+ import Q, { isAxiosError } from 'axios';
2
+ import * as Ge from '@imtbl/generated-clients';
3
3
  import { MultiRollupApiClients, createConfig, multiRollupConfig, ImxApiClients, imxApiConfig } from '@imtbl/generated-clients';
4
4
  import { IMXClient, generateLegacyStarkPrivateKey, createStarkSigner } from '@imtbl/x-client';
5
5
  import { Environment } from '@imtbl/config';
6
6
  import { utils, setPassportClientId, track, trackFlow, trackError, identify, getDetail, Detail, trackDuration } from '@imtbl/metrics';
7
7
  import { UserManager, User, ErrorTimeout, ErrorResponse, InMemoryWebStorage, WebStorageStateStore } from 'oidc-client-ts';
8
- import jwt_decode3 from 'jwt-decode';
9
- import localForage from 'localforage';
8
+ import tt from 'jwt-decode';
9
+ import An from 'localforage';
10
10
  import { Magic } from 'magic-sdk';
11
11
  import { OpenIdExtension } from '@magic-ext/oidc';
12
12
  import { JsonRpcProvider, toBeHex, Contract, isCallException, ZeroAddress, BrowserProvider, TypedDataEncoder, keccak256, getBytes, hashMessage, stripZerosLeft, toUtf8String, solidityPacked, Interface, AbiCoder } from 'ethers';
@@ -16,388 +16,7 @@ import { walletContracts } from '@0xsequence/abi';
16
16
  import { v1 } from '@0xsequence/core';
17
17
  import { v4 } from 'uuid';
18
18
 
19
- // node-modules-polyfills:node:process
20
- function unimplemented(name) {
21
- throw new Error("Node.js process " + name + " is not supported by JSPM core outside of Node.js");
22
- }
23
- var queue = [];
24
- var draining = false;
25
- var currentQueue;
26
- var queueIndex = -1;
27
- function cleanUpNextTick() {
28
- if (!draining || !currentQueue)
29
- return;
30
- draining = false;
31
- if (currentQueue.length) {
32
- queue = currentQueue.concat(queue);
33
- } else {
34
- queueIndex = -1;
35
- }
36
- if (queue.length)
37
- drainQueue();
38
- }
39
- function drainQueue() {
40
- if (draining)
41
- return;
42
- var timeout = setTimeout(cleanUpNextTick, 0);
43
- draining = true;
44
- var len = queue.length;
45
- while (len) {
46
- currentQueue = queue;
47
- queue = [];
48
- while (++queueIndex < len) {
49
- if (currentQueue)
50
- currentQueue[queueIndex].run();
51
- }
52
- queueIndex = -1;
53
- len = queue.length;
54
- }
55
- currentQueue = null;
56
- draining = false;
57
- clearTimeout(timeout);
58
- }
59
- function nextTick(fun) {
60
- var args = new Array(arguments.length - 1);
61
- if (arguments.length > 1) {
62
- for (var i = 1; i < arguments.length; i++)
63
- args[i - 1] = arguments[i];
64
- }
65
- queue.push(new Item(fun, args));
66
- if (queue.length === 1 && !draining)
67
- setTimeout(drainQueue, 0);
68
- }
69
- function Item(fun, array) {
70
- this.fun = fun;
71
- this.array = array;
72
- }
73
- Item.prototype.run = function() {
74
- this.fun.apply(null, this.array);
75
- };
76
- var title = "browser";
77
- var arch = "x64";
78
- var platform = "browser";
79
- var env = {
80
- PATH: "/usr/bin",
81
- LANG: navigator.language + ".UTF-8",
82
- PWD: "/",
83
- HOME: "/home",
84
- TMP: "/tmp"
85
- };
86
- var argv = ["/usr/bin/node"];
87
- var execArgv = [];
88
- var version = "v16.8.0";
89
- var versions = {};
90
- var emitWarning = function(message, type) {
91
- console.warn((type ? type + ": " : "") + message);
92
- };
93
- var binding = function(name) {
94
- unimplemented("binding");
95
- };
96
- var umask = function(mask) {
97
- return 0;
98
- };
99
- var cwd = function() {
100
- return "/";
101
- };
102
- var chdir = function(dir) {
103
- };
104
- var release = {
105
- name: "node",
106
- sourceUrl: "",
107
- headersUrl: "",
108
- libUrl: ""
109
- };
110
- function noop() {
111
- }
112
- var _rawDebug = noop;
113
- var moduleLoadList = [];
114
- function _linkedBinding(name) {
115
- unimplemented("_linkedBinding");
116
- }
117
- var domain = {};
118
- var _exiting = false;
119
- var config = {};
120
- function dlopen(name) {
121
- unimplemented("dlopen");
122
- }
123
- function _getActiveRequests() {
124
- return [];
125
- }
126
- function _getActiveHandles() {
127
- return [];
128
- }
129
- var reallyExit = noop;
130
- var _kill = noop;
131
- var cpuUsage = function() {
132
- return {};
133
- };
134
- var resourceUsage = cpuUsage;
135
- var memoryUsage = cpuUsage;
136
- var kill = noop;
137
- var exit = noop;
138
- var openStdin = noop;
139
- var allowedNodeEnvironmentFlags = {};
140
- function assert(condition, message) {
141
- if (!condition) throw new Error(message || "assertion error");
142
- }
143
- var features = {
144
- inspector: false,
145
- debug: false,
146
- uv: false,
147
- ipv6: false,
148
- tls_alpn: false,
149
- tls_sni: false,
150
- tls_ocsp: false,
151
- tls: false,
152
- cached_builtins: true
153
- };
154
- var _fatalExceptions = noop;
155
- var setUncaughtExceptionCaptureCallback = noop;
156
- function hasUncaughtExceptionCaptureCallback() {
157
- return false;
158
- }
159
- var _tickCallback = noop;
160
- var _debugProcess = noop;
161
- var _debugEnd = noop;
162
- var _startProfilerIdleNotifier = noop;
163
- var _stopProfilerIdleNotifier = noop;
164
- var stdout = void 0;
165
- var stderr = void 0;
166
- var stdin = void 0;
167
- var abort = noop;
168
- var pid = 2;
169
- var ppid = 1;
170
- var execPath = "/bin/usr/node";
171
- var debugPort = 9229;
172
- var argv0 = "node";
173
- var _preload_modules = [];
174
- var setSourceMapsEnabled = noop;
175
- var _performance = {
176
- now: typeof performance !== "undefined" ? performance.now.bind(performance) : void 0,
177
- timing: typeof performance !== "undefined" ? performance.timing : void 0
178
- };
179
- if (_performance.now === void 0) {
180
- nowOffset = Date.now();
181
- if (_performance.timing && _performance.timing.navigationStart) {
182
- nowOffset = _performance.timing.navigationStart;
183
- }
184
- _performance.now = () => Date.now() - nowOffset;
185
- }
186
- var nowOffset;
187
- function uptime() {
188
- return _performance.now() / 1e3;
189
- }
190
- var nanoPerSec = 1e9;
191
- function hrtime(previousTimestamp) {
192
- var baseNow = Math.floor((Date.now() - _performance.now()) * 1e-3);
193
- var clocktime = _performance.now() * 1e-3;
194
- var seconds = Math.floor(clocktime) + baseNow;
195
- var nanoseconds = Math.floor(clocktime % 1 * 1e9);
196
- if (previousTimestamp) {
197
- seconds = seconds - previousTimestamp[0];
198
- nanoseconds = nanoseconds - previousTimestamp[1];
199
- if (nanoseconds < 0) {
200
- seconds--;
201
- nanoseconds += nanoPerSec;
202
- }
203
- }
204
- return [seconds, nanoseconds];
205
- }
206
- hrtime.bigint = function(time) {
207
- var diff = hrtime(time);
208
- if (typeof BigInt === "undefined") {
209
- return diff[0] * nanoPerSec + diff[1];
210
- }
211
- return BigInt(diff[0] * nanoPerSec) + BigInt(diff[1]);
212
- };
213
- var _maxListeners = 10;
214
- var _events = {};
215
- var _eventsCount = 0;
216
- function on() {
217
- return process;
218
- }
219
- var addListener = on;
220
- var once = on;
221
- var off = on;
222
- var removeListener = on;
223
- var removeAllListeners = on;
224
- var emit = noop;
225
- var prependListener = on;
226
- var prependOnceListener = on;
227
- function listeners(name) {
228
- return [];
229
- }
230
- var process = {
231
- version,
232
- versions,
233
- arch,
234
- platform,
235
- release,
236
- _rawDebug,
237
- moduleLoadList,
238
- binding,
239
- _linkedBinding,
240
- _events,
241
- _eventsCount,
242
- _maxListeners,
243
- on,
244
- addListener,
245
- once,
246
- off,
247
- removeListener,
248
- removeAllListeners,
249
- emit,
250
- prependListener,
251
- prependOnceListener,
252
- listeners,
253
- domain,
254
- _exiting,
255
- config,
256
- dlopen,
257
- uptime,
258
- _getActiveRequests,
259
- _getActiveHandles,
260
- reallyExit,
261
- _kill,
262
- cpuUsage,
263
- resourceUsage,
264
- memoryUsage,
265
- kill,
266
- exit,
267
- openStdin,
268
- allowedNodeEnvironmentFlags,
269
- assert,
270
- features,
271
- _fatalExceptions,
272
- setUncaughtExceptionCaptureCallback,
273
- hasUncaughtExceptionCaptureCallback,
274
- emitWarning,
275
- nextTick,
276
- _tickCallback,
277
- _debugProcess,
278
- _debugEnd,
279
- _startProfilerIdleNotifier,
280
- _stopProfilerIdleNotifier,
281
- stdout,
282
- stdin,
283
- stderr,
284
- abort,
285
- umask,
286
- chdir,
287
- cwd,
288
- env,
289
- title,
290
- argv,
291
- execArgv,
292
- pid,
293
- ppid,
294
- execPath,
295
- debugPort,
296
- hrtime,
297
- argv0,
298
- _preload_modules,
299
- setSourceMapsEnabled
300
- };
301
- function isAPIError(error) {
302
- return "code" in error && "message" in error;
303
- }
304
- var PassportError = class extends Error {
305
- type;
306
- constructor(message, type) {
307
- super(message);
308
- this.type = type;
309
- }
310
- };
311
- var withPassportError = async (fn, customErrorType) => {
312
- try {
313
- return await fn();
314
- } catch (error) {
315
- let errorMessage;
316
- if (error instanceof PassportError && error.type === "SERVICE_UNAVAILABLE_ERROR" /* SERVICE_UNAVAILABLE_ERROR */) {
317
- throw new PassportError(error.message, error.type);
318
- }
319
- if (isAxiosError(error) && error.response?.data && isAPIError(error.response.data)) {
320
- errorMessage = error.response.data.message;
321
- } else {
322
- errorMessage = error.message;
323
- }
324
- throw new PassportError(errorMessage, customErrorType);
325
- }
326
- };
327
- var KEY_PKCE_STATE = "pkce_state";
328
- var KEY_PKCE_VERIFIER = "pkce_verifier";
329
- var validCredentialsMinTtlSec = 3600;
330
- var DeviceCredentialsManager = class {
331
- areValid(tokenResponse) {
332
- if (tokenResponse) {
333
- const accessTokenValid = this.isTokenValid(tokenResponse.access_token);
334
- const idTokenValid = this.isTokenValid(tokenResponse.id_token);
335
- return accessTokenValid && idTokenValid;
336
- }
337
- return false;
338
- }
339
- isTokenValid(jwt) {
340
- try {
341
- const tokenPayload = jwt_decode3(jwt);
342
- const expiresAt = tokenPayload.exp ?? 0;
343
- const now = Date.now() / 1e3 + validCredentialsMinTtlSec;
344
- return expiresAt > now;
345
- } catch (error) {
346
- return false;
347
- }
348
- }
349
- savePKCEData(data) {
350
- localStorage.setItem(KEY_PKCE_STATE, data.state);
351
- localStorage.setItem(KEY_PKCE_VERIFIER, data.verifier);
352
- }
353
- getPKCEData() {
354
- const state = localStorage.getItem(KEY_PKCE_STATE);
355
- const verifier = localStorage.getItem(KEY_PKCE_VERIFIER);
356
- if (state && verifier) {
357
- return { state, verifier };
358
- }
359
- return null;
360
- }
361
- };
362
-
363
- // src/utils/logger.ts
364
- var warn = (...args) => {
365
- if (typeof process === "undefined") {
366
- return;
367
- }
368
- const shouldLog = process?.env?.JEST_WORKER_ID === void 0;
369
- if (shouldLog) {
370
- console.warn(...args);
371
- }
372
- };
373
- var logger_default = {
374
- warn
375
- };
376
- function isIdTokenExpired(idToken) {
377
- if (!idToken) {
378
- return false;
379
- }
380
- const decodedToken = jwt_decode3(idToken);
381
- const now = Math.floor(Date.now() / 1e3);
382
- return decodedToken.exp < now;
383
- }
384
- function isTokenExpired(oidcUser) {
385
- const { id_token: idToken, expired } = oidcUser;
386
- if (expired) {
387
- return true;
388
- }
389
- return isIdTokenExpired(idToken);
390
- }
391
-
392
- // src/types.ts
393
- var isUserZkEvm = (user) => !!user.zkEvm;
394
- var isUserImx = (user) => !!user.imx;
395
-
396
- // src/overlay/constants.ts
397
- var PASSPORT_OVERLAY_ID = "passport-overlay";
398
- var PASSPORT_OVERLAY_CLOSE_ID = `${PASSPORT_OVERLAY_ID}-close`;
399
- var PASSPORT_OVERLAY_TRY_AGAIN_ID = `${PASSPORT_OVERLAY_ID}-try-again`;
400
- var CLOSE_BUTTON_SVG = `
19
+ function ve(n){throw new Error("Node.js process "+n+" is not supported by JSPM core outside of Node.js")}var P=[],U=!1,x,K=-1;function rr(){!U||!x||(U=!1,x.length?P=x.concat(P):K=-1,P.length&&qe());}function qe(){if(!U){var n=setTimeout(rr,0);U=!0;for(var e=P.length;e;){for(x=P,P=[];++K<e;)x&&x[K].run();K=-1,e=P.length;}x=null,U=!1,clearTimeout(n);}}function nr(n){var e=new Array(arguments.length-1);if(arguments.length>1)for(var t=1;t<arguments.length;t++)e[t-1]=arguments[t];P.push(new $e(n,e)),P.length===1&&!U&&setTimeout(qe,0);}function $e(n,e){this.fun=n,this.array=e;}$e.prototype.run=function(){this.fun.apply(null,this.array);};var ir="browser",ar="x64",sr="browser",or={PATH:"/usr/bin",LANG:navigator.language+".UTF-8",PWD:"/",HOME:"/home",TMP:"/tmp"},cr=["/usr/bin/node"],dr=[],lr="v16.8.0",pr={},mr=function(n,e){console.warn((e?e+": ":"")+n);},ur=function(n){ve("binding");},gr=function(n){return 0},hr=function(){return "/"},fr=function(n){},Er={name:"node",sourceUrl:"",headersUrl:"",libUrl:""};function R(){}var Cr=R,yr=[];function Rr(n){ve("_linkedBinding");}var vr={},Tr=!1,wr={};function _r(n){ve("dlopen");}function Pr(){return []}function Ar(){return []}var Ir=R,Sr=R,Te=function(){return {}},Or=Te,br=Te,kr=R,xr=R,Mr=R,Nr={};function Dr(n,e){if(!n)throw new Error(e||"assertion error")}var Ur={inspector:!1,debug:!1,uv:!1,ipv6:!1,tls_alpn:!1,tls_sni:!1,tls_ocsp:!1,tls:!1,cached_builtins:!0},Lr=R,Fr=R;function Gr(){return !1}var Br=R,Vr=R,Hr=R,Wr=R,qr=R,$r=void 0,Zr=void 0,Kr=void 0,zr=R,Xr=2,Jr=1,jr="/bin/usr/node",Yr=9229,Qr="node",en=[],tn=R,I={now:typeof performance<"u"?performance.now.bind(performance):void 0,timing:typeof performance<"u"?performance.timing:void 0};I.now===void 0&&(Ce=Date.now(),I.timing&&I.timing.navigationStart&&(Ce=I.timing.navigationStart),I.now=()=>Date.now()-Ce);var Ce;function rn(){return I.now()/1e3}var ye=1e9;function Re(n){var e=Math.floor((Date.now()-I.now())*.001),t=I.now()*.001,r=Math.floor(t)+e,i=Math.floor(t%1*1e9);return n&&(r=r-n[0],i=i-n[1],i<0&&(r--,i+=ye)),[r,i]}Re.bigint=function(n){var e=Re(n);return typeof BigInt>"u"?e[0]*ye+e[1]:BigInt(e[0]*ye)+BigInt(e[1])};var nn=10,an={},sn=0;function S(){return l}var on=S,cn=S,dn=S,ln=S,pn=S,mn=R,un=S,gn=S;function hn(n){return []}var l={version:lr,versions:pr,arch:ar,platform:sr,release:Er,_rawDebug:Cr,moduleLoadList:yr,binding:ur,_linkedBinding:Rr,_events:an,_eventsCount:sn,_maxListeners:nn,on:S,addListener:on,once:cn,off:dn,removeListener:ln,removeAllListeners:pn,emit:mn,prependListener:un,prependOnceListener:gn,listeners:hn,domain:vr,_exiting:Tr,config:wr,dlopen:_r,uptime:rn,_getActiveRequests:Pr,_getActiveHandles:Ar,reallyExit:Ir,_kill:Sr,cpuUsage:Te,resourceUsage:Or,memoryUsage:br,kill:kr,exit:xr,openStdin:Mr,allowedNodeEnvironmentFlags:Nr,assert:Dr,features:Ur,_fatalExceptions:Lr,setUncaughtExceptionCaptureCallback:Fr,hasUncaughtExceptionCaptureCallback:Gr,emitWarning:mr,nextTick:nr,_tickCallback:Br,_debugProcess:Vr,_debugEnd:Hr,_startProfilerIdleNotifier:Wr,_stopProfilerIdleNotifier:qr,stdout:$r,stdin:Kr,stderr:Zr,abort:zr,umask:gr,chdir:fr,cwd:hr,env:or,title:ir,argv:cr,execArgv:dr,pid:Xr,ppid:Jr,execPath:jr,debugPort:Yr,hrtime:Re,argv0:Qr,_preload_modules:en,setSourceMapsEnabled:tn};function we(n){return "code"in n&&"message"in n}var f=class extends Error{type;constructor(e,t){super(e),this.type=t;}},C=async(n,e)=>{try{return await n()}catch(t){let r;throw t instanceof f&&t.type==="SERVICE_UNAVAILABLE_ERROR"?new f(t.message,t.type):(isAxiosError(t)&&t.response?.data&&we(t.response.data)?r=t.response.data.message:r=t.message,new f(r,e))}};var Ze="pkce_state",Ke="pkce_verifier",Cn=3600,G=class{areValid(e){if(e){let t=this.isTokenValid(e.access_token),r=this.isTokenValid(e.id_token);return t&&r}return !1}isTokenValid(e){try{let r=tt(e).exp??0,i=Date.now()/1e3+Cn;return r>i}catch{return !1}}savePKCEData(e){localStorage.setItem(Ze,e.state),localStorage.setItem(Ke,e.verifier);}getPKCEData(){let e=localStorage.getItem(Ze),t=localStorage.getItem(Ke);return e&&t?{state:e,verifier:t}:null}};var yn=(...n)=>{if(typeof l>"u")return;l?.env?.JEST_WORKER_ID===void 0&&console.warn(...n);},L={warn:yn};function vn(n){if(!n)return !1;let e=tt(n),t=Math.floor(Date.now()/1e3);return e.exp<t}function ze(n){let{id_token:e,expired:t}=n;return t?!0:vn(e)}var z=n=>!!n.zkEvm,M=n=>!!n.imx;var B="passport-overlay",X=`${B}-close`,J=`${B}-try-again`,Xe=`
401
20
  <svg
402
21
  viewBox="0 0 20 20"
403
22
  fill="none"
@@ -409,8 +28,7 @@ var CLOSE_BUTTON_SVG = `
409
28
  fill="#F3F3F3"
410
29
  />
411
30
  </svg>
412
- `;
413
- var POPUP_BLOCKED_SVG = `
31
+ `,Je=`
414
32
  <svg
415
33
  viewBox="0 0 17 16"
416
34
  fill="none"
@@ -424,8 +42,7 @@ var POPUP_BLOCKED_SVG = `
424
42
  fill="#E01A3D"
425
43
  />
426
44
  </svg>
427
- `;
428
- var IMMUTABLE_LOGO_SVG = `
45
+ `,je=`
429
46
  <svg
430
47
  style="
431
48
  max-width: 123px !important;
@@ -608,12 +225,9 @@ var IMMUTABLE_LOGO_SVG = `
608
225
  </clipPath>
609
226
  </defs>
610
227
  </svg>
611
- `;
612
-
613
- // src/overlay/elements.ts
614
- var getCloseButton = () => `
228
+ `;var Tn=()=>`
615
229
  <button
616
- id="${PASSPORT_OVERLAY_CLOSE_ID}"
230
+ id="${X}"
617
231
  style="
618
232
  background: #f3f3f326 !important;
619
233
  border: none !important;
@@ -629,10 +243,9 @@ var getCloseButton = () => `
629
243
  justify-content: center !important;
630
244
  "
631
245
  >
632
- ${CLOSE_BUTTON_SVG}
246
+ ${Xe}
633
247
  </button>
634
- `;
635
- var getBlockedContents = () => `
248
+ `,wn=()=>`
636
249
  <div
637
250
  style="
638
251
  color: #e01a3d !important;
@@ -642,7 +255,7 @@ var getBlockedContents = () => `
642
255
  margin-bottom: 10px !important;
643
256
  "
644
257
  >
645
- ${POPUP_BLOCKED_SVG}
258
+ ${Je}
646
259
  Pop-up blocked
647
260
  </div>
648
261
  <p style="
@@ -655,8 +268,7 @@ var getBlockedContents = () => `
655
268
  If the problem continues, adjust your<br />
656
269
  browser settings.
657
270
  </p>
658
- `;
659
- var getGenericContents = () => `
271
+ `,_n=()=>`
660
272
  <p style="
661
273
  color: #b6b6b6 !important;
662
274
  text-align: center !important;
@@ -665,10 +277,9 @@ var getGenericContents = () => `
665
277
  >
666
278
  Secure pop-up not showing?<br />We'll help you re-launch
667
279
  </p>
668
- `;
669
- var getTryAgainButton = () => `
280
+ `,Pn=()=>`
670
281
  <button
671
- id="${PASSPORT_OVERLAY_TRY_AGAIN_ID}"
282
+ id="${J}"
672
283
  style="
673
284
  margin-top: 27px !important;
674
285
  color: #f3f3f3 !important;
@@ -683,10 +294,9 @@ var getTryAgainButton = () => `
683
294
  >
684
295
  Try again
685
296
  </button>
686
- `;
687
- var getOverlay = (contents) => `
297
+ `,Ye=n=>`
688
298
  <div
689
- id="${PASSPORT_OVERLAY_ID}"
299
+ id="${B}"
690
300
  style="
691
301
  position: fixed !important;
692
302
  top: 0 !important;
@@ -709,7 +319,7 @@ var getOverlay = (contents) => `
709
319
  z-index: 2147483647 !important;
710
320
  "
711
321
  >
712
- ${getCloseButton()}
322
+ ${Tn()}
713
323
  <div
714
324
  style="
715
325
  display: flex !important;
@@ -718,3658 +328,24 @@ var getOverlay = (contents) => `
718
328
  max-width: 400px !important;
719
329
  "
720
330
  >
721
- ${IMMUTABLE_LOGO_SVG}
722
- ${contents}
723
- ${getTryAgainButton()}
331
+ ${je}
332
+ ${n}
333
+ ${Pn()}
724
334
  </div>
725
335
  </div>
726
- `;
727
- function addLink({
728
- id,
729
- href,
730
- rel,
731
- crossOrigin
732
- }) {
733
- const fullId = `${PASSPORT_OVERLAY_ID}-${id}`;
734
- if (!document.getElementById(fullId)) {
735
- const link = document.createElement("link");
736
- link.id = fullId;
737
- link.href = href;
738
- if (rel) link.rel = rel;
739
- if (crossOrigin) link.crossOrigin = crossOrigin;
740
- document.head.appendChild(link);
741
- }
742
- }
743
- var getBlockedOverlay = () => getOverlay(getBlockedContents());
744
- var getGenericOverlay = () => getOverlay(getGenericContents());
745
-
746
- // src/overlay/index.ts
747
- var Overlay = class {
748
- disableGenericPopupOverlay;
749
- disableBlockedPopupOverlay;
750
- overlay;
751
- isBlockedOverlay;
752
- tryAgainListener;
753
- onCloseListener;
754
- constructor(popupOverlayOptions, isBlockedOverlay = false) {
755
- this.disableBlockedPopupOverlay = popupOverlayOptions.disableBlockedPopupOverlay || false;
756
- this.disableGenericPopupOverlay = popupOverlayOptions.disableGenericPopupOverlay || false;
757
- this.isBlockedOverlay = isBlockedOverlay;
758
- }
759
- append(tryAgainOnClick, onCloseClick) {
760
- if (this.shouldAppendOverlay()) {
761
- this.appendOverlay();
762
- this.updateTryAgainButton(tryAgainOnClick);
763
- this.updateCloseButton(onCloseClick);
764
- }
765
- }
766
- update(tryAgainOnClick) {
767
- this.updateTryAgainButton(tryAgainOnClick);
768
- }
769
- remove() {
770
- if (this.overlay) {
771
- this.overlay.remove();
772
- }
773
- }
774
- shouldAppendOverlay() {
775
- if (this.disableGenericPopupOverlay && this.disableBlockedPopupOverlay) return false;
776
- if (this.disableGenericPopupOverlay && !this.isBlockedOverlay) return false;
777
- if (this.disableBlockedPopupOverlay && this.isBlockedOverlay) return false;
778
- return true;
779
- }
780
- appendOverlay() {
781
- if (!this.overlay) {
782
- addLink({ id: "link-googleapis", href: "https://fonts.googleapis.com" });
783
- addLink({ id: "link-gstatic", href: "https://fonts.gstatic.com", crossOrigin: "anonymous" });
784
- addLink({ id: "link-roboto", href: "https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap", rel: "stylesheet" });
785
- const overlay = document.createElement("div");
786
- overlay.innerHTML = this.isBlockedOverlay ? getBlockedOverlay() : getGenericOverlay();
787
- document.body.insertAdjacentElement("beforeend", overlay);
788
- this.overlay = overlay;
789
- }
790
- }
791
- updateTryAgainButton(tryAgainOnClick) {
792
- const tryAgainButton = document.getElementById(PASSPORT_OVERLAY_TRY_AGAIN_ID);
793
- if (tryAgainButton) {
794
- if (this.tryAgainListener) {
795
- tryAgainButton.removeEventListener("click", this.tryAgainListener);
796
- }
797
- this.tryAgainListener = tryAgainOnClick;
798
- tryAgainButton.addEventListener("click", tryAgainOnClick);
799
- }
800
- }
801
- updateCloseButton(onCloseClick) {
802
- const closeButton = document.getElementById(PASSPORT_OVERLAY_CLOSE_ID);
803
- if (closeButton) {
804
- if (this.onCloseListener) {
805
- closeButton.removeEventListener("click", this.onCloseListener);
806
- }
807
- this.onCloseListener = onCloseClick;
808
- closeButton.addEventListener("click", onCloseClick);
809
- }
810
- }
811
- };
812
- var LocalForageAsyncStorage = class {
813
- storage;
814
- constructor(name, driver) {
815
- this.storage = localForage.createInstance({ name, driver });
816
- }
817
- get length() {
818
- return this.storage.length();
819
- }
820
- clear() {
821
- return this.storage.clear();
822
- }
823
- getItem(key) {
824
- return this.storage.getItem(key);
825
- }
826
- key(index) {
827
- return this.storage.key(index);
828
- }
829
- async removeItem(key) {
830
- await this.storage.removeItem(key);
831
- }
832
- async setItem(key, value) {
833
- await this.storage.setItem(key, value);
834
- }
835
- };
836
-
837
- // src/authManager.ts
838
- var formUrlEncodedHeader = {
839
- headers: {
840
- "Content-Type": "application/x-www-form-urlencoded"
841
- }
842
- };
843
- var logoutEndpoint = "/v2/logout";
844
- var authorizeEndpoint = "/authorize";
845
- var getAuthConfiguration = (config2) => {
846
- const { authenticationDomain, oidcConfiguration } = config2;
847
- let store;
848
- if (config2.crossSdkBridgeEnabled) {
849
- store = new LocalForageAsyncStorage("ImmutableSDKPassport", localForage.INDEXEDDB);
850
- } else if (typeof window !== "undefined") {
851
- store = window.localStorage;
852
- } else {
853
- store = new InMemoryWebStorage();
854
- }
855
- const userStore = new WebStorageStateStore({ store });
856
- const endSessionEndpoint = new URL(logoutEndpoint, authenticationDomain.replace(/^(?:https?:\/\/)?(.*)/, "https://$1"));
857
- endSessionEndpoint.searchParams.set("client_id", oidcConfiguration.clientId);
858
- if (oidcConfiguration.logoutRedirectUri) {
859
- endSessionEndpoint.searchParams.set("returnTo", oidcConfiguration.logoutRedirectUri);
860
- }
861
- const baseConfiguration = {
862
- authority: authenticationDomain,
863
- redirect_uri: oidcConfiguration.redirectUri,
864
- popup_redirect_uri: oidcConfiguration.redirectUri,
865
- client_id: oidcConfiguration.clientId,
866
- metadata: {
867
- authorization_endpoint: `${authenticationDomain}/authorize`,
868
- token_endpoint: `${authenticationDomain}/oauth/token`,
869
- userinfo_endpoint: `${authenticationDomain}/userinfo`,
870
- end_session_endpoint: endSessionEndpoint.toString()
871
- },
872
- mergeClaims: true,
873
- automaticSilentRenew: false,
874
- // Disabled until https://github.com/authts/oidc-client-ts/issues/430 has been resolved
875
- scope: oidcConfiguration.scope,
876
- userStore
877
- };
878
- if (oidcConfiguration.audience) {
879
- baseConfiguration.extraQueryParams = {
880
- audience: oidcConfiguration.audience
881
- };
882
- }
883
- return baseConfiguration;
884
- };
885
- function wait(ms) {
886
- return new Promise((resolve) => {
887
- setTimeout(resolve, ms);
888
- });
889
- }
890
- function base64URLEncode(str) {
891
- return btoa(String.fromCharCode(...new Uint8Array(str))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
892
- }
893
- async function sha256(buffer) {
894
- const encoder = new TextEncoder();
895
- const data = encoder.encode(buffer);
896
- return await window.crypto.subtle.digest("SHA-256", data);
897
- }
898
- var AuthManager = class _AuthManager {
899
- userManager;
900
- deviceCredentialsManager;
901
- config;
902
- logoutMode;
903
- /**
904
- * Promise that is used to prevent multiple concurrent calls to the refresh token endpoint.
905
- */
906
- refreshingPromise = null;
907
- constructor(config2) {
908
- this.config = config2;
909
- this.userManager = new UserManager(getAuthConfiguration(config2));
910
- this.deviceCredentialsManager = new DeviceCredentialsManager();
911
- this.logoutMode = config2.oidcConfiguration.logoutMode || "redirect";
912
- }
913
- static mapOidcUserToDomainModel = (oidcUser) => {
914
- let passport;
915
- if (oidcUser.id_token) {
916
- passport = jwt_decode3(oidcUser.id_token)?.passport;
917
- }
918
- const user = {
919
- expired: oidcUser.expired,
920
- idToken: oidcUser.id_token,
921
- accessToken: oidcUser.access_token,
922
- refreshToken: oidcUser.refresh_token,
923
- profile: {
924
- sub: oidcUser.profile.sub,
925
- email: oidcUser.profile.email,
926
- nickname: oidcUser.profile.nickname
927
- }
928
- };
929
- if (passport?.imx_eth_address) {
930
- user.imx = {
931
- ethAddress: passport.imx_eth_address,
932
- starkAddress: passport.imx_stark_address,
933
- userAdminAddress: passport.imx_user_admin_address
934
- };
935
- }
936
- if (passport?.zkevm_eth_address) {
937
- user.zkEvm = {
938
- ethAddress: passport?.zkevm_eth_address,
939
- userAdminAddress: passport?.zkevm_user_admin_address
940
- };
941
- }
942
- return user;
943
- };
944
- static mapDeviceTokenResponseToOidcUser = (tokenResponse) => {
945
- const idTokenPayload = jwt_decode3(tokenResponse.id_token);
946
- return new User({
947
- id_token: tokenResponse.id_token,
948
- access_token: tokenResponse.access_token,
949
- refresh_token: tokenResponse.refresh_token,
950
- token_type: tokenResponse.token_type,
951
- profile: {
952
- sub: idTokenPayload.sub,
953
- iss: idTokenPayload.iss,
954
- aud: idTokenPayload.aud,
955
- exp: idTokenPayload.exp,
956
- iat: idTokenPayload.iat,
957
- email: idTokenPayload.email,
958
- nickname: idTokenPayload.nickname,
959
- passport: idTokenPayload.passport
960
- }
961
- });
962
- };
963
- /**
964
- * login
965
- * @param anonymousId Caller can pass an anonymousId if they want to associate their user's identity with immutable's internal instrumentation.
966
- */
967
- async login(anonymousId) {
968
- return withPassportError(async () => {
969
- const popupWindowTarget = "passportLoginPrompt";
970
- const signinPopup = async () => this.userManager.signinPopup({
971
- extraQueryParams: {
972
- ...this.userManager.settings?.extraQueryParams ?? {},
973
- rid: getDetail(Detail.RUNTIME_ID) || "",
974
- third_party_a_id: anonymousId || ""
975
- },
976
- popupWindowFeatures: {
977
- width: 410,
978
- height: 450
979
- },
980
- popupWindowTarget
981
- });
982
- return new Promise((resolve, reject) => {
983
- signinPopup().then((oidcUser) => {
984
- resolve(_AuthManager.mapOidcUserToDomainModel(oidcUser));
985
- }).catch((error) => {
986
- if (!(error instanceof Error) || error.message !== "Attempted to navigate on a disposed window") {
987
- reject(error);
988
- return;
989
- }
990
- let popupHasBeenOpened = false;
991
- const overlay = new Overlay(this.config.popupOverlayOptions, true);
992
- overlay.append(
993
- async () => {
994
- try {
995
- if (!popupHasBeenOpened) {
996
- popupHasBeenOpened = true;
997
- const oidcUser = await signinPopup();
998
- overlay.remove();
999
- resolve(_AuthManager.mapOidcUserToDomainModel(oidcUser));
1000
- } else {
1001
- window.open("", popupWindowTarget);
1002
- }
1003
- } catch (retryError) {
1004
- overlay.remove();
1005
- reject(retryError);
1006
- }
1007
- },
1008
- () => {
1009
- overlay.remove();
1010
- reject(new Error("Popup closed by user"));
1011
- }
1012
- );
1013
- });
1014
- });
1015
- }, "AUTHENTICATION_ERROR" /* AUTHENTICATION_ERROR */);
1016
- }
1017
- async getUserOrLogin() {
1018
- let user = null;
1019
- try {
1020
- user = await this.getUser();
1021
- } catch (err) {
1022
- logger_default.warn("Failed to retrieve a cached user session", err);
1023
- }
1024
- return user || this.login();
1025
- }
1026
- async loginCallback() {
1027
- return withPassportError(
1028
- async () => {
1029
- await this.userManager.signinCallback();
1030
- },
1031
- "AUTHENTICATION_ERROR" /* AUTHENTICATION_ERROR */
1032
- );
1033
- }
1034
- /**
1035
- * loginWithDeviceFlow
1036
- * @param anonymousId Caller can pass an anonymousId if they want to associate their user's identity with immutable's internal instrumentation.
1037
- */
1038
- async loginWithDeviceFlow(anonymousId) {
1039
- return withPassportError(async () => {
1040
- const response = await axios.post(
1041
- `${this.config.authenticationDomain}/oauth/device/code`,
1042
- {
1043
- client_id: this.config.oidcConfiguration.clientId,
1044
- scope: this.config.oidcConfiguration.scope,
1045
- audience: this.config.oidcConfiguration.audience
1046
- },
1047
- formUrlEncodedHeader
1048
- );
1049
- const rid = getDetail(Detail.RUNTIME_ID);
1050
- return {
1051
- code: response.data.user_code,
1052
- deviceCode: response.data.device_code,
1053
- url: `${response.data.verification_uri_complete}${rid ? `&rid=${rid}` : ""}${anonymousId ? `&third_party_a_id=${anonymousId}` : ""}`,
1054
- interval: response.data.interval
1055
- };
1056
- }, "AUTHENTICATION_ERROR" /* AUTHENTICATION_ERROR */);
1057
- }
1058
- /* eslint-disable no-await-in-loop */
1059
- async loginWithDeviceFlowCallback(deviceCode, interval, timeoutMs) {
1060
- return withPassportError(async () => {
1061
- const startTime = Date.now();
1062
- const loopCondition = true;
1063
- while (loopCondition) {
1064
- if (timeoutMs != null && Date.now() - startTime > timeoutMs) {
1065
- throw new Error("Timed out");
1066
- }
1067
- await wait(interval * 1e3);
1068
- try {
1069
- const tokenResponse = await this.getDeviceFlowToken(deviceCode);
1070
- const oidcUser = _AuthManager.mapDeviceTokenResponseToOidcUser(tokenResponse);
1071
- const user = _AuthManager.mapOidcUserToDomainModel(oidcUser);
1072
- await this.userManager.storeUser(oidcUser);
1073
- return user;
1074
- } catch (error) {
1075
- if (axios.isAxiosError(error)) {
1076
- const responseError = error.response?.data;
1077
- switch (responseError.error) {
1078
- case "authorization_pending":
1079
- break;
1080
- case "slow_down":
1081
- break;
1082
- case "expired_token":
1083
- throw new Error("Token expired, please log in again");
1084
- case "access_denied":
1085
- throw new Error("User denied access");
1086
- default:
1087
- throw new Error("Error getting token");
1088
- }
1089
- } else {
1090
- throw error;
1091
- }
1092
- }
1093
- }
1094
- throw new Error("Failed to get credentials");
1095
- }, "AUTHENTICATION_ERROR" /* AUTHENTICATION_ERROR */);
1096
- }
1097
- /* eslint-enable no-await-in-loop */
1098
- async getDeviceFlowToken(deviceCode) {
1099
- const response = await axios.post(
1100
- `${this.config.authenticationDomain}/oauth/token`,
1101
- {
1102
- client_id: this.config.oidcConfiguration.clientId,
1103
- grant_type: "urn:ietf:params:oauth:grant-type:device_code",
1104
- device_code: deviceCode
1105
- },
1106
- formUrlEncodedHeader
1107
- );
1108
- return response.data;
1109
- }
1110
- async getPKCEAuthorizationUrl() {
1111
- const verifier = base64URLEncode(window.crypto.getRandomValues(new Uint8Array(32)));
1112
- const challenge = base64URLEncode(await sha256(verifier));
1113
- const state = base64URLEncode(window.crypto.getRandomValues(new Uint8Array(32)));
1114
- const {
1115
- redirectUri,
1116
- scope,
1117
- audience,
1118
- clientId
1119
- } = this.config.oidcConfiguration;
1120
- this.deviceCredentialsManager.savePKCEData({ state, verifier });
1121
- const pKCEAuthorizationUrl = new URL(authorizeEndpoint, this.config.authenticationDomain);
1122
- pKCEAuthorizationUrl.searchParams.set("response_type", "code");
1123
- pKCEAuthorizationUrl.searchParams.set("code_challenge", challenge);
1124
- pKCEAuthorizationUrl.searchParams.set("code_challenge_method", "S256");
1125
- pKCEAuthorizationUrl.searchParams.set("client_id", clientId);
1126
- pKCEAuthorizationUrl.searchParams.set("redirect_uri", redirectUri);
1127
- pKCEAuthorizationUrl.searchParams.set("state", state);
1128
- if (scope) pKCEAuthorizationUrl.searchParams.set("scope", scope);
1129
- if (audience) pKCEAuthorizationUrl.searchParams.set("audience", audience);
1130
- return pKCEAuthorizationUrl.toString();
1131
- }
1132
- async loginWithPKCEFlowCallback(authorizationCode, state) {
1133
- return withPassportError(async () => {
1134
- const pkceData = this.deviceCredentialsManager.getPKCEData();
1135
- if (!pkceData) {
1136
- throw new Error("No code verifier or state for PKCE");
1137
- }
1138
- if (state !== pkceData.state) {
1139
- throw new Error("Provided state does not match stored state");
1140
- }
1141
- const tokenResponse = await this.getPKCEToken(authorizationCode, pkceData.verifier);
1142
- const oidcUser = _AuthManager.mapDeviceTokenResponseToOidcUser(tokenResponse);
1143
- const user = _AuthManager.mapOidcUserToDomainModel(oidcUser);
1144
- await this.userManager.storeUser(oidcUser);
1145
- return user;
1146
- }, "AUTHENTICATION_ERROR" /* AUTHENTICATION_ERROR */);
1147
- }
1148
- async getPKCEToken(authorizationCode, codeVerifier) {
1149
- const response = await axios.post(
1150
- `${this.config.authenticationDomain}/oauth/token`,
1151
- {
1152
- client_id: this.config.oidcConfiguration.clientId,
1153
- grant_type: "authorization_code",
1154
- code_verifier: codeVerifier,
1155
- code: authorizationCode,
1156
- redirect_uri: this.config.oidcConfiguration.redirectUri
1157
- },
1158
- formUrlEncodedHeader
1159
- );
1160
- return response.data;
1161
- }
1162
- async logout() {
1163
- return withPassportError(
1164
- async () => {
1165
- if (this.logoutMode === "silent") {
1166
- return this.userManager.signoutSilent();
1167
- }
1168
- return this.userManager.signoutRedirect();
1169
- },
1170
- "LOGOUT_ERROR" /* LOGOUT_ERROR */
1171
- );
1172
- }
1173
- async logoutSilentCallback(url) {
1174
- return this.userManager.signoutSilentCallback(url);
1175
- }
1176
- async removeUser() {
1177
- return this.userManager.removeUser();
1178
- }
1179
- async getDeviceFlowEndSessionEndpoint() {
1180
- const { authenticationDomain, oidcConfiguration } = this.config;
1181
- const endSessionEndpoint = new URL(logoutEndpoint, authenticationDomain);
1182
- endSessionEndpoint.searchParams.set("client_id", oidcConfiguration.clientId);
1183
- if (oidcConfiguration.logoutRedirectUri) endSessionEndpoint.searchParams.set("returnTo", oidcConfiguration.logoutRedirectUri);
1184
- return endSessionEndpoint.toString();
1185
- }
1186
- forceUserRefreshInBackground() {
1187
- this.refreshTokenAndUpdatePromise().catch((error) => {
1188
- logger_default.warn("Failed to refresh user token", error);
1189
- });
1190
- }
1191
- async forceUserRefresh() {
1192
- return this.refreshTokenAndUpdatePromise().catch((error) => {
1193
- logger_default.warn("Failed to refresh user token", error);
1194
- return null;
1195
- });
1196
- }
1197
- /**
1198
- * Refreshes the token and returns the user.
1199
- * If the token is already being refreshed, returns the existing promise.
1200
- */
1201
- async refreshTokenAndUpdatePromise() {
1202
- if (this.refreshingPromise) return this.refreshingPromise;
1203
- this.refreshingPromise = new Promise(async (resolve, reject) => {
1204
- try {
1205
- const newOidcUser = await this.userManager.signinSilent();
1206
- if (newOidcUser) {
1207
- resolve(_AuthManager.mapOidcUserToDomainModel(newOidcUser));
1208
- return;
1209
- }
1210
- resolve(null);
1211
- } catch (err) {
1212
- let passportErrorType = "AUTHENTICATION_ERROR" /* AUTHENTICATION_ERROR */;
1213
- let errorMessage = "Failed to refresh token";
1214
- let removeUser = true;
1215
- if (err instanceof ErrorTimeout) {
1216
- passportErrorType = "SILENT_LOGIN_ERROR" /* SILENT_LOGIN_ERROR */;
1217
- errorMessage = `${errorMessage}: ${err.message}`;
1218
- removeUser = false;
1219
- } else if (err instanceof ErrorResponse) {
1220
- passportErrorType = "NOT_LOGGED_IN_ERROR" /* NOT_LOGGED_IN_ERROR */;
1221
- errorMessage = `${errorMessage}: ${err.message || err.error_description}`;
1222
- } else if (err instanceof Error) {
1223
- errorMessage = `${errorMessage}: ${err.message}`;
1224
- } else if (typeof err === "string") {
1225
- errorMessage = `${errorMessage}: ${err}`;
1226
- }
1227
- if (removeUser) {
1228
- try {
1229
- await this.userManager.removeUser();
1230
- } catch (removeUserError) {
1231
- if (removeUserError instanceof Error) {
1232
- errorMessage = `${errorMessage}: Failed to remove user: ${removeUserError.message}`;
1233
- }
1234
- }
1235
- }
1236
- reject(new PassportError(errorMessage, passportErrorType));
1237
- } finally {
1238
- this.refreshingPromise = null;
1239
- }
1240
- });
1241
- return this.refreshingPromise;
1242
- }
1243
- /**
1244
- *
1245
- * @param typeAssertion {(user: User) => boolean} - Optional. If provided, then the User will be checked against
1246
- * the typeAssertion. If the user meets the requirements, then it will be typed as T and returned. If the User
1247
- * does NOT meet the type assertion, then execution will continue, and we will attempt to obtain a User that does
1248
- * meet the type assertion.
1249
- *
1250
- * This function will attempt to obtain a User in the following order:
1251
- * 1. If the User is currently refreshing, wait for the refresh to complete.
1252
- * 2. Attempt to obtain a User from storage that has not expired.
1253
- * 3. Attempt to refresh the User if a refresh token is present.
1254
- * 4. Return null if no valid User can be obtained.
1255
- */
1256
- async getUser(typeAssertion = (user) => true) {
1257
- if (this.refreshingPromise) {
1258
- const user = await this.refreshingPromise;
1259
- if (user && typeAssertion(user)) {
1260
- return user;
1261
- }
1262
- return null;
1263
- }
1264
- const oidcUser = await this.userManager.getUser();
1265
- if (!oidcUser) return null;
1266
- if (!isTokenExpired(oidcUser)) {
1267
- const user = _AuthManager.mapOidcUserToDomainModel(oidcUser);
1268
- if (user && typeAssertion(user)) {
1269
- return user;
1270
- }
1271
- }
1272
- if (oidcUser.refresh_token) {
1273
- const user = await this.refreshTokenAndUpdatePromise();
1274
- if (user && typeAssertion(user)) {
1275
- return user;
1276
- }
1277
- }
1278
- return null;
1279
- }
1280
- async getUserZkEvm() {
1281
- const user = await this.getUser(isUserZkEvm);
1282
- if (!user) {
1283
- throw new Error("Failed to obtain a User with the required ZkEvm attributes");
1284
- }
1285
- return user;
1286
- }
1287
- async getUserImx() {
1288
- const user = await this.getUser(isUserImx);
1289
- if (!user) {
1290
- throw new Error("Failed to obtain a User with the required IMX attributes");
1291
- }
1292
- return user;
1293
- }
1294
- };
1295
-
1296
- // src/utils/lazyLoad.ts
1297
- var lazyLoad = (promiseToAwait, initialiseFunction) => promiseToAwait().then(initialiseFunction);
1298
- var lazyDocumentReady = (initialiseFunction) => {
1299
- const documentReadyPromise = () => new Promise((resolve) => {
1300
- const onReadyStateChange = () => {
1301
- if (window.document.readyState === "complete") {
1302
- resolve();
1303
- window.document.removeEventListener("readystatechange", onReadyStateChange);
1304
- }
1305
- };
1306
- window.document.addEventListener("readystatechange", onReadyStateChange);
1307
- if (window.document.readyState === "complete") {
1308
- resolve();
1309
- window.document.removeEventListener("readystatechange", onReadyStateChange);
1310
- }
1311
- });
1312
- return lazyLoad(documentReadyPromise, initialiseFunction);
1313
- };
1314
- var withMetricsAsync = async (fn, flowName) => {
1315
- const flow = trackFlow("passport", flowName);
1316
- try {
1317
- return await fn(flow);
1318
- } catch (error) {
1319
- if (error instanceof Error) {
1320
- trackError("passport", flowName, error);
1321
- }
1322
- flow.addEvent("errored");
1323
- throw error;
1324
- } finally {
1325
- flow.addEvent("End");
1326
- }
1327
- };
1328
-
1329
- // src/magicAdapter.ts
1330
- var MAINNET = "mainnet";
1331
- var MagicAdapter = class {
1332
- config;
1333
- lazyMagicClient;
1334
- constructor(config2) {
1335
- this.config = config2;
1336
- if (typeof window !== "undefined") {
1337
- this.lazyMagicClient = lazyDocumentReady(() => {
1338
- const client2 = new Magic(this.config.magicPublishableApiKey, {
1339
- extensions: [new OpenIdExtension()],
1340
- network: MAINNET
1341
- // We always connect to mainnet to ensure addresses are the same across envs
1342
- });
1343
- return client2;
1344
- });
1345
- }
1346
- }
1347
- get magicClient() {
1348
- if (!this.lazyMagicClient) {
1349
- throw new Error("Cannot perform this action outside of the browser");
1350
- }
1351
- return this.lazyMagicClient;
1352
- }
1353
- async login(idToken) {
1354
- return withPassportError(async () => withMetricsAsync(async (flow) => {
1355
- const startTime = performance.now();
1356
- const magicClient = await this.magicClient;
1357
- flow.addEvent("endMagicClientInit");
1358
- await magicClient.openid.loginWithOIDC({
1359
- jwt: idToken,
1360
- providerId: this.config.magicProviderId
1361
- });
1362
- flow.addEvent("endLoginWithOIDC");
1363
- trackDuration(
1364
- "passport",
1365
- flow.details.flowName,
1366
- Math.round(performance.now() - startTime)
1367
- );
1368
- return magicClient.rpcProvider;
1369
- }, "magicLogin"), "WALLET_CONNECTION_ERROR" /* WALLET_CONNECTION_ERROR */);
1370
- }
1371
- async logout() {
1372
- const magicClient = await this.magicClient;
1373
- if (magicClient.user) {
1374
- await magicClient.user.logout();
1375
- }
1376
- }
1377
- };
1378
- var getStarkSigner = async (signer) => withPassportError(async () => {
1379
- const privateKey = await generateLegacyStarkPrivateKey(signer);
1380
- return createStarkSigner(privateKey);
1381
- }, "WALLET_CONNECTION_ERROR" /* WALLET_CONNECTION_ERROR */);
1382
- async function exchangeTransfer({
1383
- user,
1384
- starkSigner,
1385
- request,
1386
- exchangesApi
1387
- }) {
1388
- return withPassportError(async () => {
1389
- const { ethAddress } = user.imx;
1390
- const transferAmount = request.amount;
1391
- const signableResult = await exchangesApi.getExchangeSignableTransfer({
1392
- id: request.transactionID,
1393
- getSignableTransferRequest: {
1394
- sender: ethAddress,
1395
- token: convertToSignableToken(request),
1396
- amount: transferAmount,
1397
- receiver: request.receiver
1398
- }
1399
- });
1400
- const starkAddress = await starkSigner.getAddress();
1401
- const { payload_hash: payloadHash } = signableResult.data;
1402
- const starkSignature = await starkSigner.signMessage(payloadHash);
1403
- const transferSigningParams = {
1404
- sender_stark_key: signableResult.data.sender_stark_key || starkAddress,
1405
- sender_vault_id: signableResult.data.sender_vault_id,
1406
- receiver_stark_key: signableResult.data.receiver_stark_key,
1407
- receiver_vault_id: signableResult.data.receiver_vault_id,
1408
- asset_id: signableResult.data.asset_id,
1409
- amount: signableResult.data.amount,
1410
- nonce: signableResult.data.nonce,
1411
- expiration_timestamp: signableResult.data.expiration_timestamp,
1412
- stark_signature: starkSignature
1413
- };
1414
- const headers = {
1415
- // eslint-disable-next-line @typescript-eslint/naming-convention
1416
- Authorization: `Bearer ${user.accessToken}`
1417
- };
1418
- const response = await exchangesApi.createExchangeTransfer(
1419
- {
1420
- id: request.transactionID,
1421
- createTransferRequest: transferSigningParams
1422
- },
1423
- { headers }
1424
- );
1425
- return {
1426
- sent_signature: response?.data.sent_signature,
1427
- status: response?.data.status?.toString(),
1428
- time: response?.data.time,
1429
- transfer_id: response?.data.transfer_id
1430
- };
1431
- }, "EXCHANGE_TRANSFER_ERROR" /* EXCHANGE_TRANSFER_ERROR */);
1432
- }
1433
- var ERC721 = "ERC721";
1434
- async function createOrder({
1435
- starkSigner,
1436
- user,
1437
- request,
1438
- ordersApi,
1439
- guardianClient
1440
- }) {
1441
- return withPassportError(async () => {
1442
- const { ethAddress } = user.imx;
1443
- const amountSell = request.sell.type === ERC721 ? "1" : request.sell.amount;
1444
- const amountBuy = request.buy.type === ERC721 ? "1" : request.buy.amount;
1445
- const headers = { Authorization: `Bearer ${user.accessToken}` };
1446
- const getSignableOrderRequestV3 = {
1447
- user: ethAddress,
1448
- amount_buy: amountBuy,
1449
- token_buy: convertToSignableToken(request.buy),
1450
- amount_sell: amountSell,
1451
- token_sell: convertToSignableToken(request.sell),
1452
- fees: request.fees,
1453
- split_fees: true,
1454
- expiration_timestamp: request.expiration_timestamp
1455
- };
1456
- const getSignableOrderResponse = await ordersApi.getSignableOrder(
1457
- {
1458
- getSignableOrderRequestV3
1459
- },
1460
- { headers }
1461
- );
1462
- await guardianClient.evaluateImxTransaction({
1463
- payloadHash: getSignableOrderResponse.data.payload_hash
1464
- });
1465
- const { payload_hash: payloadHash } = getSignableOrderResponse.data;
1466
- const starkSignature = await starkSigner.signMessage(payloadHash);
1467
- const signableResultData = getSignableOrderResponse.data;
1468
- const orderParams = {
1469
- createOrderRequest: {
1470
- include_fees: true,
1471
- fees: request.fees,
1472
- stark_signature: starkSignature,
1473
- amount_buy: signableResultData.amount_buy,
1474
- amount_sell: signableResultData.amount_sell,
1475
- asset_id_buy: signableResultData.asset_id_buy,
1476
- asset_id_sell: signableResultData.asset_id_sell,
1477
- expiration_timestamp: signableResultData.expiration_timestamp,
1478
- nonce: signableResultData.nonce,
1479
- stark_key: signableResultData.stark_key,
1480
- vault_id_buy: signableResultData.vault_id_buy,
1481
- vault_id_sell: signableResultData.vault_id_sell
1482
- }
1483
- };
1484
- const createOrderResponse = await ordersApi.createOrderV3(orderParams, {
1485
- headers
1486
- });
1487
- return {
1488
- ...createOrderResponse.data
1489
- };
1490
- }, "CREATE_ORDER_ERROR" /* CREATE_ORDER_ERROR */);
1491
- }
1492
- async function cancelOrder({
1493
- user,
1494
- starkSigner,
1495
- request,
1496
- ordersApi,
1497
- guardianClient
1498
- }) {
1499
- return withPassportError(async () => {
1500
- const getSignableCancelOrderRequest = {
1501
- order_id: request.order_id
1502
- };
1503
- const headers = {
1504
- // eslint-disable-next-line @typescript-eslint/naming-convention
1505
- Authorization: `Bearer ${user.accessToken}`
1506
- };
1507
- const getSignableCancelOrderResponse = await ordersApi.getSignableCancelOrderV3({
1508
- getSignableCancelOrderRequest
1509
- }, { headers });
1510
- await guardianClient.evaluateImxTransaction({
1511
- payloadHash: getSignableCancelOrderResponse.data.payload_hash
1512
- });
1513
- const { payload_hash: payloadHash } = getSignableCancelOrderResponse.data;
1514
- const starkSignature = await starkSigner.signMessage(payloadHash);
1515
- const cancelOrderResponse = await ordersApi.cancelOrderV3(
1516
- {
1517
- id: request.order_id.toString(),
1518
- cancelOrderRequest: {
1519
- order_id: request.order_id,
1520
- stark_signature: starkSignature
1521
- }
1522
- },
1523
- { headers }
1524
- );
1525
- return {
1526
- order_id: cancelOrderResponse.data.order_id,
1527
- status: cancelOrderResponse.data.status
1528
- };
1529
- }, "CANCEL_ORDER_ERROR" /* CANCEL_ORDER_ERROR */);
1530
- }
1531
- async function registerPassport({ ethSigner, starkSigner, imxApiClients }, authorization) {
1532
- return withPassportError(async () => {
1533
- const [userAddress, starkPublicKey] = await Promise.all([
1534
- ethSigner.getAddress(),
1535
- starkSigner.getAddress()
1536
- ]);
1537
- const signableResult = await imxApiClients.usersApi.getSignableRegistrationOffchain({
1538
- getSignableRegistrationRequest: {
1539
- ether_key: userAddress,
1540
- stark_key: starkPublicKey
1541
- }
1542
- });
1543
- const { signable_message: signableMessage, payload_hash: payloadHash } = signableResult.data;
1544
- const [ethSignature, starkSignature] = await Promise.all([
1545
- signRaw(signableMessage, ethSigner),
1546
- starkSigner.signMessage(payloadHash)
1547
- ]);
1548
- const response = await imxApiClients.usersApi.registerPassportUserV2({
1549
- authorization: `Bearer ${authorization}`,
1550
- registerPassportUserRequest: {
1551
- eth_signature: ethSignature,
1552
- ether_key: userAddress,
1553
- stark_signature: starkSignature,
1554
- stark_key: starkPublicKey
1555
- }
1556
- });
1557
- return response.data;
1558
- }, "USER_REGISTRATION_ERROR" /* USER_REGISTRATION_ERROR */);
1559
- }
1560
-
1561
- // src/starkEx/workflows/trades.ts
1562
- async function createTrade({
1563
- request,
1564
- tradesApi,
1565
- user,
1566
- starkSigner,
1567
- guardianClient
1568
- }) {
1569
- return withPassportError(async () => {
1570
- const { ethAddress } = user.imx;
1571
- const getSignableTradeRequest = {
1572
- expiration_timestamp: request.expiration_timestamp,
1573
- fees: request.fees,
1574
- order_id: request.order_id,
1575
- user: ethAddress
1576
- };
1577
- const headers = { Authorization: `Bearer ${user.accessToken}` };
1578
- const getSignableTradeResponse = await tradesApi.getSignableTrade({
1579
- getSignableTradeRequest
1580
- }, { headers });
1581
- await guardianClient.evaluateImxTransaction({
1582
- payloadHash: getSignableTradeResponse.data.payload_hash
1583
- });
1584
- const { payload_hash: payloadHash } = getSignableTradeResponse.data;
1585
- const starkSignature = await starkSigner.signMessage(payloadHash);
1586
- const { data: signableResultData } = getSignableTradeResponse;
1587
- const tradeParams = {
1588
- createTradeRequest: {
1589
- include_fees: true,
1590
- fees: request?.fees,
1591
- stark_signature: starkSignature,
1592
- order_id: request?.order_id,
1593
- fee_info: signableResultData.fee_info,
1594
- amount_buy: signableResultData.amount_buy,
1595
- amount_sell: signableResultData.amount_sell,
1596
- asset_id_buy: signableResultData.asset_id_buy,
1597
- asset_id_sell: signableResultData.asset_id_sell,
1598
- expiration_timestamp: signableResultData.expiration_timestamp,
1599
- nonce: signableResultData.nonce,
1600
- stark_key: signableResultData.stark_key,
1601
- vault_id_buy: signableResultData.vault_id_buy,
1602
- vault_id_sell: signableResultData.vault_id_sell
1603
- }
1604
- };
1605
- const { data: createTradeResponse } = await tradesApi.createTradeV3(
1606
- tradeParams,
1607
- {
1608
- headers
1609
- }
1610
- );
1611
- return createTradeResponse;
1612
- }, "CREATE_TRADE_ERROR" /* CREATE_TRADE_ERROR */);
1613
- }
1614
- var ERC7212 = "ERC721";
1615
- async function transfer({
1616
- request,
1617
- transfersApi,
1618
- starkSigner,
1619
- user,
1620
- guardianClient
1621
- }) {
1622
- return withPassportError(async () => {
1623
- const transferAmount = request.type === ERC7212 ? "1" : request.amount;
1624
- const getSignableTransferRequest = {
1625
- sender: user.imx.ethAddress,
1626
- token: convertToSignableToken(request),
1627
- amount: transferAmount,
1628
- receiver: request.receiver
1629
- };
1630
- const headers = {
1631
- Authorization: `Bearer ${user.accessToken}`
1632
- };
1633
- const signableResult = await transfersApi.getSignableTransferV1(
1634
- {
1635
- getSignableTransferRequest
1636
- },
1637
- { headers }
1638
- );
1639
- await guardianClient.evaluateImxTransaction({
1640
- payloadHash: signableResult.data.payload_hash
1641
- });
1642
- const signableResultData = signableResult.data;
1643
- const { payload_hash: payloadHash } = signableResultData;
1644
- const starkSignature = await starkSigner.signMessage(payloadHash);
1645
- const senderStarkKey = await starkSigner.getAddress();
1646
- const transferSigningParams = {
1647
- sender_stark_key: signableResultData.sender_stark_key || senderStarkKey,
1648
- sender_vault_id: signableResultData.sender_vault_id,
1649
- receiver_stark_key: signableResultData.receiver_stark_key,
1650
- receiver_vault_id: signableResultData.receiver_vault_id,
1651
- asset_id: signableResultData.asset_id,
1652
- amount: signableResultData.amount,
1653
- nonce: signableResultData.nonce,
1654
- expiration_timestamp: signableResultData.expiration_timestamp,
1655
- stark_signature: starkSignature
1656
- };
1657
- const createTransferRequest = {
1658
- createTransferRequest: transferSigningParams
1659
- };
1660
- const { data: responseData } = await transfersApi.createTransferV1(
1661
- createTransferRequest,
1662
- { headers }
1663
- );
1664
- return {
1665
- sent_signature: responseData.sent_signature,
1666
- status: responseData.status?.toString(),
1667
- time: responseData.time,
1668
- transfer_id: responseData.transfer_id
1669
- };
1670
- }, "TRANSFER_ERROR" /* TRANSFER_ERROR */);
1671
- }
1672
- async function batchNftTransfer({
1673
- user,
1674
- starkSigner,
1675
- request,
1676
- transfersApi,
1677
- guardianClient
1678
- }) {
1679
- return withPassportError(async () => {
1680
- const { ethAddress } = user.imx;
1681
- const signableRequests = request.map(
1682
- (nftTransfer) => ({
1683
- amount: "1",
1684
- token: convertToSignableToken({
1685
- type: ERC7212,
1686
- tokenId: nftTransfer.tokenId,
1687
- tokenAddress: nftTransfer.tokenAddress
1688
- }),
1689
- receiver: nftTransfer.receiver
1690
- })
1691
- );
1692
- const headers = { Authorization: `Bearer ${user.accessToken}` };
1693
- const signableResult = await transfersApi.getSignableTransfer(
1694
- {
1695
- getSignableTransferRequestV2: {
1696
- sender_ether_key: ethAddress,
1697
- signable_requests: signableRequests
1698
- }
1699
- },
1700
- { headers }
1701
- );
1702
- await guardianClient.evaluateImxTransaction({
1703
- payloadHash: signableResult.data.signable_responses[0]?.payload_hash
1704
- });
1705
- const requests = await Promise.all(
1706
- signableResult.data.signable_responses.map(async (resp) => {
1707
- const starkSignature = await starkSigner.signMessage(resp.payload_hash);
1708
- return {
1709
- sender_vault_id: resp.sender_vault_id,
1710
- receiver_stark_key: resp.receiver_stark_key,
1711
- receiver_vault_id: resp.receiver_vault_id,
1712
- asset_id: resp.asset_id,
1713
- amount: resp.amount,
1714
- nonce: resp.nonce,
1715
- expiration_timestamp: resp.expiration_timestamp,
1716
- stark_signature: starkSignature
1717
- };
1718
- })
1719
- );
1720
- const transferSigningParams = {
1721
- sender_stark_key: signableResult.data.sender_stark_key,
1722
- requests
1723
- };
1724
- const response = await transfersApi.createTransfer(
1725
- {
1726
- createTransferRequestV2: transferSigningParams
1727
- },
1728
- { headers }
1729
- );
1730
- return {
1731
- transfer_ids: response?.data.transfer_ids
1732
- };
1733
- }, "TRANSFER_ERROR" /* TRANSFER_ERROR */);
1734
- }
1735
-
1736
- // src/network/retry.ts
1737
- var POLL_INTERVAL = 1 * 1e3;
1738
- var MAX_RETRIES = 3;
1739
- var wait2 = (ms) => new Promise((resolve) => {
1740
- setTimeout(() => resolve(), ms);
1741
- });
1742
- var retryWithDelay = async (fn, options) => {
1743
- const {
1744
- retries = MAX_RETRIES,
1745
- interval = POLL_INTERVAL,
1746
- finalErr = Error("Retry failed"),
1747
- finallyFn = () => {
1748
- }
1749
- } = options || {};
1750
- try {
1751
- return await fn();
1752
- } catch (err) {
1753
- if (retries <= 0) {
1754
- return Promise.reject(finalErr);
1755
- }
1756
- await wait2(interval);
1757
- return retryWithDelay(fn, { retries: retries - 1, finalErr, finallyFn });
1758
- } finally {
1759
- if (retries <= 0) {
1760
- finallyFn();
1761
- }
1762
- }
1763
- };
1764
-
1765
- // src/starkEx/workflows/registerOffchain.ts
1766
- async function forceUserRefresh(authManager) {
1767
- await retryWithDelay(async () => {
1768
- const user = await authManager.forceUserRefresh();
1769
- if (user?.imx) return user;
1770
- return Promise.reject(new Error("user wallet addresses not exist"));
1771
- });
1772
- }
1773
- async function registerOffchain(userAdminKeySigner, starkSigner, unregisteredUser, authManager, imxApiClients) {
1774
- return withPassportError(async () => {
1775
- try {
1776
- const response = await registerPassport(
1777
- {
1778
- ethSigner: userAdminKeySigner,
1779
- starkSigner,
1780
- imxApiClients
1781
- },
1782
- unregisteredUser.accessToken
1783
- );
1784
- await forceUserRefresh(authManager);
1785
- return response;
1786
- } catch (err) {
1787
- if (axios.isAxiosError(err) && err.response?.status === 409) {
1788
- await forceUserRefresh(authManager);
1789
- return { tx_hash: "" };
1790
- }
1791
- throw err;
1792
- }
1793
- }, "USER_REGISTRATION_ERROR" /* USER_REGISTRATION_ERROR */);
1794
- }
1795
-
1796
- // src/starkEx/passportImxProvider.ts
1797
- var PassportImxProvider = class {
1798
- authManager;
1799
- immutableXClient;
1800
- guardianClient;
1801
- imxApiClients;
1802
- magicAdapter;
1803
- /**
1804
- * This property is set during initialisation and stores the signers in a promise.
1805
- * This property is not meant to be accessed directly, but through the
1806
- * `#getSigners` method.
1807
- * @see #getSigners
1808
- */
1809
- signers;
1810
- signerInitialisationError;
1811
- constructor({
1812
- authManager,
1813
- immutableXClient,
1814
- passportEventEmitter,
1815
- magicAdapter,
1816
- imxApiClients,
1817
- guardianClient
1818
- }) {
1819
- this.authManager = authManager;
1820
- this.immutableXClient = immutableXClient;
1821
- this.magicAdapter = magicAdapter;
1822
- this.imxApiClients = imxApiClients;
1823
- this.guardianClient = guardianClient;
1824
- this.#initialiseSigners();
1825
- passportEventEmitter.on("loggedOut" /* LOGGED_OUT */, this.handleLogout);
1826
- }
1827
- handleLogout = () => {
1828
- this.signers = void 0;
1829
- };
1830
- /**
1831
- * This method is called by the constructor and asynchronously initialises the signers.
1832
- * The signers are stored in a promise so that they can be retrieved by the provider
1833
- * when needed.
1834
- *
1835
- * If an error is thrown during initialisation, it is stored in the `signerInitialisationError`,
1836
- * so that it doesn't result in an unhandled promise rejection.
1837
- *
1838
- * This error is thrown when the signers are requested through:
1839
- * @see #getSigners
1840
- *
1841
- */
1842
- #initialiseSigners() {
1843
- const generateSigners = async () => {
1844
- const user = await this.authManager.getUser();
1845
- const magicRpcProvider = await this.magicAdapter.login(user.idToken);
1846
- const browserProvider = new BrowserProvider(magicRpcProvider);
1847
- const ethSigner = await browserProvider.getSigner();
1848
- const starkSigner = await getStarkSigner(ethSigner);
1849
- return { ethSigner, starkSigner };
1850
- };
1851
- this.signers = new Promise(async (resolve) => {
1852
- try {
1853
- resolve(await generateSigners());
1854
- } catch (err) {
1855
- this.signerInitialisationError = err;
1856
- resolve(void 0);
1857
- }
1858
- });
1859
- }
1860
- async #getAuthenticatedUser() {
1861
- const user = await this.authManager.getUser();
1862
- if (!user || !this.signers) {
1863
- throw new PassportError(
1864
- "User has been logged out",
1865
- "NOT_LOGGED_IN_ERROR" /* NOT_LOGGED_IN_ERROR */
1866
- );
1867
- }
1868
- return user;
1869
- }
1870
- async #getSigners() {
1871
- const signers = await this.signers;
1872
- if (typeof signers === "undefined") {
1873
- if (typeof this.signerInitialisationError !== "undefined") {
1874
- throw this.signerInitialisationError;
1875
- }
1876
- throw new Error("Signers failed to initialise");
1877
- }
1878
- return signers;
1879
- }
1880
- async #getRegisteredImxUserAndSigners() {
1881
- const [user, signers] = await Promise.all([
1882
- this.#getAuthenticatedUser(),
1883
- this.#getSigners()
1884
- ]);
1885
- if (!isUserImx(user)) {
1886
- throw new PassportError(
1887
- "User has not been registered with StarkEx",
1888
- "USER_NOT_REGISTERED_ERROR" /* USER_NOT_REGISTERED_ERROR */
1889
- );
1890
- }
1891
- return {
1892
- user,
1893
- starkSigner: signers.starkSigner,
1894
- ethSigner: signers.ethSigner
1895
- };
1896
- }
1897
- async transfer(request) {
1898
- return withMetricsAsync(() => this.guardianClient.withDefaultConfirmationScreenTask(
1899
- async () => {
1900
- const { user, starkSigner } = await this.#getRegisteredImxUserAndSigners();
1901
- return transfer({
1902
- request,
1903
- user,
1904
- starkSigner,
1905
- transfersApi: this.immutableXClient.transfersApi,
1906
- guardianClient: this.guardianClient
1907
- });
1908
- }
1909
- )(), "imxTransfer");
1910
- }
1911
- async registerOffchain() {
1912
- return withMetricsAsync(
1913
- async () => {
1914
- const [user, signers] = await Promise.all([
1915
- this.#getAuthenticatedUser(),
1916
- this.#getSigners()
1917
- ]);
1918
- return await registerOffchain(
1919
- signers.ethSigner,
1920
- signers.starkSigner,
1921
- user,
1922
- this.authManager,
1923
- this.imxApiClients
1924
- );
1925
- },
1926
- "imxRegisterOffchain"
1927
- );
1928
- }
1929
- async isRegisteredOffchain() {
1930
- return withMetricsAsync(
1931
- async () => {
1932
- const user = await this.#getAuthenticatedUser();
1933
- return !!user.imx;
1934
- },
1935
- "imxIsRegisteredOffchain"
1936
- );
1937
- }
1938
- // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars
1939
- isRegisteredOnchain() {
1940
- throw new PassportError(
1941
- "Operation not supported",
1942
- "OPERATION_NOT_SUPPORTED_ERROR" /* OPERATION_NOT_SUPPORTED_ERROR */
1943
- );
1944
- }
1945
- async createOrder(request) {
1946
- return withMetricsAsync(() => this.guardianClient.withDefaultConfirmationScreenTask(
1947
- async () => {
1948
- const { user, starkSigner } = await this.#getRegisteredImxUserAndSigners();
1949
- return createOrder({
1950
- request,
1951
- user,
1952
- starkSigner,
1953
- ordersApi: this.immutableXClient.ordersApi,
1954
- guardianClient: this.guardianClient
1955
- });
1956
- }
1957
- )(), "imxCreateOrder");
1958
- }
1959
- async cancelOrder(request) {
1960
- return withMetricsAsync(() => this.guardianClient.withDefaultConfirmationScreenTask(
1961
- async () => {
1962
- const { user, starkSigner } = await this.#getRegisteredImxUserAndSigners();
1963
- return cancelOrder({
1964
- request,
1965
- user,
1966
- starkSigner,
1967
- ordersApi: this.immutableXClient.ordersApi,
1968
- guardianClient: this.guardianClient
1969
- });
1970
- }
1971
- )(), "imxCancelOrder");
1972
- }
1973
- async createTrade(request) {
1974
- return withMetricsAsync(() => this.guardianClient.withDefaultConfirmationScreenTask(
1975
- async () => {
1976
- const { user, starkSigner } = await this.#getRegisteredImxUserAndSigners();
1977
- return createTrade({
1978
- request,
1979
- user,
1980
- starkSigner,
1981
- tradesApi: this.immutableXClient.tradesApi,
1982
- guardianClient: this.guardianClient
1983
- });
1984
- }
1985
- )(), "imxCreateTrade");
1986
- }
1987
- async batchNftTransfer(request) {
1988
- return withMetricsAsync(() => this.guardianClient.withConfirmationScreenTask(
1989
- { width: 480, height: 784 }
1990
- )(async () => {
1991
- const { user, starkSigner } = await this.#getRegisteredImxUserAndSigners();
1992
- return batchNftTransfer({
1993
- request,
1994
- user,
1995
- starkSigner,
1996
- transfersApi: this.immutableXClient.transfersApi,
1997
- guardianClient: this.guardianClient
1998
- });
1999
- })(), "imxBatchNftTransfer");
2000
- }
2001
- async exchangeTransfer(request) {
2002
- return withMetricsAsync(async () => {
2003
- const { user, starkSigner } = await this.#getRegisteredImxUserAndSigners();
2004
- return exchangeTransfer({
2005
- request,
2006
- user,
2007
- starkSigner,
2008
- exchangesApi: this.immutableXClient.exchangeApi
2009
- });
2010
- }, "imxExchangeTransfer");
2011
- }
2012
- // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars
2013
- deposit(deposit) {
2014
- throw new PassportError(
2015
- "Operation not supported",
2016
- "OPERATION_NOT_SUPPORTED_ERROR" /* OPERATION_NOT_SUPPORTED_ERROR */
2017
- );
2018
- }
2019
- // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars
2020
- prepareWithdrawal(request) {
2021
- throw new PassportError(
2022
- "Operation not supported",
2023
- "OPERATION_NOT_SUPPORTED_ERROR" /* OPERATION_NOT_SUPPORTED_ERROR */
2024
- );
2025
- }
2026
- // eslint-disable-next-line class-methods-use-this
2027
- completeWithdrawal(starkPublicKey, token) {
2028
- throw new PassportError(
2029
- "Operation not supported",
2030
- "OPERATION_NOT_SUPPORTED_ERROR" /* OPERATION_NOT_SUPPORTED_ERROR */
2031
- );
2032
- }
2033
- async getAddress() {
2034
- return withMetricsAsync(async () => {
2035
- const user = await this.#getAuthenticatedUser();
2036
- if (!isUserImx(user)) {
2037
- throw new PassportError(
2038
- "User has not been registered with StarkEx",
2039
- "USER_NOT_REGISTERED_ERROR" /* USER_NOT_REGISTERED_ERROR */
2040
- );
2041
- }
2042
- return Promise.resolve(user.imx.ethAddress);
2043
- }, "imxGetAddress");
2044
- }
2045
- };
2046
-
2047
- // src/starkEx/passportImxProviderFactory.ts
2048
- var PassportImxProviderFactory = class {
2049
- authManager;
2050
- immutableXClient;
2051
- magicAdapter;
2052
- passportEventEmitter;
2053
- imxApiClients;
2054
- guardianClient;
2055
- constructor({
2056
- authManager,
2057
- immutableXClient,
2058
- magicAdapter,
2059
- passportEventEmitter,
2060
- imxApiClients,
2061
- guardianClient
2062
- }) {
2063
- this.authManager = authManager;
2064
- this.immutableXClient = immutableXClient;
2065
- this.magicAdapter = magicAdapter;
2066
- this.passportEventEmitter = passportEventEmitter;
2067
- this.imxApiClients = imxApiClients;
2068
- this.guardianClient = guardianClient;
2069
- }
2070
- async getProvider() {
2071
- const user = await this.authManager.getUserOrLogin();
2072
- return this.createProviderInstance(user);
2073
- }
2074
- async getProviderSilent() {
2075
- const user = await this.authManager.getUser();
2076
- if (!user) {
2077
- return null;
2078
- }
2079
- return this.createProviderInstance(user);
2080
- }
2081
- async createProviderInstance(user) {
2082
- if (!user.idToken) {
2083
- throw new PassportError(
2084
- "Failed to initialise",
2085
- "WALLET_CONNECTION_ERROR" /* WALLET_CONNECTION_ERROR */
2086
- );
2087
- }
2088
- return new PassportImxProvider({
2089
- authManager: this.authManager,
2090
- immutableXClient: this.immutableXClient,
2091
- passportEventEmitter: this.passportEventEmitter,
2092
- magicAdapter: this.magicAdapter,
2093
- imxApiClients: this.imxApiClients,
2094
- guardianClient: this.guardianClient
2095
- });
2096
- }
2097
- };
2098
- var validateConfiguration = (configuration, requiredKeys, prefix) => {
2099
- const missingKeys = requiredKeys.map((key) => !configuration[key] && key).filter((n) => n).join(", ");
2100
- if (missingKeys !== "") {
2101
- const errorMessage = prefix ? `${prefix} - ${missingKeys} cannot be null` : `${missingKeys} cannot be null`;
2102
- throw new PassportError(
2103
- errorMessage,
2104
- "INVALID_CONFIGURATION" /* INVALID_CONFIGURATION */
2105
- );
2106
- }
2107
- };
2108
- var PassportConfiguration = class {
2109
- authenticationDomain;
2110
- passportDomain;
2111
- imxPublicApiDomain;
2112
- magicPublishableApiKey;
2113
- magicProviderId;
2114
- oidcConfiguration;
2115
- baseConfig;
2116
- zkEvmRpcUrl;
2117
- relayerUrl;
2118
- multiRollupConfig;
2119
- crossSdkBridgeEnabled;
2120
- jsonRpcReferrer;
2121
- forceScwDeployBeforeMessageSignature;
2122
- popupOverlayOptions;
2123
- constructor({
2124
- baseConfig,
2125
- overrides,
2126
- crossSdkBridgeEnabled,
2127
- jsonRpcReferrer,
2128
- forceScwDeployBeforeMessageSignature,
2129
- popupOverlayOptions,
2130
- ...oidcConfiguration
2131
- }) {
2132
- validateConfiguration(oidcConfiguration, [
2133
- "clientId",
2134
- "redirectUri"
2135
- ]);
2136
- this.oidcConfiguration = oidcConfiguration;
2137
- this.baseConfig = baseConfig;
2138
- this.crossSdkBridgeEnabled = crossSdkBridgeEnabled || false;
2139
- this.jsonRpcReferrer = jsonRpcReferrer || "";
2140
- this.forceScwDeployBeforeMessageSignature = forceScwDeployBeforeMessageSignature || false;
2141
- this.popupOverlayOptions = popupOverlayOptions || {
2142
- disableGenericPopupOverlay: false,
2143
- disableBlockedPopupOverlay: false
2144
- };
2145
- if (overrides) {
2146
- validateConfiguration(
2147
- overrides,
2148
- [
2149
- "authenticationDomain",
2150
- "passportDomain",
2151
- "magicPublishableApiKey",
2152
- "magicProviderId",
2153
- "zkEvmRpcUrl",
2154
- "relayerUrl",
2155
- "imxPublicApiDomain",
2156
- "indexerMrBasePath",
2157
- "orderBookMrBasePath",
2158
- "passportMrBasePath"
2159
- ],
2160
- "overrides"
2161
- );
2162
- this.authenticationDomain = overrides.authenticationDomain;
2163
- this.passportDomain = overrides.passportDomain;
2164
- this.imxPublicApiDomain = overrides.imxPublicApiDomain;
2165
- this.magicPublishableApiKey = overrides.magicPublishableApiKey;
2166
- this.magicProviderId = overrides.magicProviderId;
2167
- this.zkEvmRpcUrl = overrides.zkEvmRpcUrl;
2168
- this.relayerUrl = overrides.relayerUrl;
2169
- this.multiRollupConfig = {
2170
- indexer: createConfig({
2171
- basePath: overrides.indexerMrBasePath
2172
- }),
2173
- orderBook: createConfig({
2174
- basePath: overrides.orderBookMrBasePath
2175
- }),
2176
- passport: createConfig({
2177
- basePath: overrides.passportMrBasePath
2178
- })
2179
- };
2180
- } else {
2181
- switch (baseConfig.environment) {
2182
- case Environment.PRODUCTION: {
2183
- this.authenticationDomain = "https://auth.immutable.com";
2184
- this.magicPublishableApiKey = "pk_live_10F423798A540ED7";
2185
- this.magicProviderId = "fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=";
2186
- this.passportDomain = "https://passport.immutable.com";
2187
- this.imxPublicApiDomain = "https://api.immutable.com";
2188
- this.zkEvmRpcUrl = "https://rpc.immutable.com";
2189
- this.relayerUrl = "https://api.immutable.com/relayer-mr";
2190
- this.multiRollupConfig = multiRollupConfig.getProduction();
2191
- break;
2192
- }
2193
- case Environment.SANDBOX:
2194
- default: {
2195
- this.authenticationDomain = "https://auth.immutable.com";
2196
- this.magicPublishableApiKey = "pk_live_10F423798A540ED7";
2197
- this.magicProviderId = "fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=";
2198
- this.passportDomain = "https://passport.sandbox.immutable.com";
2199
- this.imxPublicApiDomain = "https://api.sandbox.immutable.com";
2200
- this.zkEvmRpcUrl = "https://rpc.testnet.immutable.com";
2201
- this.relayerUrl = "https://api.sandbox.immutable.com/relayer-mr";
2202
- this.multiRollupConfig = multiRollupConfig.getSandbox();
2203
- break;
2204
- }
2205
- }
2206
- }
2207
- }
2208
- };
2209
-
2210
- // src/confirmation/types.ts
2211
- var PASSPORT_EVENT_TYPE = "imx_passport_confirmation";
2212
-
2213
- // src/confirmation/popup.ts
2214
- var openPopupCenter = ({
2215
- url,
2216
- title: title2,
2217
- width,
2218
- height
2219
- }) => {
2220
- const left = Math.max(
2221
- 0,
2222
- Math.round(window.screenX + (window.outerWidth - width) / 2)
2223
- );
2224
- const top = Math.max(
2225
- 0,
2226
- Math.round(window.screenY + (window.outerHeight - height) / 2)
2227
- );
2228
- const newWindow = window.open(
2229
- url,
2230
- title2,
2231
- `
336
+ `;function j({id:n,href:e,rel:t,crossOrigin:r}){let i=`${B}-${n}`;if(!document.getElementById(i)){let a=document.createElement("link");a.id=i,a.href=e,t&&(a.rel=t),r&&(a.crossOrigin=r),document.head.appendChild(a);}}var Qe=()=>Ye(wn()),et=()=>Ye(_n());var O=class{disableGenericPopupOverlay;disableBlockedPopupOverlay;overlay;isBlockedOverlay;tryAgainListener;onCloseListener;constructor(e,t=!1){this.disableBlockedPopupOverlay=e.disableBlockedPopupOverlay||!1,this.disableGenericPopupOverlay=e.disableGenericPopupOverlay||!1,this.isBlockedOverlay=t;}append(e,t){this.shouldAppendOverlay()&&(this.appendOverlay(),this.updateTryAgainButton(e),this.updateCloseButton(t));}update(e){this.updateTryAgainButton(e);}remove(){this.overlay&&this.overlay.remove();}shouldAppendOverlay(){return !(this.disableGenericPopupOverlay&&this.disableBlockedPopupOverlay||this.disableGenericPopupOverlay&&!this.isBlockedOverlay||this.disableBlockedPopupOverlay&&this.isBlockedOverlay)}appendOverlay(){if(!this.overlay){j({id:"link-googleapis",href:"https://fonts.googleapis.com"}),j({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),j({id:"link-roboto",href:"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap",rel:"stylesheet"});let e=document.createElement("div");e.innerHTML=this.isBlockedOverlay?Qe():et(),document.body.insertAdjacentElement("beforeend",e),this.overlay=e;}}updateTryAgainButton(e){let t=document.getElementById(J);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(X);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var Y=class{storage;constructor(e,t){this.storage=An.createInstance({name:e,driver:t});}get length(){return this.storage.length()}clear(){return this.storage.clear()}getItem(e){return this.storage.getItem(e)}key(e){return this.storage.key(e)}async removeItem(e){await this.storage.removeItem(e);}async setItem(e,t){await this.storage.setItem(e,t);}};var _e={headers:{"Content-Type":"application/x-www-form-urlencoded"}},it="/v2/logout",Nn="/authorize",Dn=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new Y("ImmutableSDKPassport",An.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new InMemoryWebStorage;let i=new WebStorageStateStore({store:r}),a=new URL(it,e.replace(/^(?:https?:\/\/)?(.*)/,"https://$1"));a.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&a.searchParams.set("returnTo",t.logoutRedirectUri);let s={authority:e,redirect_uri:t.redirectUri,popup_redirect_uri:t.redirectUri,client_id:t.clientId,metadata:{authorization_endpoint:`${e}/authorize`,token_endpoint:`${e}/oauth/token`,userinfo_endpoint:`${e}/userinfo`,end_session_endpoint:a.toString()},mergeClaims:!0,automaticSilentRenew:!1,scope:t.scope,userStore:i};return t.audience&&(s.extraQueryParams={audience:t.audience}),s};function Un(n){return new Promise(e=>{setTimeout(e,n);})}function Pe(n){return btoa(String.fromCharCode(...new Uint8Array(n))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Ln(n){let t=new TextEncoder().encode(n);return await window.crypto.subtle.digest("SHA-256",t)}var V=class n{userManager;deviceCredentialsManager;config;logoutMode;refreshingPromise=null;constructor(e){this.config=e,this.userManager=new UserManager(Dn(e)),this.deviceCredentialsManager=new G,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=tt(e.id_token)?.passport);let r={expired:e.expired,idToken:e.id_token,accessToken:e.access_token,refreshToken:e.refresh_token,profile:{sub:e.profile.sub,email:e.profile.email,nickname:e.profile.nickname}};return t?.imx_eth_address&&(r.imx={ethAddress:t.imx_eth_address,starkAddress:t.imx_stark_address,userAdminAddress:t.imx_user_admin_address}),t?.zkevm_eth_address&&(r.zkEvm={ethAddress:t?.zkevm_eth_address,userAdminAddress:t?.zkevm_user_admin_address}),r};static mapDeviceTokenResponseToOidcUser=e=>{let t=tt(e.id_token);return new User({id_token:e.id_token,access_token:e.access_token,refresh_token:e.refresh_token,token_type:e.token_type,profile:{sub:t.sub,iss:t.iss,aud:t.aud,exp:t.exp,iat:t.iat,email:t.email,nickname:t.nickname,passport:t.passport}})};async login(e){return C(async()=>{let t="passportLoginPrompt",r=async()=>this.userManager.signinPopup({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:e||""},popupWindowFeatures:{width:410,height:450},popupWindowTarget:t});return new Promise((i,a)=>{r().then(s=>{i(n.mapOidcUserToDomainModel(s));}).catch(s=>{if(!(s instanceof Error)||s.message!=="Attempted to navigate on a disposed window"){a(s);return}let o=!1,c=new O(this.config.popupOverlayOptions,!0);c.append(async()=>{try{if(o)window.open("",t);else {o=!0;let d=await r();c.remove(),i(n.mapOidcUserToDomainModel(d));}}catch(d){c.remove(),a(d);}},()=>{c.remove(),a(new Error("Popup closed by user"));});});})},"AUTHENTICATION_ERROR")}async getUserOrLogin(){let e=null;try{e=await this.getUser();}catch(t){L.warn("Failed to retrieve a cached user session",t);}return e||this.login()}async loginCallback(){return C(async()=>{await this.userManager.signinCallback();},"AUTHENTICATION_ERROR")}async loginWithDeviceFlow(e){return C(async()=>{let t=await Q.post(`${this.config.authenticationDomain}/oauth/device/code`,{client_id:this.config.oidcConfiguration.clientId,scope:this.config.oidcConfiguration.scope,audience:this.config.oidcConfiguration.audience},_e),r=getDetail(Detail.RUNTIME_ID);return {code:t.data.user_code,deviceCode:t.data.device_code,url:`${t.data.verification_uri_complete}${r?`&rid=${r}`:""}${e?`&third_party_a_id=${e}`:""}`,interval:t.data.interval}},"AUTHENTICATION_ERROR")}async loginWithDeviceFlowCallback(e,t,r){return C(async()=>{let i=Date.now(),a=!0;for(;a;){if(r!=null&&Date.now()-i>r)throw new Error("Timed out");await Un(t*1e3);try{let s=await this.getDeviceFlowToken(e),o=n.mapDeviceTokenResponseToOidcUser(s),c=n.mapOidcUserToDomainModel(o);return await this.userManager.storeUser(o),c}catch(s){if(Q.isAxiosError(s))switch((s.response?.data).error){case"authorization_pending":break;case"slow_down":break;case"expired_token":throw new Error("Token expired, please log in again");case"access_denied":throw new Error("User denied access");default:throw new Error("Error getting token")}else throw s}}throw new Error("Failed to get credentials")},"AUTHENTICATION_ERROR")}async getDeviceFlowToken(e){return (await Q.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:e},_e)).data}async getPKCEAuthorizationUrl(){let e=Pe(window.crypto.getRandomValues(new Uint8Array(32))),t=Pe(await Ln(e)),r=Pe(window.crypto.getRandomValues(new Uint8Array(32))),{redirectUri:i,scope:a,audience:s,clientId:o}=this.config.oidcConfiguration;this.deviceCredentialsManager.savePKCEData({state:r,verifier:e});let c=new URL(Nn,this.config.authenticationDomain);return c.searchParams.set("response_type","code"),c.searchParams.set("code_challenge",t),c.searchParams.set("code_challenge_method","S256"),c.searchParams.set("client_id",o),c.searchParams.set("redirect_uri",i),c.searchParams.set("state",r),a&&c.searchParams.set("scope",a),s&&c.searchParams.set("audience",s),c.toString()}async loginWithPKCEFlowCallback(e,t){return C(async()=>{let r=this.deviceCredentialsManager.getPKCEData();if(!r)throw new Error("No code verifier or state for PKCE");if(t!==r.state)throw new Error("Provided state does not match stored state");let i=await this.getPKCEToken(e,r.verifier),a=n.mapDeviceTokenResponseToOidcUser(i),s=n.mapOidcUserToDomainModel(a);return await this.userManager.storeUser(a),s},"AUTHENTICATION_ERROR")}async getPKCEToken(e,t){return (await Q.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"authorization_code",code_verifier:t,code:e,redirect_uri:this.config.oidcConfiguration.redirectUri},_e)).data}async logout(){return C(async()=>this.logoutMode==="silent"?this.userManager.signoutSilent():this.userManager.signoutRedirect(),"LOGOUT_ERROR")}async logoutSilentCallback(e){return this.userManager.signoutSilentCallback(e)}async removeUser(){return this.userManager.removeUser()}async getDeviceFlowEndSessionEndpoint(){let{authenticationDomain:e,oidcConfiguration:t}=this.config,r=new URL(it,e);return r.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&r.searchParams.set("returnTo",t.logoutRedirectUri),r.toString()}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{L.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(L.warn("Failed to refresh user token",e),null))}async refreshTokenAndUpdatePromise(){return this.refreshingPromise?this.refreshingPromise:(this.refreshingPromise=new Promise(async(e,t)=>{try{let r=await this.userManager.signinSilent();if(r){e(n.mapOidcUserToDomainModel(r));return}e(null);}catch(r){let i="AUTHENTICATION_ERROR",a="Failed to refresh token",s=!0;if(r instanceof ErrorTimeout?(i="SILENT_LOGIN_ERROR",a=`${a}: ${r.message}`,s=!1):r instanceof ErrorResponse?(i="NOT_LOGGED_IN_ERROR",a=`${a}: ${r.message||r.error_description}`):r instanceof Error?a=`${a}: ${r.message}`:typeof r=="string"&&(a=`${a}: ${r}`),s)try{await this.userManager.removeUser();}catch(o){o instanceof Error&&(a=`${a}: Failed to remove user: ${o.message}`);}t(new f(a,i));}finally{this.refreshingPromise=null;}}),this.refreshingPromise)}async getUser(e=t=>!0){if(this.refreshingPromise){let r=await this.refreshingPromise;return r&&e(r)?r:null}let t=await this.userManager.getUser();if(!t)return null;if(!ze(t)){let r=n.mapOidcUserToDomainModel(t);if(r&&e(r))return r}if(t.refresh_token){let r=await this.refreshTokenAndUpdatePromise();if(r&&e(r))return r}return null}async getUserZkEvm(){let e=await this.getUser(z);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(M);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};var Fn=(n,e)=>n().then(e),at=n=>Fn(()=>new Promise(t=>{let r=()=>{window.document.readyState==="complete"&&(t(),window.document.removeEventListener("readystatechange",r));};window.document.addEventListener("readystatechange",r),window.document.readyState==="complete"&&(t(),window.document.removeEventListener("readystatechange",r));}),n);var E=async(n,e)=>{let t=trackFlow("passport",e);try{return await n(t)}catch(r){throw r instanceof Error&&trackError("passport",e,r),t.addEvent("errored"),r}finally{t.addEvent("End");}};var qn="mainnet",H=class{config;lazyMagicClient;constructor(e){this.config=e,typeof window<"u"&&(this.lazyMagicClient=at(()=>new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:qn})));}get magicClient(){if(!this.lazyMagicClient)throw new Error("Cannot perform this action outside of the browser");return this.lazyMagicClient}async login(e){return C(async()=>E(async t=>{let r=performance.now(),i=await this.magicClient;return t.addEvent("endMagicClientInit"),await i.openid.loginWithOIDC({jwt:e,providerId:this.config.magicProviderId}),t.addEvent("endLoginWithOIDC"),trackDuration("passport",t.details.flowName,Math.round(performance.now()-r)),i.rpcProvider},"magicLogin"),"WALLET_CONNECTION_ERROR")}async logout(){let e=await this.magicClient;e.user&&await e.user.logout();}};var st=async n=>C(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function ot({user:n,starkSigner:e,request:t,exchangesApi:r}){return C(async()=>{let{ethAddress:i}=n.imx,a=t.amount,s=await r.getExchangeSignableTransfer({id:t.transactionID,getSignableTransferRequest:{sender:i,token:convertToSignableToken(t),amount:a,receiver:t.receiver}}),o=await e.getAddress(),{payload_hash:c}=s.data,d=await e.signMessage(c),m={sender_stark_key:s.data.sender_stark_key||o,sender_vault_id:s.data.sender_vault_id,receiver_stark_key:s.data.receiver_stark_key,receiver_vault_id:s.data.receiver_vault_id,asset_id:s.data.asset_id,amount:s.data.amount,nonce:s.data.nonce,expiration_timestamp:s.data.expiration_timestamp,stark_signature:d},g={Authorization:`Bearer ${n.accessToken}`},h=await r.createExchangeTransfer({id:t.transactionID,createTransferRequest:m},{headers:g});return {sent_signature:h?.data.sent_signature,status:h?.data.status?.toString(),time:h?.data.time,transfer_id:h?.data.transfer_id}},"EXCHANGE_TRANSFER_ERROR")}var dt="ERC721";async function lt({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return C(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===dt?"1":t.sell.amount,o=t.buy.type===dt?"1":t.buy.amount,c={Authorization:`Bearer ${e.accessToken}`},d={user:a,amount_buy:o,token_buy:convertToSignableToken(t.buy),amount_sell:s,token_sell:convertToSignableToken(t.sell),fees:t.fees,split_fees:!0,expiration_timestamp:t.expiration_timestamp},m=await r.getSignableOrder({getSignableOrderRequestV3:d},{headers:c});await i.evaluateImxTransaction({payloadHash:m.data.payload_hash});let{payload_hash:g}=m.data,h=await n.signMessage(g),y=m.data,v={createOrderRequest:{include_fees:!0,fees:t.fees,stark_signature:h,amount_buy:y.amount_buy,amount_sell:y.amount_sell,asset_id_buy:y.asset_id_buy,asset_id_sell:y.asset_id_sell,expiration_timestamp:y.expiration_timestamp,nonce:y.nonce,stark_key:y.stark_key,vault_id_buy:y.vault_id_buy,vault_id_sell:y.vault_id_sell}};return {...(await r.createOrderV3(v,{headers:c})).data}},"CREATE_ORDER_ERROR")}async function pt({user:n,starkSigner:e,request:t,ordersApi:r,guardianClient:i}){return C(async()=>{let a={order_id:t.order_id},s={Authorization:`Bearer ${n.accessToken}`},o=await r.getSignableCancelOrderV3({getSignableCancelOrderRequest:a},{headers:s});await i.evaluateImxTransaction({payloadHash:o.data.payload_hash});let{payload_hash:c}=o.data,d=await e.signMessage(c),m=await r.cancelOrderV3({id:t.order_id.toString(),cancelOrderRequest:{order_id:t.order_id,stark_signature:d}},{headers:s});return {order_id:m.data.order_id,status:m.data.status}},"CANCEL_ORDER_ERROR")}async function Ae({ethSigner:n,starkSigner:e,imxApiClients:t},r){return C(async()=>{let[i,a]=await Promise.all([n.getAddress(),e.getAddress()]),s=await t.usersApi.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:i,stark_key:a}}),{signable_message:o,payload_hash:c}=s.data,[d,m]=await Promise.all([signRaw(o,n),e.signMessage(c)]);return (await t.usersApi.registerPassportUserV2({authorization:`Bearer ${r}`,registerPassportUserRequest:{eth_signature:d,ether_key:i,stark_signature:m,stark_key:a}})).data},"USER_REGISTRATION_ERROR")}async function mt({request:n,tradesApi:e,user:t,starkSigner:r,guardianClient:i}){return C(async()=>{let{ethAddress:a}=t.imx,s={expiration_timestamp:n.expiration_timestamp,fees:n.fees,order_id:n.order_id,user:a},o={Authorization:`Bearer ${t.accessToken}`},c=await e.getSignableTrade({getSignableTradeRequest:s},{headers:o});await i.evaluateImxTransaction({payloadHash:c.data.payload_hash});let{payload_hash:d}=c.data,m=await r.signMessage(d),{data:g}=c,h={createTradeRequest:{include_fees:!0,fees:n?.fees,stark_signature:m,order_id:n?.order_id,fee_info:g.fee_info,amount_buy:g.amount_buy,amount_sell:g.amount_sell,asset_id_buy:g.asset_id_buy,asset_id_sell:g.asset_id_sell,expiration_timestamp:g.expiration_timestamp,nonce:g.nonce,stark_key:g.stark_key,vault_id_buy:g.vault_id_buy,vault_id_sell:g.vault_id_sell}},{data:y}=await e.createTradeV3(h,{headers:o});return y},"CREATE_TRADE_ERROR")}var gt="ERC721";async function ht({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return C(async()=>{let a=n.type===gt?"1":n.amount,s={sender:r.imx.ethAddress,token:convertToSignableToken(n),amount:a,receiver:n.receiver},o={Authorization:`Bearer ${r.accessToken}`},c=await e.getSignableTransferV1({getSignableTransferRequest:s},{headers:o});await i.evaluateImxTransaction({payloadHash:c.data.payload_hash});let d=c.data,{payload_hash:m}=d,g=await t.signMessage(m),h=await t.getAddress(),v={createTransferRequest:{sender_stark_key:d.sender_stark_key||h,sender_vault_id:d.sender_vault_id,receiver_stark_key:d.receiver_stark_key,receiver_vault_id:d.receiver_vault_id,asset_id:d.asset_id,amount:d.amount,nonce:d.nonce,expiration_timestamp:d.expiration_timestamp,stark_signature:g}},{data:w}=await e.createTransferV1(v,{headers:o});return {sent_signature:w.sent_signature,status:w.status?.toString(),time:w.time,transfer_id:w.transfer_id}},"TRANSFER_ERROR")}async function ft({user:n,starkSigner:e,request:t,transfersApi:r,guardianClient:i}){return C(async()=>{let{ethAddress:a}=n.imx,s=t.map(h=>({amount:"1",token:convertToSignableToken({type:gt,tokenId:h.tokenId,tokenAddress:h.tokenAddress}),receiver:h.receiver})),o={Authorization:`Bearer ${n.accessToken}`},c=await r.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}},{headers:o});await i.evaluateImxTransaction({payloadHash:c.data.signable_responses[0]?.payload_hash});let d=await Promise.all(c.data.signable_responses.map(async h=>{let y=await e.signMessage(h.payload_hash);return {sender_vault_id:h.sender_vault_id,receiver_stark_key:h.receiver_stark_key,receiver_vault_id:h.receiver_vault_id,asset_id:h.asset_id,amount:h.amount,nonce:h.nonce,expiration_timestamp:h.expiration_timestamp,stark_signature:y}})),m={sender_stark_key:c.data.sender_stark_key,requests:d};return {transfer_ids:(await r.createTransfer({createTransferRequestV2:m},{headers:o}))?.data.transfer_ids}},"TRANSFER_ERROR")}var Jn=n=>new Promise(e=>{setTimeout(()=>e(),n);}),N=async(n,e)=>{let{retries:t=3,interval:r=1e3,finalErr:i=Error("Retry failed"),finallyFn:a=()=>{}}=e||{};try{return await n()}catch{return t<=0?Promise.reject(i):(await Jn(r),N(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function Et(n){await N(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function Ie(n,e,t,r,i){return C(async()=>{try{let a=await Ae({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await Et(r),a}catch(a){if(Q.isAxiosError(a)&&a.response?.status===409)return await Et(r),{tx_hash:""};throw a}},"USER_REGISTRATION_ERROR")}var ee=class{authManager;immutableXClient;guardianClient;imxApiClients;magicAdapter;signers;signerInitialisationError;constructor({authManager:e,immutableXClient:t,passportEventEmitter:r,magicAdapter:i,imxApiClients:a,guardianClient:s}){this.authManager=e,this.immutableXClient=t,this.magicAdapter=i,this.imxApiClients=a,this.guardianClient=s,this.#i(),r.on("loggedOut",this.handleLogout);}handleLogout=()=>{this.signers=void 0;};#i(){let e=async()=>{let t=await this.authManager.getUser(),r=await this.magicAdapter.login(t.idToken),a=await new BrowserProvider(r).getSigner(),s=await st(a);return {ethSigner:a,starkSigner:s}};this.signers=new Promise(async t=>{try{t(await e());}catch(r){this.signerInitialisationError=r,t(void 0);}});}async#t(){let e=await this.authManager.getUser();if(!e||!this.signers)throw new f("User has been logged out","NOT_LOGGED_IN_ERROR");return e}async#a(){let e=await this.signers;if(typeof e>"u")throw typeof this.signerInitialisationError<"u"?this.signerInitialisationError:new Error("Signers failed to initialise");return e}async#r(){let[e,t]=await Promise.all([this.#t(),this.#a()]);if(!M(e))throw new f("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return {user:e,starkSigner:t.starkSigner,ethSigner:t.ethSigner}}async transfer(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return ht({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxTransfer")}async registerOffchain(){return E(async()=>{let[e,t]=await Promise.all([this.#t(),this.#a()]);return await Ie(t.ethSigner,t.starkSigner,e,this.authManager,this.imxApiClients)},"imxRegisterOffchain")}async isRegisteredOffchain(){return E(async()=>!!(await this.#t()).imx,"imxIsRegisteredOffchain")}isRegisteredOnchain(){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async createOrder(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return lt({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCreateOrder")}async cancelOrder(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return pt({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCancelOrder")}async createTrade(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return mt({request:e,user:t,starkSigner:r,tradesApi:this.immutableXClient.tradesApi,guardianClient:this.guardianClient})})(),"imxCreateTrade")}async batchNftTransfer(e){return E(()=>this.guardianClient.withConfirmationScreenTask({width:480,height:784})(async()=>{let{user:t,starkSigner:r}=await this.#r();return ft({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxBatchNftTransfer")}async exchangeTransfer(e){return E(async()=>{let{user:t,starkSigner:r}=await this.#r();return ot({request:e,user:t,starkSigner:r,exchangesApi:this.immutableXClient.exchangeApi})},"imxExchangeTransfer")}deposit(e){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}prepareWithdrawal(e){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}completeWithdrawal(e,t){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async getAddress(){return E(async()=>{let e=await this.#t();if(!M(e))throw new f("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return Promise.resolve(e.imx.ethAddress)},"imxGetAddress")}};var te=class{authManager;immutableXClient;magicAdapter;passportEventEmitter;imxApiClients;guardianClient;constructor({authManager:e,immutableXClient:t,magicAdapter:r,passportEventEmitter:i,imxApiClients:a,guardianClient:s}){this.authManager=e,this.immutableXClient=t,this.magicAdapter=r,this.passportEventEmitter=i,this.imxApiClients=a,this.guardianClient=s;}async getProvider(){let e=await this.authManager.getUserOrLogin();return this.createProviderInstance(e)}async getProviderSilent(){let e=await this.authManager.getUser();return e?this.createProviderInstance(e):null}async createProviderInstance(e){if(!e.idToken)throw new f("Failed to initialise","WALLET_CONNECTION_ERROR");return new ee({authManager:this.authManager,immutableXClient:this.immutableXClient,passportEventEmitter:this.passportEventEmitter,magicAdapter:this.magicAdapter,imxApiClients:this.imxApiClients,guardianClient:this.guardianClient})}};var vt=(n,e,t)=>{let r=e.map(i=>!n[i]&&i).filter(i=>i).join(", ");if(r!==""){let i=t?`${t} - ${r} cannot be null`:`${r} cannot be null`;throw new f(i,"INVALID_CONFIGURATION")}},re=class{authenticationDomain;passportDomain;imxPublicApiDomain;magicPublishableApiKey;magicProviderId;oidcConfiguration;baseConfig;zkEvmRpcUrl;relayerUrl;multiRollupConfig;crossSdkBridgeEnabled;jsonRpcReferrer;forceScwDeployBeforeMessageSignature;popupOverlayOptions;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,...o}){if(vt(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.jsonRpcReferrer=i||"",this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},t)vt(t,["authenticationDomain","passportDomain","magicPublishableApiKey","magicProviderId","zkEvmRpcUrl","relayerUrl","imxPublicApiDomain","indexerMrBasePath","orderBookMrBasePath","passportMrBasePath"],"overrides"),this.authenticationDomain=t.authenticationDomain,this.passportDomain=t.passportDomain,this.imxPublicApiDomain=t.imxPublicApiDomain,this.magicPublishableApiKey=t.magicPublishableApiKey,this.magicProviderId=t.magicProviderId,this.zkEvmRpcUrl=t.zkEvmRpcUrl,this.relayerUrl=t.relayerUrl,this.multiRollupConfig={indexer:createConfig({basePath:t.indexerMrBasePath}),orderBook:createConfig({basePath:t.orderBookMrBasePath}),passport:createConfig({basePath:t.passportMrBasePath})};else switch(e.environment){case Environment.PRODUCTION:{this.authenticationDomain="https://auth.immutable.com",this.magicPublishableApiKey="pk_live_10F423798A540ED7",this.magicProviderId="fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=",this.passportDomain="https://passport.immutable.com",this.imxPublicApiDomain="https://api.immutable.com",this.zkEvmRpcUrl="https://rpc.immutable.com",this.relayerUrl="https://api.immutable.com/relayer-mr",this.multiRollupConfig=multiRollupConfig.getProduction();break}case Environment.SANDBOX:default:{this.authenticationDomain="https://auth.immutable.com",this.magicPublishableApiKey="pk_live_10F423798A540ED7",this.magicProviderId="fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=",this.passportDomain="https://passport.sandbox.immutable.com",this.imxPublicApiDomain="https://api.sandbox.immutable.com",this.zkEvmRpcUrl="https://rpc.testnet.immutable.com",this.relayerUrl="https://api.sandbox.immutable.com/relayer-mr",this.multiRollupConfig=multiRollupConfig.getSandbox();break}}}};var W="imx_passport_confirmation";var ne=({url:n,title:e,width:t,height:r})=>{let i=Math.max(0,Math.round(window.screenX+(window.outerWidth-t)/2)),a=Math.max(0,Math.round(window.screenY+(window.outerHeight-r)/2)),s=window.open(n,e,`
2232
337
  scrollbars=yes,
2233
- width=${width},
2234
- height=${height},
2235
- top=${top},
2236
- left=${left}
2237
- `
2238
- );
2239
- if (!newWindow) {
2240
- throw new Error("Failed to open confirmation screen");
2241
- }
2242
- newWindow.focus();
2243
- return newWindow;
2244
- };
2245
-
2246
- // src/confirmation/confirmation.ts
2247
- var CONFIRMATION_WINDOW_TITLE = "Confirm this transaction";
2248
- var CONFIRMATION_WINDOW_HEIGHT = 720;
2249
- var CONFIRMATION_WINDOW_WIDTH = 480;
2250
- var CONFIRMATION_WINDOW_CLOSED_POLLING_DURATION = 1e3;
2251
- var ConfirmationScreen = class {
2252
- config;
2253
- confirmationWindow;
2254
- popupOptions;
2255
- overlay;
2256
- overlayClosed;
2257
- timer;
2258
- constructor(config2) {
2259
- this.config = config2;
2260
- this.overlayClosed = false;
2261
- }
2262
- getHref(relativePath, queryStringParams) {
2263
- let href = `${this.config.passportDomain}/transaction-confirmation/${relativePath}`;
2264
- if (queryStringParams) {
2265
- const queryString = queryStringParams ? Object.keys(queryStringParams).map((key) => `${key}=${queryStringParams[key]}`).join("&") : "";
2266
- href = `${href}?${queryString}`;
2267
- }
2268
- return href;
2269
- }
2270
- requestConfirmation(transactionId, etherAddress, chainType, chainId) {
2271
- return new Promise((resolve, reject) => {
2272
- const messageHandler = ({ data, origin }) => {
2273
- if (origin !== this.config.passportDomain || data.eventType !== PASSPORT_EVENT_TYPE) {
2274
- return;
2275
- }
2276
- switch (data.messageType) {
2277
- case "confirmation_window_ready" /* CONFIRMATION_WINDOW_READY */: {
2278
- this.confirmationWindow?.postMessage({
2279
- eventType: PASSPORT_EVENT_TYPE,
2280
- messageType: "confirmation_start" /* CONFIRMATION_START */
2281
- }, this.config.passportDomain);
2282
- break;
2283
- }
2284
- case "transaction_confirmed" /* TRANSACTION_CONFIRMED */: {
2285
- this.closeWindow();
2286
- resolve({ confirmed: true });
2287
- break;
2288
- }
2289
- case "transaction_rejected" /* TRANSACTION_REJECTED */: {
2290
- this.closeWindow();
2291
- resolve({ confirmed: false });
2292
- break;
2293
- }
2294
- case "transaction_error" /* TRANSACTION_ERROR */: {
2295
- this.closeWindow();
2296
- reject(new Error("Error during transaction confirmation"));
2297
- break;
2298
- }
2299
- default:
2300
- this.closeWindow();
2301
- reject(new Error("Unsupported message type"));
2302
- }
2303
- };
2304
- let href = "";
2305
- if (chainType === GeneratedClients2.mr.TransactionApprovalRequestChainTypeEnum.Starkex) {
2306
- href = this.getHref("transaction", { transactionId, etherAddress, chainType });
2307
- } else {
2308
- href = this.getHref("zkevm/transaction", {
2309
- transactionID: transactionId,
2310
- etherAddress,
2311
- chainType,
2312
- chainID: chainId
2313
- });
2314
- }
2315
- window.addEventListener("message", messageHandler);
2316
- this.showConfirmationScreen(href, messageHandler, resolve);
2317
- });
2318
- }
2319
- requestMessageConfirmation(messageID, etherAddress, messageType) {
2320
- return new Promise((resolve, reject) => {
2321
- const messageHandler = ({ data, origin }) => {
2322
- if (origin !== this.config.passportDomain || data.eventType !== PASSPORT_EVENT_TYPE) {
2323
- return;
2324
- }
2325
- switch (data.messageType) {
2326
- case "confirmation_window_ready" /* CONFIRMATION_WINDOW_READY */: {
2327
- this.confirmationWindow?.postMessage({
2328
- eventType: PASSPORT_EVENT_TYPE,
2329
- messageType: "confirmation_start" /* CONFIRMATION_START */
2330
- }, this.config.passportDomain);
2331
- break;
2332
- }
2333
- case "message_confirmed" /* MESSAGE_CONFIRMED */: {
2334
- this.closeWindow();
2335
- resolve({ confirmed: true });
2336
- break;
2337
- }
2338
- case "message_rejected" /* MESSAGE_REJECTED */: {
2339
- this.closeWindow();
2340
- resolve({ confirmed: false });
2341
- break;
2342
- }
2343
- case "message_error" /* MESSAGE_ERROR */: {
2344
- this.closeWindow();
2345
- reject(new Error("Error during message confirmation"));
2346
- break;
2347
- }
2348
- default:
2349
- this.closeWindow();
2350
- reject(new Error("Unsupported message type"));
2351
- }
2352
- };
2353
- window.addEventListener("message", messageHandler);
2354
- const href = this.getHref("zkevm/message", {
2355
- messageID,
2356
- etherAddress,
2357
- ...messageType ? { messageType } : {}
2358
- });
2359
- this.showConfirmationScreen(href, messageHandler, resolve);
2360
- });
2361
- }
2362
- showServiceUnavailable() {
2363
- return new Promise((_, reject) => {
2364
- this.showConfirmationScreen(
2365
- this.getHref("unavailable"),
2366
- () => {
2367
- },
2368
- () => {
2369
- this.closeWindow();
2370
- reject(new Error("Service unavailable"));
2371
- }
2372
- );
2373
- });
2374
- }
2375
- loading(popupOptions) {
2376
- if (this.config.crossSdkBridgeEnabled) {
2377
- return;
2378
- }
2379
- this.popupOptions = popupOptions;
2380
- try {
2381
- this.confirmationWindow = openPopupCenter({
2382
- url: this.getHref("loading"),
2383
- title: CONFIRMATION_WINDOW_TITLE,
2384
- width: popupOptions?.width || CONFIRMATION_WINDOW_WIDTH,
2385
- height: popupOptions?.height || CONFIRMATION_WINDOW_HEIGHT
2386
- });
2387
- this.overlay = new Overlay(this.config.popupOverlayOptions);
2388
- } catch (error) {
2389
- const errorMessage = error instanceof Error ? error.message : String(error);
2390
- trackError("passport", "confirmationPopupDenied", new Error(errorMessage));
2391
- this.overlay = new Overlay(this.config.popupOverlayOptions, true);
2392
- }
2393
- this.overlay.append(
2394
- () => {
2395
- try {
2396
- this.confirmationWindow?.close();
2397
- this.confirmationWindow = openPopupCenter({
2398
- url: this.getHref("loading"),
2399
- title: CONFIRMATION_WINDOW_TITLE,
2400
- width: this.popupOptions?.width || CONFIRMATION_WINDOW_WIDTH,
2401
- height: this.popupOptions?.height || CONFIRMATION_WINDOW_HEIGHT
2402
- });
2403
- } catch {
2404
- }
2405
- },
2406
- () => {
2407
- this.overlayClosed = true;
2408
- this.closeWindow();
2409
- }
2410
- );
2411
- }
2412
- closeWindow() {
2413
- this.confirmationWindow?.close();
2414
- this.overlay?.remove();
2415
- this.overlay = void 0;
2416
- }
2417
- showConfirmationScreen(href, messageHandler, resolve) {
2418
- if (this.confirmationWindow) {
2419
- this.confirmationWindow.location.href = href;
2420
- }
2421
- if (!this.overlay) {
2422
- this.overlayClosed = false;
2423
- resolve({ confirmed: false });
2424
- return;
2425
- }
2426
- const timerCallback = () => {
2427
- if (this.confirmationWindow?.closed || this.overlayClosed) {
2428
- clearInterval(this.timer);
2429
- window.removeEventListener("message", messageHandler);
2430
- resolve({ confirmed: false });
2431
- this.overlayClosed = false;
2432
- this.confirmationWindow = void 0;
2433
- }
2434
- };
2435
- this.timer = setInterval(
2436
- timerCallback,
2437
- CONFIRMATION_WINDOW_CLOSED_POLLING_DURATION
2438
- );
2439
- this.overlay.update(() => this.recreateConfirmationWindow(href, timerCallback));
2440
- }
2441
- recreateConfirmationWindow(href, timerCallback) {
2442
- try {
2443
- clearInterval(this.timer);
2444
- this.confirmationWindow?.close();
2445
- this.confirmationWindow = openPopupCenter({
2446
- url: href,
2447
- title: CONFIRMATION_WINDOW_TITLE,
2448
- width: this.popupOptions?.width || CONFIRMATION_WINDOW_WIDTH,
2449
- height: this.popupOptions?.height || CONFIRMATION_WINDOW_HEIGHT
2450
- });
2451
- this.timer = setInterval(timerCallback, CONFIRMATION_WINDOW_CLOSED_POLLING_DURATION);
2452
- } catch {
2453
- }
2454
- }
2455
- };
2456
-
2457
- // src/zkEvm/types.ts
2458
- var ProviderEvent = /* @__PURE__ */ ((ProviderEvent2) => {
2459
- ProviderEvent2["ACCOUNTS_CHANGED"] = "accountsChanged";
2460
- return ProviderEvent2;
2461
- })(ProviderEvent || {});
2462
- var TypedEventEmitter = class {
2463
- emitter = new EventEmitter();
2464
- emit(eventName, ...eventArg) {
2465
- this.emitter.emit(eventName, ...eventArg);
2466
- }
2467
- on(eventName, handler) {
2468
- this.emitter.on(eventName, handler);
2469
- }
2470
- removeListener(eventName, handler) {
2471
- this.emitter.removeListener(eventName, handler);
2472
- }
2473
- };
2474
- var SIGNATURE_WEIGHT = 1;
2475
- var TRANSACTION_SIGNATURE_THRESHOLD = 1;
2476
- var PACKED_SIGNATURE_THRESHOLD = 2;
2477
- var ETH_SIGN_FLAG = "02";
2478
- var ETH_SIGN_PREFIX = "";
2479
- var META_TRANSACTIONS_TYPE = `tuple(
338
+ width=${t},
339
+ height=${r},
340
+ top=${a},
341
+ left=${i}
342
+ `);if(!s)throw new Error("Failed to open confirmation screen");return s.focus(),s};var Oe="Confirm this transaction",be=720,ke=480,Tt=1e3;var F=class{config;confirmationWindow;popupOptions;overlay;overlayClosed;timer;constructor(e){this.config=e,this.overlayClosed=!1;}getHref(e,t){let r=`${this.config.passportDomain}/transaction-confirmation/${e}`;if(t){let i=t?Object.keys(t).map(a=>`${a}=${t[a]}`).join("&"):"";r=`${r}?${i}`;}return r}requestConfirmation(e,t,r,i){return new Promise((a,s)=>{let o=({data:d,origin:m})=>{if(!(m!==this.config.passportDomain||d.eventType!==W))switch(d.messageType){case"confirmation_window_ready":{this.confirmationWindow?.postMessage({eventType:W,messageType:"confirmation_start"},this.config.passportDomain);break}case"transaction_confirmed":{this.closeWindow(),a({confirmed:!0});break}case"transaction_rejected":{this.closeWindow(),a({confirmed:!1});break}case"transaction_error":{this.closeWindow(),s(new Error("Error during transaction confirmation"));break}default:this.closeWindow(),s(new Error("Unsupported message type"));}},c="";r===Ge.mr.TransactionApprovalRequestChainTypeEnum.Starkex?c=this.getHref("transaction",{transactionId:e,etherAddress:t,chainType:r}):c=this.getHref("zkevm/transaction",{transactionID:e,etherAddress:t,chainType:r,chainID:i}),window.addEventListener("message",o),this.showConfirmationScreen(c,o,a);})}requestMessageConfirmation(e,t,r){return new Promise((i,a)=>{let s=({data:c,origin:d})=>{if(!(d!==this.config.passportDomain||c.eventType!==W))switch(c.messageType){case"confirmation_window_ready":{this.confirmationWindow?.postMessage({eventType:W,messageType:"confirmation_start"},this.config.passportDomain);break}case"message_confirmed":{this.closeWindow(),i({confirmed:!0});break}case"message_rejected":{this.closeWindow(),i({confirmed:!1});break}case"message_error":{this.closeWindow(),a(new Error("Error during message confirmation"));break}default:this.closeWindow(),a(new Error("Unsupported message type"));}};window.addEventListener("message",s);let o=this.getHref("zkevm/message",{messageID:e,etherAddress:t,...r?{messageType:r}:{}});this.showConfirmationScreen(o,s,i);})}showServiceUnavailable(){return new Promise((e,t)=>{this.showConfirmationScreen(this.getHref("unavailable"),()=>{},()=>{this.closeWindow(),t(new Error("Service unavailable"));});})}loading(e){if(!this.config.crossSdkBridgeEnabled){this.popupOptions=e;try{this.confirmationWindow=ne({url:this.getHref("loading"),title:Oe,width:e?.width||ke,height:e?.height||be}),this.overlay=new O(this.config.popupOverlayOptions);}catch(t){let r=t instanceof Error?t.message:String(t);trackError("passport","confirmationPopupDenied",new Error(r)),this.overlay=new O(this.config.popupOverlayOptions,!0);}this.overlay.append(()=>{try{this.confirmationWindow?.close(),this.confirmationWindow=ne({url:this.getHref("loading"),title:Oe,width:this.popupOptions?.width||ke,height:this.popupOptions?.height||be});}catch{}},()=>{this.overlayClosed=!0,this.closeWindow();});}}closeWindow(){this.confirmationWindow?.close(),this.overlay?.remove(),this.overlay=void 0;}showConfirmationScreen(e,t,r){if(this.confirmationWindow&&(this.confirmationWindow.location.href=e),!this.overlay){this.overlayClosed=!1,r({confirmed:!1});return}let i=()=>{(this.confirmationWindow?.closed||this.overlayClosed)&&(clearInterval(this.timer),window.removeEventListener("message",t),r({confirmed:!1}),this.overlayClosed=!1,this.confirmationWindow=void 0);};this.timer=setInterval(i,Tt),this.overlay.update(()=>this.recreateConfirmationWindow(e,i));}recreateConfirmationWindow(e,t){try{clearInterval(this.timer),this.confirmationWindow?.close(),this.confirmationWindow=ne({url:e,title:Oe,width:this.popupOptions?.width||ke,height:this.popupOptions?.height||be}),this.timer=setInterval(t,Tt);}catch{}}};var xe=(e=>(e.ACCOUNTS_CHANGED="accountsChanged",e))(xe||{});var D=class{emitter=new EventEmitter;emit(e,...t){this.emitter.emit(e,...t);}on(e,t){this.emitter.on(e,t);}removeListener(e,t){this.emitter.removeListener(e,t);}};var It=1,ci=1,di=2,St="02",li="",Ot=`tuple(
2480
343
  bool delegateCall,
2481
344
  bool revertOnError,
2482
345
  uint256 gasLimit,
2483
346
  address target,
2484
347
  uint256 value,
2485
348
  bytes data
2486
- )[]`;
2487
- var getNormalisedTransactions = (txs) => txs.map((t) => ({
2488
- delegateCall: t.delegateCall === true,
2489
- revertOnError: t.revertOnError === true,
2490
- gasLimit: t.gasLimit ?? BigInt(0),
2491
- target: t.to ?? ZeroAddress,
2492
- value: t.value ?? BigInt(0),
2493
- data: t.data ?? "0x"
2494
- }));
2495
- var digestOfTransactionsAndNonce = (nonce, normalisedTransactions) => {
2496
- const packMetaTransactionsNonceData = AbiCoder.defaultAbiCoder().encode(
2497
- ["uint256", META_TRANSACTIONS_TYPE],
2498
- [nonce, normalisedTransactions]
2499
- );
2500
- return keccak256(packMetaTransactionsNonceData);
2501
- };
2502
- var encodedTransactions = (normalisedTransactions) => AbiCoder.defaultAbiCoder().encode(
2503
- [META_TRANSACTIONS_TYPE],
2504
- [normalisedTransactions]
2505
- );
2506
- var coerceNonceSpace = (nonceSpace) => nonceSpace || 0n;
2507
- var encodeNonce = (nonceSpace, nonce) => {
2508
- const shiftedSpace = BigInt(nonceSpace) * 2n ** 96n;
2509
- return BigInt(nonce) + shiftedSpace;
2510
- };
2511
- var getNonce = async (rpcProvider, smartContractWalletAddress, nonceSpace) => {
2512
- try {
2513
- const contract = new Contract(
2514
- smartContractWalletAddress,
2515
- walletContracts.mainModule.abi,
2516
- rpcProvider
2517
- );
2518
- const space = coerceNonceSpace(nonceSpace);
2519
- const result = await contract.readNonce(space);
2520
- if (typeof result === "bigint") {
2521
- return encodeNonce(space, result);
2522
- }
2523
- } catch (error) {
2524
- if (isCallException(error)) {
2525
- return BigInt(0);
2526
- }
2527
- throw error;
2528
- }
2529
- throw new Error("Unexpected result from contract.nonce() call.");
2530
- };
2531
- var encodeMessageSubDigest = (chainId, walletAddress, digest) => solidityPacked(
2532
- ["string", "uint256", "address", "bytes32"],
2533
- [ETH_SIGN_PREFIX, chainId, walletAddress, digest]
2534
- );
2535
- var signMetaTransactions = async (metaTransactions, nonce, chainId, walletAddress, signer) => {
2536
- const normalisedMetaTransactions = getNormalisedTransactions(metaTransactions);
2537
- const digest = digestOfTransactionsAndNonce(nonce, normalisedMetaTransactions);
2538
- const completePayload = encodeMessageSubDigest(chainId, walletAddress, digest);
2539
- const hash = keccak256(completePayload);
2540
- const hashArray = getBytes(hash);
2541
- const startTime = performance.now();
2542
- const ethsigNoType = await signer.signMessage(hashArray);
2543
- trackDuration(
2544
- "passport",
2545
- "magicSignMessageGetSignedMetaTransactions",
2546
- Math.round(performance.now() - startTime)
2547
- );
2548
- const signedDigest = `${ethsigNoType}${ETH_SIGN_FLAG}`;
2549
- const encodedSignature = v1.signature.encodeSignature({
2550
- version: 1,
2551
- threshold: TRANSACTION_SIGNATURE_THRESHOLD,
2552
- signers: [
2553
- {
2554
- isDynamic: false,
2555
- unrecovered: true,
2556
- weight: SIGNATURE_WEIGHT,
2557
- signature: signedDigest
2558
- }
2559
- ]
2560
- });
2561
- const walletInterface = new Interface(walletContracts.mainModule.abi);
2562
- return walletInterface.encodeFunctionData(walletInterface.getFunction("execute") ?? "", [
2563
- normalisedMetaTransactions,
2564
- nonce,
2565
- encodedSignature
2566
- ]);
2567
- };
2568
- var decodeRelayerSignature = (relayerSignature) => {
2569
- const signatureWithThreshold = `0x0000${relayerSignature}`;
2570
- return v1.signature.decodeSignature(signatureWithThreshold);
2571
- };
2572
- var packSignatures = (EOASignature, EOAAddress, relayerSignature) => {
2573
- const signedDigest = `${EOASignature}${ETH_SIGN_FLAG}`;
2574
- const { signers: relayerSigners } = decodeRelayerSignature(relayerSignature);
2575
- const combinedSigners = [
2576
- ...relayerSigners,
2577
- {
2578
- isDynamic: false,
2579
- unrecovered: true,
2580
- weight: SIGNATURE_WEIGHT,
2581
- signature: signedDigest,
2582
- address: EOAAddress
2583
- }
2584
- ];
2585
- const sortedSigners = combinedSigners.sort((a, b) => {
2586
- const bigA = BigInt(a.address ?? 0);
2587
- const bigB = BigInt(b.address ?? 0);
2588
- if (bigA <= bigB) {
2589
- return -1;
2590
- }
2591
- if (bigA === bigB) {
2592
- return 0;
2593
- }
2594
- return 1;
2595
- });
2596
- return v1.signature.encodeSignature({
2597
- version: 1,
2598
- threshold: PACKED_SIGNATURE_THRESHOLD,
2599
- signers: sortedSigners
2600
- });
2601
- };
2602
- var signAndPackTypedData = async (typedData, relayerSignature, chainId, walletAddress, signer) => {
2603
- const types = { ...typedData.types };
2604
- delete types.EIP712Domain;
2605
- const typedDataHash = TypedDataEncoder.hash(typedData.domain, types, typedData.message);
2606
- const messageSubDigest = encodeMessageSubDigest(chainId, walletAddress, typedDataHash);
2607
- const hash = keccak256(messageSubDigest);
2608
- const hashArray = getBytes(hash);
2609
- const startTime = performance.now();
2610
- const eoaSignature = await signer.signMessage(hashArray);
2611
- trackDuration(
2612
- "passport",
2613
- "magicSignMessageTypedData",
2614
- Math.round(performance.now() - startTime)
2615
- );
2616
- const eoaAddress = await signer.getAddress();
2617
- return packSignatures(eoaSignature, eoaAddress, relayerSignature);
2618
- };
2619
- var signERC191Message = async (chainId, payload, signer, walletAddress) => {
2620
- const digest = hashMessage(payload);
2621
- const subDigest = encodeMessageSubDigest(chainId, walletAddress, digest);
2622
- const subDigestHash = keccak256(subDigest);
2623
- const subDigestHashArray = getBytes(subDigestHash);
2624
- return signer.signMessage(subDigestHashArray);
2625
- };
2626
- var getEip155ChainId = (chainId) => `eip155:${chainId}`;
2627
-
2628
- // src/zkEvm/relayerClient.ts
2629
- var RelayerClient = class {
2630
- config;
2631
- rpcProvider;
2632
- authManager;
2633
- constructor({ config: config2, rpcProvider, authManager }) {
2634
- this.config = config2;
2635
- this.rpcProvider = rpcProvider;
2636
- this.authManager = authManager;
2637
- }
2638
- async postToRelayer(request) {
2639
- const body = {
2640
- id: 1,
2641
- jsonrpc: "2.0",
2642
- ...request
2643
- };
2644
- const user = await this.authManager.getUserZkEvm();
2645
- const startTime = performance.now();
2646
- const response = await fetch(`${this.config.relayerUrl}/v1/transactions`, {
2647
- method: "POST",
2648
- headers: {
2649
- Authorization: `Bearer ${user.accessToken}`,
2650
- "Content-Type": "application/json"
2651
- },
2652
- body: JSON.stringify(body)
2653
- });
2654
- trackDuration(
2655
- "passport",
2656
- "postToRelayer",
2657
- Math.round(performance.now() - startTime),
2658
- { rpcMethod: request.method }
2659
- );
2660
- const jsonResponse = await response.json();
2661
- if (jsonResponse.error) {
2662
- throw jsonResponse.error;
2663
- }
2664
- return jsonResponse;
2665
- }
2666
- async ethSendTransaction(to, data) {
2667
- const { chainId } = await this.rpcProvider.getNetwork();
2668
- const payload = {
2669
- method: "eth_sendTransaction",
2670
- params: [{
2671
- to,
2672
- data,
2673
- chainId: getEip155ChainId(Number(chainId))
2674
- }]
2675
- };
2676
- const { result } = await this.postToRelayer(payload);
2677
- return result;
2678
- }
2679
- async imGetTransactionByHash(hash) {
2680
- const payload = {
2681
- method: "im_getTransactionByHash",
2682
- params: [hash]
2683
- };
2684
- const { result } = await this.postToRelayer(payload);
2685
- return result;
2686
- }
2687
- async imGetFeeOptions(userAddress, data) {
2688
- const { chainId } = await this.rpcProvider.getNetwork();
2689
- const payload = {
2690
- method: "im_getFeeOptions",
2691
- params: [{
2692
- userAddress,
2693
- data,
2694
- chainId: getEip155ChainId(Number(chainId))
2695
- }]
2696
- };
2697
- const { result } = await this.postToRelayer(payload);
2698
- return result;
2699
- }
2700
- async imSignTypedData(address, eip712Payload) {
2701
- const { chainId } = await this.rpcProvider.getNetwork();
2702
- const payload = {
2703
- method: "im_signTypedData",
2704
- params: [{
2705
- address,
2706
- eip712Payload,
2707
- chainId: getEip155ChainId(Number(chainId))
2708
- }]
2709
- };
2710
- const { result } = await this.postToRelayer(payload);
2711
- return result;
2712
- }
2713
- async imSign(address, message) {
2714
- const { chainId } = await this.rpcProvider.getNetwork();
2715
- const payload = {
2716
- method: "im_sign",
2717
- params: [{
2718
- address,
2719
- message,
2720
- chainId: getEip155ChainId(Number(chainId))
2721
- }]
2722
- };
2723
- const { result } = await this.postToRelayer(payload);
2724
- return result;
2725
- }
2726
- };
2727
-
2728
- // src/zkEvm/JsonRpcError.ts
2729
- var ProviderErrorCode = /* @__PURE__ */ ((ProviderErrorCode2) => {
2730
- ProviderErrorCode2[ProviderErrorCode2["USER_REJECTED_REQUEST"] = 4001] = "USER_REJECTED_REQUEST";
2731
- ProviderErrorCode2[ProviderErrorCode2["UNAUTHORIZED"] = 4100] = "UNAUTHORIZED";
2732
- ProviderErrorCode2[ProviderErrorCode2["UNSUPPORTED_METHOD"] = 4200] = "UNSUPPORTED_METHOD";
2733
- ProviderErrorCode2[ProviderErrorCode2["DISCONNECTED"] = 4900] = "DISCONNECTED";
2734
- return ProviderErrorCode2;
2735
- })(ProviderErrorCode || {});
2736
- var RpcErrorCode = /* @__PURE__ */ ((RpcErrorCode2) => {
2737
- RpcErrorCode2[RpcErrorCode2["RPC_SERVER_ERROR"] = -32e3] = "RPC_SERVER_ERROR";
2738
- RpcErrorCode2[RpcErrorCode2["INVALID_REQUEST"] = -32600] = "INVALID_REQUEST";
2739
- RpcErrorCode2[RpcErrorCode2["METHOD_NOT_FOUND"] = -32601] = "METHOD_NOT_FOUND";
2740
- RpcErrorCode2[RpcErrorCode2["INVALID_PARAMS"] = -32602] = "INVALID_PARAMS";
2741
- RpcErrorCode2[RpcErrorCode2["INTERNAL_ERROR"] = -32603] = "INTERNAL_ERROR";
2742
- RpcErrorCode2[RpcErrorCode2["PARSE_ERROR"] = -32700] = "PARSE_ERROR";
2743
- RpcErrorCode2[RpcErrorCode2["TRANSACTION_REJECTED"] = -32003] = "TRANSACTION_REJECTED";
2744
- return RpcErrorCode2;
2745
- })(RpcErrorCode || {});
2746
- var JsonRpcError = class extends Error {
2747
- message;
2748
- code;
2749
- constructor(code, message) {
2750
- super(message);
2751
- this.message = message;
2752
- this.code = code;
2753
- }
2754
- };
2755
- var MESSAGE_TO_SIGN = "Only sign this message from Immutable Passport";
2756
- async function registerZkEvmUser({
2757
- authManager,
2758
- ethSigner,
2759
- multiRollupApiClients,
2760
- accessToken,
2761
- rpcProvider,
2762
- flow
2763
- }) {
2764
- const getAddressPromise = ethSigner.getAddress();
2765
- getAddressPromise.then(() => flow.addEvent("endGetAddress"));
2766
- const signRawPromise = signRaw(MESSAGE_TO_SIGN, ethSigner);
2767
- signRawPromise.then(() => flow.addEvent("endSignRaw"));
2768
- const detectNetworkPromise = rpcProvider.getNetwork();
2769
- detectNetworkPromise.then(() => flow.addEvent("endDetectNetwork"));
2770
- const listChainsPromise = multiRollupApiClients.chainsApi.listChains();
2771
- listChainsPromise.then(() => flow.addEvent("endListChains"));
2772
- const [ethereumAddress, ethereumSignature, network, chainListResponse] = await Promise.all([
2773
- getAddressPromise,
2774
- signRawPromise,
2775
- detectNetworkPromise,
2776
- listChainsPromise
2777
- ]);
2778
- const eipChainId = getEip155ChainId(Number(network.chainId));
2779
- const chainName = chainListResponse.data?.result?.find((chain) => chain.id === eipChainId)?.name;
2780
- if (!chainName) {
2781
- throw new JsonRpcError(
2782
- -32603 /* INTERNAL_ERROR */,
2783
- `Chain name does not exist on for chain id ${network.chainId}`
2784
- );
2785
- }
2786
- try {
2787
- const registrationResponse = await multiRollupApiClients.passportApi.createCounterfactualAddressV2({
2788
- chainName,
2789
- createCounterfactualAddressRequest: {
2790
- ethereum_address: ethereumAddress,
2791
- ethereum_signature: ethereumSignature
2792
- }
2793
- }, {
2794
- headers: { Authorization: `Bearer ${accessToken}` }
2795
- });
2796
- flow.addEvent("endCreateCounterfactualAddress");
2797
- authManager.forceUserRefreshInBackground();
2798
- return registrationResponse.data.counterfactual_address;
2799
- } catch (error) {
2800
- throw new JsonRpcError(-32603 /* INTERNAL_ERROR */, `Failed to create counterfactual address: ${error}`);
2801
- }
2802
- }
2803
- var transactionRejectedCrossSdkBridgeError = "Transaction requires confirmation but this functionality is not supported in this environment. Please contact Immutable support if you need to enable this feature.";
2804
- var convertBigNumberishToString = (value) => BigInt(value).toString();
2805
- var transformGuardianTransactions = (txs) => {
2806
- try {
2807
- return txs.map((t) => ({
2808
- delegateCall: t.delegateCall === true,
2809
- revertOnError: t.revertOnError === true,
2810
- gasLimit: t.gasLimit ? convertBigNumberishToString(t.gasLimit) : "0",
2811
- target: t.to ?? ZeroAddress,
2812
- value: t.value ? convertBigNumberishToString(t.value) : "0",
2813
- data: t.data ? t.data.toString() : "0x"
2814
- }));
2815
- } catch (error) {
2816
- const errorMessage = error instanceof Error ? error.message : String(error);
2817
- throw new JsonRpcError(
2818
- -32602 /* INVALID_PARAMS */,
2819
- `Transaction failed to parsing: ${errorMessage}`
2820
- );
2821
- }
2822
- };
2823
- var GuardianClient = class {
2824
- guardianApi;
2825
- confirmationScreen;
2826
- crossSdkBridgeEnabled;
2827
- authManager;
2828
- constructor({
2829
- confirmationScreen,
2830
- config: config2,
2831
- authManager,
2832
- guardianApi
2833
- }) {
2834
- this.confirmationScreen = confirmationScreen;
2835
- this.crossSdkBridgeEnabled = config2.crossSdkBridgeEnabled;
2836
- this.guardianApi = guardianApi;
2837
- this.authManager = authManager;
2838
- }
2839
- /**
2840
- * Open confirmation screen and close it automatically if the
2841
- * underlying task fails.
2842
- */
2843
- withConfirmationScreen(popupWindowSize) {
2844
- return (task) => this.withConfirmationScreenTask(popupWindowSize)(task)();
2845
- }
2846
- withConfirmationScreenTask(popupWindowSize) {
2847
- return (task) => async () => {
2848
- this.confirmationScreen.loading(popupWindowSize);
2849
- try {
2850
- return await task();
2851
- } catch (err) {
2852
- if (err instanceof PassportError && err.type === "SERVICE_UNAVAILABLE_ERROR" /* SERVICE_UNAVAILABLE_ERROR */) {
2853
- await this.confirmationScreen.showServiceUnavailable();
2854
- throw err;
2855
- }
2856
- this.confirmationScreen.closeWindow();
2857
- throw err;
2858
- }
2859
- };
2860
- }
2861
- withDefaultConfirmationScreenTask(task) {
2862
- return this.withConfirmationScreenTask()(task);
2863
- }
2864
- async evaluateImxTransaction({ payloadHash }) {
2865
- try {
2866
- const finallyFn = () => {
2867
- this.confirmationScreen.closeWindow();
2868
- };
2869
- const user = await this.authManager.getUserImx();
2870
- const headers = { Authorization: `Bearer ${user.accessToken}` };
2871
- const transactionRes = await retryWithDelay(
2872
- async () => this.guardianApi.getTransactionByID({
2873
- transactionID: payloadHash,
2874
- chainType: "starkex"
2875
- }, { headers }),
2876
- { finallyFn }
2877
- );
2878
- if (!transactionRes.data.id) {
2879
- throw new Error("Transaction doesn't exists");
2880
- }
2881
- const evaluateImxRes = await this.guardianApi.evaluateTransaction({
2882
- id: payloadHash,
2883
- transactionEvaluationRequest: {
2884
- chainType: "starkex"
2885
- }
2886
- }, { headers });
2887
- const { confirmationRequired } = evaluateImxRes.data;
2888
- if (confirmationRequired) {
2889
- if (this.crossSdkBridgeEnabled) {
2890
- throw new Error(transactionRejectedCrossSdkBridgeError);
2891
- }
2892
- const confirmationResult = await this.confirmationScreen.requestConfirmation(
2893
- payloadHash,
2894
- user.imx.ethAddress,
2895
- GeneratedClients2.mr.TransactionApprovalRequestChainTypeEnum.Starkex
2896
- );
2897
- if (!confirmationResult.confirmed) {
2898
- throw new Error("Transaction rejected by user");
2899
- }
2900
- } else {
2901
- this.confirmationScreen.closeWindow();
2902
- }
2903
- } catch (error) {
2904
- if (axios.isAxiosError(error) && error.response?.status === 403) {
2905
- throw new PassportError("Service unavailable", "SERVICE_UNAVAILABLE_ERROR" /* SERVICE_UNAVAILABLE_ERROR */);
2906
- }
2907
- throw error;
2908
- }
2909
- }
2910
- async evaluateEVMTransaction({
2911
- chainId,
2912
- nonce,
2913
- metaTransactions
2914
- }) {
2915
- const user = await this.authManager.getUserZkEvm();
2916
- const headers = { Authorization: `Bearer ${user.accessToken}` };
2917
- const guardianTransactions = transformGuardianTransactions(metaTransactions);
2918
- try {
2919
- const response = await this.guardianApi.evaluateTransaction(
2920
- {
2921
- id: "evm",
2922
- transactionEvaluationRequest: {
2923
- chainType: "evm",
2924
- chainId,
2925
- transactionData: {
2926
- nonce,
2927
- userAddress: user.zkEvm.ethAddress,
2928
- metaTransactions: guardianTransactions
2929
- }
2930
- }
2931
- },
2932
- { headers }
2933
- );
2934
- return response.data;
2935
- } catch (error) {
2936
- if (axios.isAxiosError(error) && error.response?.status === 403) {
2937
- throw new PassportError("Service unavailable", "SERVICE_UNAVAILABLE_ERROR" /* SERVICE_UNAVAILABLE_ERROR */);
2938
- }
2939
- const errorMessage = error instanceof Error ? error.message : String(error);
2940
- throw new JsonRpcError(
2941
- -32603 /* INTERNAL_ERROR */,
2942
- `Transaction failed to validate with error: ${errorMessage}`
2943
- );
2944
- }
2945
- }
2946
- async validateEVMTransaction({
2947
- chainId,
2948
- nonce,
2949
- metaTransactions
2950
- }) {
2951
- const transactionEvaluationResponse = await this.evaluateEVMTransaction({
2952
- chainId,
2953
- nonce,
2954
- metaTransactions
2955
- });
2956
- const { confirmationRequired, transactionId } = transactionEvaluationResponse;
2957
- if (confirmationRequired && this.crossSdkBridgeEnabled) {
2958
- throw new JsonRpcError(
2959
- -32003 /* TRANSACTION_REJECTED */,
2960
- transactionRejectedCrossSdkBridgeError
2961
- );
2962
- }
2963
- if (confirmationRequired && !!transactionId) {
2964
- const user = await this.authManager.getUserZkEvm();
2965
- const confirmationResult = await this.confirmationScreen.requestConfirmation(
2966
- transactionId,
2967
- user.zkEvm.ethAddress,
2968
- GeneratedClients2.mr.TransactionApprovalRequestChainTypeEnum.Evm,
2969
- chainId
2970
- );
2971
- if (!confirmationResult.confirmed) {
2972
- throw new JsonRpcError(
2973
- -32003 /* TRANSACTION_REJECTED */,
2974
- "Transaction rejected by user"
2975
- );
2976
- }
2977
- } else {
2978
- this.confirmationScreen.closeWindow();
2979
- }
2980
- }
2981
- async handleEIP712MessageEvaluation({ chainID, payload }) {
2982
- try {
2983
- const user = await this.authManager.getUserZkEvm();
2984
- if (user === null) {
2985
- throw new JsonRpcError(
2986
- 4100 /* UNAUTHORIZED */,
2987
- "User not logged in. Please log in first."
2988
- );
2989
- }
2990
- const messageEvalResponse = await this.guardianApi.evaluateMessage(
2991
- { messageEvaluationRequest: { chainID, payload } },
2992
- { headers: { Authorization: `Bearer ${user.accessToken}` } }
2993
- );
2994
- return messageEvalResponse.data;
2995
- } catch (error) {
2996
- const errorMessage = error instanceof Error ? error.message : String(error);
2997
- throw new JsonRpcError(
2998
- -32603 /* INTERNAL_ERROR */,
2999
- `Message failed to validate with error: ${errorMessage}`
3000
- );
3001
- }
3002
- }
3003
- async evaluateEIP712Message({ chainID, payload }) {
3004
- const { messageId, confirmationRequired } = await this.handleEIP712MessageEvaluation({ chainID, payload });
3005
- if (confirmationRequired && this.crossSdkBridgeEnabled) {
3006
- throw new JsonRpcError(-32003 /* TRANSACTION_REJECTED */, transactionRejectedCrossSdkBridgeError);
3007
- }
3008
- if (confirmationRequired && !!messageId) {
3009
- const user = await this.authManager.getUserZkEvm();
3010
- const confirmationResult = await this.confirmationScreen.requestMessageConfirmation(
3011
- messageId,
3012
- user.zkEvm.ethAddress,
3013
- "eip712"
3014
- );
3015
- if (!confirmationResult.confirmed) {
3016
- throw new JsonRpcError(
3017
- -32003 /* TRANSACTION_REJECTED */,
3018
- "Signature rejected by user"
3019
- );
3020
- }
3021
- } else {
3022
- this.confirmationScreen.closeWindow();
3023
- }
3024
- }
3025
- async handleERC191MessageEvaluation({ chainID, payload }) {
3026
- try {
3027
- const user = await this.authManager.getUserZkEvm();
3028
- if (user === null) {
3029
- throw new JsonRpcError(
3030
- 4100 /* UNAUTHORIZED */,
3031
- "User not logged in. Please log in first."
3032
- );
3033
- }
3034
- const messageEvalResponse = await this.guardianApi.evaluateErc191Message(
3035
- {
3036
- eRC191MessageEvaluationRequest: {
3037
- chainID: getEip155ChainId(Number(chainID)),
3038
- payload
3039
- }
3040
- },
3041
- { headers: { Authorization: `Bearer ${user.accessToken}` } }
3042
- );
3043
- return messageEvalResponse.data;
3044
- } catch (error) {
3045
- const errorMessage = error instanceof Error ? error.message : String(error);
3046
- throw new JsonRpcError(
3047
- -32603 /* INTERNAL_ERROR */,
3048
- `Message failed to validate with error: ${errorMessage}`
3049
- );
3050
- }
3051
- }
3052
- async evaluateERC191Message({ chainID, payload }) {
3053
- const { messageId, confirmationRequired } = await this.handleERC191MessageEvaluation({ chainID, payload });
3054
- if (confirmationRequired && this.crossSdkBridgeEnabled) {
3055
- throw new JsonRpcError(-32003 /* TRANSACTION_REJECTED */, transactionRejectedCrossSdkBridgeError);
3056
- }
3057
- if (confirmationRequired && !!messageId) {
3058
- const user = await this.authManager.getUserZkEvm();
3059
- const confirmationResult = await this.confirmationScreen.requestMessageConfirmation(
3060
- messageId,
3061
- user.zkEvm.ethAddress,
3062
- "erc191"
3063
- );
3064
- if (!confirmationResult.confirmed) {
3065
- throw new JsonRpcError(
3066
- -32003 /* TRANSACTION_REJECTED */,
3067
- "Signature rejected by user"
3068
- );
3069
- }
3070
- } else {
3071
- this.confirmationScreen.closeWindow();
3072
- }
3073
- }
3074
- };
3075
-
3076
- // src/zkEvm/transactionHelpers.ts
3077
- var MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES = 30;
3078
- var TRANSACTION_HASH_RETRIEVAL_WAIT = 1e3;
3079
- var getFeeOption = async (metaTransaction, walletAddress, relayerClient) => {
3080
- const normalisedMetaTransaction = getNormalisedTransactions([
3081
- metaTransaction
3082
- ]);
3083
- const transactions = encodedTransactions(normalisedMetaTransaction);
3084
- const feeOptions = await relayerClient.imGetFeeOptions(
3085
- walletAddress,
3086
- transactions
3087
- );
3088
- const imxFeeOption = feeOptions.find(
3089
- (feeOption) => feeOption.tokenSymbol === "IMX"
3090
- );
3091
- if (!imxFeeOption) {
3092
- throw new Error("Failed to retrieve fees for IMX token");
3093
- }
3094
- return imxFeeOption;
3095
- };
3096
- var buildMetaTransactions = async (transactionRequest, rpcProvider, relayerClient, zkevmAddress, nonceSpace) => {
3097
- if (!transactionRequest.to) {
3098
- throw new JsonRpcError(
3099
- -32602 /* INVALID_PARAMS */,
3100
- 'eth_sendTransaction requires a "to" field'
3101
- );
3102
- }
3103
- const metaTransaction = {
3104
- to: transactionRequest.to.toString(),
3105
- data: transactionRequest.data,
3106
- nonce: BigInt(0),
3107
- // NOTE: We don't need a valid nonce to estimate the fee
3108
- value: transactionRequest.value,
3109
- revertOnError: true
3110
- };
3111
- const [nonce, feeOption] = await Promise.all([
3112
- getNonce(rpcProvider, zkevmAddress, nonceSpace),
3113
- getFeeOption(metaTransaction, zkevmAddress, relayerClient)
3114
- ]);
3115
- const metaTransactions = [
3116
- {
3117
- ...metaTransaction,
3118
- nonce
3119
- }
3120
- ];
3121
- const feeValue = BigInt(feeOption.tokenPrice);
3122
- if (feeValue !== BigInt(0)) {
3123
- metaTransactions.push({
3124
- nonce,
3125
- to: feeOption.recipientAddress,
3126
- value: feeValue,
3127
- revertOnError: true
3128
- });
3129
- }
3130
- return metaTransactions;
3131
- };
3132
- var pollRelayerTransaction = async (relayerClient, relayerId, flow) => {
3133
- const retrieveRelayerTransaction = async () => {
3134
- const tx = await relayerClient.imGetTransactionByHash(relayerId);
3135
- if (tx.status === "PENDING" /* PENDING */) {
3136
- throw new Error();
3137
- }
3138
- return tx;
3139
- };
3140
- const relayerTransaction = await retryWithDelay(retrieveRelayerTransaction, {
3141
- retries: MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES,
3142
- interval: TRANSACTION_HASH_RETRIEVAL_WAIT,
3143
- finalErr: new JsonRpcError(
3144
- -32e3 /* RPC_SERVER_ERROR */,
3145
- "transaction hash not generated in time"
3146
- )
3147
- });
3148
- flow.addEvent("endRetrieveRelayerTransaction");
3149
- if (![
3150
- "SUBMITTED" /* SUBMITTED */,
3151
- "SUCCESSFUL" /* SUCCESSFUL */
3152
- ].includes(relayerTransaction.status)) {
3153
- let errorMessage = `Transaction failed to submit with status ${relayerTransaction.status}.`;
3154
- if (relayerTransaction.statusMessage) {
3155
- errorMessage += ` Error message: ${relayerTransaction.statusMessage}`;
3156
- }
3157
- throw new JsonRpcError(-32e3 /* RPC_SERVER_ERROR */, errorMessage);
3158
- }
3159
- return relayerTransaction;
3160
- };
3161
- var prepareAndSignTransaction = async ({
3162
- transactionRequest,
3163
- ethSigner,
3164
- rpcProvider,
3165
- guardianClient,
3166
- relayerClient,
3167
- zkEvmAddress,
3168
- flow,
3169
- nonceSpace
3170
- }) => {
3171
- const { chainId } = await rpcProvider.getNetwork();
3172
- const chainIdBigNumber = BigInt(chainId);
3173
- flow.addEvent("endDetectNetwork");
3174
- const metaTransactions = await buildMetaTransactions(
3175
- transactionRequest,
3176
- rpcProvider,
3177
- relayerClient,
3178
- zkEvmAddress,
3179
- nonceSpace
3180
- );
3181
- flow.addEvent("endBuildMetaTransactions");
3182
- const { nonce } = metaTransactions[0];
3183
- if (!nonce) {
3184
- throw new Error("Failed to retrieve nonce from the smart wallet");
3185
- }
3186
- const validateTransaction = async () => {
3187
- await guardianClient.validateEVMTransaction({
3188
- chainId: getEip155ChainId(Number(chainId)),
3189
- nonce: convertBigNumberishToString(nonce),
3190
- metaTransactions
3191
- });
3192
- flow.addEvent("endValidateEVMTransaction");
3193
- };
3194
- const signTransaction = async () => {
3195
- const signed = await signMetaTransactions(
3196
- metaTransactions,
3197
- nonce,
3198
- chainIdBigNumber,
3199
- zkEvmAddress,
3200
- ethSigner
3201
- );
3202
- flow.addEvent("endGetSignedMetaTransactions");
3203
- return signed;
3204
- };
3205
- const [, signedTransactions] = await Promise.all([
3206
- validateTransaction(),
3207
- signTransaction()
3208
- ]);
3209
- const relayerId = await relayerClient.ethSendTransaction(zkEvmAddress, signedTransactions);
3210
- flow.addEvent("endRelayerSendTransaction");
3211
- return { signedTransactions, relayerId, nonce };
3212
- };
3213
- var buildMetaTransactionForEjection = async (transactionRequest) => {
3214
- if (!transactionRequest.to) {
3215
- throw new JsonRpcError(
3216
- -32602 /* INVALID_PARAMS */,
3217
- 'im_signEjectionTransaction requires a "to" field'
3218
- );
3219
- }
3220
- if (typeof transactionRequest.nonce === "undefined") {
3221
- throw new JsonRpcError(
3222
- -32602 /* INVALID_PARAMS */,
3223
- 'im_signEjectionTransaction requires a "nonce" field'
3224
- );
3225
- }
3226
- if (!transactionRequest.chainId) {
3227
- throw new JsonRpcError(
3228
- -32602 /* INVALID_PARAMS */,
3229
- 'im_signEjectionTransaction requires a "chainId" field'
3230
- );
3231
- }
3232
- const metaTransaction = {
3233
- to: transactionRequest.to.toString(),
3234
- data: transactionRequest.data,
3235
- nonce: transactionRequest.nonce,
3236
- value: transactionRequest.value,
3237
- revertOnError: true
3238
- };
3239
- return [metaTransaction];
3240
- };
3241
- var prepareAndSignEjectionTransaction = async ({
3242
- transactionRequest,
3243
- ethSigner,
3244
- zkEvmAddress,
3245
- flow
3246
- }) => {
3247
- const metaTransaction = await buildMetaTransactionForEjection(
3248
- transactionRequest
3249
- );
3250
- flow.addEvent("endBuildMetaTransactions");
3251
- const signedTransaction = await signMetaTransactions(
3252
- metaTransaction,
3253
- transactionRequest.nonce,
3254
- BigInt(transactionRequest.chainId ?? 0),
3255
- zkEvmAddress,
3256
- ethSigner
3257
- );
3258
- flow.addEvent("endGetSignedMetaTransactions");
3259
- return {
3260
- to: zkEvmAddress,
3261
- data: signedTransaction,
3262
- chainId: getEip155ChainId(Number(transactionRequest.chainId ?? 0))
3263
- };
3264
- };
3265
-
3266
- // src/zkEvm/sendTransaction.ts
3267
- var sendTransaction = async ({
3268
- params,
3269
- ethSigner,
3270
- rpcProvider,
3271
- relayerClient,
3272
- guardianClient,
3273
- zkEvmAddress,
3274
- flow,
3275
- nonceSpace
3276
- }) => {
3277
- const transactionRequest = params[0];
3278
- const { relayerId } = await prepareAndSignTransaction({
3279
- transactionRequest,
3280
- ethSigner,
3281
- rpcProvider,
3282
- guardianClient,
3283
- relayerClient,
3284
- zkEvmAddress,
3285
- flow,
3286
- nonceSpace
3287
- });
3288
- const { hash } = await pollRelayerTransaction(relayerClient, relayerId, flow);
3289
- return hash;
3290
- };
3291
-
3292
- // src/zkEvm/signTypedDataV4.ts
3293
- var REQUIRED_TYPED_DATA_PROPERTIES = ["types", "domain", "primaryType", "message"];
3294
- var isValidTypedDataPayload = (typedData) => REQUIRED_TYPED_DATA_PROPERTIES.every((key) => key in typedData);
3295
- var transformTypedData = (typedData, chainId) => {
3296
- let transformedTypedData;
3297
- if (typeof typedData === "string") {
3298
- try {
3299
- transformedTypedData = JSON.parse(typedData);
3300
- } catch (err) {
3301
- throw new JsonRpcError(-32602 /* INVALID_PARAMS */, `Failed to parse typed data JSON: ${err}`);
3302
- }
3303
- } else if (typeof typedData === "object") {
3304
- transformedTypedData = typedData;
3305
- } else {
3306
- throw new JsonRpcError(-32602 /* INVALID_PARAMS */, `Invalid typed data argument: ${typedData}`);
3307
- }
3308
- if (!isValidTypedDataPayload(transformedTypedData)) {
3309
- throw new JsonRpcError(
3310
- -32602 /* INVALID_PARAMS */,
3311
- `Invalid typed data argument. The following properties are required: ${REQUIRED_TYPED_DATA_PROPERTIES.join(", ")}`
3312
- );
3313
- }
3314
- const providedChainId = transformedTypedData.domain?.chainId;
3315
- if (providedChainId) {
3316
- if (typeof providedChainId === "string") {
3317
- if (providedChainId.startsWith("0x")) {
3318
- transformedTypedData.domain.chainId = parseInt(providedChainId, 16).toString();
3319
- } else {
3320
- transformedTypedData.domain.chainId = parseInt(providedChainId, 10).toString();
3321
- }
3322
- }
3323
- if (transformedTypedData.domain.chainId !== chainId) {
3324
- throw new JsonRpcError(-32602 /* INVALID_PARAMS */, `Invalid chainId, expected ${chainId}`);
3325
- }
3326
- }
3327
- return transformedTypedData;
3328
- };
3329
- var signTypedDataV4 = async ({
3330
- params,
3331
- method,
3332
- ethSigner,
3333
- rpcProvider,
3334
- relayerClient,
3335
- guardianClient,
3336
- flow
3337
- }) => {
3338
- const fromAddress = params[0];
3339
- const typedDataParam = params[1];
3340
- if (!fromAddress || !typedDataParam) {
3341
- throw new JsonRpcError(-32602 /* INVALID_PARAMS */, `${method} requires an address and a typed data JSON`);
3342
- }
3343
- const { chainId } = await rpcProvider.getNetwork();
3344
- const typedData = transformTypedData(typedDataParam, chainId.toString());
3345
- flow.addEvent("endDetectNetwork");
3346
- await guardianClient.evaluateEIP712Message({ chainID: String(chainId), payload: typedData });
3347
- flow.addEvent("endValidateMessage");
3348
- const relayerSignature = await relayerClient.imSignTypedData(fromAddress, typedData);
3349
- flow.addEvent("endRelayerSignTypedData");
3350
- const signature = await signAndPackTypedData(
3351
- typedData,
3352
- relayerSignature,
3353
- BigInt(chainId),
3354
- fromAddress,
3355
- ethSigner
3356
- );
3357
- flow.addEvent("getSignedTypedData");
3358
- return signature;
3359
- };
3360
- var hexToString = (hex) => {
3361
- if (!hex) return hex;
3362
- try {
3363
- const stripped = stripZerosLeft(getBytes(hex));
3364
- return toUtf8String(stripped);
3365
- } catch (e) {
3366
- return hex;
3367
- }
3368
- };
3369
-
3370
- // src/zkEvm/personalSign.ts
3371
- var personalSign = async ({
3372
- params,
3373
- ethSigner,
3374
- zkEvmAddress,
3375
- rpcProvider,
3376
- guardianClient,
3377
- relayerClient,
3378
- flow
3379
- }) => {
3380
- const message = params[0];
3381
- const fromAddress = params[1];
3382
- if (!fromAddress || !message) {
3383
- throw new JsonRpcError(-32602 /* INVALID_PARAMS */, "personal_sign requires an address and a message");
3384
- }
3385
- if (fromAddress.toLowerCase() !== zkEvmAddress.toLowerCase()) {
3386
- throw new JsonRpcError(-32602 /* INVALID_PARAMS */, "personal_sign requires the signer to be the from address");
3387
- }
3388
- const payload = hexToString(message);
3389
- const { chainId } = await rpcProvider.getNetwork();
3390
- flow.addEvent("endDetectNetwork");
3391
- const chainIdBigNumber = BigInt(chainId);
3392
- const eoaSignaturePromise = signERC191Message(chainIdBigNumber, payload, ethSigner, fromAddress);
3393
- eoaSignaturePromise.then(() => flow.addEvent("endEOASignature"));
3394
- await guardianClient.evaluateERC191Message({ chainID: chainId, payload });
3395
- flow.addEvent("endEvaluateERC191Message");
3396
- const [eoaSignature, relayerSignature] = await Promise.all([
3397
- eoaSignaturePromise,
3398
- relayerClient.imSign(fromAddress, payload)
3399
- ]);
3400
- flow.addEvent("endRelayerSign");
3401
- const eoaAddress = await ethSigner.getAddress();
3402
- flow.addEvent("endGetEOAAddress");
3403
- return packSignatures(eoaSignature, eoaAddress, relayerSignature);
3404
- };
3405
- var PROD_API = "https://api.immutable.com";
3406
- var SANDBOX_API = "https://api.sandbox.immutable.com";
3407
- var CHECK_PATH = "/v1/sdk/session-activity/check";
3408
- var getBaseUrl = (environment) => {
3409
- switch (environment) {
3410
- case Environment.SANDBOX:
3411
- return SANDBOX_API;
3412
- case Environment.PRODUCTION:
3413
- return PROD_API;
3414
- default:
3415
- throw new Error("Environment not supported");
3416
- }
3417
- };
3418
- var client;
3419
- var setupClient = (environment) => {
3420
- if (client) {
3421
- return;
3422
- }
3423
- client = axios.create({
3424
- baseURL: getBaseUrl(environment)
3425
- });
3426
- };
3427
- async function get(queries) {
3428
- if (!client) {
3429
- throw new Error("Client not initialised");
3430
- }
3431
- return client.get(CHECK_PATH, {
3432
- params: queries
3433
- }).then((res) => res.data).catch((error) => {
3434
- if (error.response.status === 404) {
3435
- return void 0;
3436
- }
3437
- throw error;
3438
- });
3439
- }
3440
- function errorBoundary(fn, fallbackResult) {
3441
- return (...args) => {
3442
- try {
3443
- const result = fn(...args);
3444
- if (result instanceof Promise) {
3445
- return result.catch((error) => {
3446
- if (error instanceof Error) {
3447
- trackError("passport", "sessionActivityError", error);
3448
- }
3449
- return fallbackResult;
3450
- });
3451
- }
3452
- return result;
3453
- } catch (error) {
3454
- if (error instanceof Error) {
3455
- trackError("passport", "sessionActivityError", error);
3456
- }
3457
- return fallbackResult;
3458
- }
3459
- };
3460
- }
3461
-
3462
- // src/zkEvm/sessionActivity/sessionActivity.ts
3463
- var { getItem, setItem } = utils.localStorage;
3464
- var SESSION_ACTIVITY_COUNT_KEY = "sessionActivitySendCount";
3465
- var SESSION_ACTIVITY_DAY_KEY = "sessionActivityDate";
3466
- var checkCount = {};
3467
- var sendCount = {};
3468
- var currentSessionTrackCall = {};
3469
- var syncSendCount = () => {
3470
- sendCount = getItem(SESSION_ACTIVITY_COUNT_KEY) || {};
3471
- const sendDay = getItem(SESSION_ACTIVITY_DAY_KEY);
3472
- const date = /* @__PURE__ */ new Date();
3473
- const yyyy = date.getFullYear();
3474
- const mm = `${date.getMonth() + 1}`.padStart(2, "0");
3475
- const dd = `${date.getDate()}`.padStart(2, "0");
3476
- const today = `${yyyy}-${mm}-${dd}`;
3477
- if (!sendDay || sendDay !== today) {
3478
- sendCount = {};
3479
- }
3480
- setItem(SESSION_ACTIVITY_DAY_KEY, today);
3481
- setItem(SESSION_ACTIVITY_COUNT_KEY, sendCount);
3482
- };
3483
- syncSendCount();
3484
- var incrementSendCount = (clientId) => {
3485
- syncSendCount();
3486
- if (!sendCount[clientId]) {
3487
- sendCount[clientId] = 0;
3488
- }
3489
- sendCount[clientId]++;
3490
- setItem(SESSION_ACTIVITY_COUNT_KEY, sendCount);
3491
- checkCount[clientId] = 0;
3492
- };
3493
- var wait3 = async (seconds) => new Promise((resolve) => {
3494
- setTimeout(resolve, seconds * 1e3);
3495
- });
3496
- var trackSessionActivityFn = async (args) => {
3497
- const flow = args.flow || trackFlow("passport", "sendSessionActivity");
3498
- const clientId = args.passportClient;
3499
- if (!clientId) {
3500
- flow.addEvent("No Passport Client ID");
3501
- throw new Error("No Passport Client ID provided");
3502
- }
3503
- if (currentSessionTrackCall[clientId]) {
3504
- flow.addEvent("Existing Delay Early Exit");
3505
- return;
3506
- }
3507
- currentSessionTrackCall[clientId] = true;
3508
- const { sendTransaction: sendTransaction2, environment } = args;
3509
- if (!sendTransaction2) {
3510
- throw new Error("No sendTransaction function provided");
3511
- }
3512
- if (!environment) {
3513
- throw new Error("No environment provided");
3514
- }
3515
- setupClient(environment);
3516
- const from = args.walletAddress;
3517
- if (!from) {
3518
- flow.addEvent("No Passport Wallet Address");
3519
- throw new Error("No wallet address");
3520
- }
3521
- let details;
3522
- try {
3523
- flow.addEvent("Fetching details");
3524
- details = await get({
3525
- clientId,
3526
- wallet: from,
3527
- checkCount: checkCount[clientId] || 0,
3528
- sendCount: sendCount[clientId] || 0
3529
- });
3530
- checkCount[clientId]++;
3531
- flow.addEvent("Fetched details", { checkCount: checkCount[clientId] });
3532
- if (!details) {
3533
- flow.addEvent("No details found");
3534
- return;
3535
- }
3536
- } catch (error) {
3537
- flow.addEvent("Failed to fetch details");
3538
- throw new Error("Failed to get details", { cause: error });
3539
- }
3540
- if (details && details.contractAddress && details.functionName) {
3541
- const contractInterface = () => new Interface([`function ${details.functionName}()`]);
3542
- const data = contractInterface().encodeFunctionData(details.functionName);
3543
- const to = details.contractAddress;
3544
- try {
3545
- flow.addEvent("Start Sending Transaction");
3546
- const tx = await args.sendTransaction([{ to, from, data }], flow);
3547
- incrementSendCount(clientId);
3548
- flow.addEvent("Transaction Sent", { tx });
3549
- } catch (error) {
3550
- flow.addEvent("Failed to send Transaction");
3551
- const err = new Error("Failed to send transaction", { cause: error });
3552
- trackError("passport", "sessionActivityError", err);
3553
- }
3554
- }
3555
- if (details && details.delay && details.delay > 0) {
3556
- flow.addEvent("Delaying Transaction", { delay: details.delay });
3557
- await wait3(details.delay);
3558
- setTimeout(() => {
3559
- flow.addEvent("Retrying after Delay");
3560
- currentSessionTrackCall[clientId] = false;
3561
- trackSessionWrapper({ ...args, flow });
3562
- }, 0);
3563
- }
3564
- };
3565
- var trackSessionWrapper = (args) => errorBoundary(trackSessionActivityFn)(args).then(() => {
3566
- currentSessionTrackCall[args.passportClient] = false;
3567
- });
3568
- var trackSessionActivity = trackSessionWrapper;
3569
-
3570
- // src/zkEvm/sendDeployTransactionAndPersonalSign.ts
3571
- var sendDeployTransactionAndPersonalSign = async ({
3572
- params,
3573
- ethSigner,
3574
- rpcProvider,
3575
- relayerClient,
3576
- guardianClient,
3577
- zkEvmAddress,
3578
- flow
3579
- }) => {
3580
- const deployTransaction = { to: zkEvmAddress, value: 0 };
3581
- const { relayerId } = await prepareAndSignTransaction({
3582
- transactionRequest: deployTransaction,
3583
- ethSigner,
3584
- rpcProvider,
3585
- guardianClient,
3586
- relayerClient,
3587
- zkEvmAddress,
3588
- flow
3589
- });
3590
- return guardianClient.withConfirmationScreen()(async () => {
3591
- const signedMessage = await personalSign({
3592
- params,
3593
- ethSigner,
3594
- zkEvmAddress,
3595
- rpcProvider,
3596
- guardianClient,
3597
- relayerClient,
3598
- flow
3599
- });
3600
- await pollRelayerTransaction(relayerClient, relayerId, flow);
3601
- return signedMessage;
3602
- });
3603
- };
3604
-
3605
- // src/zkEvm/signEjectionTransaction.ts
3606
- var signEjectionTransaction = async ({
3607
- params,
3608
- ethSigner,
3609
- zkEvmAddress,
3610
- flow
3611
- }) => {
3612
- if (!params || params.length !== 1) {
3613
- throw new JsonRpcError(
3614
- -32602 /* INVALID_PARAMS */,
3615
- "im_signEjectionTransaction requires a singular param (hash)"
3616
- );
3617
- }
3618
- const transactionRequest = params[0];
3619
- return await prepareAndSignEjectionTransaction({
3620
- transactionRequest,
3621
- ethSigner,
3622
- zkEvmAddress,
3623
- flow
3624
- });
3625
- };
3626
-
3627
- // src/zkEvm/zkEvmProvider.ts
3628
- var isZkEvmUser = (user) => "zkEvm" in user;
3629
- var ZkEvmProvider = class {
3630
- #authManager;
3631
- #config;
3632
- /**
3633
- * intended to emit EIP-1193 events
3634
- */
3635
- #providerEventEmitter;
3636
- /**
3637
- * intended to emit internal Passport events
3638
- */
3639
- #passportEventEmitter;
3640
- #guardianClient;
3641
- #rpcProvider;
3642
- // Used for read
3643
- #magicAdapter;
3644
- #multiRollupApiClients;
3645
- #relayerClient;
3646
- /**
3647
- * This property is set during `#initialiseEthSigner` and stores the signer in a promise.
3648
- * This property is not meant to be accessed directly, but through the
3649
- * `#getSigner` method.
3650
- * @see getSigner
3651
- */
3652
- #ethSigner;
3653
- #signerInitialisationError;
3654
- isPassport = true;
3655
- constructor({
3656
- authManager,
3657
- magicAdapter,
3658
- config: config2,
3659
- multiRollupApiClients,
3660
- passportEventEmitter,
3661
- guardianClient
3662
- }) {
3663
- this.#authManager = authManager;
3664
- this.#magicAdapter = magicAdapter;
3665
- this.#config = config2;
3666
- this.#guardianClient = guardianClient;
3667
- this.#passportEventEmitter = passportEventEmitter;
3668
- if (config2.jsonRpcReferrer) {
3669
- this.#rpcProvider = new JsonRpcProvider(this.#config.zkEvmRpcUrl, void 0, {
3670
- staticNetwork: true
3671
- });
3672
- } else {
3673
- this.#rpcProvider = new JsonRpcProvider(this.#config.zkEvmRpcUrl, void 0, {
3674
- staticNetwork: true
3675
- });
3676
- }
3677
- this.#relayerClient = new RelayerClient({
3678
- config: this.#config,
3679
- rpcProvider: this.#rpcProvider,
3680
- authManager: this.#authManager
3681
- });
3682
- this.#multiRollupApiClients = multiRollupApiClients;
3683
- this.#providerEventEmitter = new TypedEventEmitter();
3684
- this.#authManager.getUser().then((user) => {
3685
- if (user) {
3686
- this.#initialiseEthSigner(user);
3687
- if (isZkEvmUser(user)) {
3688
- this.#callSessionActivity(user.zkEvm.ethAddress);
3689
- }
3690
- }
3691
- }).catch(() => {
3692
- });
3693
- passportEventEmitter.on("loggedIn" /* LOGGED_IN */, (user) => {
3694
- this.#initialiseEthSigner(user);
3695
- if (isZkEvmUser(user)) {
3696
- this.#callSessionActivity(user.zkEvm.ethAddress);
3697
- }
3698
- });
3699
- passportEventEmitter.on("loggedOut" /* LOGGED_OUT */, this.#handleLogout);
3700
- passportEventEmitter.on(
3701
- "accountsRequested" /* ACCOUNTS_REQUESTED */,
3702
- trackSessionActivity
3703
- );
3704
- }
3705
- #handleLogout = () => {
3706
- this.#ethSigner = void 0;
3707
- this.#providerEventEmitter.emit("accountsChanged" /* ACCOUNTS_CHANGED */, []);
3708
- };
3709
- /**
3710
- * This method is called by `eth_requestAccounts` and asynchronously initialises the signer.
3711
- * The signer is stored in a promise so that it can be retrieved by the provider
3712
- * when needed.
3713
- *
3714
- * If an error is thrown during initialisation, it is stored in the `signerInitialisationError`,
3715
- * so that it doesn't result in an unhandled promise rejection.
3716
- *
3717
- * This error is thrown when the signer is requested through:
3718
- * @see #getSigner
3719
- *
3720
- */
3721
- #initialiseEthSigner(user) {
3722
- const generateSigner = async () => {
3723
- const magicRpcProvider = await this.#magicAdapter.login(user.idToken);
3724
- const browserProvider = new BrowserProvider(magicRpcProvider);
3725
- return browserProvider.getSigner();
3726
- };
3727
- this.#signerInitialisationError = void 0;
3728
- this.#ethSigner = new Promise(async (resolve) => {
3729
- try {
3730
- resolve(await generateSigner());
3731
- } catch (err) {
3732
- this.#signerInitialisationError = err;
3733
- resolve(void 0);
3734
- }
3735
- });
3736
- }
3737
- async #getSigner() {
3738
- const ethSigner = await this.#ethSigner;
3739
- if (typeof ethSigner === "undefined") {
3740
- if (typeof this.#signerInitialisationError !== "undefined") {
3741
- throw this.#signerInitialisationError;
3742
- }
3743
- throw new Error("Signer failed to initialise");
3744
- }
3745
- return ethSigner;
3746
- }
3747
- async #callSessionActivity(zkEvmAddress, clientId) {
3748
- const nonceSpace = BigInt(1);
3749
- const sendTransactionClosure = async (params, flow) => {
3750
- const ethSigner = await this.#getSigner();
3751
- return await sendTransaction({
3752
- params,
3753
- ethSigner,
3754
- guardianClient: this.#guardianClient,
3755
- rpcProvider: this.#rpcProvider,
3756
- relayerClient: this.#relayerClient,
3757
- zkEvmAddress,
3758
- flow,
3759
- nonceSpace
3760
- });
3761
- };
3762
- this.#passportEventEmitter.emit("accountsRequested" /* ACCOUNTS_REQUESTED */, {
3763
- environment: this.#config.baseConfig.environment,
3764
- sendTransaction: sendTransactionClosure,
3765
- walletAddress: zkEvmAddress,
3766
- passportClient: clientId || this.#config.oidcConfiguration.clientId
3767
- });
3768
- }
3769
- // Used to get the registered zkEvm address from the User session
3770
- async #getZkEvmAddress() {
3771
- try {
3772
- const user = await this.#authManager.getUser();
3773
- if (user && isZkEvmUser(user)) {
3774
- return user.zkEvm.ethAddress;
3775
- }
3776
- return void 0;
3777
- } catch {
3778
- return void 0;
3779
- }
3780
- }
3781
- async #performRequest(request) {
3782
- switch (request.method) {
3783
- case "eth_requestAccounts": {
3784
- const zkEvmAddress = await this.#getZkEvmAddress();
3785
- if (zkEvmAddress) return [zkEvmAddress];
3786
- const flow = trackFlow("passport", "ethRequestAccounts");
3787
- try {
3788
- const user = await this.#authManager.getUserOrLogin();
3789
- flow.addEvent("endGetUserOrLogin");
3790
- if (!this.#ethSigner) {
3791
- this.#initialiseEthSigner(user);
3792
- }
3793
- let userZkEvmEthAddress;
3794
- if (!isZkEvmUser(user)) {
3795
- flow.addEvent("startUserRegistration");
3796
- const ethSigner = await this.#getSigner();
3797
- flow.addEvent("ethSignerResolved");
3798
- userZkEvmEthAddress = await registerZkEvmUser({
3799
- ethSigner,
3800
- authManager: this.#authManager,
3801
- multiRollupApiClients: this.#multiRollupApiClients,
3802
- accessToken: user.accessToken,
3803
- rpcProvider: this.#rpcProvider,
3804
- flow
3805
- });
3806
- flow.addEvent("endUserRegistration");
3807
- } else {
3808
- userZkEvmEthAddress = user.zkEvm.ethAddress;
3809
- }
3810
- this.#providerEventEmitter.emit("accountsChanged" /* ACCOUNTS_CHANGED */, [
3811
- userZkEvmEthAddress
3812
- ]);
3813
- identify({
3814
- passportId: user.profile.sub
3815
- });
3816
- this.#callSessionActivity(userZkEvmEthAddress);
3817
- return [userZkEvmEthAddress];
3818
- } catch (error) {
3819
- if (error instanceof Error) {
3820
- trackError("passport", "ethRequestAccounts", error);
3821
- }
3822
- flow.addEvent("errored");
3823
- throw error;
3824
- } finally {
3825
- flow.addEvent("End");
3826
- }
3827
- }
3828
- case "eth_sendTransaction": {
3829
- const zkEvmAddress = await this.#getZkEvmAddress();
3830
- if (!zkEvmAddress) {
3831
- throw new JsonRpcError(
3832
- 4100 /* UNAUTHORIZED */,
3833
- "Unauthorised - call eth_requestAccounts first"
3834
- );
3835
- }
3836
- const flow = trackFlow("passport", "ethSendTransaction");
3837
- try {
3838
- return await this.#guardianClient.withConfirmationScreen({
3839
- width: 480,
3840
- height: 720
3841
- })(async () => {
3842
- const ethSigner = await this.#getSigner();
3843
- flow.addEvent("endGetSigner");
3844
- return await sendTransaction({
3845
- params: request.params || [],
3846
- ethSigner,
3847
- guardianClient: this.#guardianClient,
3848
- rpcProvider: this.#rpcProvider,
3849
- relayerClient: this.#relayerClient,
3850
- zkEvmAddress,
3851
- flow
3852
- });
3853
- });
3854
- } catch (error) {
3855
- if (error instanceof Error) {
3856
- trackError("passport", "eth_sendTransaction", error);
3857
- }
3858
- flow.addEvent("errored");
3859
- throw error;
3860
- } finally {
3861
- flow.addEvent("End");
3862
- }
3863
- }
3864
- case "eth_accounts": {
3865
- const zkEvmAddress = await this.#getZkEvmAddress();
3866
- return zkEvmAddress ? [zkEvmAddress] : [];
3867
- }
3868
- case "personal_sign": {
3869
- const zkEvmAddress = await this.#getZkEvmAddress();
3870
- if (!zkEvmAddress) {
3871
- throw new JsonRpcError(
3872
- 4100 /* UNAUTHORIZED */,
3873
- "Unauthorised - call eth_requestAccounts first"
3874
- );
3875
- }
3876
- const flow = trackFlow("passport", "personalSign");
3877
- try {
3878
- return await this.#guardianClient.withConfirmationScreen({
3879
- width: 480,
3880
- height: 720
3881
- })(async () => {
3882
- const ethSigner = await this.#getSigner();
3883
- flow.addEvent("endGetSigner");
3884
- if (this.#config.forceScwDeployBeforeMessageSignature) {
3885
- const nonce = await getNonce(this.#rpcProvider, zkEvmAddress);
3886
- if (!(nonce > BigInt(0))) {
3887
- return await sendDeployTransactionAndPersonalSign({
3888
- params: request.params || [],
3889
- ethSigner,
3890
- zkEvmAddress,
3891
- rpcProvider: this.#rpcProvider,
3892
- guardianClient: this.#guardianClient,
3893
- relayerClient: this.#relayerClient,
3894
- flow
3895
- });
3896
- }
3897
- }
3898
- return await personalSign({
3899
- params: request.params || [],
3900
- ethSigner,
3901
- zkEvmAddress,
3902
- rpcProvider: this.#rpcProvider,
3903
- guardianClient: this.#guardianClient,
3904
- relayerClient: this.#relayerClient,
3905
- flow
3906
- });
3907
- });
3908
- } catch (error) {
3909
- if (error instanceof Error) {
3910
- trackError("passport", "personal_sign", error);
3911
- }
3912
- flow.addEvent("errored");
3913
- throw error;
3914
- } finally {
3915
- flow.addEvent("End");
3916
- }
3917
- }
3918
- case "eth_signTypedData":
3919
- case "eth_signTypedData_v4": {
3920
- const zkEvmAddress = await this.#getZkEvmAddress();
3921
- if (!zkEvmAddress) {
3922
- throw new JsonRpcError(
3923
- 4100 /* UNAUTHORIZED */,
3924
- "Unauthorised - call eth_requestAccounts first"
3925
- );
3926
- }
3927
- const flow = trackFlow("passport", "ethSignTypedDataV4");
3928
- try {
3929
- return await this.#guardianClient.withConfirmationScreen({
3930
- width: 480,
3931
- height: 720
3932
- })(async () => {
3933
- const ethSigner = await this.#getSigner();
3934
- flow.addEvent("endGetSigner");
3935
- return await signTypedDataV4({
3936
- method: request.method,
3937
- params: request.params || [],
3938
- ethSigner,
3939
- rpcProvider: this.#rpcProvider,
3940
- relayerClient: this.#relayerClient,
3941
- guardianClient: this.#guardianClient,
3942
- flow
3943
- });
3944
- });
3945
- } catch (error) {
3946
- if (error instanceof Error) {
3947
- trackError("passport", "eth_signTypedData", error);
3948
- }
3949
- flow.addEvent("errored");
3950
- throw error;
3951
- } finally {
3952
- flow.addEvent("End");
3953
- }
3954
- }
3955
- case "eth_chainId": {
3956
- const { chainId } = await this.#rpcProvider.getNetwork();
3957
- return toBeHex(chainId);
3958
- }
3959
- // Pass through methods
3960
- case "eth_getBalance":
3961
- case "eth_getCode":
3962
- case "eth_getTransactionCount": {
3963
- const [address, blockNumber] = request.params || [];
3964
- return this.#rpcProvider.send(request.method, [
3965
- address,
3966
- blockNumber || "latest"
3967
- ]);
3968
- }
3969
- case "eth_getStorageAt": {
3970
- const [address, storageSlot, blockNumber] = request.params || [];
3971
- return this.#rpcProvider.send(request.method, [
3972
- address,
3973
- storageSlot,
3974
- blockNumber || "latest"
3975
- ]);
3976
- }
3977
- case "eth_call":
3978
- case "eth_estimateGas": {
3979
- const [transaction, blockNumber] = request.params || [];
3980
- return this.#rpcProvider.send(request.method, [
3981
- transaction,
3982
- blockNumber || "latest"
3983
- ]);
3984
- }
3985
- case "eth_gasPrice":
3986
- case "eth_blockNumber":
3987
- case "eth_getBlockByHash":
3988
- case "eth_getBlockByNumber":
3989
- case "eth_getTransactionByHash":
3990
- case "eth_getTransactionReceipt": {
3991
- return this.#rpcProvider.send(request.method, request.params || []);
3992
- }
3993
- case "im_signEjectionTransaction": {
3994
- const zkEvmAddress = await this.#getZkEvmAddress();
3995
- if (!zkEvmAddress) {
3996
- throw new JsonRpcError(
3997
- 4100 /* UNAUTHORIZED */,
3998
- "Unauthorised - call eth_requestAccounts first"
3999
- );
4000
- }
4001
- const flow = trackFlow("passport", "imSignEjectionTransaction");
4002
- try {
4003
- const ethSigner = await this.#getSigner();
4004
- flow.addEvent("endGetSigner");
4005
- return await signEjectionTransaction({
4006
- params: request.params || [],
4007
- ethSigner,
4008
- zkEvmAddress,
4009
- flow
4010
- });
4011
- } catch (error) {
4012
- if (error instanceof Error) {
4013
- trackError("passport", "imSignEjectionTransaction", error);
4014
- }
4015
- flow.addEvent("errored");
4016
- throw error;
4017
- } finally {
4018
- flow.addEvent("End");
4019
- }
4020
- }
4021
- case "im_addSessionActivity": {
4022
- const [clientId] = request.params || [];
4023
- const zkEvmAddress = await this.#getZkEvmAddress();
4024
- if (zkEvmAddress) {
4025
- this.#callSessionActivity(zkEvmAddress, clientId);
4026
- }
4027
- return null;
4028
- }
4029
- default: {
4030
- throw new JsonRpcError(
4031
- 4200 /* UNSUPPORTED_METHOD */,
4032
- "Method not supported"
4033
- );
4034
- }
4035
- }
4036
- }
4037
- async request(request) {
4038
- try {
4039
- return this.#performRequest(request);
4040
- } catch (error) {
4041
- if (error instanceof JsonRpcError) {
4042
- throw error;
4043
- }
4044
- if (error instanceof Error) {
4045
- throw new JsonRpcError(-32603 /* INTERNAL_ERROR */, error.message);
4046
- }
4047
- throw new JsonRpcError(-32603 /* INTERNAL_ERROR */, "Internal error");
4048
- }
4049
- }
4050
- on(event, listener) {
4051
- this.#providerEventEmitter.on(event, listener);
4052
- }
4053
- removeListener(event, listener) {
4054
- this.#providerEventEmitter.removeListener(event, listener);
4055
- }
4056
- };
4057
- var passportProviderInfo = {
4058
- // eslint-disable-next-line max-len
4059
- icon: 'data:image/svg+xml,<svg viewBox="0 0 48 48" class="SvgIcon undefined Logo Logo--PassportSymbolOutlined css-1dn9atd" xmlns="http://www.w3.org/2000/svg"><g data-testid="undefined__g"><circle cx="24" cy="24" r="22.5" fill="url(%23paint0_radial_6324_83922)"></circle><circle cx="24" cy="24" r="22.5" fill="url(%23paint1_radial_6324_83922)"></circle><path d="M24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0ZM23.0718 9.16608C23.7383 8.83951 24.4406 8.86188 25.087 9.2287C27.3282 10.5059 29.5627 11.7942 31.786 13.096C32.5018 13.5165 32.8686 14.1897 32.8708 15.0173C32.8843 17.9184 32.8798 20.8171 32.8708 23.7182C32.8708 23.8255 32.8015 23.9821 32.7143 24.0335C31.8531 24.548 30.9808 25.0423 30.0347 25.5881V25.1318C30.0347 22.148 30.0257 19.1664 30.0414 16.1827C30.0436 15.6101 29.8468 15.241 29.339 14.9525C26.7377 13.474 24.1499 11.9687 21.5575 10.4723C21.4457 10.4075 21.3361 10.3381 21.1661 10.2352C21.8326 9.85722 22.4321 9.47698 23.0673 9.16608H23.0718ZM22.5953 38.8451C22.45 38.7713 22.3426 38.7198 22.2375 38.6595C18.8041 36.68 15.3752 34.687 11.9307 32.7232C10.9644 32.173 10.5238 31.3879 10.5349 30.2852C10.5551 27.9411 10.5484 25.597 10.5372 23.2507C10.5327 22.1927 10.9622 21.4255 11.8926 20.8977C14.3105 19.5221 16.715 18.1264 19.1195 16.7284C19.3275 16.6076 19.4796 16.5875 19.6965 16.7172C20.5264 17.216 21.3719 17.6924 22.2554 18.2024C22.0876 18.3031 21.9601 18.3791 21.8304 18.4552C19.2268 19.9582 16.6278 21.4658 14.0175 22.9599C13.5903 23.2037 13.3912 23.5213 13.3957 24.0179C13.4091 25.8654 13.4114 27.713 13.3957 29.5605C13.3912 30.0705 13.5948 30.3948 14.0332 30.6453C16.7866 32.2199 19.5288 33.8125 22.28 35.3916C22.5126 35.5258 22.611 35.6645 22.6065 35.9418C22.5864 36.888 22.5998 37.8363 22.5998 38.8473L22.5953 38.8451ZM22.5953 33.553C22.356 33.4166 22.1838 33.3204 22.0116 33.2198C19.8285 31.9605 17.6477 30.6967 15.4602 29.4464C15.2231 29.3122 15.1359 29.1668 15.1381 28.8917C15.1538 27.4714 15.1471 26.0511 15.1426 24.6308C15.1426 24.4384 15.1717 24.3064 15.3618 24.1991C16.167 23.7495 16.9633 23.2798 17.7618 22.8212C17.8199 22.7877 17.8826 22.7631 17.9877 22.7116V24.3064C17.9877 25.1698 18.0011 26.0354 17.9832 26.8988C17.972 27.3909 18.1622 27.7241 18.5916 27.9657C19.8285 28.6636 21.0498 29.3883 22.2867 30.0839C22.5305 30.2203 22.6043 30.3724 22.5998 30.6408C22.5842 31.5847 22.5931 32.5308 22.5931 33.5508L22.5953 33.553ZM20.0746 14.91C19.6116 14.6371 19.2157 14.6393 18.7527 14.91C16.1581 16.4265 13.5523 17.9228 10.9487 19.4259C10.8391 19.4908 10.7251 19.5489 10.5305 19.6541C10.5998 18.6654 10.3873 17.7327 10.7251 16.8291C10.9085 16.3348 11.2529 15.9635 11.7092 15.6995C13.8811 14.4447 16.0507 13.1877 18.227 11.9396C19.0211 11.4833 19.8308 11.4945 20.6248 11.953C23.0964 13.3756 25.5657 14.8026 28.0306 16.2341C28.1357 16.2945 28.2677 16.4309 28.2677 16.5338C28.2856 17.5493 28.2788 18.567 28.2788 19.6563C27.3819 19.1396 26.5543 18.6609 25.7267 18.1823C23.8412 17.093 21.9512 16.0149 20.0746 14.91ZM37.4427 30.8779C37.3778 31.6764 36.9103 32.2423 36.2192 32.6404C33.5732 34.1614 30.9294 35.6913 28.2856 37.2168C27.4557 37.6954 26.6259 38.1741 25.7938 38.6527C25.6932 38.7109 25.5903 38.7601 25.4539 38.8317C25.4449 38.693 25.4337 38.5924 25.4337 38.4917C25.4337 37.6149 25.4382 36.7404 25.4293 35.8636C25.4293 35.6645 25.4762 35.5437 25.6596 35.4386C29.5157 33.2198 33.3696 30.9942 37.2212 28.7709C37.2794 28.7374 37.3443 28.7105 37.4539 28.6591C37.4539 29.4375 37.4986 30.1622 37.4427 30.8779ZM37.4628 25.3577C37.4561 26.2658 36.9663 26.9033 36.1901 27.3506C33.175 29.0841 30.1622 30.8265 27.1493 32.5666C26.5991 32.8842 26.0466 33.1996 25.4561 33.5396C25.4472 33.3897 25.436 33.2913 25.436 33.1907C25.436 32.3273 25.4449 31.4617 25.4293 30.5983C25.4248 30.3523 25.5075 30.2226 25.72 30.0995C28.46 28.5271 31.1911 26.9368 33.9355 25.3733C34.4231 25.096 34.6378 24.7538 34.6334 24.1812C34.6132 21.1974 34.6244 18.2136 34.6244 15.2298V14.7087C35.3402 15.1404 36.0112 15.496 36.624 15.9299C37.1832 16.3258 37.465 16.9253 37.4673 17.6164C37.4762 20.1976 37.4829 22.7788 37.465 25.3599L37.4628 25.3577Z" fill="%230D0D0D"></path><path fill-rule="evenodd" d="M24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0ZM24 2C11.8497 2 2 11.8497 2 24C2 36.1503 11.8497 46 24 46C36.1503 46 46 36.1503 46 24C46 11.8497 36.1503 2 24 2Z" fill="url(%23paint2_radial_6324_83922)"></path><path fill-rule="evenodd" d="M24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0ZM24 2C11.8497 2 2 11.8497 2 24C2 36.1503 11.8497 46 24 46C36.1503 46 46 36.1503 46 24C46 11.8497 36.1503 2 24 2Z" fill="url(%23paint3_radial_6324_83922)"></path><defs><radialGradient id="paint0_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(13.4442 13.3899) rotate(44.9817) scale(46.7487 99.1435)"><stop stop-color="%23A3EEF8"></stop><stop offset="0.177083" stop-color="%23A4DCF5"></stop><stop offset="0.380208" stop-color="%23A6AEEC"></stop><stop offset="1" stop-color="%23ECBEE1"></stop></radialGradient><radialGradient id="paint1_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(25.9515 43.7068) rotate(84.265) scale(24.2138 46.3215)"><stop stop-color="%23FCF5EE"></stop><stop offset="0.715135" stop-color="%23ECBEE1" stop-opacity="0"></stop></radialGradient><radialGradient id="paint2_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(12.7405 12.6825) rotate(44.9817) scale(49.8653 105.753)"><stop stop-color="%23A3EEF8"></stop><stop offset="0.177083" stop-color="%23A4DCF5"></stop><stop offset="0.380208" stop-color="%23A6AEEC"></stop><stop offset="1" stop-color="%23ECBEE1"></stop></radialGradient><radialGradient id="paint3_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(26.0816 45.0206) rotate(84.265) scale(25.828 49.4096)"><stop stop-color="%23FCF5EE"></stop><stop offset="0.715135" stop-color="%23ECBEE1" stop-opacity="0"></stop></radialGradient></defs></g></svg>',
4060
- name: "Immutable Passport",
4061
- rdns: "com.immutable.passport",
4062
- uuid: v4()
4063
- };
4064
- function announceProvider(detail) {
4065
- if (typeof window === "undefined") return;
4066
- const event = new CustomEvent(
4067
- "eip6963:announceProvider",
4068
- { detail: Object.freeze(detail) }
4069
- );
4070
- window.dispatchEvent(event);
4071
- const handler = () => window.dispatchEvent(event);
4072
- window.addEventListener("eip6963:requestProvider", handler);
4073
- }
4074
-
4075
- // src/Passport.ts
4076
- var buildImxClientConfig = (passportModuleConfiguration) => {
4077
- if (passportModuleConfiguration.overrides) {
4078
- return createConfig({ basePath: passportModuleConfiguration.overrides.imxPublicApiDomain });
4079
- }
4080
- if (passportModuleConfiguration.baseConfig.environment === Environment.SANDBOX) {
4081
- return imxApiConfig.getSandbox();
4082
- }
4083
- return imxApiConfig.getProduction();
4084
- };
4085
- var buildImxApiClients = (passportModuleConfiguration) => {
4086
- if (passportModuleConfiguration.overrides?.imxApiClients) return passportModuleConfiguration.overrides.imxApiClients;
4087
- const config2 = buildImxClientConfig(passportModuleConfiguration);
4088
- return new ImxApiClients(config2);
4089
- };
4090
- var buildPrivateVars = (passportModuleConfiguration) => {
4091
- const config2 = new PassportConfiguration(passportModuleConfiguration);
4092
- const authManager = new AuthManager(config2);
4093
- const magicAdapter = new MagicAdapter(config2);
4094
- const confirmationScreen = new ConfirmationScreen(config2);
4095
- const multiRollupApiClients = new MultiRollupApiClients(config2.multiRollupConfig);
4096
- const passportEventEmitter = new TypedEventEmitter();
4097
- const immutableXClient = passportModuleConfiguration.overrides ? passportModuleConfiguration.overrides.immutableXClient : new IMXClient({ baseConfig: passportModuleConfiguration.baseConfig });
4098
- const guardianClient = new GuardianClient({
4099
- confirmationScreen,
4100
- config: config2,
4101
- authManager,
4102
- guardianApi: multiRollupApiClients.guardianApi
4103
- });
4104
- const imxApiClients = buildImxApiClients(passportModuleConfiguration);
4105
- const passportImxProviderFactory = new PassportImxProviderFactory({
4106
- authManager,
4107
- immutableXClient,
4108
- magicAdapter,
4109
- passportEventEmitter,
4110
- imxApiClients,
4111
- guardianClient
4112
- });
4113
- return {
4114
- config: config2,
4115
- authManager,
4116
- magicAdapter,
4117
- confirmationScreen,
4118
- immutableXClient,
4119
- multiRollupApiClients,
4120
- passportEventEmitter,
4121
- passportImxProviderFactory,
4122
- guardianClient
4123
- };
4124
- };
4125
- var Passport = class {
4126
- authManager;
4127
- config;
4128
- confirmationScreen;
4129
- immutableXClient;
4130
- magicAdapter;
4131
- multiRollupApiClients;
4132
- passportImxProviderFactory;
4133
- passportEventEmitter;
4134
- guardianClient;
4135
- constructor(passportModuleConfiguration) {
4136
- const privateVars = buildPrivateVars(passportModuleConfiguration);
4137
- this.config = privateVars.config;
4138
- this.authManager = privateVars.authManager;
4139
- this.magicAdapter = privateVars.magicAdapter;
4140
- this.confirmationScreen = privateVars.confirmationScreen;
4141
- this.immutableXClient = privateVars.immutableXClient;
4142
- this.multiRollupApiClients = privateVars.multiRollupApiClients;
4143
- this.passportEventEmitter = privateVars.passportEventEmitter;
4144
- this.passportImxProviderFactory = privateVars.passportImxProviderFactory;
4145
- this.guardianClient = privateVars.guardianClient;
4146
- setPassportClientId(passportModuleConfiguration.clientId);
4147
- track("passport", "initialise");
4148
- }
4149
- /**
4150
- * @deprecated The method `login` with an argument of `{ useCachedSession: true }` should be used in conjunction with
4151
- * `connectImx` instead.
4152
- */
4153
- async connectImxSilent() {
4154
- return withMetricsAsync(() => this.passportImxProviderFactory.getProviderSilent(), "connectImxSilent");
4155
- }
4156
- async connectImx() {
4157
- return withMetricsAsync(() => this.passportImxProviderFactory.getProvider(), "connectImx");
4158
- }
4159
- connectEvm(options = {
4160
- announceProvider: true
4161
- }) {
4162
- return withMetricsAsync(async () => {
4163
- const provider = new ZkEvmProvider({
4164
- passportEventEmitter: this.passportEventEmitter,
4165
- authManager: this.authManager,
4166
- magicAdapter: this.magicAdapter,
4167
- config: this.config,
4168
- multiRollupApiClients: this.multiRollupApiClients,
4169
- guardianClient: this.guardianClient
4170
- });
4171
- if (options?.announceProvider) {
4172
- announceProvider({
4173
- info: passportProviderInfo,
4174
- provider
4175
- });
4176
- }
4177
- return provider;
4178
- }, "connectEvm");
4179
- }
4180
- /**
4181
- *
4182
- * Initiates the authorisation flow.
4183
- *
4184
- * @param options.useCachedSession = false - If true, and no active session exists, then the user will not be
4185
- * prompted to log in and the Promise will resolve with a null value.
4186
- * @param options.anonymousId - If provided, Passport internal metrics will be enriched with this value.
4187
- * @param options.useSilentLogin - If true, and no active session exists, then the user will not be prompted to log in. Instead, we will attempt to authenticate the user silently. This approach will fail if the user does not have an active session with the authentication server, or if user input is required (for example, consent is required).
4188
- * @returns {Promise<UserProfile | null>} the user profile if the user is logged in, otherwise null
4189
- */
4190
- async login(options) {
4191
- return withMetricsAsync(async () => {
4192
- const { useCachedSession = false, useSilentLogin } = options || {};
4193
- let user = null;
4194
- try {
4195
- user = await this.authManager.getUser();
4196
- } catch (error) {
4197
- if (error instanceof Error && !error.message.includes("Unknown or invalid refresh token")) {
4198
- trackError("passport", "login", error);
4199
- }
4200
- if (useCachedSession) {
4201
- throw error;
4202
- }
4203
- logger_default.warn("Failed to retrieve a cached user session", error);
4204
- }
4205
- if (!user && useSilentLogin) {
4206
- user = await this.authManager.forceUserRefresh();
4207
- } else if (!user && !useCachedSession) {
4208
- user = await this.authManager.login(options?.anonymousId);
4209
- }
4210
- if (user) {
4211
- identify({
4212
- passportId: user.profile.sub
4213
- });
4214
- this.passportEventEmitter.emit("loggedIn" /* LOGGED_IN */, user);
4215
- }
4216
- return user ? user.profile : null;
4217
- }, "login");
4218
- }
4219
- async loginCallback() {
4220
- return withMetricsAsync(() => this.authManager.loginCallback(), "loginCallback");
4221
- }
4222
- async loginWithDeviceFlow(options) {
4223
- return withMetricsAsync(() => this.authManager.loginWithDeviceFlow(options?.anonymousId), "loginWithDeviceFlow");
4224
- }
4225
- async loginWithDeviceFlowCallback(deviceCode, interval, timeoutMs) {
4226
- return withMetricsAsync(async () => {
4227
- const user = await this.authManager.loginWithDeviceFlowCallback(
4228
- deviceCode,
4229
- interval,
4230
- timeoutMs
4231
- );
4232
- this.passportEventEmitter.emit("loggedIn" /* LOGGED_IN */, user);
4233
- return user.profile;
4234
- }, "loginWithDeviceFlowCallback");
4235
- }
4236
- loginWithPKCEFlow() {
4237
- return withMetricsAsync(async () => await this.authManager.getPKCEAuthorizationUrl(), "loginWithPKCEFlow");
4238
- }
4239
- async loginWithPKCEFlowCallback(authorizationCode, state) {
4240
- return withMetricsAsync(async () => {
4241
- const user = await this.authManager.loginWithPKCEFlowCallback(
4242
- authorizationCode,
4243
- state
4244
- );
4245
- this.passportEventEmitter.emit("loggedIn" /* LOGGED_IN */, user);
4246
- return user.profile;
4247
- }, "loginWithPKCEFlowCallback");
4248
- }
4249
- async logout() {
4250
- return withMetricsAsync(async () => {
4251
- if (this.config.oidcConfiguration.logoutMode === "silent") {
4252
- await Promise.allSettled([
4253
- this.authManager.logout(),
4254
- this.magicAdapter.logout()
4255
- ]);
4256
- } else {
4257
- await this.magicAdapter.logout();
4258
- await this.authManager.logout();
4259
- }
4260
- this.passportEventEmitter.emit("loggedOut" /* LOGGED_OUT */);
4261
- }, "logout");
4262
- }
4263
- /**
4264
- * Logs the user out of Passport when using device flow authentication.
4265
- *
4266
- * @returns {Promise<string>} The device flow end session endpoint. Consumers are responsible for
4267
- * opening this URL in the same browser that was used to log the user in.
4268
- */
4269
- async logoutDeviceFlow() {
4270
- return withMetricsAsync(async () => {
4271
- await this.authManager.removeUser();
4272
- await this.magicAdapter.logout();
4273
- this.passportEventEmitter.emit("loggedOut" /* LOGGED_OUT */);
4274
- return await this.authManager.getDeviceFlowEndSessionEndpoint();
4275
- }, "logoutDeviceFlow");
4276
- }
4277
- /**
4278
- * This method should only be called from the logout redirect uri
4279
- * when logout mode is 'silent'.
4280
- */
4281
- async logoutSilentCallback(url) {
4282
- return withMetricsAsync(() => this.authManager.logoutSilentCallback(url), "logoutSilentCallback");
4283
- }
4284
- async getUserInfo() {
4285
- return withMetricsAsync(async () => {
4286
- const user = await this.authManager.getUser();
4287
- return user?.profile;
4288
- }, "getUserInfo");
4289
- }
4290
- async getIdToken() {
4291
- return withMetricsAsync(async () => {
4292
- const user = await this.authManager.getUser();
4293
- return user?.idToken;
4294
- }, "getIdToken");
4295
- }
4296
- async getAccessToken() {
4297
- return withMetricsAsync(async () => {
4298
- const user = await this.authManager.getUser();
4299
- return user?.accessToken;
4300
- }, "getAccessToken");
4301
- }
4302
- async getLinkedAddresses() {
4303
- return withMetricsAsync(async () => {
4304
- const user = await this.authManager.getUser();
4305
- if (!user?.profile.sub) {
4306
- return [];
4307
- }
4308
- const headers = { Authorization: `Bearer ${user.accessToken}` };
4309
- const getUserInfoResult = await this.multiRollupApiClients.passportProfileApi.getUserInfo({ headers });
4310
- return getUserInfoResult.data.linked_addresses;
4311
- }, "getLinkedAddresses");
4312
- }
4313
- async linkExternalWallet(params) {
4314
- const flow = trackFlow("passport", "linkExternalWallet");
4315
- const user = await this.authManager.getUser();
4316
- if (!user) {
4317
- throw new PassportError("User is not logged in", "NOT_LOGGED_IN_ERROR" /* NOT_LOGGED_IN_ERROR */);
4318
- }
4319
- const isRegisteredWithIMX = isUserImx(user);
4320
- const isRegisteredWithZkEvm = isUserZkEvm(user);
4321
- if (!isRegisteredWithIMX && !isRegisteredWithZkEvm) {
4322
- throw new PassportError("User has not been registered", "USER_NOT_REGISTERED_ERROR" /* USER_NOT_REGISTERED_ERROR */);
4323
- }
4324
- const headers = { Authorization: `Bearer ${user.accessToken}` };
4325
- const linkWalletV2Request = {
4326
- type: params.type,
4327
- wallet_address: params.walletAddress,
4328
- signature: params.signature,
4329
- nonce: params.nonce
4330
- };
4331
- try {
4332
- const linkWalletV2Result = await this.multiRollupApiClients.passportProfileApi.linkWalletV2({ linkWalletV2Request }, { headers });
4333
- return { ...linkWalletV2Result.data };
4334
- } catch (error) {
4335
- if (error instanceof Error) {
4336
- trackError("passport", "linkExternalWallet", error);
4337
- }
4338
- flow.addEvent("errored");
4339
- if (isAxiosError(error) && error.response) {
4340
- if (error.response.data && isAPIError(error.response.data)) {
4341
- const { code, message: message2 } = error.response.data;
4342
- switch (code) {
4343
- case "ALREADY_LINKED":
4344
- throw new PassportError(message2, "LINK_WALLET_ALREADY_LINKED_ERROR" /* LINK_WALLET_ALREADY_LINKED_ERROR */);
4345
- case "MAX_WALLETS_LINKED":
4346
- throw new PassportError(message2, "LINK_WALLET_MAX_WALLETS_LINKED_ERROR" /* LINK_WALLET_MAX_WALLETS_LINKED_ERROR */);
4347
- case "DUPLICATE_NONCE":
4348
- throw new PassportError(message2, "LINK_WALLET_DUPLICATE_NONCE_ERROR" /* LINK_WALLET_DUPLICATE_NONCE_ERROR */);
4349
- case "VALIDATION_ERROR":
4350
- throw new PassportError(message2, "LINK_WALLET_VALIDATION_ERROR" /* LINK_WALLET_VALIDATION_ERROR */);
4351
- default:
4352
- throw new PassportError(message2, "LINK_WALLET_GENERIC_ERROR" /* LINK_WALLET_GENERIC_ERROR */);
4353
- }
4354
- } else if (error.response.status) {
4355
- throw new PassportError(
4356
- `Link wallet request failed with status code ${error.response.status}`,
4357
- "LINK_WALLET_GENERIC_ERROR" /* LINK_WALLET_GENERIC_ERROR */
4358
- );
4359
- }
4360
- }
4361
- let message = "Link wallet request failed";
4362
- if (error instanceof Error) {
4363
- message += `: ${error.message}`;
4364
- }
4365
- throw new PassportError(
4366
- message,
4367
- "LINK_WALLET_GENERIC_ERROR" /* LINK_WALLET_GENERIC_ERROR */
4368
- );
4369
- } finally {
4370
- flow.addEvent("End");
4371
- }
4372
- }
4373
- };
349
+ )[]`,De=n=>n.map(e=>({delegateCall:e.delegateCall===!0,revertOnError:e.revertOnError===!0,gasLimit:e.gasLimit??BigInt(0),target:e.to??ZeroAddress,value:e.value??BigInt(0),data:e.data??"0x"})),pi=(n,e)=>{let t=AbiCoder.defaultAbiCoder().encode(["uint256",Ot],[n,e]);return keccak256(t)},bt=n=>AbiCoder.defaultAbiCoder().encode([Ot],[n]),mi=n=>n||0n,ui=(n,e)=>{let t=BigInt(n)*2n**96n;return BigInt(e)+t},ae=async(n,e,t)=>{try{let r=new Contract(e,walletContracts.mainModule.abi,n),i=mi(t),a=await r.readNonce(i);if(typeof a=="bigint")return ui(i,a)}catch(r){if(isCallException(r))return BigInt(0);throw r}throw new Error("Unexpected result from contract.nonce() call.")},Ue=(n,e,t)=>solidityPacked(["string","uint256","address","bytes32"],[li,n,e,t]),Le=async(n,e,t,r,i)=>{let a=De(n),s=pi(e,a),o=Ue(t,r,s),c=keccak256(o),d=getBytes(c),m=performance.now(),g=await i.signMessage(d);trackDuration("passport","magicSignMessageGetSignedMetaTransactions",Math.round(performance.now()-m));let h=`${g}${St}`,y=v1.signature.encodeSignature({version:1,threshold:ci,signers:[{isDynamic:!1,unrecovered:!0,weight:It,signature:h}]}),v=new Interface(walletContracts.mainModule.abi);return v.encodeFunctionData(v.getFunction("execute")??"",[a,e,y])},gi=n=>{let e=`0x0000${n}`;return v1.signature.decodeSignature(e)},Fe=(n,e,t)=>{let r=`${n}${St}`,{signers:i}=gi(t),s=[...i,{isDynamic:!1,unrecovered:!0,weight:It,signature:r,address:e}].sort((o,c)=>{let d=BigInt(o.address??0),m=BigInt(c.address??0);return d<=m?-1:d===m?0:1});return v1.signature.encodeSignature({version:1,threshold:di,signers:s})},kt=async(n,e,t,r,i)=>{let a={...n.types};delete a.EIP712Domain;let s=TypedDataEncoder.hash(n.domain,a,n.message),o=Ue(t,r,s),c=keccak256(o),d=getBytes(c),m=performance.now(),g=await i.signMessage(d);trackDuration("passport","magicSignMessageTypedData",Math.round(performance.now()-m));let h=await i.getAddress();return Fe(g,h,e)},xt=async(n,e,t,r)=>{let i=hashMessage(e),a=Ue(n,r,i),s=keccak256(a),o=getBytes(s);return t.signMessage(o)},_=n=>`eip155:${n}`;var se=class{config;rpcProvider;authManager;constructor({config:e,rpcProvider:t,authManager:r}){this.config=e,this.rpcProvider=t,this.authManager=r;}async postToRelayer(e){let t={id:1,jsonrpc:"2.0",...e},r=await this.authManager.getUserZkEvm(),i=performance.now(),a=await fetch(`${this.config.relayerUrl}/v1/transactions`,{method:"POST",headers:{Authorization:`Bearer ${r.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify(t)});trackDuration("passport","postToRelayer",Math.round(performance.now()-i),{rpcMethod:e.method});let s=await a.json();if(s.error)throw s.error;return s}async ethSendTransaction(e,t){let{chainId:r}=await this.rpcProvider.getNetwork(),i={method:"eth_sendTransaction",params:[{to:e,data:t,chainId:_(Number(r))}]},{result:a}=await this.postToRelayer(i);return a}async imGetTransactionByHash(e){let t={method:"im_getTransactionByHash",params:[e]},{result:r}=await this.postToRelayer(t);return r}async imGetFeeOptions(e,t){let{chainId:r}=await this.rpcProvider.getNetwork(),i={method:"im_getFeeOptions",params:[{userAddress:e,data:t,chainId:_(Number(r))}]},{result:a}=await this.postToRelayer(i);return a}async imSignTypedData(e,t){let{chainId:r}=await this.rpcProvider.getNetwork(),i={method:"im_signTypedData",params:[{address:e,eip712Payload:t,chainId:_(Number(r))}]},{result:a}=await this.postToRelayer(i);return a}async imSign(e,t){let{chainId:r}=await this.rpcProvider.getNetwork(),i={method:"im_sign",params:[{address:e,message:t,chainId:_(Number(r))}]},{result:a}=await this.postToRelayer(i);return a}};var oe=(i=>(i[i.USER_REJECTED_REQUEST=4001]="USER_REJECTED_REQUEST",i[i.UNAUTHORIZED=4100]="UNAUTHORIZED",i[i.UNSUPPORTED_METHOD=4200]="UNSUPPORTED_METHOD",i[i.DISCONNECTED=4900]="DISCONNECTED",i))(oe||{}),A=(o=>(o[o.RPC_SERVER_ERROR=-32e3]="RPC_SERVER_ERROR",o[o.INVALID_REQUEST=-32600]="INVALID_REQUEST",o[o.METHOD_NOT_FOUND=-32601]="METHOD_NOT_FOUND",o[o.INVALID_PARAMS=-32602]="INVALID_PARAMS",o[o.INTERNAL_ERROR=-32603]="INTERNAL_ERROR",o[o.PARSE_ERROR=-32700]="PARSE_ERROR",o[o.TRANSACTION_REJECTED=-32003]="TRANSACTION_REJECTED",o))(A||{}),u=class extends Error{message;code;constructor(e,t){super(t),this.message=t,this.code=e;}};var Ei="Only sign this message from Immutable Passport";async function Mt({authManager:n,ethSigner:e,multiRollupApiClients:t,accessToken:r,rpcProvider:i,flow:a}){let s=e.getAddress();s.then(()=>a.addEvent("endGetAddress"));let o=signRaw(Ei,e);o.then(()=>a.addEvent("endSignRaw"));let c=i.getNetwork();c.then(()=>a.addEvent("endDetectNetwork"));let d=t.chainsApi.listChains();d.then(()=>a.addEvent("endListChains"));let[m,g,h,y]=await Promise.all([s,o,c,d]),v=_(Number(h.chainId)),w=y.data?.result?.find(k=>k.id===v)?.name;if(!w)throw new u(-32603,`Chain name does not exist on for chain id ${h.chainId}`);try{let k=await t.passportApi.createCounterfactualAddressV2({chainName:w,createCounterfactualAddressRequest:{ethereum_address:m,ethereum_signature:g}},{headers:{Authorization:`Bearer ${r}`}});return a.addEvent("endCreateCounterfactualAddress"),n.forceUserRefreshInBackground(),k.data.counterfactual_address}catch(k){throw new u(-32603,`Failed to create counterfactual address: ${k}`)}}var ce="Transaction requires confirmation but this functionality is not supported in this environment. Please contact Immutable support if you need to enable this feature.",de=n=>BigInt(n).toString(),yi=n=>{try{return n.map(e=>({delegateCall:e.delegateCall===!0,revertOnError:e.revertOnError===!0,gasLimit:e.gasLimit?de(e.gasLimit):"0",target:e.to??ZeroAddress,value:e.value?de(e.value):"0",data:e.data?e.data.toString():"0x"}))}catch(e){let t=e instanceof Error?e.message:String(e);throw new u(-32602,`Transaction failed to parsing: ${t}`)}},q=class{guardianApi;confirmationScreen;crossSdkBridgeEnabled;authManager;constructor({confirmationScreen:e,config:t,authManager:r,guardianApi:i}){this.confirmationScreen=e,this.crossSdkBridgeEnabled=t.crossSdkBridgeEnabled,this.guardianApi=i,this.authManager=r;}withConfirmationScreen(e){return t=>this.withConfirmationScreenTask(e)(t)()}withConfirmationScreenTask(e){return t=>async()=>{this.confirmationScreen.loading(e);try{return await t()}catch(r){throw r instanceof f&&r.type==="SERVICE_UNAVAILABLE_ERROR"?(await this.confirmationScreen.showServiceUnavailable(),r):(this.confirmationScreen.closeWindow(),r)}}}withDefaultConfirmationScreenTask(e){return this.withConfirmationScreenTask()(e)}async evaluateImxTransaction({payloadHash:e}){try{let t=()=>{this.confirmationScreen.closeWindow();},r=await this.authManager.getUserImx(),i={Authorization:`Bearer ${r.accessToken}`};if(!(await N(async()=>this.guardianApi.getTransactionByID({transactionID:e,chainType:"starkex"},{headers:i}),{finallyFn:t})).data.id)throw new Error("Transaction doesn't exists");let s=await this.guardianApi.evaluateTransaction({id:e,transactionEvaluationRequest:{chainType:"starkex"}},{headers:i}),{confirmationRequired:o}=s.data;if(o){if(this.crossSdkBridgeEnabled)throw new Error(ce);if(!(await this.confirmationScreen.requestConfirmation(e,r.imx.ethAddress,Ge.mr.TransactionApprovalRequestChainTypeEnum.Starkex)).confirmed)throw new Error("Transaction rejected by user")}else this.confirmationScreen.closeWindow();}catch(t){throw Q.isAxiosError(t)&&t.response?.status===403?new f("Service unavailable","SERVICE_UNAVAILABLE_ERROR"):t}}async evaluateEVMTransaction({chainId:e,nonce:t,metaTransactions:r}){let i=await this.authManager.getUserZkEvm(),a={Authorization:`Bearer ${i.accessToken}`},s=yi(r);try{return (await this.guardianApi.evaluateTransaction({id:"evm",transactionEvaluationRequest:{chainType:"evm",chainId:e,transactionData:{nonce:t,userAddress:i.zkEvm.ethAddress,metaTransactions:s}}},{headers:a})).data}catch(o){if(Q.isAxiosError(o)&&o.response?.status===403)throw new f("Service unavailable","SERVICE_UNAVAILABLE_ERROR");let c=o instanceof Error?o.message:String(o);throw new u(-32603,`Transaction failed to validate with error: ${c}`)}}async validateEVMTransaction({chainId:e,nonce:t,metaTransactions:r}){let i=await this.evaluateEVMTransaction({chainId:e,nonce:t,metaTransactions:r}),{confirmationRequired:a,transactionId:s}=i;if(a&&this.crossSdkBridgeEnabled)throw new u(-32003,ce);if(a&&s){let o=await this.authManager.getUserZkEvm();if(!(await this.confirmationScreen.requestConfirmation(s,o.zkEvm.ethAddress,Ge.mr.TransactionApprovalRequestChainTypeEnum.Evm,e)).confirmed)throw new u(-32003,"Transaction rejected by user")}else this.confirmationScreen.closeWindow();}async handleEIP712MessageEvaluation({chainID:e,payload:t}){try{let r=await this.authManager.getUserZkEvm();if(r===null)throw new u(4100,"User not logged in. Please log in first.");return (await this.guardianApi.evaluateMessage({messageEvaluationRequest:{chainID:e,payload:t}},{headers:{Authorization:`Bearer ${r.accessToken}`}})).data}catch(r){let i=r instanceof Error?r.message:String(r);throw new u(-32603,`Message failed to validate with error: ${i}`)}}async evaluateEIP712Message({chainID:e,payload:t}){let{messageId:r,confirmationRequired:i}=await this.handleEIP712MessageEvaluation({chainID:e,payload:t});if(i&&this.crossSdkBridgeEnabled)throw new u(-32003,ce);if(i&&r){let a=await this.authManager.getUserZkEvm();if(!(await this.confirmationScreen.requestMessageConfirmation(r,a.zkEvm.ethAddress,"eip712")).confirmed)throw new u(-32003,"Signature rejected by user")}else this.confirmationScreen.closeWindow();}async handleERC191MessageEvaluation({chainID:e,payload:t}){try{let r=await this.authManager.getUserZkEvm();if(r===null)throw new u(4100,"User not logged in. Please log in first.");return (await this.guardianApi.evaluateErc191Message({eRC191MessageEvaluationRequest:{chainID:_(Number(e)),payload:t}},{headers:{Authorization:`Bearer ${r.accessToken}`}})).data}catch(r){let i=r instanceof Error?r.message:String(r);throw new u(-32603,`Message failed to validate with error: ${i}`)}}async evaluateERC191Message({chainID:e,payload:t}){let{messageId:r,confirmationRequired:i}=await this.handleERC191MessageEvaluation({chainID:e,payload:t});if(i&&this.crossSdkBridgeEnabled)throw new u(-32003,ce);if(i&&r){let a=await this.authManager.getUserZkEvm();if(!(await this.confirmationScreen.requestMessageConfirmation(r,a.zkEvm.ethAddress,"erc191")).confirmed)throw new u(-32003,"Signature rejected by user")}else this.confirmationScreen.closeWindow();}};var Ri=30,vi=1e3,Ti=async(n,e,t)=>{let r=De([n]),i=bt(r),s=(await t.imGetFeeOptions(e,i)).find(o=>o.tokenSymbol==="IMX");if(!s)throw new Error("Failed to retrieve fees for IMX token");return s},wi=async(n,e,t,r,i)=>{if(!n.to)throw new u(-32602,'eth_sendTransaction requires a "to" field');let a={to:n.to.toString(),data:n.data,nonce:BigInt(0),value:n.value,revertOnError:!0},[s,o]=await Promise.all([ae(e,r,i),Ti(a,r,t)]),c=[{...a,nonce:s}],d=BigInt(o.tokenPrice);return d!==BigInt(0)&&c.push({nonce:s,to:o.recipientAddress,value:d,revertOnError:!0}),c},le=async(n,e,t)=>{let i=await N(async()=>{let a=await n.imGetTransactionByHash(e);if(a.status==="PENDING")throw new Error;return a},{retries:Ri,interval:vi,finalErr:new u(-32e3,"transaction hash not generated in time")});if(t.addEvent("endRetrieveRelayerTransaction"),!["SUBMITTED","SUCCESSFUL"].includes(i.status)){let a=`Transaction failed to submit with status ${i.status}.`;throw i.statusMessage&&(a+=` Error message: ${i.statusMessage}`),new u(-32e3,a)}return i},pe=async({transactionRequest:n,ethSigner:e,rpcProvider:t,guardianClient:r,relayerClient:i,zkEvmAddress:a,flow:s,nonceSpace:o})=>{let{chainId:c}=await t.getNetwork(),d=BigInt(c);s.addEvent("endDetectNetwork");let m=await wi(n,t,i,a,o);s.addEvent("endBuildMetaTransactions");let{nonce:g}=m[0];if(!g)throw new Error("Failed to retrieve nonce from the smart wallet");let h=async()=>{await r.validateEVMTransaction({chainId:_(Number(c)),nonce:de(g),metaTransactions:m}),s.addEvent("endValidateEVMTransaction");},y=async()=>{let k=await Le(m,g,d,a,e);return s.addEvent("endGetSignedMetaTransactions"),k},[,v]=await Promise.all([h(),y()]),w=await i.ethSendTransaction(a,v);return s.addEvent("endRelayerSendTransaction"),{signedTransactions:v,relayerId:w,nonce:g}},_i=async n=>{if(!n.to)throw new u(-32602,'im_signEjectionTransaction requires a "to" field');if(typeof n.nonce>"u")throw new u(-32602,'im_signEjectionTransaction requires a "nonce" field');if(!n.chainId)throw new u(-32602,'im_signEjectionTransaction requires a "chainId" field');return [{to:n.to.toString(),data:n.data,nonce:n.nonce,value:n.value,revertOnError:!0}]},Dt=async({transactionRequest:n,ethSigner:e,zkEvmAddress:t,flow:r})=>{let i=await _i(n);r.addEvent("endBuildMetaTransactions");let a=await Le(i,n.nonce,BigInt(n.chainId??0),t,e);return r.addEvent("endGetSignedMetaTransactions"),{to:t,data:a,chainId:_(Number(n.chainId??0))}};var Be=async({params:n,ethSigner:e,rpcProvider:t,relayerClient:r,guardianClient:i,zkEvmAddress:a,flow:s,nonceSpace:o})=>{let c=n[0],{relayerId:d}=await pe({transactionRequest:c,ethSigner:e,rpcProvider:t,guardianClient:i,relayerClient:r,zkEvmAddress:a,flow:s,nonceSpace:o}),{hash:m}=await le(r,d,s);return m};var Ut=["types","domain","primaryType","message"],Pi=n=>Ut.every(e=>e in n),Ai=(n,e)=>{let t;if(typeof n=="string")try{t=JSON.parse(n);}catch(i){throw new u(-32602,`Failed to parse typed data JSON: ${i}`)}else if(typeof n=="object")t=n;else throw new u(-32602,`Invalid typed data argument: ${n}`);if(!Pi(t))throw new u(-32602,`Invalid typed data argument. The following properties are required: ${Ut.join(", ")}`);let r=t.domain?.chainId;if(r&&(typeof r=="string"&&(r.startsWith("0x")?t.domain.chainId=parseInt(r,16).toString():t.domain.chainId=parseInt(r,10).toString()),t.domain.chainId!==e))throw new u(-32602,`Invalid chainId, expected ${e}`);return t},Lt=async({params:n,method:e,ethSigner:t,rpcProvider:r,relayerClient:i,guardianClient:a,flow:s})=>{let o=n[0],c=n[1];if(!o||!c)throw new u(-32602,`${e} requires an address and a typed data JSON`);let{chainId:d}=await r.getNetwork(),m=Ai(c,d.toString());s.addEvent("endDetectNetwork"),await a.evaluateEIP712Message({chainID:String(d),payload:m}),s.addEvent("endValidateMessage");let g=await i.imSignTypedData(o,m);s.addEvent("endRelayerSignTypedData");let h=await kt(m,g,BigInt(d),o,t);return s.addEvent("getSignedTypedData"),h};var Ft=n=>{if(!n)return n;try{let e=stripZerosLeft(getBytes(n));return toUtf8String(e)}catch{return n}};var me=async({params:n,ethSigner:e,zkEvmAddress:t,rpcProvider:r,guardianClient:i,relayerClient:a,flow:s})=>{let o=n[0],c=n[1];if(!c||!o)throw new u(-32602,"personal_sign requires an address and a message");if(c.toLowerCase()!==t.toLowerCase())throw new u(-32602,"personal_sign requires the signer to be the from address");let d=Ft(o),{chainId:m}=await r.getNetwork();s.addEvent("endDetectNetwork");let g=BigInt(m),h=xt(g,d,e,c);h.then(()=>s.addEvent("endEOASignature")),await i.evaluateERC191Message({chainID:m,payload:d}),s.addEvent("endEvaluateERC191Message");let[y,v]=await Promise.all([h,a.imSign(c,d)]);s.addEvent("endRelayerSign");let w=await e.getAddress();return s.addEvent("endGetEOAAddress"),Fe(y,w,v)};var ki="https://api.immutable.com",xi="https://api.sandbox.immutable.com",Mi="/v1/sdk/session-activity/check",Ni=n=>{switch(n){case Environment.SANDBOX:return xi;case Environment.PRODUCTION:return ki;default:throw new Error("Environment not supported")}},ue,Bt=n=>{ue||(ue=Q.create({baseURL:Ni(n)}));};async function Vt(n){if(!ue)throw new Error("Client not initialised");return ue.get(Mi,{params:n}).then(e=>e.data).catch(e=>{if(e.response.status!==404)throw e})}function Wt(n,e){return (...t)=>{try{let r=n(...t);return r instanceof Promise?r.catch(i=>(i instanceof Error&&trackError("passport","sessionActivityError",i),e)):r}catch(r){return r instanceof Error&&trackError("passport","sessionActivityError",r),e}}}var{getItem:qt,setItem:Ve}=utils.localStorage,He="sessionActivitySendCount",$t="sessionActivityDate",ge={},b={},he={},Zt=()=>{b=qt(He)||{};let n=qt($t),e=new Date,t=e.getFullYear(),r=`${e.getMonth()+1}`.padStart(2,"0"),i=`${e.getDate()}`.padStart(2,"0"),a=`${t}-${r}-${i}`;(!n||n!==a)&&(b={}),Ve($t,a),Ve(He,b);};Zt();var Gi=n=>{Zt(),b[n]||(b[n]=0),b[n]++,Ve(He,b),ge[n]=0;},Bi=async n=>new Promise(e=>{setTimeout(e,n*1e3);}),Vi=async n=>{let e=n.flow||trackFlow("passport","sendSessionActivity"),t=n.passportClient;if(!t)throw e.addEvent("No Passport Client ID"),new Error("No Passport Client ID provided");if(he[t]){e.addEvent("Existing Delay Early Exit");return}he[t]=!0;let{sendTransaction:r,environment:i}=n;if(!r)throw new Error("No sendTransaction function provided");if(!i)throw new Error("No environment provided");Bt(i);let a=n.walletAddress;if(!a)throw e.addEvent("No Passport Wallet Address"),new Error("No wallet address");let s;try{if(e.addEvent("Fetching details"),s=await Vt({clientId:t,wallet:a,checkCount:ge[t]||0,sendCount:b[t]||0}),ge[t]++,e.addEvent("Fetched details",{checkCount:ge[t]}),!s){e.addEvent("No details found");return}}catch(o){throw e.addEvent("Failed to fetch details"),new Error("Failed to get details",{cause:o})}if(s&&s.contractAddress&&s.functionName){let c=new Interface([`function ${s.functionName}()`]).encodeFunctionData(s.functionName),d=s.contractAddress;try{e.addEvent("Start Sending Transaction");let m=await n.sendTransaction([{to:d,from:a,data:c}],e);Gi(t),e.addEvent("Transaction Sent",{tx:m});}catch(m){e.addEvent("Failed to send Transaction");let g=new Error("Failed to send transaction",{cause:m});trackError("passport","sessionActivityError",g);}}s&&s.delay&&s.delay>0&&(e.addEvent("Delaying Transaction",{delay:s.delay}),await Bi(s.delay),setTimeout(()=>{e.addEvent("Retrying after Delay"),he[t]=!1,Kt({...n,flow:e});},0));},Kt=n=>Wt(Vi)(n).then(()=>{he[n.passportClient]=!1;}),zt=Kt;var Xt=async({params:n,ethSigner:e,rpcProvider:t,relayerClient:r,guardianClient:i,zkEvmAddress:a,flow:s})=>{let o={to:a,value:0},{relayerId:c}=await pe({transactionRequest:o,ethSigner:e,rpcProvider:t,guardianClient:i,relayerClient:r,zkEvmAddress:a,flow:s});return i.withConfirmationScreen()(async()=>{let d=await me({params:n,ethSigner:e,zkEvmAddress:a,rpcProvider:t,guardianClient:i,relayerClient:r,flow:s});return await le(r,c,s),d})};var Jt=async({params:n,ethSigner:e,zkEvmAddress:t,flow:r})=>{if(!n||n.length!==1)throw new u(-32602,"im_signEjectionTransaction requires a singular param (hash)");let i=n[0];return await Dt({transactionRequest:i,ethSigner:e,zkEvmAddress:t,flow:r})};var fe=n=>"zkEvm"in n,Ee=class{#i;#t;#a;#r;#n;#e;#u;#g;#o;#d;#l;isPassport=!0;constructor({authManager:e,magicAdapter:t,config:r,multiRollupApiClients:i,passportEventEmitter:a,guardianClient:s}){this.#i=e,this.#u=t,this.#t=r,this.#n=s,this.#r=a,r.jsonRpcReferrer?this.#e=new JsonRpcProvider(this.#t.zkEvmRpcUrl,void 0,{staticNetwork:!0}):this.#e=new JsonRpcProvider(this.#t.zkEvmRpcUrl,void 0,{staticNetwork:!0}),this.#o=new se({config:this.#t,rpcProvider:this.#e,authManager:this.#i}),this.#g=i,this.#a=new D,this.#i.getUser().then(o=>{o&&(this.#m(o),fe(o)&&this.#p(o.zkEvm.ethAddress));}).catch(()=>{}),a.on("loggedIn",o=>{this.#m(o),fe(o)&&this.#p(o.zkEvm.ethAddress);}),a.on("loggedOut",this.#h),a.on("accountsRequested",zt);}#h=()=>{this.#d=void 0,this.#a.emit("accountsChanged",[]);};#m(e){let t=async()=>{let r=await this.#u.login(e.idToken);return new BrowserProvider(r).getSigner()};this.#l=void 0,this.#d=new Promise(async r=>{try{r(await t());}catch(i){this.#l=i,r(void 0);}});}async#c(){let e=await this.#d;if(typeof e>"u")throw typeof this.#l<"u"?this.#l:new Error("Signer failed to initialise");return e}async#p(e,t){let r=BigInt(1),i=async(a,s)=>{let o=await this.#c();return await Be({params:a,ethSigner:o,guardianClient:this.#n,rpcProvider:this.#e,relayerClient:this.#o,zkEvmAddress:e,flow:s,nonceSpace:r})};this.#r.emit("accountsRequested",{environment:this.#t.baseConfig.environment,sendTransaction:i,walletAddress:e,passportClient:t||this.#t.oidcConfiguration.clientId});}async#s(){try{let e=await this.#i.getUser();return e&&fe(e)?e.zkEvm.ethAddress:void 0}catch{return}}async#f(e){switch(e.method){case"eth_requestAccounts":{let t=await this.#s();if(t)return [t];let r=trackFlow("passport","ethRequestAccounts");try{let i=await this.#i.getUserOrLogin();r.addEvent("endGetUserOrLogin"),this.#d||this.#m(i);let a;if(fe(i))a=i.zkEvm.ethAddress;else {r.addEvent("startUserRegistration");let s=await this.#c();r.addEvent("ethSignerResolved"),a=await Mt({ethSigner:s,authManager:this.#i,multiRollupApiClients:this.#g,accessToken:i.accessToken,rpcProvider:this.#e,flow:r}),r.addEvent("endUserRegistration");}return this.#a.emit("accountsChanged",[a]),identify({passportId:i.profile.sub}),this.#p(a),[a]}catch(i){throw i instanceof Error&&trackError("passport","ethRequestAccounts",i),r.addEvent("errored"),i}finally{r.addEvent("End");}}case"eth_sendTransaction":{let t=await this.#s();if(!t)throw new u(4100,"Unauthorised - call eth_requestAccounts first");let r=trackFlow("passport","ethSendTransaction");try{return await this.#n.withConfirmationScreen({width:480,height:720})(async()=>{let i=await this.#c();return r.addEvent("endGetSigner"),await Be({params:e.params||[],ethSigner:i,guardianClient:this.#n,rpcProvider:this.#e,relayerClient:this.#o,zkEvmAddress:t,flow:r})})}catch(i){throw i instanceof Error&&trackError("passport","eth_sendTransaction",i),r.addEvent("errored"),i}finally{r.addEvent("End");}}case"eth_accounts":{let t=await this.#s();return t?[t]:[]}case"personal_sign":{let t=await this.#s();if(!t)throw new u(4100,"Unauthorised - call eth_requestAccounts first");let r=trackFlow("passport","personalSign");try{return await this.#n.withConfirmationScreen({width:480,height:720})(async()=>{let i=await this.#c();return r.addEvent("endGetSigner"),this.#t.forceScwDeployBeforeMessageSignature&&!(await ae(this.#e,t)>BigInt(0))?await Xt({params:e.params||[],ethSigner:i,zkEvmAddress:t,rpcProvider:this.#e,guardianClient:this.#n,relayerClient:this.#o,flow:r}):await me({params:e.params||[],ethSigner:i,zkEvmAddress:t,rpcProvider:this.#e,guardianClient:this.#n,relayerClient:this.#o,flow:r})})}catch(i){throw i instanceof Error&&trackError("passport","personal_sign",i),r.addEvent("errored"),i}finally{r.addEvent("End");}}case"eth_signTypedData":case"eth_signTypedData_v4":{if(!await this.#s())throw new u(4100,"Unauthorised - call eth_requestAccounts first");let r=trackFlow("passport","ethSignTypedDataV4");try{return await this.#n.withConfirmationScreen({width:480,height:720})(async()=>{let i=await this.#c();return r.addEvent("endGetSigner"),await Lt({method:e.method,params:e.params||[],ethSigner:i,rpcProvider:this.#e,relayerClient:this.#o,guardianClient:this.#n,flow:r})})}catch(i){throw i instanceof Error&&trackError("passport","eth_signTypedData",i),r.addEvent("errored"),i}finally{r.addEvent("End");}}case"eth_chainId":{let{chainId:t}=await this.#e.getNetwork();return toBeHex(t)}case"eth_getBalance":case"eth_getCode":case"eth_getTransactionCount":{let[t,r]=e.params||[];return this.#e.send(e.method,[t,r||"latest"])}case"eth_getStorageAt":{let[t,r,i]=e.params||[];return this.#e.send(e.method,[t,r,i||"latest"])}case"eth_call":case"eth_estimateGas":{let[t,r]=e.params||[];return this.#e.send(e.method,[t,r||"latest"])}case"eth_gasPrice":case"eth_blockNumber":case"eth_getBlockByHash":case"eth_getBlockByNumber":case"eth_getTransactionByHash":case"eth_getTransactionReceipt":return this.#e.send(e.method,e.params||[]);case"im_signEjectionTransaction":{let t=await this.#s();if(!t)throw new u(4100,"Unauthorised - call eth_requestAccounts first");let r=trackFlow("passport","imSignEjectionTransaction");try{let i=await this.#c();return r.addEvent("endGetSigner"),await Jt({params:e.params||[],ethSigner:i,zkEvmAddress:t,flow:r})}catch(i){throw i instanceof Error&&trackError("passport","imSignEjectionTransaction",i),r.addEvent("errored"),i}finally{r.addEvent("End");}}case"im_addSessionActivity":{let[t]=e.params||[],r=await this.#s();return r&&this.#p(r,t),null}default:throw new u(4200,"Method not supported")}}async request(e){try{return this.#f(e)}catch(t){throw t instanceof u?t:t instanceof Error?new u(-32603,t.message):new u(-32603,"Internal error")}}on(e,t){this.#a.on(e,t);}removeListener(e,t){this.#a.removeListener(e,t);}};var Yt={icon:'data:image/svg+xml,<svg viewBox="0 0 48 48" class="SvgIcon undefined Logo Logo--PassportSymbolOutlined css-1dn9atd" xmlns="http://www.w3.org/2000/svg"><g data-testid="undefined__g"><circle cx="24" cy="24" r="22.5" fill="url(%23paint0_radial_6324_83922)"></circle><circle cx="24" cy="24" r="22.5" fill="url(%23paint1_radial_6324_83922)"></circle><path d="M24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0ZM23.0718 9.16608C23.7383 8.83951 24.4406 8.86188 25.087 9.2287C27.3282 10.5059 29.5627 11.7942 31.786 13.096C32.5018 13.5165 32.8686 14.1897 32.8708 15.0173C32.8843 17.9184 32.8798 20.8171 32.8708 23.7182C32.8708 23.8255 32.8015 23.9821 32.7143 24.0335C31.8531 24.548 30.9808 25.0423 30.0347 25.5881V25.1318C30.0347 22.148 30.0257 19.1664 30.0414 16.1827C30.0436 15.6101 29.8468 15.241 29.339 14.9525C26.7377 13.474 24.1499 11.9687 21.5575 10.4723C21.4457 10.4075 21.3361 10.3381 21.1661 10.2352C21.8326 9.85722 22.4321 9.47698 23.0673 9.16608H23.0718ZM22.5953 38.8451C22.45 38.7713 22.3426 38.7198 22.2375 38.6595C18.8041 36.68 15.3752 34.687 11.9307 32.7232C10.9644 32.173 10.5238 31.3879 10.5349 30.2852C10.5551 27.9411 10.5484 25.597 10.5372 23.2507C10.5327 22.1927 10.9622 21.4255 11.8926 20.8977C14.3105 19.5221 16.715 18.1264 19.1195 16.7284C19.3275 16.6076 19.4796 16.5875 19.6965 16.7172C20.5264 17.216 21.3719 17.6924 22.2554 18.2024C22.0876 18.3031 21.9601 18.3791 21.8304 18.4552C19.2268 19.9582 16.6278 21.4658 14.0175 22.9599C13.5903 23.2037 13.3912 23.5213 13.3957 24.0179C13.4091 25.8654 13.4114 27.713 13.3957 29.5605C13.3912 30.0705 13.5948 30.3948 14.0332 30.6453C16.7866 32.2199 19.5288 33.8125 22.28 35.3916C22.5126 35.5258 22.611 35.6645 22.6065 35.9418C22.5864 36.888 22.5998 37.8363 22.5998 38.8473L22.5953 38.8451ZM22.5953 33.553C22.356 33.4166 22.1838 33.3204 22.0116 33.2198C19.8285 31.9605 17.6477 30.6967 15.4602 29.4464C15.2231 29.3122 15.1359 29.1668 15.1381 28.8917C15.1538 27.4714 15.1471 26.0511 15.1426 24.6308C15.1426 24.4384 15.1717 24.3064 15.3618 24.1991C16.167 23.7495 16.9633 23.2798 17.7618 22.8212C17.8199 22.7877 17.8826 22.7631 17.9877 22.7116V24.3064C17.9877 25.1698 18.0011 26.0354 17.9832 26.8988C17.972 27.3909 18.1622 27.7241 18.5916 27.9657C19.8285 28.6636 21.0498 29.3883 22.2867 30.0839C22.5305 30.2203 22.6043 30.3724 22.5998 30.6408C22.5842 31.5847 22.5931 32.5308 22.5931 33.5508L22.5953 33.553ZM20.0746 14.91C19.6116 14.6371 19.2157 14.6393 18.7527 14.91C16.1581 16.4265 13.5523 17.9228 10.9487 19.4259C10.8391 19.4908 10.7251 19.5489 10.5305 19.6541C10.5998 18.6654 10.3873 17.7327 10.7251 16.8291C10.9085 16.3348 11.2529 15.9635 11.7092 15.6995C13.8811 14.4447 16.0507 13.1877 18.227 11.9396C19.0211 11.4833 19.8308 11.4945 20.6248 11.953C23.0964 13.3756 25.5657 14.8026 28.0306 16.2341C28.1357 16.2945 28.2677 16.4309 28.2677 16.5338C28.2856 17.5493 28.2788 18.567 28.2788 19.6563C27.3819 19.1396 26.5543 18.6609 25.7267 18.1823C23.8412 17.093 21.9512 16.0149 20.0746 14.91ZM37.4427 30.8779C37.3778 31.6764 36.9103 32.2423 36.2192 32.6404C33.5732 34.1614 30.9294 35.6913 28.2856 37.2168C27.4557 37.6954 26.6259 38.1741 25.7938 38.6527C25.6932 38.7109 25.5903 38.7601 25.4539 38.8317C25.4449 38.693 25.4337 38.5924 25.4337 38.4917C25.4337 37.6149 25.4382 36.7404 25.4293 35.8636C25.4293 35.6645 25.4762 35.5437 25.6596 35.4386C29.5157 33.2198 33.3696 30.9942 37.2212 28.7709C37.2794 28.7374 37.3443 28.7105 37.4539 28.6591C37.4539 29.4375 37.4986 30.1622 37.4427 30.8779ZM37.4628 25.3577C37.4561 26.2658 36.9663 26.9033 36.1901 27.3506C33.175 29.0841 30.1622 30.8265 27.1493 32.5666C26.5991 32.8842 26.0466 33.1996 25.4561 33.5396C25.4472 33.3897 25.436 33.2913 25.436 33.1907C25.436 32.3273 25.4449 31.4617 25.4293 30.5983C25.4248 30.3523 25.5075 30.2226 25.72 30.0995C28.46 28.5271 31.1911 26.9368 33.9355 25.3733C34.4231 25.096 34.6378 24.7538 34.6334 24.1812C34.6132 21.1974 34.6244 18.2136 34.6244 15.2298V14.7087C35.3402 15.1404 36.0112 15.496 36.624 15.9299C37.1832 16.3258 37.465 16.9253 37.4673 17.6164C37.4762 20.1976 37.4829 22.7788 37.465 25.3599L37.4628 25.3577Z" fill="%230D0D0D"></path><path fill-rule="evenodd" d="M24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0ZM24 2C11.8497 2 2 11.8497 2 24C2 36.1503 11.8497 46 24 46C36.1503 46 46 36.1503 46 24C46 11.8497 36.1503 2 24 2Z" fill="url(%23paint2_radial_6324_83922)"></path><path fill-rule="evenodd" d="M24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0ZM24 2C11.8497 2 2 11.8497 2 24C2 36.1503 11.8497 46 24 46C36.1503 46 46 36.1503 46 24C46 11.8497 36.1503 2 24 2Z" fill="url(%23paint3_radial_6324_83922)"></path><defs><radialGradient id="paint0_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(13.4442 13.3899) rotate(44.9817) scale(46.7487 99.1435)"><stop stop-color="%23A3EEF8"></stop><stop offset="0.177083" stop-color="%23A4DCF5"></stop><stop offset="0.380208" stop-color="%23A6AEEC"></stop><stop offset="1" stop-color="%23ECBEE1"></stop></radialGradient><radialGradient id="paint1_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(25.9515 43.7068) rotate(84.265) scale(24.2138 46.3215)"><stop stop-color="%23FCF5EE"></stop><stop offset="0.715135" stop-color="%23ECBEE1" stop-opacity="0"></stop></radialGradient><radialGradient id="paint2_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(12.7405 12.6825) rotate(44.9817) scale(49.8653 105.753)"><stop stop-color="%23A3EEF8"></stop><stop offset="0.177083" stop-color="%23A4DCF5"></stop><stop offset="0.380208" stop-color="%23A6AEEC"></stop><stop offset="1" stop-color="%23ECBEE1"></stop></radialGradient><radialGradient id="paint3_radial_6324_83922" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(26.0816 45.0206) rotate(84.265) scale(25.828 49.4096)"><stop stop-color="%23FCF5EE"></stop><stop offset="0.715135" stop-color="%23ECBEE1" stop-opacity="0"></stop></radialGradient></defs></g></svg>',name:"Immutable Passport",rdns:"com.immutable.passport",uuid:v4()};function Qt(n){if(typeof window>"u")return;let e=new CustomEvent("eip6963:announceProvider",{detail:Object.freeze(n)});window.dispatchEvent(e);let t=()=>window.dispatchEvent(e);window.addEventListener("eip6963:requestProvider",t);}var ra=n=>n.overrides?createConfig({basePath:n.overrides.imxPublicApiDomain}):n.baseConfig.environment===Environment.SANDBOX?imxApiConfig.getSandbox():imxApiConfig.getProduction(),na=n=>{if(n.overrides?.imxApiClients)return n.overrides.imxApiClients;let e=ra(n);return new ImxApiClients(e)},ia=n=>{let e=new re(n),t=new V(e),r=new H(e),i=new F(e),a=new MultiRollupApiClients(e.multiRollupConfig),s=new D,o=n.overrides?n.overrides.immutableXClient:new IMXClient({baseConfig:n.baseConfig}),c=new q({confirmationScreen:i,config:e,authManager:t,guardianApi:a.guardianApi}),d=na(n),m=new te({authManager:t,immutableXClient:o,magicAdapter:r,passportEventEmitter:s,imxApiClients:d,guardianClient:c});return {config:e,authManager:t,magicAdapter:r,confirmationScreen:i,immutableXClient:o,multiRollupApiClients:a,passportEventEmitter:s,passportImxProviderFactory:m,guardianClient:c}},We=class{authManager;config;confirmationScreen;immutableXClient;magicAdapter;multiRollupApiClients;passportImxProviderFactory;passportEventEmitter;guardianClient;constructor(e){let t=ia(e);this.config=t.config,this.authManager=t.authManager,this.magicAdapter=t.magicAdapter,this.confirmationScreen=t.confirmationScreen,this.immutableXClient=t.immutableXClient,this.multiRollupApiClients=t.multiRollupApiClients,this.passportEventEmitter=t.passportEventEmitter,this.passportImxProviderFactory=t.passportImxProviderFactory,this.guardianClient=t.guardianClient,setPassportClientId(e.clientId),track("passport","initialise");}async connectImxSilent(){return E(()=>this.passportImxProviderFactory.getProviderSilent(),"connectImxSilent")}async connectImx(){return E(()=>this.passportImxProviderFactory.getProvider(),"connectImx")}connectEvm(e={announceProvider:!0}){return E(async()=>{let t=new Ee({passportEventEmitter:this.passportEventEmitter,authManager:this.authManager,magicAdapter:this.magicAdapter,config:this.config,multiRollupApiClients:this.multiRollupApiClients,guardianClient:this.guardianClient});return e?.announceProvider&&Qt({info:Yt,provider:t}),t},"connectEvm")}async login(e){return E(async()=>{let{useCachedSession:t=!1,useSilentLogin:r}=e||{},i=null;try{i=await this.authManager.getUser();}catch(a){if(a instanceof Error&&!a.message.includes("Unknown or invalid refresh token")&&trackError("passport","login",a),t)throw a;L.warn("Failed to retrieve a cached user session",a);}return !i&&r?i=await this.authManager.forceUserRefresh():!i&&!t&&(i=await this.authManager.login(e?.anonymousId)),i&&(identify({passportId:i.profile.sub}),this.passportEventEmitter.emit("loggedIn",i)),i?i.profile:null},"login")}async loginCallback(){return E(()=>this.authManager.loginCallback(),"loginCallback")}async loginWithDeviceFlow(e){return E(()=>this.authManager.loginWithDeviceFlow(e?.anonymousId),"loginWithDeviceFlow")}async loginWithDeviceFlowCallback(e,t,r){return E(async()=>{let i=await this.authManager.loginWithDeviceFlowCallback(e,t,r);return this.passportEventEmitter.emit("loggedIn",i),i.profile},"loginWithDeviceFlowCallback")}loginWithPKCEFlow(){return E(async()=>await this.authManager.getPKCEAuthorizationUrl(),"loginWithPKCEFlow")}async loginWithPKCEFlowCallback(e,t){return E(async()=>{let r=await this.authManager.loginWithPKCEFlowCallback(e,t);return this.passportEventEmitter.emit("loggedIn",r),r.profile},"loginWithPKCEFlowCallback")}async logout(){return E(async()=>{this.config.oidcConfiguration.logoutMode==="silent"?await Promise.allSettled([this.authManager.logout(),this.magicAdapter.logout()]):(await this.magicAdapter.logout(),await this.authManager.logout()),this.passportEventEmitter.emit("loggedOut");},"logout")}async logoutDeviceFlow(){return E(async()=>(await this.authManager.removeUser(),await this.magicAdapter.logout(),this.passportEventEmitter.emit("loggedOut"),await this.authManager.getDeviceFlowEndSessionEndpoint()),"logoutDeviceFlow")}async logoutSilentCallback(e){return E(()=>this.authManager.logoutSilentCallback(e),"logoutSilentCallback")}async getUserInfo(){return E(async()=>(await this.authManager.getUser())?.profile,"getUserInfo")}async getIdToken(){return E(async()=>(await this.authManager.getUser())?.idToken,"getIdToken")}async getAccessToken(){return E(async()=>(await this.authManager.getUser())?.accessToken,"getAccessToken")}async getLinkedAddresses(){return E(async()=>{let e=await this.authManager.getUser();if(!e?.profile.sub)return [];let t={Authorization:`Bearer ${e.accessToken}`};return (await this.multiRollupApiClients.passportProfileApi.getUserInfo({headers:t})).data.linked_addresses},"getLinkedAddresses")}async linkExternalWallet(e){let t=trackFlow("passport","linkExternalWallet"),r=await this.authManager.getUser();if(!r)throw new f("User is not logged in","NOT_LOGGED_IN_ERROR");let i=M(r),a=z(r);if(!i&&!a)throw new f("User has not been registered","USER_NOT_REGISTERED_ERROR");let s={Authorization:`Bearer ${r.accessToken}`},o={type:e.type,wallet_address:e.walletAddress,signature:e.signature,nonce:e.nonce};try{return {...(await this.multiRollupApiClients.passportProfileApi.linkWalletV2({linkWalletV2Request:o},{headers:s})).data}}catch(c){if(c instanceof Error&&trackError("passport","linkExternalWallet",c),t.addEvent("errored"),isAxiosError(c)&&c.response){if(c.response.data&&we(c.response.data)){let{code:m,message:g}=c.response.data;switch(m){case"ALREADY_LINKED":throw new f(g,"LINK_WALLET_ALREADY_LINKED_ERROR");case"MAX_WALLETS_LINKED":throw new f(g,"LINK_WALLET_MAX_WALLETS_LINKED_ERROR");case"DUPLICATE_NONCE":throw new f(g,"LINK_WALLET_DUPLICATE_NONCE_ERROR");case"VALIDATION_ERROR":throw new f(g,"LINK_WALLET_VALIDATION_ERROR");default:throw new f(g,"LINK_WALLET_GENERIC_ERROR")}}else if(c.response.status)throw new f(`Link wallet request failed with status code ${c.response.status}`,"LINK_WALLET_GENERIC_ERROR")}let d="Link wallet request failed";throw c instanceof Error&&(d+=`: ${c.message}`),new f(d,"LINK_WALLET_GENERIC_ERROR")}finally{t.addEvent("End");}}};
4374
350
 
4375
- export { JsonRpcError, Passport, PassportError, ProviderErrorCode, ProviderEvent, RpcErrorCode };
351
+ export { u as JsonRpcError, We as Passport, f as PassportError, oe as ProviderErrorCode, xe as ProviderEvent, A as RpcErrorCode };