@imtbl/passport 2.0.3 → 2.0.4-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -333,7 +333,7 @@ function ve(n){throw new Error("Node.js process "+n+" is not supported by JSPM c
333
333
  ${In()}
334
334
  </div>
335
335
  </div>
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 rt=()=>tt(Pn()),nt=()=>tt(An());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?rt():nt(),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=Sn.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 Ae={headers:{"Content-Type":"application/x-www-form-urlencoded"}},at="/v2/logout",Un="/authorize",Ln=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new Y("ImmutableSDKPassport",Sn.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new InMemoryWebStorage;let i=new WebStorageStateStore({store:r}),a=new URL(at,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.popupRedirectUri||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 Fn(n){return new Promise(e=>{setTimeout(e,n);})}function Ie(n){return btoa(String.fromCharCode(...new Uint8Array(n))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Gn(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(Ln(e)),this.deviceCredentialsManager=new G,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=it(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=it(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 loginWithRedirect(e){return await this.userManager.clearStaleState(),y(async()=>{await this.userManager.signinRedirect({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:e||""}});},"AUTHENTICATION_ERROR")}async login(e){return y(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 y(async()=>{let e=await this.userManager.signinCallback();if(e)return n.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async loginWithDeviceFlow(e){return y(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},Ae),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 y(async()=>{let i=Date.now(),a=!0;for(;a;){if(r!=null&&Date.now()-i>r)throw new Error("Timed out");await Fn(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},Ae)).data}async getPKCEAuthorizationUrl(){let e=Ie(window.crypto.getRandomValues(new Uint8Array(32))),t=Ie(await Gn(e)),r=Ie(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(Un,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 y(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},Ae)).data}async logout(){return y(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(at,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(!je(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 Bn=(n,e)=>n().then(e),st=n=>Bn(()=>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,t=!0,r=!0)=>{let i=trackFlow("passport",e,t);try{return await n(i)}catch(a){throw a instanceof Error?trackError("passport",e,a,{flowId:i.details.flowId}):i.addEvent("errored"),a}finally{r&&i.addEvent("End");}};var Zn="mainnet",H=class{config;magicProviderProxyFactory;lazyMagicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.lazyMagicClient=st(()=>new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:Zn})));}get magicClient(){if(!this.lazyMagicClient)throw new Error("Cannot perform this action outside of the browser");return this.lazyMagicClient}async login(e){return y(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)),this.magicProviderProxyFactory.createProxy(i)},"magicLogin"),"WALLET_CONNECTION_ERROR")}async logout(){let e=await this.magicClient;e.user&&await e.user.logout();}};var ot=async n=>y(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function ct({user:n,starkSigner:e,request:t,exchangesApi:r}){return y(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 lt="ERC721";async function pt({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return y(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===lt?"1":t.sell.amount,o=t.buy.type===lt?"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),C=m.data,w={createOrderRequest:{include_fees:!0,fees:t.fees,stark_signature:h,amount_buy:C.amount_buy,amount_sell:C.amount_sell,asset_id_buy:C.asset_id_buy,asset_id_sell:C.asset_id_sell,expiration_timestamp:C.expiration_timestamp,nonce:C.nonce,stark_key:C.stark_key,vault_id_buy:C.vault_id_buy,vault_id_sell:C.vault_id_sell}};return {...(await r.createOrderV3(w,{headers:c})).data}},"CREATE_ORDER_ERROR")}async function mt({user:n,starkSigner:e,request:t,ordersApi:r,guardianClient:i}){return y(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 Se({ethSigner:n,starkSigner:e,imxApiClients:t},r){return y(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 ut({request:n,tradesApi:e,user:t,starkSigner:r,guardianClient:i}){return y(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:C}=await e.createTradeV3(h,{headers:o});return C},"CREATE_TRADE_ERROR")}var ht="ERC721";async function ft({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return y(async()=>{let a=n.type===ht?"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(),w={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:v}=await e.createTransferV1(w,{headers:o});return {sent_signature:v.sent_signature,status:v.status?.toString(),time:v.time,transfer_id:v.transfer_id}},"TRANSFER_ERROR")}async function Et({user:n,starkSigner:e,request:t,transfersApi:r,guardianClient:i}){return y(async()=>{let{ethAddress:a}=n.imx,s=t.map(h=>({amount:"1",token:convertToSignableToken({type:ht,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 C=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:C}})),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 Yn=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 Yn(r),N(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function yt(n){await N(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function Oe(n,e,t,r,i){return y(async()=>{try{let a=await Se({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await yt(r),a}catch(a){if(Q.isAxiosError(a)&&a.response?.status===409)return await yt(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 ot(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 ft({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 Oe(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 pt({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 mt({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 ut({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 Et({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 ct({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 Tt=(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;forceScwDeployBeforeMessageSignature;popupOverlayOptions;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,...o}){if(Tt(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},t)Tt(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,`
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 rt=()=>tt(Pn()),nt=()=>tt(An());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?rt():nt(),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=Sn.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 Ae={headers:{"Content-Type":"application/x-www-form-urlencoded"}},at="/v2/logout",Un="/authorize",Ln=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new Y("ImmutableSDKPassport",Sn.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new InMemoryWebStorage;let i=new WebStorageStateStore({store:r}),a=new URL(at,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.popupRedirectUri||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 Fn(n){return new Promise(e=>{setTimeout(e,n);})}function Ie(n){return btoa(String.fromCharCode(...new Uint8Array(n))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Gn(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(Ln(e)),this.deviceCredentialsManager=new G,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=it(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=it(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 loginWithRedirect(e){return await this.userManager.clearStaleState(),y(async()=>{await this.userManager.signinRedirect({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:e||""}});},"AUTHENTICATION_ERROR")}async login(e){return y(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 y(async()=>{let e=await this.userManager.signinCallback();if(e)return n.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async loginWithDeviceFlow(e){return y(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},Ae),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 y(async()=>{let i=Date.now(),a=!0;for(;a;){if(r!=null&&Date.now()-i>r)throw new Error("Timed out");await Fn(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},Ae)).data}async getPKCEAuthorizationUrl(){let e=Ie(window.crypto.getRandomValues(new Uint8Array(32))),t=Ie(await Gn(e)),r=Ie(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(Un,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 y(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},Ae)).data}async logout(){return y(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(at,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(!je(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 Bn=(n,e)=>n().then(e),st=n=>Bn(()=>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,t=!0,r=!0)=>{let i=trackFlow("passport",e,t);try{return await n(i)}catch(a){throw a instanceof Error?trackError("passport",e,a,{flowId:i.details.flowId}):i.addEvent("errored"),a}finally{r&&i.addEvent("End");}};var Zn="mainnet",H=class{config;magicProviderProxyFactory;lazyMagicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.lazyMagicClient=st(()=>new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:Zn})));}get magicClient(){if(!this.lazyMagicClient)throw new Error("Cannot perform this action outside of the browser");return this.lazyMagicClient}async login(e){return y(async()=>E(async t=>{let r=performance.now(),i=await this.magicClient;return t.addEvent("endMagicClientInit"),await i.user.isLoggedIn()||await i.openid.loginWithOIDC({jwt:e,providerId:this.config.magicProviderId}),t.addEvent("endLoginWithOIDC"),trackDuration("passport",t.details.flowName,Math.round(performance.now()-r)),this.magicProviderProxyFactory.createProxy(i)},"magicLogin"),"WALLET_CONNECTION_ERROR")}async logout(){let e=await this.magicClient;e.user&&await e.user.logout();}};var ot=async n=>y(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function ct({user:n,starkSigner:e,request:t,exchangesApi:r}){return y(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 lt="ERC721";async function pt({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return y(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===lt?"1":t.sell.amount,o=t.buy.type===lt?"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),C=m.data,w={createOrderRequest:{include_fees:!0,fees:t.fees,stark_signature:h,amount_buy:C.amount_buy,amount_sell:C.amount_sell,asset_id_buy:C.asset_id_buy,asset_id_sell:C.asset_id_sell,expiration_timestamp:C.expiration_timestamp,nonce:C.nonce,stark_key:C.stark_key,vault_id_buy:C.vault_id_buy,vault_id_sell:C.vault_id_sell}};return {...(await r.createOrderV3(w,{headers:c})).data}},"CREATE_ORDER_ERROR")}async function mt({user:n,starkSigner:e,request:t,ordersApi:r,guardianClient:i}){return y(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 Se({ethSigner:n,starkSigner:e,imxApiClients:t},r){return y(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 ut({request:n,tradesApi:e,user:t,starkSigner:r,guardianClient:i}){return y(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:C}=await e.createTradeV3(h,{headers:o});return C},"CREATE_TRADE_ERROR")}var ht="ERC721";async function ft({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return y(async()=>{let a=n.type===ht?"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(),w={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:v}=await e.createTransferV1(w,{headers:o});return {sent_signature:v.sent_signature,status:v.status?.toString(),time:v.time,transfer_id:v.transfer_id}},"TRANSFER_ERROR")}async function Et({user:n,starkSigner:e,request:t,transfersApi:r,guardianClient:i}){return y(async()=>{let{ethAddress:a}=n.imx,s=t.map(h=>({amount:"1",token:convertToSignableToken({type:ht,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 C=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:C}})),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 Yn=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 Yn(r),N(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function yt(n){await N(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function Oe(n,e,t,r,i){return y(async()=>{try{let a=await Se({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await yt(r),a}catch(a){if(Q.isAxiosError(a)&&a.response?.status===409)return await yt(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 ot(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 ft({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 Oe(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 pt({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 mt({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 ut({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 Et({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 ct({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 Tt=(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;forceScwDeployBeforeMessageSignature;popupOverlayOptions;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,...o}){if(Tt(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},t)Tt(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,`
337
337
  scrollbars=yes,
338
338
  width=${t},
339
339
  height=${r},
@@ -359,7 +359,7 @@ function de(n){return "code"in n&&"message"in n}var g=class extends Error{type;c
359
359
  ${jt()}
360
360
  </div>
361
361
  </div>
362
- `;function H({id:n,href:e,rel:t,crossOrigin:r}){let i=`${k}-${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 Be=()=>Ge(Xt()),Ve=()=>Ge(Jt());var w=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){H({id:"link-googleapis",href:"https://fonts.googleapis.com"}),H({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),H({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?Be():Ve(),document.body.insertAdjacentElement("beforeend",e),this.overlay=e;}}updateTryAgainButton(e){let t=document.getElementById(V);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(B);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var W=class{storage;constructor(e,t){this.storage=Yt__default.default.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 me={headers:{"Content-Type":"application/x-www-form-urlencoded"}},We="/v2/logout",sr="/authorize",or=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",Yt__default.default.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new oidcClientTs.InMemoryWebStorage;let i=new oidcClientTs.WebStorageStateStore({store:r}),a=new URL(We,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.popupRedirectUri||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 cr(n){return new Promise(e=>{setTimeout(e,n);})}function ue(n){return btoa(String.fromCharCode(...new Uint8Array(n))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function dr(n){let t=new TextEncoder().encode(n);return await window.crypto.subtle.digest("SHA-256",t)}var M=class n{userManager;deviceCredentialsManager;config;logoutMode;refreshingPromise=null;constructor(e){this.config=e,this.userManager=new oidcClientTs.UserManager(or(e)),this.deviceCredentialsManager=new x,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=He__default.default(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=He__default.default(e.id_token);return new oidcClientTs.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 loginWithRedirect(e){return await this.userManager.clearStaleState(),f(async()=>{await this.userManager.signinRedirect({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:metrics.getDetail(metrics.Detail.RUNTIME_ID)||"",third_party_a_id:e||""}});},"AUTHENTICATION_ERROR")}async login(e){return f(async()=>{let t="passportLoginPrompt",r=async()=>this.userManager.signinPopup({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:metrics.getDetail(metrics.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 w(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){O.warn("Failed to retrieve a cached user session",t);}return e||this.login()}async loginCallback(){return f(async()=>{let e=await this.userManager.signinCallback();if(e)return n.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async loginWithDeviceFlow(e){return f(async()=>{let t=await q__default.default.post(`${this.config.authenticationDomain}/oauth/device/code`,{client_id:this.config.oidcConfiguration.clientId,scope:this.config.oidcConfiguration.scope,audience:this.config.oidcConfiguration.audience},me),r=metrics.getDetail(metrics.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 f(async()=>{let i=Date.now(),a=!0;for(;a;){if(r!=null&&Date.now()-i>r)throw new Error("Timed out");await cr(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__default.default.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__default.default.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},me)).data}async getPKCEAuthorizationUrl(){let e=ue(window.crypto.getRandomValues(new Uint8Array(32))),t=ue(await dr(e)),r=ue(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(sr,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 f(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__default.default.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},me)).data}async logout(){return f(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(We,e);return r.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&r.searchParams.set("returnTo",t.logoutRedirectUri),r.toString()}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{O.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(O.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 oidcClientTs.ErrorTimeout?(i="SILENT_LOGIN_ERROR",a=`${a}: ${r.message}`,s=!1):r instanceof oidcClientTs.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 g(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(!De(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(G);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(A);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};var lr=(n,e)=>n().then(e),qe=n=>lr(()=>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 h=async(n,e,t=!0,r=!0)=>{let i=metrics.trackFlow("passport",e,t);try{return await n(i)}catch(a){throw a instanceof Error?metrics.trackError("passport",e,a,{flowId:i.details.flowId}):i.addEvent("errored"),a}finally{r&&i.addEvent("End");}};var fr="mainnet",N=class{config;magicProviderProxyFactory;lazyMagicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.lazyMagicClient=qe(()=>new magicSdk.Magic(this.config.magicPublishableApiKey,{extensions:[new oidc.OpenIdExtension],network:fr})));}get magicClient(){if(!this.lazyMagicClient)throw new Error("Cannot perform this action outside of the browser");return this.lazyMagicClient}async login(e){return f(async()=>h(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"),metrics.trackDuration("passport",t.details.flowName,Math.round(performance.now()-r)),this.magicProviderProxyFactory.createProxy(i)},"magicLogin"),"WALLET_CONNECTION_ERROR")}async logout(){let e=await this.magicClient;e.user&&await e.user.logout();}};var $e=async n=>f(async()=>{let e=await xClient.generateLegacyStarkPrivateKey(n);return xClient.createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function Ze({user:n,starkSigner:e,request:t,exchangesApi:r}){return f(async()=>{let{ethAddress:i}=n.imx,a=t.amount,s=await r.getExchangeSignableTransfer({id:t.transactionID,getSignableTransferRequest:{sender:i,token:toolkit.convertToSignableToken(t),amount:a,receiver:t.receiver}}),o=await e.getAddress(),{payload_hash:c}=s.data,d=await e.signMessage(c),l={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},m={Authorization:`Bearer ${n.accessToken}`},u=await r.createExchangeTransfer({id:t.transactionID,createTransferRequest:l},{headers:m});return {sent_signature:u?.data.sent_signature,status:u?.data.status?.toString(),time:u?.data.time,transfer_id:u?.data.transfer_id}},"EXCHANGE_TRANSFER_ERROR")}var ze="ERC721";async function Xe({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===ze?"1":t.sell.amount,o=t.buy.type===ze?"1":t.buy.amount,c={Authorization:`Bearer ${e.accessToken}`},d={user:a,amount_buy:o,token_buy:toolkit.convertToSignableToken(t.buy),amount_sell:s,token_sell:toolkit.convertToSignableToken(t.sell),fees:t.fees,split_fees:!0,expiration_timestamp:t.expiration_timestamp},l=await r.getSignableOrder({getSignableOrderRequestV3:d},{headers:c});await i.evaluateImxTransaction({payloadHash:l.data.payload_hash});let{payload_hash:m}=l.data,u=await n.signMessage(m),E=l.data,R={createOrderRequest:{include_fees:!0,fees:t.fees,stark_signature:u,amount_buy:E.amount_buy,amount_sell:E.amount_sell,asset_id_buy:E.asset_id_buy,asset_id_sell:E.asset_id_sell,expiration_timestamp:E.expiration_timestamp,nonce:E.nonce,stark_key:E.stark_key,vault_id_buy:E.vault_id_buy,vault_id_sell:E.vault_id_sell}};return {...(await r.createOrderV3(R,{headers:c})).data}},"CREATE_ORDER_ERROR")}async function Je({user:n,starkSigner:e,request:t,ordersApi:r,guardianClient:i}){return f(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),l=await r.cancelOrderV3({id:t.order_id.toString(),cancelOrderRequest:{order_id:t.order_id,stark_signature:d}},{headers:s});return {order_id:l.data.order_id,status:l.data.status}},"CANCEL_ORDER_ERROR")}async function ge({ethSigner:n,starkSigner:e,imxApiClients:t},r){return f(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,l]=await Promise.all([toolkit.signRaw(o,n),e.signMessage(c)]);return (await t.usersApi.registerPassportUserV2({authorization:`Bearer ${r}`,registerPassportUserRequest:{eth_signature:d,ether_key:i,stark_signature:l,stark_key:a}})).data},"USER_REGISTRATION_ERROR")}async function je({request:n,tradesApi:e,user:t,starkSigner:r,guardianClient:i}){return f(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,l=await r.signMessage(d),{data:m}=c,u={createTradeRequest:{include_fees:!0,fees:n?.fees,stark_signature:l,order_id:n?.order_id,fee_info:m.fee_info,amount_buy:m.amount_buy,amount_sell:m.amount_sell,asset_id_buy:m.asset_id_buy,asset_id_sell:m.asset_id_sell,expiration_timestamp:m.expiration_timestamp,nonce:m.nonce,stark_key:m.stark_key,vault_id_buy:m.vault_id_buy,vault_id_sell:m.vault_id_sell}},{data:E}=await e.createTradeV3(u,{headers:o});return E},"CREATE_TRADE_ERROR")}var Qe="ERC721";async function et({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Qe?"1":n.amount,s={sender:r.imx.ethAddress,token:toolkit.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:l}=d,m=await t.signMessage(l),u=await t.getAddress(),R={createTransferRequest:{sender_stark_key:d.sender_stark_key||u,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:m}},{data:y}=await e.createTransferV1(R,{headers:o});return {sent_signature:y.sent_signature,status:y.status?.toString(),time:y.time,transfer_id:y.transfer_id}},"TRANSFER_ERROR")}async function tt({user:n,starkSigner:e,request:t,transfersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=n.imx,s=t.map(u=>({amount:"1",token:toolkit.convertToSignableToken({type:Qe,tokenId:u.tokenId,tokenAddress:u.tokenAddress}),receiver:u.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 u=>{let E=await e.signMessage(u.payload_hash);return {sender_vault_id:u.sender_vault_id,receiver_stark_key:u.receiver_stark_key,receiver_vault_id:u.receiver_vault_id,asset_id:u.asset_id,amount:u.amount,nonce:u.nonce,expiration_timestamp:u.expiration_timestamp,stark_signature:E}})),l={sender_stark_key:c.data.sender_stark_key,requests:d};return {transfer_ids:(await r.createTransfer({createTransferRequestV2:l},{headers:o}))?.data.transfer_ids}},"TRANSFER_ERROR")}var Tr=n=>new Promise(e=>{setTimeout(()=>e(),n);}),I=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 Tr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function rt(n){await I(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function he(n,e,t,r,i){return f(async()=>{try{let a=await ge({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await rt(r),a}catch(a){if(q__default.default.isAxiosError(a)&&a.response?.status===409)return await rt(r),{tx_hash:""};throw a}},"USER_REGISTRATION_ERROR")}var $=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 ethers.BrowserProvider(r).getSigner(),s=await $e(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 g("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(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return {user:e,starkSigner:t.starkSigner,ethSigner:t.ethSigner}}async transfer(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return et({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxTransfer")}async registerOffchain(){return h(async()=>{let[e,t]=await Promise.all([this.#t(),this.#a()]);return await he(t.ethSigner,t.starkSigner,e,this.authManager,this.imxApiClients)},"imxRegisterOffchain")}async isRegisteredOffchain(){return h(async()=>!!(await this.#t()).imx,"imxIsRegisteredOffchain")}isRegisteredOnchain(){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async createOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Xe({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCreateOrder")}async cancelOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Je({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCancelOrder")}async createTrade(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return je({request:e,user:t,starkSigner:r,tradesApi:this.immutableXClient.tradesApi,guardianClient:this.guardianClient})})(),"imxCreateTrade")}async batchNftTransfer(e){return h(()=>this.guardianClient.withConfirmationScreenTask({width:480,height:784})(async()=>{let{user:t,starkSigner:r}=await this.#r();return tt({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxBatchNftTransfer")}async exchangeTransfer(e){return h(async()=>{let{user:t,starkSigner:r}=await this.#r();return Ze({request:e,user:t,starkSigner:r,exchangesApi:this.immutableXClient.exchangeApi})},"imxExchangeTransfer")}deposit(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}prepareWithdrawal(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}completeWithdrawal(e,t){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async getAddress(){return h(async()=>{let e=await this.#t();if(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return Promise.resolve(e.imx.ethAddress)},"imxGetAddress")}};var Z=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 g("Failed to initialise","WALLET_CONNECTION_ERROR");return new $({authManager:this.authManager,immutableXClient:this.immutableXClient,passportEventEmitter:this.passportEventEmitter,magicAdapter:this.magicAdapter,imxApiClients:this.imxApiClients,guardianClient:this.guardianClient})}};var st=(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 g(i,"INVALID_CONFIGURATION")}},K=class{authenticationDomain;passportDomain;imxPublicApiDomain;magicPublishableApiKey;magicProviderId;oidcConfiguration;baseConfig;zkEvmRpcUrl;relayerUrl;multiRollupConfig;crossSdkBridgeEnabled;forceScwDeployBeforeMessageSignature;popupOverlayOptions;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,...o}){if(st(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},t)st(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:Ie.createConfig({basePath:t.indexerMrBasePath}),orderBook:Ie.createConfig({basePath:t.orderBookMrBasePath}),passport:Ie.createConfig({basePath:t.passportMrBasePath})};else switch(e.environment){case config.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=Ie.multiRollupConfig.getProduction();break}case config.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=Ie.multiRollupConfig.getSandbox();break}}}};var D="imx_passport_confirmation";var z=({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,`
362
+ `;function H({id:n,href:e,rel:t,crossOrigin:r}){let i=`${k}-${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 Be=()=>Ge(Xt()),Ve=()=>Ge(Jt());var w=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){H({id:"link-googleapis",href:"https://fonts.googleapis.com"}),H({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),H({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?Be():Ve(),document.body.insertAdjacentElement("beforeend",e),this.overlay=e;}}updateTryAgainButton(e){let t=document.getElementById(V);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(B);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var W=class{storage;constructor(e,t){this.storage=Yt__default.default.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 me={headers:{"Content-Type":"application/x-www-form-urlencoded"}},We="/v2/logout",sr="/authorize",or=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",Yt__default.default.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new oidcClientTs.InMemoryWebStorage;let i=new oidcClientTs.WebStorageStateStore({store:r}),a=new URL(We,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.popupRedirectUri||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 cr(n){return new Promise(e=>{setTimeout(e,n);})}function ue(n){return btoa(String.fromCharCode(...new Uint8Array(n))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function dr(n){let t=new TextEncoder().encode(n);return await window.crypto.subtle.digest("SHA-256",t)}var M=class n{userManager;deviceCredentialsManager;config;logoutMode;refreshingPromise=null;constructor(e){this.config=e,this.userManager=new oidcClientTs.UserManager(or(e)),this.deviceCredentialsManager=new x,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=He__default.default(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=He__default.default(e.id_token);return new oidcClientTs.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 loginWithRedirect(e){return await this.userManager.clearStaleState(),f(async()=>{await this.userManager.signinRedirect({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:metrics.getDetail(metrics.Detail.RUNTIME_ID)||"",third_party_a_id:e||""}});},"AUTHENTICATION_ERROR")}async login(e){return f(async()=>{let t="passportLoginPrompt",r=async()=>this.userManager.signinPopup({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:metrics.getDetail(metrics.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 w(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){O.warn("Failed to retrieve a cached user session",t);}return e||this.login()}async loginCallback(){return f(async()=>{let e=await this.userManager.signinCallback();if(e)return n.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async loginWithDeviceFlow(e){return f(async()=>{let t=await q__default.default.post(`${this.config.authenticationDomain}/oauth/device/code`,{client_id:this.config.oidcConfiguration.clientId,scope:this.config.oidcConfiguration.scope,audience:this.config.oidcConfiguration.audience},me),r=metrics.getDetail(metrics.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 f(async()=>{let i=Date.now(),a=!0;for(;a;){if(r!=null&&Date.now()-i>r)throw new Error("Timed out");await cr(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__default.default.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__default.default.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},me)).data}async getPKCEAuthorizationUrl(){let e=ue(window.crypto.getRandomValues(new Uint8Array(32))),t=ue(await dr(e)),r=ue(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(sr,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 f(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__default.default.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},me)).data}async logout(){return f(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(We,e);return r.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&r.searchParams.set("returnTo",t.logoutRedirectUri),r.toString()}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{O.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(O.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 oidcClientTs.ErrorTimeout?(i="SILENT_LOGIN_ERROR",a=`${a}: ${r.message}`,s=!1):r instanceof oidcClientTs.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 g(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(!De(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(G);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(A);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};var lr=(n,e)=>n().then(e),qe=n=>lr(()=>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 h=async(n,e,t=!0,r=!0)=>{let i=metrics.trackFlow("passport",e,t);try{return await n(i)}catch(a){throw a instanceof Error?metrics.trackError("passport",e,a,{flowId:i.details.flowId}):i.addEvent("errored"),a}finally{r&&i.addEvent("End");}};var fr="mainnet",N=class{config;magicProviderProxyFactory;lazyMagicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.lazyMagicClient=qe(()=>new magicSdk.Magic(this.config.magicPublishableApiKey,{extensions:[new oidc.OpenIdExtension],network:fr})));}get magicClient(){if(!this.lazyMagicClient)throw new Error("Cannot perform this action outside of the browser");return this.lazyMagicClient}async login(e){return f(async()=>h(async t=>{let r=performance.now(),i=await this.magicClient;return t.addEvent("endMagicClientInit"),await i.user.isLoggedIn()||await i.openid.loginWithOIDC({jwt:e,providerId:this.config.magicProviderId}),t.addEvent("endLoginWithOIDC"),metrics.trackDuration("passport",t.details.flowName,Math.round(performance.now()-r)),this.magicProviderProxyFactory.createProxy(i)},"magicLogin"),"WALLET_CONNECTION_ERROR")}async logout(){let e=await this.magicClient;e.user&&await e.user.logout();}};var $e=async n=>f(async()=>{let e=await xClient.generateLegacyStarkPrivateKey(n);return xClient.createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function Ze({user:n,starkSigner:e,request:t,exchangesApi:r}){return f(async()=>{let{ethAddress:i}=n.imx,a=t.amount,s=await r.getExchangeSignableTransfer({id:t.transactionID,getSignableTransferRequest:{sender:i,token:toolkit.convertToSignableToken(t),amount:a,receiver:t.receiver}}),o=await e.getAddress(),{payload_hash:c}=s.data,d=await e.signMessage(c),l={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},m={Authorization:`Bearer ${n.accessToken}`},u=await r.createExchangeTransfer({id:t.transactionID,createTransferRequest:l},{headers:m});return {sent_signature:u?.data.sent_signature,status:u?.data.status?.toString(),time:u?.data.time,transfer_id:u?.data.transfer_id}},"EXCHANGE_TRANSFER_ERROR")}var ze="ERC721";async function Xe({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===ze?"1":t.sell.amount,o=t.buy.type===ze?"1":t.buy.amount,c={Authorization:`Bearer ${e.accessToken}`},d={user:a,amount_buy:o,token_buy:toolkit.convertToSignableToken(t.buy),amount_sell:s,token_sell:toolkit.convertToSignableToken(t.sell),fees:t.fees,split_fees:!0,expiration_timestamp:t.expiration_timestamp},l=await r.getSignableOrder({getSignableOrderRequestV3:d},{headers:c});await i.evaluateImxTransaction({payloadHash:l.data.payload_hash});let{payload_hash:m}=l.data,u=await n.signMessage(m),E=l.data,R={createOrderRequest:{include_fees:!0,fees:t.fees,stark_signature:u,amount_buy:E.amount_buy,amount_sell:E.amount_sell,asset_id_buy:E.asset_id_buy,asset_id_sell:E.asset_id_sell,expiration_timestamp:E.expiration_timestamp,nonce:E.nonce,stark_key:E.stark_key,vault_id_buy:E.vault_id_buy,vault_id_sell:E.vault_id_sell}};return {...(await r.createOrderV3(R,{headers:c})).data}},"CREATE_ORDER_ERROR")}async function Je({user:n,starkSigner:e,request:t,ordersApi:r,guardianClient:i}){return f(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),l=await r.cancelOrderV3({id:t.order_id.toString(),cancelOrderRequest:{order_id:t.order_id,stark_signature:d}},{headers:s});return {order_id:l.data.order_id,status:l.data.status}},"CANCEL_ORDER_ERROR")}async function ge({ethSigner:n,starkSigner:e,imxApiClients:t},r){return f(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,l]=await Promise.all([toolkit.signRaw(o,n),e.signMessage(c)]);return (await t.usersApi.registerPassportUserV2({authorization:`Bearer ${r}`,registerPassportUserRequest:{eth_signature:d,ether_key:i,stark_signature:l,stark_key:a}})).data},"USER_REGISTRATION_ERROR")}async function je({request:n,tradesApi:e,user:t,starkSigner:r,guardianClient:i}){return f(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,l=await r.signMessage(d),{data:m}=c,u={createTradeRequest:{include_fees:!0,fees:n?.fees,stark_signature:l,order_id:n?.order_id,fee_info:m.fee_info,amount_buy:m.amount_buy,amount_sell:m.amount_sell,asset_id_buy:m.asset_id_buy,asset_id_sell:m.asset_id_sell,expiration_timestamp:m.expiration_timestamp,nonce:m.nonce,stark_key:m.stark_key,vault_id_buy:m.vault_id_buy,vault_id_sell:m.vault_id_sell}},{data:E}=await e.createTradeV3(u,{headers:o});return E},"CREATE_TRADE_ERROR")}var Qe="ERC721";async function et({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Qe?"1":n.amount,s={sender:r.imx.ethAddress,token:toolkit.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:l}=d,m=await t.signMessage(l),u=await t.getAddress(),R={createTransferRequest:{sender_stark_key:d.sender_stark_key||u,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:m}},{data:y}=await e.createTransferV1(R,{headers:o});return {sent_signature:y.sent_signature,status:y.status?.toString(),time:y.time,transfer_id:y.transfer_id}},"TRANSFER_ERROR")}async function tt({user:n,starkSigner:e,request:t,transfersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=n.imx,s=t.map(u=>({amount:"1",token:toolkit.convertToSignableToken({type:Qe,tokenId:u.tokenId,tokenAddress:u.tokenAddress}),receiver:u.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 u=>{let E=await e.signMessage(u.payload_hash);return {sender_vault_id:u.sender_vault_id,receiver_stark_key:u.receiver_stark_key,receiver_vault_id:u.receiver_vault_id,asset_id:u.asset_id,amount:u.amount,nonce:u.nonce,expiration_timestamp:u.expiration_timestamp,stark_signature:E}})),l={sender_stark_key:c.data.sender_stark_key,requests:d};return {transfer_ids:(await r.createTransfer({createTransferRequestV2:l},{headers:o}))?.data.transfer_ids}},"TRANSFER_ERROR")}var Tr=n=>new Promise(e=>{setTimeout(()=>e(),n);}),I=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 Tr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function rt(n){await I(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function he(n,e,t,r,i){return f(async()=>{try{let a=await ge({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await rt(r),a}catch(a){if(q__default.default.isAxiosError(a)&&a.response?.status===409)return await rt(r),{tx_hash:""};throw a}},"USER_REGISTRATION_ERROR")}var $=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 ethers.BrowserProvider(r).getSigner(),s=await $e(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 g("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(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return {user:e,starkSigner:t.starkSigner,ethSigner:t.ethSigner}}async transfer(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return et({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxTransfer")}async registerOffchain(){return h(async()=>{let[e,t]=await Promise.all([this.#t(),this.#a()]);return await he(t.ethSigner,t.starkSigner,e,this.authManager,this.imxApiClients)},"imxRegisterOffchain")}async isRegisteredOffchain(){return h(async()=>!!(await this.#t()).imx,"imxIsRegisteredOffchain")}isRegisteredOnchain(){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async createOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Xe({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCreateOrder")}async cancelOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Je({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCancelOrder")}async createTrade(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return je({request:e,user:t,starkSigner:r,tradesApi:this.immutableXClient.tradesApi,guardianClient:this.guardianClient})})(),"imxCreateTrade")}async batchNftTransfer(e){return h(()=>this.guardianClient.withConfirmationScreenTask({width:480,height:784})(async()=>{let{user:t,starkSigner:r}=await this.#r();return tt({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxBatchNftTransfer")}async exchangeTransfer(e){return h(async()=>{let{user:t,starkSigner:r}=await this.#r();return Ze({request:e,user:t,starkSigner:r,exchangesApi:this.immutableXClient.exchangeApi})},"imxExchangeTransfer")}deposit(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}prepareWithdrawal(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}completeWithdrawal(e,t){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async getAddress(){return h(async()=>{let e=await this.#t();if(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return Promise.resolve(e.imx.ethAddress)},"imxGetAddress")}};var Z=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 g("Failed to initialise","WALLET_CONNECTION_ERROR");return new $({authManager:this.authManager,immutableXClient:this.immutableXClient,passportEventEmitter:this.passportEventEmitter,magicAdapter:this.magicAdapter,imxApiClients:this.imxApiClients,guardianClient:this.guardianClient})}};var st=(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 g(i,"INVALID_CONFIGURATION")}},K=class{authenticationDomain;passportDomain;imxPublicApiDomain;magicPublishableApiKey;magicProviderId;oidcConfiguration;baseConfig;zkEvmRpcUrl;relayerUrl;multiRollupConfig;crossSdkBridgeEnabled;forceScwDeployBeforeMessageSignature;popupOverlayOptions;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,...o}){if(st(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},t)st(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:Ie.createConfig({basePath:t.indexerMrBasePath}),orderBook:Ie.createConfig({basePath:t.orderBookMrBasePath}),passport:Ie.createConfig({basePath:t.passportMrBasePath})};else switch(e.environment){case config.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=Ie.multiRollupConfig.getProduction();break}case config.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=Ie.multiRollupConfig.getSandbox();break}}}};var D="imx_passport_confirmation";var z=({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,`
363
363
  scrollbars=yes,
364
364
  width=${t},
365
365
  height=${r},
@@ -333,7 +333,7 @@ function de(n){return "code"in n&&"message"in n}var g=class extends Error{type;c
333
333
  ${jt()}
334
334
  </div>
335
335
  </div>
336
- `;function H({id:n,href:e,rel:t,crossOrigin:r}){let i=`${k}-${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 Be=()=>Ge(Xt()),Ve=()=>Ge(Jt());var w=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){H({id:"link-googleapis",href:"https://fonts.googleapis.com"}),H({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),H({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?Be():Ve(),document.body.insertAdjacentElement("beforeend",e),this.overlay=e;}}updateTryAgainButton(e){let t=document.getElementById(V);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(B);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var W=class{storage;constructor(e,t){this.storage=Yt.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 me={headers:{"Content-Type":"application/x-www-form-urlencoded"}},We="/v2/logout",sr="/authorize",or=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",Yt.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new InMemoryWebStorage;let i=new WebStorageStateStore({store:r}),a=new URL(We,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.popupRedirectUri||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 cr(n){return new Promise(e=>{setTimeout(e,n);})}function ue(n){return btoa(String.fromCharCode(...new Uint8Array(n))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function dr(n){let t=new TextEncoder().encode(n);return await window.crypto.subtle.digest("SHA-256",t)}var M=class n{userManager;deviceCredentialsManager;config;logoutMode;refreshingPromise=null;constructor(e){this.config=e,this.userManager=new UserManager(or(e)),this.deviceCredentialsManager=new x,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=He(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=He(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 loginWithRedirect(e){return await this.userManager.clearStaleState(),f(async()=>{await this.userManager.signinRedirect({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:e||""}});},"AUTHENTICATION_ERROR")}async login(e){return f(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 w(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){O.warn("Failed to retrieve a cached user session",t);}return e||this.login()}async loginCallback(){return f(async()=>{let e=await this.userManager.signinCallback();if(e)return n.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async loginWithDeviceFlow(e){return f(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},me),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 f(async()=>{let i=Date.now(),a=!0;for(;a;){if(r!=null&&Date.now()-i>r)throw new Error("Timed out");await cr(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},me)).data}async getPKCEAuthorizationUrl(){let e=ue(window.crypto.getRandomValues(new Uint8Array(32))),t=ue(await dr(e)),r=ue(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(sr,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 f(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},me)).data}async logout(){return f(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(We,e);return r.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&r.searchParams.set("returnTo",t.logoutRedirectUri),r.toString()}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{O.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(O.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 g(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(!De(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(G);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(A);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};var lr=(n,e)=>n().then(e),qe=n=>lr(()=>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 h=async(n,e,t=!0,r=!0)=>{let i=trackFlow("passport",e,t);try{return await n(i)}catch(a){throw a instanceof Error?trackError("passport",e,a,{flowId:i.details.flowId}):i.addEvent("errored"),a}finally{r&&i.addEvent("End");}};var fr="mainnet",N=class{config;magicProviderProxyFactory;lazyMagicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.lazyMagicClient=qe(()=>new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:fr})));}get magicClient(){if(!this.lazyMagicClient)throw new Error("Cannot perform this action outside of the browser");return this.lazyMagicClient}async login(e){return f(async()=>h(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)),this.magicProviderProxyFactory.createProxy(i)},"magicLogin"),"WALLET_CONNECTION_ERROR")}async logout(){let e=await this.magicClient;e.user&&await e.user.logout();}};var $e=async n=>f(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function Ze({user:n,starkSigner:e,request:t,exchangesApi:r}){return f(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),l={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},m={Authorization:`Bearer ${n.accessToken}`},u=await r.createExchangeTransfer({id:t.transactionID,createTransferRequest:l},{headers:m});return {sent_signature:u?.data.sent_signature,status:u?.data.status?.toString(),time:u?.data.time,transfer_id:u?.data.transfer_id}},"EXCHANGE_TRANSFER_ERROR")}var ze="ERC721";async function Xe({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===ze?"1":t.sell.amount,o=t.buy.type===ze?"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},l=await r.getSignableOrder({getSignableOrderRequestV3:d},{headers:c});await i.evaluateImxTransaction({payloadHash:l.data.payload_hash});let{payload_hash:m}=l.data,u=await n.signMessage(m),E=l.data,R={createOrderRequest:{include_fees:!0,fees:t.fees,stark_signature:u,amount_buy:E.amount_buy,amount_sell:E.amount_sell,asset_id_buy:E.asset_id_buy,asset_id_sell:E.asset_id_sell,expiration_timestamp:E.expiration_timestamp,nonce:E.nonce,stark_key:E.stark_key,vault_id_buy:E.vault_id_buy,vault_id_sell:E.vault_id_sell}};return {...(await r.createOrderV3(R,{headers:c})).data}},"CREATE_ORDER_ERROR")}async function Je({user:n,starkSigner:e,request:t,ordersApi:r,guardianClient:i}){return f(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),l=await r.cancelOrderV3({id:t.order_id.toString(),cancelOrderRequest:{order_id:t.order_id,stark_signature:d}},{headers:s});return {order_id:l.data.order_id,status:l.data.status}},"CANCEL_ORDER_ERROR")}async function ge({ethSigner:n,starkSigner:e,imxApiClients:t},r){return f(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,l]=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:l,stark_key:a}})).data},"USER_REGISTRATION_ERROR")}async function je({request:n,tradesApi:e,user:t,starkSigner:r,guardianClient:i}){return f(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,l=await r.signMessage(d),{data:m}=c,u={createTradeRequest:{include_fees:!0,fees:n?.fees,stark_signature:l,order_id:n?.order_id,fee_info:m.fee_info,amount_buy:m.amount_buy,amount_sell:m.amount_sell,asset_id_buy:m.asset_id_buy,asset_id_sell:m.asset_id_sell,expiration_timestamp:m.expiration_timestamp,nonce:m.nonce,stark_key:m.stark_key,vault_id_buy:m.vault_id_buy,vault_id_sell:m.vault_id_sell}},{data:E}=await e.createTradeV3(u,{headers:o});return E},"CREATE_TRADE_ERROR")}var Qe="ERC721";async function et({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Qe?"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:l}=d,m=await t.signMessage(l),u=await t.getAddress(),R={createTransferRequest:{sender_stark_key:d.sender_stark_key||u,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:m}},{data:y}=await e.createTransferV1(R,{headers:o});return {sent_signature:y.sent_signature,status:y.status?.toString(),time:y.time,transfer_id:y.transfer_id}},"TRANSFER_ERROR")}async function tt({user:n,starkSigner:e,request:t,transfersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=n.imx,s=t.map(u=>({amount:"1",token:convertToSignableToken({type:Qe,tokenId:u.tokenId,tokenAddress:u.tokenAddress}),receiver:u.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 u=>{let E=await e.signMessage(u.payload_hash);return {sender_vault_id:u.sender_vault_id,receiver_stark_key:u.receiver_stark_key,receiver_vault_id:u.receiver_vault_id,asset_id:u.asset_id,amount:u.amount,nonce:u.nonce,expiration_timestamp:u.expiration_timestamp,stark_signature:E}})),l={sender_stark_key:c.data.sender_stark_key,requests:d};return {transfer_ids:(await r.createTransfer({createTransferRequestV2:l},{headers:o}))?.data.transfer_ids}},"TRANSFER_ERROR")}var Tr=n=>new Promise(e=>{setTimeout(()=>e(),n);}),I=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 Tr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function rt(n){await I(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function he(n,e,t,r,i){return f(async()=>{try{let a=await ge({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await rt(r),a}catch(a){if(q.isAxiosError(a)&&a.response?.status===409)return await rt(r),{tx_hash:""};throw a}},"USER_REGISTRATION_ERROR")}var $=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 $e(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 g("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(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return {user:e,starkSigner:t.starkSigner,ethSigner:t.ethSigner}}async transfer(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return et({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxTransfer")}async registerOffchain(){return h(async()=>{let[e,t]=await Promise.all([this.#t(),this.#a()]);return await he(t.ethSigner,t.starkSigner,e,this.authManager,this.imxApiClients)},"imxRegisterOffchain")}async isRegisteredOffchain(){return h(async()=>!!(await this.#t()).imx,"imxIsRegisteredOffchain")}isRegisteredOnchain(){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async createOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Xe({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCreateOrder")}async cancelOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Je({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCancelOrder")}async createTrade(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return je({request:e,user:t,starkSigner:r,tradesApi:this.immutableXClient.tradesApi,guardianClient:this.guardianClient})})(),"imxCreateTrade")}async batchNftTransfer(e){return h(()=>this.guardianClient.withConfirmationScreenTask({width:480,height:784})(async()=>{let{user:t,starkSigner:r}=await this.#r();return tt({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxBatchNftTransfer")}async exchangeTransfer(e){return h(async()=>{let{user:t,starkSigner:r}=await this.#r();return Ze({request:e,user:t,starkSigner:r,exchangesApi:this.immutableXClient.exchangeApi})},"imxExchangeTransfer")}deposit(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}prepareWithdrawal(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}completeWithdrawal(e,t){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async getAddress(){return h(async()=>{let e=await this.#t();if(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return Promise.resolve(e.imx.ethAddress)},"imxGetAddress")}};var Z=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 g("Failed to initialise","WALLET_CONNECTION_ERROR");return new $({authManager:this.authManager,immutableXClient:this.immutableXClient,passportEventEmitter:this.passportEventEmitter,magicAdapter:this.magicAdapter,imxApiClients:this.imxApiClients,guardianClient:this.guardianClient})}};var st=(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 g(i,"INVALID_CONFIGURATION")}},K=class{authenticationDomain;passportDomain;imxPublicApiDomain;magicPublishableApiKey;magicProviderId;oidcConfiguration;baseConfig;zkEvmRpcUrl;relayerUrl;multiRollupConfig;crossSdkBridgeEnabled;forceScwDeployBeforeMessageSignature;popupOverlayOptions;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,...o}){if(st(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},t)st(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 D="imx_passport_confirmation";var z=({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,`
336
+ `;function H({id:n,href:e,rel:t,crossOrigin:r}){let i=`${k}-${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 Be=()=>Ge(Xt()),Ve=()=>Ge(Jt());var w=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){H({id:"link-googleapis",href:"https://fonts.googleapis.com"}),H({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),H({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?Be():Ve(),document.body.insertAdjacentElement("beforeend",e),this.overlay=e;}}updateTryAgainButton(e){let t=document.getElementById(V);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(B);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var W=class{storage;constructor(e,t){this.storage=Yt.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 me={headers:{"Content-Type":"application/x-www-form-urlencoded"}},We="/v2/logout",sr="/authorize",or=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",Yt.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new InMemoryWebStorage;let i=new WebStorageStateStore({store:r}),a=new URL(We,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.popupRedirectUri||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 cr(n){return new Promise(e=>{setTimeout(e,n);})}function ue(n){return btoa(String.fromCharCode(...new Uint8Array(n))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function dr(n){let t=new TextEncoder().encode(n);return await window.crypto.subtle.digest("SHA-256",t)}var M=class n{userManager;deviceCredentialsManager;config;logoutMode;refreshingPromise=null;constructor(e){this.config=e,this.userManager=new UserManager(or(e)),this.deviceCredentialsManager=new x,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=He(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=He(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 loginWithRedirect(e){return await this.userManager.clearStaleState(),f(async()=>{await this.userManager.signinRedirect({extraQueryParams:{...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:e||""}});},"AUTHENTICATION_ERROR")}async login(e){return f(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 w(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){O.warn("Failed to retrieve a cached user session",t);}return e||this.login()}async loginCallback(){return f(async()=>{let e=await this.userManager.signinCallback();if(e)return n.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async loginWithDeviceFlow(e){return f(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},me),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 f(async()=>{let i=Date.now(),a=!0;for(;a;){if(r!=null&&Date.now()-i>r)throw new Error("Timed out");await cr(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},me)).data}async getPKCEAuthorizationUrl(){let e=ue(window.crypto.getRandomValues(new Uint8Array(32))),t=ue(await dr(e)),r=ue(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(sr,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 f(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},me)).data}async logout(){return f(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(We,e);return r.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&r.searchParams.set("returnTo",t.logoutRedirectUri),r.toString()}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{O.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(O.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 g(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(!De(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(G);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(A);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};var lr=(n,e)=>n().then(e),qe=n=>lr(()=>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 h=async(n,e,t=!0,r=!0)=>{let i=trackFlow("passport",e,t);try{return await n(i)}catch(a){throw a instanceof Error?trackError("passport",e,a,{flowId:i.details.flowId}):i.addEvent("errored"),a}finally{r&&i.addEvent("End");}};var fr="mainnet",N=class{config;magicProviderProxyFactory;lazyMagicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.lazyMagicClient=qe(()=>new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:fr})));}get magicClient(){if(!this.lazyMagicClient)throw new Error("Cannot perform this action outside of the browser");return this.lazyMagicClient}async login(e){return f(async()=>h(async t=>{let r=performance.now(),i=await this.magicClient;return t.addEvent("endMagicClientInit"),await i.user.isLoggedIn()||await i.openid.loginWithOIDC({jwt:e,providerId:this.config.magicProviderId}),t.addEvent("endLoginWithOIDC"),trackDuration("passport",t.details.flowName,Math.round(performance.now()-r)),this.magicProviderProxyFactory.createProxy(i)},"magicLogin"),"WALLET_CONNECTION_ERROR")}async logout(){let e=await this.magicClient;e.user&&await e.user.logout();}};var $e=async n=>f(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function Ze({user:n,starkSigner:e,request:t,exchangesApi:r}){return f(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),l={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},m={Authorization:`Bearer ${n.accessToken}`},u=await r.createExchangeTransfer({id:t.transactionID,createTransferRequest:l},{headers:m});return {sent_signature:u?.data.sent_signature,status:u?.data.status?.toString(),time:u?.data.time,transfer_id:u?.data.transfer_id}},"EXCHANGE_TRANSFER_ERROR")}var ze="ERC721";async function Xe({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===ze?"1":t.sell.amount,o=t.buy.type===ze?"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},l=await r.getSignableOrder({getSignableOrderRequestV3:d},{headers:c});await i.evaluateImxTransaction({payloadHash:l.data.payload_hash});let{payload_hash:m}=l.data,u=await n.signMessage(m),E=l.data,R={createOrderRequest:{include_fees:!0,fees:t.fees,stark_signature:u,amount_buy:E.amount_buy,amount_sell:E.amount_sell,asset_id_buy:E.asset_id_buy,asset_id_sell:E.asset_id_sell,expiration_timestamp:E.expiration_timestamp,nonce:E.nonce,stark_key:E.stark_key,vault_id_buy:E.vault_id_buy,vault_id_sell:E.vault_id_sell}};return {...(await r.createOrderV3(R,{headers:c})).data}},"CREATE_ORDER_ERROR")}async function Je({user:n,starkSigner:e,request:t,ordersApi:r,guardianClient:i}){return f(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),l=await r.cancelOrderV3({id:t.order_id.toString(),cancelOrderRequest:{order_id:t.order_id,stark_signature:d}},{headers:s});return {order_id:l.data.order_id,status:l.data.status}},"CANCEL_ORDER_ERROR")}async function ge({ethSigner:n,starkSigner:e,imxApiClients:t},r){return f(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,l]=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:l,stark_key:a}})).data},"USER_REGISTRATION_ERROR")}async function je({request:n,tradesApi:e,user:t,starkSigner:r,guardianClient:i}){return f(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,l=await r.signMessage(d),{data:m}=c,u={createTradeRequest:{include_fees:!0,fees:n?.fees,stark_signature:l,order_id:n?.order_id,fee_info:m.fee_info,amount_buy:m.amount_buy,amount_sell:m.amount_sell,asset_id_buy:m.asset_id_buy,asset_id_sell:m.asset_id_sell,expiration_timestamp:m.expiration_timestamp,nonce:m.nonce,stark_key:m.stark_key,vault_id_buy:m.vault_id_buy,vault_id_sell:m.vault_id_sell}},{data:E}=await e.createTradeV3(u,{headers:o});return E},"CREATE_TRADE_ERROR")}var Qe="ERC721";async function et({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Qe?"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:l}=d,m=await t.signMessage(l),u=await t.getAddress(),R={createTransferRequest:{sender_stark_key:d.sender_stark_key||u,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:m}},{data:y}=await e.createTransferV1(R,{headers:o});return {sent_signature:y.sent_signature,status:y.status?.toString(),time:y.time,transfer_id:y.transfer_id}},"TRANSFER_ERROR")}async function tt({user:n,starkSigner:e,request:t,transfersApi:r,guardianClient:i}){return f(async()=>{let{ethAddress:a}=n.imx,s=t.map(u=>({amount:"1",token:convertToSignableToken({type:Qe,tokenId:u.tokenId,tokenAddress:u.tokenAddress}),receiver:u.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 u=>{let E=await e.signMessage(u.payload_hash);return {sender_vault_id:u.sender_vault_id,receiver_stark_key:u.receiver_stark_key,receiver_vault_id:u.receiver_vault_id,asset_id:u.asset_id,amount:u.amount,nonce:u.nonce,expiration_timestamp:u.expiration_timestamp,stark_signature:E}})),l={sender_stark_key:c.data.sender_stark_key,requests:d};return {transfer_ids:(await r.createTransfer({createTransferRequestV2:l},{headers:o}))?.data.transfer_ids}},"TRANSFER_ERROR")}var Tr=n=>new Promise(e=>{setTimeout(()=>e(),n);}),I=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 Tr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function rt(n){await I(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function he(n,e,t,r,i){return f(async()=>{try{let a=await ge({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await rt(r),a}catch(a){if(q.isAxiosError(a)&&a.response?.status===409)return await rt(r),{tx_hash:""};throw a}},"USER_REGISTRATION_ERROR")}var $=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 $e(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 g("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(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return {user:e,starkSigner:t.starkSigner,ethSigner:t.ethSigner}}async transfer(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return et({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxTransfer")}async registerOffchain(){return h(async()=>{let[e,t]=await Promise.all([this.#t(),this.#a()]);return await he(t.ethSigner,t.starkSigner,e,this.authManager,this.imxApiClients)},"imxRegisterOffchain")}async isRegisteredOffchain(){return h(async()=>!!(await this.#t()).imx,"imxIsRegisteredOffchain")}isRegisteredOnchain(){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async createOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Xe({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCreateOrder")}async cancelOrder(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return Je({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCancelOrder")}async createTrade(e){return h(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return je({request:e,user:t,starkSigner:r,tradesApi:this.immutableXClient.tradesApi,guardianClient:this.guardianClient})})(),"imxCreateTrade")}async batchNftTransfer(e){return h(()=>this.guardianClient.withConfirmationScreenTask({width:480,height:784})(async()=>{let{user:t,starkSigner:r}=await this.#r();return tt({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxBatchNftTransfer")}async exchangeTransfer(e){return h(async()=>{let{user:t,starkSigner:r}=await this.#r();return Ze({request:e,user:t,starkSigner:r,exchangesApi:this.immutableXClient.exchangeApi})},"imxExchangeTransfer")}deposit(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}prepareWithdrawal(e){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}completeWithdrawal(e,t){throw new g("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async getAddress(){return h(async()=>{let e=await this.#t();if(!A(e))throw new g("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return Promise.resolve(e.imx.ethAddress)},"imxGetAddress")}};var Z=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 g("Failed to initialise","WALLET_CONNECTION_ERROR");return new $({authManager:this.authManager,immutableXClient:this.immutableXClient,passportEventEmitter:this.passportEventEmitter,magicAdapter:this.magicAdapter,imxApiClients:this.imxApiClients,guardianClient:this.guardianClient})}};var st=(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 g(i,"INVALID_CONFIGURATION")}},K=class{authenticationDomain;passportDomain;imxPublicApiDomain;magicPublishableApiKey;magicProviderId;oidcConfiguration;baseConfig;zkEvmRpcUrl;relayerUrl;multiRollupConfig;crossSdkBridgeEnabled;forceScwDeployBeforeMessageSignature;popupOverlayOptions;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,...o}){if(st(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},t)st(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 D="imx_passport_confirmation";var z=({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,`
337
337
  scrollbars=yes,
338
338
  width=${t},
339
339
  height=${r},
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@imtbl/passport",
3
3
  "description": "Passport module for Immutable SDK",
4
- "version": "2.0.3",
4
+ "version": "2.0.4-alpha.1",
5
5
  "author": "Immutable",
6
6
  "bugs": "https://github.com/immutable/ts-immutable-sdk/issues",
7
7
  "dependencies": {
8
8
  "@0xsequence/abi": "^2.0.25",
9
9
  "@0xsequence/core": "^2.0.25",
10
- "@imtbl/config": "2.0.3",
11
- "@imtbl/generated-clients": "2.0.3",
12
- "@imtbl/metrics": "2.0.3",
13
- "@imtbl/toolkit": "2.0.3",
14
- "@imtbl/x-client": "2.0.3",
15
- "@imtbl/x-provider": "2.0.3",
10
+ "@imtbl/config": "2.0.4-alpha.1",
11
+ "@imtbl/generated-clients": "2.0.4-alpha.1",
12
+ "@imtbl/metrics": "2.0.4-alpha.1",
13
+ "@imtbl/toolkit": "2.0.4-alpha.1",
14
+ "@imtbl/x-client": "2.0.4-alpha.1",
15
+ "@imtbl/x-provider": "2.0.4-alpha.1",
16
16
  "@magic-ext/oidc": "4.3.1",
17
17
  "@magic-sdk/provider": "^21.2.0",
18
18
  "@metamask/detect-provider": "^2.0.0",