@imtbl/passport 2.2.3-alpha.0 → 2.2.3
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.
- package/dist/browser/index.js +1 -1
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.js +1 -1
- package/package.json +8 -8
package/dist/browser/index.js
CHANGED
|
@@ -333,7 +333,7 @@ function ve(n){throw new Error("Node.js process "+n+" is not supported by JSPM c
|
|
|
333
333
|
${An()}
|
|
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(_n()),nt=()=>tt(Pn());var b=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(z);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var Y=class{storage;constructor(e,t){this.storage=In.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",Dn="/authorize",Un=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new Y("ImmutableSDKPassport",In.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"));return a.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&a.searchParams.set("returnTo",t.logoutRedirectUri),{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()},mergeClaimsStrategy:{array:"merge"},automaticSilentRenew:!1,scope:t.scope,userStore:i,extraQueryParams:{...n.extraQueryParams,...t.audience?{audience:t.audience}:{}}}};function Ln(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 Fn(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(Un(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 b(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 Ln(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 Fn(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(Dn,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(X);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 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 qn="mainnet",H=class{config;magicProviderProxyFactory;magicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.magicClient=new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:qn}));}getMagicClient(){if(!this.magicClient)throw new Error("Cannot perform this action outside of the browser");return this.magicClient}async login(e){return y(async()=>E(async t=>{let r=performance.now(),i=this.getMagicClient();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=this.getMagicClient();e.user&&await e.user.logout();}};var st=async n=>y(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function ot({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 dt="ERC721";async function lt({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return y(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===dt?"1":t.sell.amount,o=t.buy.type===dt?"1":t.buy.amount,c={Authorization:`Bearer ${e.accessToken}`},d={user:a,amount_buy:o,token_buy:convertToSignableToken(t.buy),amount_sell:s,token_sell:convertToSignableToken(t.sell),fees:t.fees,split_fees:!0,expiration_timestamp:t.expiration_timestamp},m=await r.getSignableOrder({getSignableOrderRequestV3:d},{headers:c});await i.evaluateImxTransaction({payloadHash:m.data.payload_hash});let{payload_hash:g}=m.data,h=await n.signMessage(g),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 pt({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 mt({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 gt="ERC721";async function ht({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return y(async()=>{let a=n.type===gt?"1":n.amount,s={sender:r.imx.ethAddress,token:convertToSignableToken(n),amount:a,receiver:n.receiver},o={Authorization:`Bearer ${r.accessToken}`},c=await e.getSignableTransferV1({getSignableTransferRequest:s},{headers:o});await i.evaluateImxTransaction({payloadHash:c.data.payload_hash});let d=c.data,{payload_hash:m}=d,g=await t.signMessage(m),h=await t.getAddress(),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 ft({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:gt,tokenId:h.tokenId,tokenAddress:h.tokenAddress}),receiver:h.receiver})),o={Authorization:`Bearer ${n.accessToken}`},c=await r.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}},{headers:o});await i.evaluateImxTransaction({payloadHash:c.data.signable_responses[0]?.payload_hash});let d=await Promise.all(c.data.signable_responses.map(async h=>{let 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 Jn=n=>new Promise(e=>{setTimeout(()=>e(),n);}),N=async(n,e)=>{let{retries:t=3,interval:r=1e3,finalErr:i=Error("Retry failed"),finallyFn:a=()=>{}}=e||{};try{return await n()}catch{return t<=0?Promise.reject(i):(await Jn(r),N(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function Et(n){await N(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function be(n,e,t,r,i){return y(async()=>{try{let a=await Se({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await Et(r),a}catch(a){if(Q.isAxiosError(a)&&a.response?.status===409)return await Et(r),{tx_hash:""};throw a}},"USER_REGISTRATION_ERROR")}var ee=class{authManager;immutableXClient;guardianClient;imxApiClients;magicAdapter;signers;signerInitialisationError;constructor({authManager:e,immutableXClient:t,passportEventEmitter:r,magicAdapter:i,imxApiClients:a,guardianClient:s}){this.authManager=e,this.immutableXClient=t,this.magicAdapter=i,this.imxApiClients=a,this.guardianClient=s,this.#i(),r.on("loggedOut",this.handleLogout);}handleLogout=()=>{this.signers=void 0;};#i(){let e=async()=>{let t=await this.authManager.getUser(),r=await this.magicAdapter.login(t.idToken),a=await new BrowserProvider(r).getSigner(),s=await st(a);return {ethSigner:a,starkSigner:s}};this.signers=new Promise(async t=>{try{t(await e());}catch(r){this.signerInitialisationError=r,t(void 0);}});}async#t(){let e=await this.authManager.getUser();if(!e||!this.signers)throw new f("User has been logged out","NOT_LOGGED_IN_ERROR");return e}async#a(){let e=await this.signers;if(typeof e>"u")throw typeof this.signerInitialisationError<"u"?this.signerInitialisationError:new Error("Signers failed to initialise");return e}async#r(){let[e,t]=await Promise.all([this.#t(),this.#a()]);if(!M(e))throw new f("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return {user:e,starkSigner:t.starkSigner,ethSigner:t.ethSigner}}async transfer(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return ht({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxTransfer")}async registerOffchain(){return E(async()=>{let[e,t]=await Promise.all([this.#t(),this.#a()]);return await be(t.ethSigner,t.starkSigner,e,this.authManager,this.imxApiClients)},"imxRegisterOffchain")}async isRegisteredOffchain(){return E(async()=>!!(await this.#t()).imx,"imxIsRegisteredOffchain")}isRegisteredOnchain(){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async createOrder(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return lt({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCreateOrder")}async cancelOrder(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return pt({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCancelOrder")}async createTrade(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return mt({request:e,user:t,starkSigner:r,tradesApi:this.immutableXClient.tradesApi,guardianClient:this.guardianClient})})(),"imxCreateTrade")}async batchNftTransfer(e){return E(()=>this.guardianClient.withConfirmationScreenTask({width:480,height:784})(async()=>{let{user:t,starkSigner:r}=await this.#r();return ft({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxBatchNftTransfer")}async exchangeTransfer(e){return E(async()=>{let{user:t,starkSigner:r}=await this.#r();return ot({request:e,user:t,starkSigner:r,exchangesApi:this.immutableXClient.exchangeApi})},"imxExchangeTransfer")}deposit(e){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}prepareWithdrawal(e){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}completeWithdrawal(e,t){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async getAddress(){return E(async()=>{let e=await this.#t();if(!M(e))throw new f("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return Promise.resolve(e.imx.ethAddress)},"imxGetAddress")}};var te=class{authManager;immutableXClient;magicAdapter;passportEventEmitter;imxApiClients;guardianClient;constructor({authManager:e,immutableXClient:t,magicAdapter:r,passportEventEmitter:i,imxApiClients:a,guardianClient:s}){this.authManager=e,this.immutableXClient=t,this.magicAdapter=r,this.passportEventEmitter=i,this.imxApiClients=a,this.guardianClient=s;}async getProvider(){let e=await this.authManager.getUserOrLogin();return this.createProviderInstance(e)}async getProviderSilent(){let e=await this.authManager.getUser();return e?this.createProviderInstance(e):null}async createProviderInstance(e){if(!e.idToken)throw new f("Failed to initialise","WALLET_CONNECTION_ERROR");return new ee({authManager:this.authManager,immutableXClient:this.immutableXClient,passportEventEmitter:this.passportEventEmitter,magicAdapter:this.magicAdapter,imxApiClients:this.imxApiClients,guardianClient:this.guardianClient})}};var vt=(n,e,t)=>{let r=e.map(i=>!n[i]&&i).filter(i=>i).join(", ");if(r!==""){let i=t?`${t} - ${r} cannot be null`:`${r} cannot be null`;throw new f(i,"INVALID_CONFIGURATION")}},re=class{authenticationDomain;passportDomain;imxPublicApiDomain;magicPublishableApiKey;magicProviderId;oidcConfiguration;baseConfig;zkEvmRpcUrl;relayerUrl;multiRollupConfig;crossSdkBridgeEnabled;forceScwDeployBeforeMessageSignature;popupOverlayOptions;extraQueryParams;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,extraQueryParams:o,...c}){if(vt(c,["clientId","redirectUri"]),this.oidcConfiguration=c,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},this.extraQueryParams=o||{},t)vt(t,["authenticationDomain","passportDomain","magicPublishableApiKey","magicProviderId","zkEvmRpcUrl","relayerUrl","imxPublicApiDomain","indexerMrBasePath","orderBookMrBasePath","passportMrBasePath"],"overrides"),this.authenticationDomain=t.authenticationDomain,this.passportDomain=t.passportDomain,this.imxPublicApiDomain=t.imxPublicApiDomain,this.magicPublishableApiKey=t.magicPublishableApiKey,this.magicProviderId=t.magicProviderId,this.zkEvmRpcUrl=t.zkEvmRpcUrl,this.relayerUrl=t.relayerUrl,this.multiRollupConfig={indexer:createConfig({basePath:t.indexerMrBasePath}),orderBook:createConfig({basePath:t.orderBookMrBasePath}),passport:createConfig({basePath:t.passportMrBasePath})};else switch(e.environment){case Environment.PRODUCTION:{this.authenticationDomain="https://auth.immutable.com",this.magicPublishableApiKey="pk_live_10F423798A540ED7",this.magicProviderId="fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=",this.passportDomain="https://passport.immutable.com",this.imxPublicApiDomain="https://api.immutable.com",this.zkEvmRpcUrl="https://rpc.immutable.com",this.relayerUrl="https://api.immutable.com/relayer-mr",this.multiRollupConfig=multiRollupConfig.getProduction();break}case Environment.SANDBOX:default:{this.authenticationDomain="https://auth.immutable.com",this.magicPublishableApiKey="pk_live_10F423798A540ED7",this.magicProviderId="fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=",this.passportDomain="https://passport.sandbox.immutable.com",this.imxPublicApiDomain="https://api.sandbox.immutable.com",this.zkEvmRpcUrl="https://rpc.testnet.immutable.com",this.relayerUrl="https://api.sandbox.immutable.com/relayer-mr",this.multiRollupConfig=multiRollupConfig.getSandbox();break}}}};var W="imx_passport_confirmation";var ne=({url:n,title:e,width:t,height:r})=>{let i=Math.max(0,Math.round(window.screenX+(window.outerWidth-t)/2)),a=Math.max(0,Math.round(window.screenY+(window.outerHeight-r)/2)),s=window.open(n,e,`
|
|
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(_n()),nt=()=>tt(Pn());var b=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(z);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var Y=class{storage;constructor(e,t){this.storage=In.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",Dn="/authorize",Un=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new Y("ImmutableSDKPassport",In.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"));return a.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&a.searchParams.set("returnTo",t.logoutRedirectUri),{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,extraQueryParams:{...n.extraQueryParams,...t.audience?{audience:t.audience}:{}}}};function Ln(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 Fn(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(Un(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 b(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 Ln(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 Fn(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(Dn,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(X);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 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 qn="mainnet",H=class{config;magicProviderProxyFactory;magicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.magicClient=new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:qn}));}getMagicClient(){if(!this.magicClient)throw new Error("Cannot perform this action outside of the browser");return this.magicClient}async login(e){return y(async()=>E(async t=>{let r=performance.now(),i=this.getMagicClient();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=this.getMagicClient();e.user&&await e.user.logout();}};var st=async n=>y(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function ot({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 dt="ERC721";async function lt({starkSigner:n,user:e,request:t,ordersApi:r,guardianClient:i}){return y(async()=>{let{ethAddress:a}=e.imx,s=t.sell.type===dt?"1":t.sell.amount,o=t.buy.type===dt?"1":t.buy.amount,c={Authorization:`Bearer ${e.accessToken}`},d={user:a,amount_buy:o,token_buy:convertToSignableToken(t.buy),amount_sell:s,token_sell:convertToSignableToken(t.sell),fees:t.fees,split_fees:!0,expiration_timestamp:t.expiration_timestamp},m=await r.getSignableOrder({getSignableOrderRequestV3:d},{headers:c});await i.evaluateImxTransaction({payloadHash:m.data.payload_hash});let{payload_hash:g}=m.data,h=await n.signMessage(g),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 pt({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 mt({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 gt="ERC721";async function ht({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return y(async()=>{let a=n.type===gt?"1":n.amount,s={sender:r.imx.ethAddress,token:convertToSignableToken(n),amount:a,receiver:n.receiver},o={Authorization:`Bearer ${r.accessToken}`},c=await e.getSignableTransferV1({getSignableTransferRequest:s},{headers:o});await i.evaluateImxTransaction({payloadHash:c.data.payload_hash});let d=c.data,{payload_hash:m}=d,g=await t.signMessage(m),h=await t.getAddress(),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 ft({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:gt,tokenId:h.tokenId,tokenAddress:h.tokenAddress}),receiver:h.receiver})),o={Authorization:`Bearer ${n.accessToken}`},c=await r.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}},{headers:o});await i.evaluateImxTransaction({payloadHash:c.data.signable_responses[0]?.payload_hash});let d=await Promise.all(c.data.signable_responses.map(async h=>{let 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 Jn=n=>new Promise(e=>{setTimeout(()=>e(),n);}),N=async(n,e)=>{let{retries:t=3,interval:r=1e3,finalErr:i=Error("Retry failed"),finallyFn:a=()=>{}}=e||{};try{return await n()}catch{return t<=0?Promise.reject(i):(await Jn(r),N(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function Et(n){await N(async()=>{let e=await n.forceUserRefresh();return e?.imx?e:Promise.reject(new Error("user wallet addresses not exist"))});}async function be(n,e,t,r,i){return y(async()=>{try{let a=await Se({ethSigner:n,starkSigner:e,imxApiClients:i},t.accessToken);return await Et(r),a}catch(a){if(Q.isAxiosError(a)&&a.response?.status===409)return await Et(r),{tx_hash:""};throw a}},"USER_REGISTRATION_ERROR")}var ee=class{authManager;immutableXClient;guardianClient;imxApiClients;magicAdapter;signers;signerInitialisationError;constructor({authManager:e,immutableXClient:t,passportEventEmitter:r,magicAdapter:i,imxApiClients:a,guardianClient:s}){this.authManager=e,this.immutableXClient=t,this.magicAdapter=i,this.imxApiClients=a,this.guardianClient=s,this.#i(),r.on("loggedOut",this.handleLogout);}handleLogout=()=>{this.signers=void 0;};#i(){let e=async()=>{let t=await this.authManager.getUser(),r=await this.magicAdapter.login(t.idToken),a=await new BrowserProvider(r).getSigner(),s=await st(a);return {ethSigner:a,starkSigner:s}};this.signers=new Promise(async t=>{try{t(await e());}catch(r){this.signerInitialisationError=r,t(void 0);}});}async#t(){let e=await this.authManager.getUser();if(!e||!this.signers)throw new f("User has been logged out","NOT_LOGGED_IN_ERROR");return e}async#a(){let e=await this.signers;if(typeof e>"u")throw typeof this.signerInitialisationError<"u"?this.signerInitialisationError:new Error("Signers failed to initialise");return e}async#r(){let[e,t]=await Promise.all([this.#t(),this.#a()]);if(!M(e))throw new f("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return {user:e,starkSigner:t.starkSigner,ethSigner:t.ethSigner}}async transfer(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return ht({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxTransfer")}async registerOffchain(){return E(async()=>{let[e,t]=await Promise.all([this.#t(),this.#a()]);return await be(t.ethSigner,t.starkSigner,e,this.authManager,this.imxApiClients)},"imxRegisterOffchain")}async isRegisteredOffchain(){return E(async()=>!!(await this.#t()).imx,"imxIsRegisteredOffchain")}isRegisteredOnchain(){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async createOrder(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return lt({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCreateOrder")}async cancelOrder(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return pt({request:e,user:t,starkSigner:r,ordersApi:this.immutableXClient.ordersApi,guardianClient:this.guardianClient})})(),"imxCancelOrder")}async createTrade(e){return E(()=>this.guardianClient.withDefaultConfirmationScreenTask(async()=>{let{user:t,starkSigner:r}=await this.#r();return mt({request:e,user:t,starkSigner:r,tradesApi:this.immutableXClient.tradesApi,guardianClient:this.guardianClient})})(),"imxCreateTrade")}async batchNftTransfer(e){return E(()=>this.guardianClient.withConfirmationScreenTask({width:480,height:784})(async()=>{let{user:t,starkSigner:r}=await this.#r();return ft({request:e,user:t,starkSigner:r,transfersApi:this.immutableXClient.transfersApi,guardianClient:this.guardianClient})})(),"imxBatchNftTransfer")}async exchangeTransfer(e){return E(async()=>{let{user:t,starkSigner:r}=await this.#r();return ot({request:e,user:t,starkSigner:r,exchangesApi:this.immutableXClient.exchangeApi})},"imxExchangeTransfer")}deposit(e){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}prepareWithdrawal(e){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}completeWithdrawal(e,t){throw new f("Operation not supported","OPERATION_NOT_SUPPORTED_ERROR")}async getAddress(){return E(async()=>{let e=await this.#t();if(!M(e))throw new f("User has not been registered with StarkEx","USER_NOT_REGISTERED_ERROR");return Promise.resolve(e.imx.ethAddress)},"imxGetAddress")}};var te=class{authManager;immutableXClient;magicAdapter;passportEventEmitter;imxApiClients;guardianClient;constructor({authManager:e,immutableXClient:t,magicAdapter:r,passportEventEmitter:i,imxApiClients:a,guardianClient:s}){this.authManager=e,this.immutableXClient=t,this.magicAdapter=r,this.passportEventEmitter=i,this.imxApiClients=a,this.guardianClient=s;}async getProvider(){let e=await this.authManager.getUserOrLogin();return this.createProviderInstance(e)}async getProviderSilent(){let e=await this.authManager.getUser();return e?this.createProviderInstance(e):null}async createProviderInstance(e){if(!e.idToken)throw new f("Failed to initialise","WALLET_CONNECTION_ERROR");return new ee({authManager:this.authManager,immutableXClient:this.immutableXClient,passportEventEmitter:this.passportEventEmitter,magicAdapter:this.magicAdapter,imxApiClients:this.imxApiClients,guardianClient:this.guardianClient})}};var vt=(n,e,t)=>{let r=e.map(i=>!n[i]&&i).filter(i=>i).join(", ");if(r!==""){let i=t?`${t} - ${r} cannot be null`:`${r} cannot be null`;throw new f(i,"INVALID_CONFIGURATION")}},re=class{authenticationDomain;passportDomain;imxPublicApiDomain;magicPublishableApiKey;magicProviderId;oidcConfiguration;baseConfig;zkEvmRpcUrl;relayerUrl;multiRollupConfig;crossSdkBridgeEnabled;forceScwDeployBeforeMessageSignature;popupOverlayOptions;extraQueryParams;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,extraQueryParams:o,...c}){if(vt(c,["clientId","redirectUri"]),this.oidcConfiguration=c,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},this.extraQueryParams=o||{},t)vt(t,["authenticationDomain","passportDomain","magicPublishableApiKey","magicProviderId","zkEvmRpcUrl","relayerUrl","imxPublicApiDomain","indexerMrBasePath","orderBookMrBasePath","passportMrBasePath"],"overrides"),this.authenticationDomain=t.authenticationDomain,this.passportDomain=t.passportDomain,this.imxPublicApiDomain=t.imxPublicApiDomain,this.magicPublishableApiKey=t.magicPublishableApiKey,this.magicProviderId=t.magicProviderId,this.zkEvmRpcUrl=t.zkEvmRpcUrl,this.relayerUrl=t.relayerUrl,this.multiRollupConfig={indexer:createConfig({basePath:t.indexerMrBasePath}),orderBook:createConfig({basePath:t.orderBookMrBasePath}),passport:createConfig({basePath:t.passportMrBasePath})};else switch(e.environment){case Environment.PRODUCTION:{this.authenticationDomain="https://auth.immutable.com",this.magicPublishableApiKey="pk_live_10F423798A540ED7",this.magicProviderId="fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=",this.passportDomain="https://passport.immutable.com",this.imxPublicApiDomain="https://api.immutable.com",this.zkEvmRpcUrl="https://rpc.immutable.com",this.relayerUrl="https://api.immutable.com/relayer-mr",this.multiRollupConfig=multiRollupConfig.getProduction();break}case Environment.SANDBOX:default:{this.authenticationDomain="https://auth.immutable.com",this.magicPublishableApiKey="pk_live_10F423798A540ED7",this.magicProviderId="fSMzaRQ4O7p4fttl7pCyGVtJS_G70P8SNsLXtPPGHo0=",this.passportDomain="https://passport.sandbox.immutable.com",this.imxPublicApiDomain="https://api.sandbox.immutable.com",this.zkEvmRpcUrl="https://rpc.testnet.immutable.com",this.relayerUrl="https://api.sandbox.immutable.com/relayer-mr",this.multiRollupConfig=multiRollupConfig.getSandbox();break}}}};var W="imx_passport_confirmation";var ne=({url:n,title:e,width:t,height:r})=>{let i=Math.max(0,Math.round(window.screenX+(window.outerWidth-t)/2)),a=Math.max(0,Math.round(window.screenY+(window.outerHeight-r)/2)),s=window.open(n,e,`
|
|
337
337
|
scrollbars=yes,
|
|
338
338
|
width=${t},
|
|
339
339
|
height=${r},
|
package/dist/node/index.cjs
CHANGED
|
@@ -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(zt());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=jt__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",ar="/authorize",sr=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",jt__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"));return a.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&a.searchParams.set("returnTo",t.logoutRedirectUri),{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()},mergeClaimsStrategy:{array:"merge"},automaticSilentRenew:!1,scope:t.scope,userStore:i,extraQueryParams:{...n.extraQueryParams,...t.audience?{audience:t.audience}:{}}}};function or(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 cr(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(sr(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 or(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 cr(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(ar,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 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 gr="mainnet",N=class{config;magicProviderProxyFactory;magicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.magicClient=new magicSdk.Magic(this.config.magicPublishableApiKey,{extensions:[new oidc.OpenIdExtension],network:gr}));}getMagicClient(){if(!this.magicClient)throw new Error("Cannot perform this action outside of the browser");return this.magicClient}async login(e){return f(async()=>h(async t=>{let r=performance.now(),i=this.getMagicClient();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=this.getMagicClient();e.user&&await e.user.logout();}};var qe=async n=>f(async()=>{let e=await xClient.generateLegacyStarkPrivateKey(n);return xClient.createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function $e({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 Ke="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===Ke?"1":t.sell.amount,o=t.buy.type===Ke?"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 ze({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 Ye="ERC721";async function Qe({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Ye?"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 et({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:Ye,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 Rr=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 Rr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function tt(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 tt(r),a}catch(a){if(q__default.default.isAxiosError(a)&&a.response?.status===409)return await tt(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 qe(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 Qe({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 ze({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 et({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 $e({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 at=(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;extraQueryParams;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,extraQueryParams:o,...c}){if(at(c,["clientId","redirectUri"]),this.oidcConfiguration=c,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},this.extraQueryParams=o||{},t)at(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 X=({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(zt());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=jt__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",ar="/authorize",sr=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",jt__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"));return a.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&a.searchParams.set("returnTo",t.logoutRedirectUri),{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,extraQueryParams:{...n.extraQueryParams,...t.audience?{audience:t.audience}:{}}}};function or(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 cr(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(sr(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 or(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 cr(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(ar,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 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 gr="mainnet",N=class{config;magicProviderProxyFactory;magicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.magicClient=new magicSdk.Magic(this.config.magicPublishableApiKey,{extensions:[new oidc.OpenIdExtension],network:gr}));}getMagicClient(){if(!this.magicClient)throw new Error("Cannot perform this action outside of the browser");return this.magicClient}async login(e){return f(async()=>h(async t=>{let r=performance.now(),i=this.getMagicClient();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=this.getMagicClient();e.user&&await e.user.logout();}};var qe=async n=>f(async()=>{let e=await xClient.generateLegacyStarkPrivateKey(n);return xClient.createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function $e({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 Ke="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===Ke?"1":t.sell.amount,o=t.buy.type===Ke?"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 ze({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 Ye="ERC721";async function Qe({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Ye?"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 et({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:Ye,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 Rr=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 Rr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function tt(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 tt(r),a}catch(a){if(q__default.default.isAxiosError(a)&&a.response?.status===409)return await tt(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 qe(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 Qe({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 ze({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 et({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 $e({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 at=(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;extraQueryParams;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,extraQueryParams:o,...c}){if(at(c,["clientId","redirectUri"]),this.oidcConfiguration=c,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},this.extraQueryParams=o||{},t)at(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 X=({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},
|
package/dist/node/index.js
CHANGED
|
@@ -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(zt());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=jt.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",ar="/authorize",sr=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",jt.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"));return a.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&a.searchParams.set("returnTo",t.logoutRedirectUri),{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()},mergeClaimsStrategy:{array:"merge"},automaticSilentRenew:!1,scope:t.scope,userStore:i,extraQueryParams:{...n.extraQueryParams,...t.audience?{audience:t.audience}:{}}}};function or(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 cr(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(sr(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 or(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 cr(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(ar,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 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 gr="mainnet",N=class{config;magicProviderProxyFactory;magicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.magicClient=new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:gr}));}getMagicClient(){if(!this.magicClient)throw new Error("Cannot perform this action outside of the browser");return this.magicClient}async login(e){return f(async()=>h(async t=>{let r=performance.now(),i=this.getMagicClient();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=this.getMagicClient();e.user&&await e.user.logout();}};var qe=async n=>f(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function $e({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 Ke="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===Ke?"1":t.sell.amount,o=t.buy.type===Ke?"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 ze({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 Ye="ERC721";async function Qe({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Ye?"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 et({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:Ye,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 Rr=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 Rr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function tt(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 tt(r),a}catch(a){if(q.isAxiosError(a)&&a.response?.status===409)return await tt(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 qe(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 Qe({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 ze({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 et({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 $e({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 at=(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;extraQueryParams;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,extraQueryParams:o,...c}){if(at(c,["clientId","redirectUri"]),this.oidcConfiguration=c,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},this.extraQueryParams=o||{},t)at(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 X=({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(zt());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=jt.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",ar="/authorize",sr=n=>{let{authenticationDomain:e,oidcConfiguration:t}=n,r;n.crossSdkBridgeEnabled?r=new W("ImmutableSDKPassport",jt.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"));return a.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&a.searchParams.set("returnTo",t.logoutRedirectUri),{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,extraQueryParams:{...n.extraQueryParams,...t.audience?{audience:t.audience}:{}}}};function or(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 cr(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(sr(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 or(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 cr(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(ar,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 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 gr="mainnet",N=class{config;magicProviderProxyFactory;magicClient;constructor(e,t){this.config=e,this.magicProviderProxyFactory=t,typeof window<"u"&&(this.magicClient=new Magic(this.config.magicPublishableApiKey,{extensions:[new OpenIdExtension],network:gr}));}getMagicClient(){if(!this.magicClient)throw new Error("Cannot perform this action outside of the browser");return this.magicClient}async login(e){return f(async()=>h(async t=>{let r=performance.now(),i=this.getMagicClient();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=this.getMagicClient();e.user&&await e.user.logout();}};var qe=async n=>f(async()=>{let e=await generateLegacyStarkPrivateKey(n);return createStarkSigner(e)},"WALLET_CONNECTION_ERROR");async function $e({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 Ke="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===Ke?"1":t.sell.amount,o=t.buy.type===Ke?"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 ze({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 Ye="ERC721";async function Qe({request:n,transfersApi:e,starkSigner:t,user:r,guardianClient:i}){return f(async()=>{let a=n.type===Ye?"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 et({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:Ye,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 Rr=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 Rr(r),I(n,{retries:t-1,finalErr:i,finallyFn:a}))}finally{t<=0&&a();}};async function tt(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 tt(r),a}catch(a){if(q.isAxiosError(a)&&a.response?.status===409)return await tt(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 qe(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 Qe({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 ze({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 et({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 $e({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 at=(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;extraQueryParams;constructor({baseConfig:e,overrides:t,crossSdkBridgeEnabled:r,jsonRpcReferrer:i,forceScwDeployBeforeMessageSignature:a,popupOverlayOptions:s,extraQueryParams:o,...c}){if(at(c,["clientId","redirectUri"]),this.oidcConfiguration=c,this.baseConfig=e,this.crossSdkBridgeEnabled=r||!1,this.forceScwDeployBeforeMessageSignature=a||!1,this.popupOverlayOptions=s||{disableGenericPopupOverlay:!1,disableBlockedPopupOverlay:!1},this.extraQueryParams=o||{},t)at(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 X=({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.2.3
|
|
4
|
+
"version": "2.2.3",
|
|
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.2.3
|
|
11
|
-
"@imtbl/generated-clients": "2.2.3
|
|
12
|
-
"@imtbl/metrics": "2.2.3
|
|
13
|
-
"@imtbl/toolkit": "2.2.3
|
|
14
|
-
"@imtbl/x-client": "2.2.3
|
|
15
|
-
"@imtbl/x-provider": "2.2.3
|
|
10
|
+
"@imtbl/config": "2.2.3",
|
|
11
|
+
"@imtbl/generated-clients": "2.2.3",
|
|
12
|
+
"@imtbl/metrics": "2.2.3",
|
|
13
|
+
"@imtbl/toolkit": "2.2.3",
|
|
14
|
+
"@imtbl/x-client": "2.2.3",
|
|
15
|
+
"@imtbl/x-provider": "2.2.3",
|
|
16
16
|
"@magic-ext/oidc": "12.0.5",
|
|
17
17
|
"@magic-sdk/provider": "^29.0.5",
|
|
18
18
|
"@metamask/detect-provider": "^2.0.0",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"jwt-decode": "^3.1.2",
|
|
23
23
|
"localforage": "^1.10.0",
|
|
24
24
|
"magic-sdk": "^29.0.5",
|
|
25
|
-
"oidc-client-ts": "
|
|
25
|
+
"oidc-client-ts": "2.4.0",
|
|
26
26
|
"uuid": "^8.3.2"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|