@imtbl/x-provider 2.1.10-alpha.0 → 2.1.10-alpha.2

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.
@@ -2,11 +2,11 @@ import { imx } from '@imtbl/generated-clients';
2
2
  import { convertToSignableToken, signRaw, signMessage } from '@imtbl/toolkit';
3
3
  import { ImxConfiguration, Contracts, EncodingApi, MintsApi, signRegisterEthAddress } from '@imtbl/x-client';
4
4
  import { isAxiosError } from 'axios';
5
- import * as M from 'enc-utils';
6
- import { parseUnits, BrowserProvider, toUtf8Bytes, toUtf8String, getBytes } from 'ethers';
7
- import Rt from '@metamask/detect-provider';
5
+ import * as N from 'enc-utils';
6
+ import { parseUnits, BrowserProvider, toUtf8Bytes } from 'ethers';
7
+ import ft from '@metamask/detect-provider';
8
8
  import { Environment } from '@imtbl/config';
9
9
 
10
- function Ge(t,e){return t===e.ethConfiguration.chainID}async function l(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!Ge(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function $({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),s=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),i=r.type==="ERC721"?"1":r.amount,o=await s.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:convertToSignableToken(r),amount:i,receiver:r.receiver}}),{signable_message:d,payload_hash:p}=o.data,u=await signRaw(d,t),E=await e.signMessage(p),f={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:E},c=await s.createTransferV1({createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:u});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function z({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),s=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),i=r.map(c=>({amount:"1",token:convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await s.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:i}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let p=await signRaw(d,t),u=[];for(let c of o.data.signable_responses){let w=await e.signMessage(c.payload_hash),T={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:w};u.push(T);}let E={sender_stark_key:o.data.sender_stark_key,requests:u};return {transfer_ids:(await s.createTransfer({createTransferRequestV2:E,xImxEthAddress:a,xImxEthSignature:p}))?.data.transfer_ids}}async function Z({signers:t,request:e,config:r}){await l(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),s=e.sell.type==="ERC721"?"1":e.sell.amount,i=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:i,token_buy:convertToSignableToken(e.buy),amount_sell:s,token_sell:convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:p,payload_hash:u}=d.data,E=await signRaw(p,t.ethSigner),f=await t.starkSigner.signMessage(u),c=d.data,w={createOrderRequest:{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,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:f,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:E};return {...(await a.createOrderV3(w)).data}}async function ee({signers:t,request:e,config:r}){let n=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:s,payload_hash:i}=a.data,o=await signRaw(s,t.ethSigner),d=await t.starkSigner.signMessage(i),p=await t.ethSigner.getAddress(),u=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:p,xImxEthSignature:o});return {order_id:u.data.order_id,status:u.data.status}}async function re(t,e){await l(t.ethSigner,e.immutableXConfig);let r=new imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),s=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:i,payload_hash:o}=s.data,d=await signRaw(i,t.ethSigner),p=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:p,stark_key:a}})).data}async function ne(t,e){try{let n=await new imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function _(t,e,r){await l(e,r.immutableXConfig);let n=r.immutableXConfig,a=Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(s){if(s.reason==="USER_UNREGISTERED")return !1;throw s}}var h=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function ae(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await l(r,t.config);let a=t.type==="ERC721"?"1":t.amount,s=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:convertToSignableToken(t),amount:a}}),{signable_message:i,payload_hash:o}=s.data,d=await n.signMessage(o),{ethAddress:p,ethSignature:u}=await signMessage(i,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:h(s.data.sender_stark_key),sender_vault_id:h(s.data.sender_vault_id),receiver_stark_key:h(s.data.receiver_stark_key),receiver_vault_id:h(s.data.receiver_vault_id),amount:a,asset_id:h(s.data.asset_id),expiration_timestamp:h(s.data.expiration_timestamp),nonce:h(s.data.nonce),stark_signature:d},xImxEthAddress:p,xImxEthSignature:u})).data}async function C(t,e,r,n){return (await new imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function x(t,e,r,n){return Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function Je(t,e,r){let n=await C("asset","ETH",r);return await x(t,e,n.asset_id,r)}async function Ze(t,e,r,n){let a=await C("asset","ERC20",n,{token_address:r});return await x(t,e,a.asset_id,n)}async function et(t,e,r,n,a,s){try{let i=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await C("mintable-asset","ERC721",s,{id:r.tokenId,token_address:r.tokenAddress,...i.data.blueprint&&{blueprint:i.data.blueprint}});return await x(t,e,o.asset_id,s)}catch(i){if(i.response?.status===404){let o=await C("asset","ERC721",s,{token_id:r.tokenId,token_address:r.tokenAddress});return await x(t,e,o.asset_id,s)}throw i}}async function I(t,e,r,n,a,s){switch(r.type){case"ETH":return await Je(t,e,s);case"ERC20":return await Ze(t,e,r.tokenAddress,s);case"ERC721":return await et(t,e,r,n,a,s);default:throw new Error("Unsupported token type")}}async function O(t,e,r,n,a){let s=new EncodingApi(a.apiConfiguration),i=new MintsApi(a.apiConfiguration),o=await I(t,e,n,s,i,a),d=await I(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}async function ie(t,e,r,n,a,s){let i=new EncodingApi(a.apiConfiguration),o=await I(t,e,n,i,s,a),d=await I(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}var oe="ERC20";async function q(t,e,r,n,a){let s=await t.getAddress(),i=await signRegisterEthAddress(e,s,r),d=await Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(s,r,i,n);return t.sendTransaction(d)}async function L(t,e,r,n){let s=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(s)}async function B(t,e,r,n){let s=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(s)}async function de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await l(t,a.immutableXConfig);let{v3Balance:s,v4Balance:i}=await O(t,r,await t.getAddress(),{type:oe,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await C("asset",oe,a.immutableXConfig,{token_address:n.tokenAddress});if(s>0)return await _(r,t,a)?L(t,r,o.asset_type,a.immutableXConfig):q(t,e,r,o.asset_type,a.immutableXConfig);if(i>0)return B(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var A="ERC721";function ge(t){let{id:e}=t.data,r=t.data.blueprint||"";return M.sanitizeHex(M.utf8ToHex(`{${e}}:{${r}}`))}async function rt(t,e,r,n){let a=await t.getAddress(),s=await e.getAddress(),i=await C("asset",A,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await signRegisterEthAddress(e,a,s),p=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,s,o,i.asset_type,r.tokenId);return t.sendTransaction(p)}async function nt(t,e,r,n){let a=await t.getAddress(),s=await e.getAddress(),i=await C("mintable-asset",A,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=ge(r),d=await signRegisterEthAddress(e,a,s),u=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,s,d,i.asset_type,o);return t.sendTransaction(u)}async function at(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(s=>nt(e,r,{type:A,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:s.data.blueprint}},a)).catch(s=>{if(s.response?.status===404)return rt(e,r,n,a);throw s})}async function st(t,e,r,n){let a=await C("mintable-asset",A,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),s=ge(r),o=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,s);return t.sendTransaction(o)}async function it(t,e,r,n){let a=await C("asset",A,n,{token_id:r.tokenId,token_address:r.tokenAddress}),i=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(i)}async function ce(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(s=>st(e,r,{type:A,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:s.data.blueprint}},a)).catch(s=>{if(s.response?.status===404)return it(e,r,n,a);throw s})}async function ue({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},s){await l(t,a.immutableXConfig);let i=await t.getAddress(),{v3Balance:o,v4Balance:d}=await ie(t,r,i,{type:A,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,s);if(o>0)return await _(r,t,a)?ce(s,t,r,n,a.immutableXConfig):at(s,t,e,n,a.immutableXConfig);if(d>0)return ce(s,t,i,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var pe="ETH";async function le({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await l(t,n.immutableXConfig);let{v3Balance:a,v4Balance:s}=await O(t,r,await t.getAddress(),{type:pe},n.immutableXConfig),i=await C("asset",pe,n.immutableXConfig);if(a>0)return await _(r,t,n)?L(t,r,i.asset_type,n.immutableXConfig):q(t,e,r,i.asset_type,n.immutableXConfig);if(s>0)return B(t,r,i.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function Ce({signers:t,withdrawal:e,config:r}){let n=new imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return ae({signers:t,config:r.immutableXConfig,...e},n)}async function Ee({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let s=new imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return le({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return ue({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},s)}}async function Re({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),s=new imx.TradesApi(n.immutableXConfig.apiConfiguration),i=await s.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=i.data,p=await signRaw(o,t),u=await e.signMessage(d);return (await s.createTradeV3({createTradeRequest:{amount_buy:i.data.amount_buy,amount_sell:i.data.amount_sell,asset_id_buy:i.data.asset_id_buy,asset_id_sell:i.data.asset_id_sell,expiration_timestamp:i.data.expiration_timestamp,fee_info:i.data.fee_info,fees:r.fees,include_fees:!0,nonce:i.data.nonce,order_id:r.order_id,stark_key:i.data.stark_key,vault_id_buy:i.data.vault_id_buy,vault_id_sell:i.data.vault_id_sell,stark_signature:u},xImxEthAddress:a,xImxEthSignature:p})).data}async function gt(t,e,r,n,a,s){let o=await Contracts.CoreV4.connect(s.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function _e({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},s=parseUnits(e.amount,"wei"),i=r.immutableXConfig,o=new imx.DepositsApi(i.apiConfiguration),d=new imx.EncodingApi(i.apiConfiguration),p={user:n,token:{type:e.type,data:a},amount:s.toString()},u=await o.getSignableDeposit({getSignableDepositRequest:p}),f=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=u.data.stark_key,w=u.data.vault_id;return gt(t,s,f,c,w,i)}async function pt(t,e,r,n,a,s){let o=await Contracts.CoreV4.connect(s.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function he({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,s=await t.getAddress(),i=new imx.TokensApi(n),o=new imx.DepositsApi(n),d=new imx.EncodingApi(n),p=await i.getToken({address:e.tokenAddress}),E={decimals:parseInt(p.data.decimals),token_address:e.tokenAddress},f=parseUnits(e.amount,0),w=await Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,f);await t.sendTransaction(w);let T={user:s,token:{type:e.type,data:E},amount:f.toString()},b=await o.getSignableDeposit({getSignableDepositRequest:T}),qe=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,Le=b.data.stark_key,Be=b.data.vault_id,Ve=BigInt(b.data.amount);return pt(t,Ve,qe,Le,Be,a)}async function lt(t,e,r,n,a,s){let o=await Contracts.CoreV4.connect(s.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function ye({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,s=new imx.DepositsApi(a.apiConfiguration),i=new imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},p={user:n,token:{type:e.type,data:o},amount:"1".toString()},u=await s.getSignableDeposit({getSignableDepositRequest:p}),f=(await i.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=u.data.stark_key,w=u.data.vault_id,T=Contracts.IERC721.connect(e.tokenAddress,t),b=a.ethConfiguration.coreContractAddress;return await T.isApprovedForAll(n,b)||await T.setApprovalForAll(b,!0),lt(t,e.tokenId,f,c,w,a)}async function Se({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return _e({signers:t,deposit:e,config:r});case"ERC20":return he({signers:t,deposit:e,config:r});case"ERC721":return ye({signers:t,deposit:e,config:r})}}async function ke({signers:t,request:e,config:r}){await l(t.ethSigner,r.immutableXConfig);let n=new imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),s=e.amount,i=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:convertToSignableToken(e),amount:s,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=i.data,p=await signRaw(o,t.ethSigner),u=await t.starkSigner.signMessage(d),E={sender_stark_key:i.data.sender_stark_key,sender_vault_id:i.data.sender_vault_id,receiver_stark_key:i.data.receiver_stark_key,receiver_vault_id:i.data.receiver_vault_id,asset_id:i.data.asset_id,amount:i.data.amount,nonce:i.data.nonce,expiration_timestamp:i.data.expiration_timestamp,stark_signature:u},f=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:E,xImxEthAddress:a,xImxEthSignature:p});return {sent_signature:f?.data.sent_signature,status:f?.data.status?.toString(),time:f?.data.time,transfer_id:f?.data.transfer_id}}var P=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return ne(e,this.config)}registerOffchain(){return re(this.signers,this.config)}batchNftTransfer(e){return z({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return ee({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return Ee({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return Z({signers:this.signers,request:e,config:this.config})}createTrade(e){return Re({signers:this.signers,request:e,config:this.config})}deposit(e){return Se({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return ke({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return _(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return Ce({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return $({signers:this.signers,request:e,config:this.config})}};var Pe={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ve(t){return !!t?.request}async function xe(t,e){await t.request({method:Pe.CONNECT}),e&&await t.request({method:Pe.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var _t={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function Ie({chainID:t}){let e=await Rt();if(!ve(e))throw new Error(_t.PROVIDER_NOT_FOUND);return await xe(e,t),new BrowserProvider(e)}var R="message";function y(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function S(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var W=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return console.log("signMessage.rawMessage",{rawMessage:e}),console.log("signMessage.toUtf8Bytes.toString()",{toUtf8Bytes:toUtf8Bytes(e).toString()}),new Promise((r,n)=>{let a=s=>{S(this.iframe,s,"SIGN_MESSAGE_RESPONSE",i=>{window.removeEventListener(R,a),i.success||n(new Error(i.error?.message)),r(i.data.signedMessage);});};window.addEventListener(R,a),y(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{S(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",s=>{window.removeEventListener(R,n),s.success||r(new Error(s.error?.message)),e(s.data.yCoordinate);});};window.addEventListener(R,n),y(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var Ne="imx-wallet-app",bt={[Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[Environment.PRODUCTION]:"https://wallets.immutable.com"},yt="display: none;";function St(){return document.querySelector(`iframe#${Ne}`)}async function kt(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",Ne),r.setAttribute("src",bt[t]),r.setAttribute("style",yt),document.body.appendChild(r),r.onload=()=>e(r);})}async function Me(t){let e=St();return e||await kt(t)}var v="Only sign this request if you\u2019ve initiated an action with Immutable X.",vt="The L2 IMX Wallet connection has failed";async function Xe(t,e){let r=await t.getSigner(),n=await r.getAddress();console.log("DEFAULT_CONNECTION_MESSAGE",{message:v}),console.log("toUtf8Bytes.toString()",{toUtf8Bytes:toUtf8Bytes(v).toString()}),console.log("toUtf8String 1",{toUtf8String:toUtf8String(toUtf8Bytes(v))}),console.log("toUtf8String 2",{toUtf8String:toUtf8String(getBytes(toUtf8Bytes(v)))});let a=await r.signMessage(toUtf8Bytes(v)),s=await Me(e);return new Promise((i,o)=>{let d=p=>{S(s,p,"CONNECT_WALLET_RESPONSE",u=>{window.removeEventListener(R,d),u.success||o(new Error(vt)),i(new W(u.data.starkPublicKey,s));});};window.addEventListener(R,d),y(s,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function De(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=s=>{S(e,s,"DISCONNECT_WALLET_RESPONSE",i=>{window.removeEventListener(R,a),!i.success&&i.error&&n(i.error),e.remove(),r();});};window.addEventListener(R,a),y(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var k=class extends Error{type;constructor(e,r){super(e),this.type=r;}},D=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new k(n,e.type)}};var G=class t extends P{static imxSigner;static async connect(e){return await D(async()=>{let r=await Ie({chainID:e.immutableXConfig.ethConfiguration.chainID});this.imxSigner=await Xe(r,e.baseConfig.environment);let n=await r.getSigner();return console.log("metaMaskProvider.getSigner().getAddress()",await n.getAddress()),console.log("imxSigner.getAddress()",this.imxSigner.getAddress()),new t(e,n,this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new k("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return D(async()=>{await De(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new k("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return D(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var F=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
10
+ function Ue(t,e){return t===e.ethConfiguration.chainID}async function l(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!Ue(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function Y({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.type==="ERC721"?"1":r.amount,o=await i.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:convertToSignableToken(r),amount:s,receiver:r.receiver}}),{signable_message:d,payload_hash:p}=o.data,g=await signRaw(d,t),E=await e.signMessage(p),f={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:E},c=await i.createTransferV1({createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:g});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function Q({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.map(c=>({amount:"1",token:convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await i.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let p=await signRaw(d,t),g=[];for(let c of o.data.signable_responses){let w=await e.signMessage(c.payload_hash),T={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:w};g.push(T);}let E={sender_stark_key:o.data.sender_stark_key,requests:g};return {transfer_ids:(await i.createTransfer({createTransferRequestV2:E,xImxEthAddress:a,xImxEthSignature:p}))?.data.transfer_ids}}async function j({signers:t,request:e,config:r}){await l(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),i=e.sell.type==="ERC721"?"1":e.sell.amount,s=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:s,token_buy:convertToSignableToken(e.buy),amount_sell:i,token_sell:convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:p,payload_hash:g}=d.data,E=await signRaw(p,t.ethSigner),f=await t.starkSigner.signMessage(g),c=d.data,w={createOrderRequest:{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,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:f,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:E};return {...(await a.createOrderV3(w)).data}}async function J({signers:t,request:e,config:r}){let n=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:i,payload_hash:s}=a.data,o=await signRaw(i,t.ethSigner),d=await t.starkSigner.signMessage(s),p=await t.ethSigner.getAddress(),g=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:p,xImxEthSignature:o});return {order_id:g.data.order_id,status:g.data.status}}async function ee(t,e){await l(t.ethSigner,e.immutableXConfig);let r=new imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),i=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:s,payload_hash:o}=i.data,d=await signRaw(s,t.ethSigner),p=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:p,stark_key:a}})).data}async function te(t,e){try{let n=await new imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function _(t,e,r){await l(e,r.immutableXConfig);let n=r.immutableXConfig,a=Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(i){if(i.reason==="USER_UNREGISTERED")return !1;throw i}}var h=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function re(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await l(r,t.config);let a=t.type==="ERC721"?"1":t.amount,i=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:convertToSignableToken(t),amount:a}}),{signable_message:s,payload_hash:o}=i.data,d=await n.signMessage(o),{ethAddress:p,ethSignature:g}=await signMessage(s,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:h(i.data.sender_stark_key),sender_vault_id:h(i.data.sender_vault_id),receiver_stark_key:h(i.data.receiver_stark_key),receiver_vault_id:h(i.data.receiver_vault_id),amount:a,asset_id:h(i.data.asset_id),expiration_timestamp:h(i.data.expiration_timestamp),nonce:h(i.data.nonce),stark_signature:d},xImxEthAddress:p,xImxEthSignature:g})).data}async function C(t,e,r,n){return (await new imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function v(t,e,r,n){return Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function ze(t,e,r){let n=await C("asset","ETH",r);return await v(t,e,n.asset_id,r)}async function Ke(t,e,r,n){let a=await C("asset","ERC20",n,{token_address:r});return await v(t,e,a.asset_id,n)}async function je(t,e,r,n,a,i){try{let s=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await C("mintable-asset","ERC721",i,{id:r.tokenId,token_address:r.tokenAddress,...s.data.blueprint&&{blueprint:s.data.blueprint}});return await v(t,e,o.asset_id,i)}catch(s){if(s.response?.status===404){let o=await C("asset","ERC721",i,{token_id:r.tokenId,token_address:r.tokenAddress});return await v(t,e,o.asset_id,i)}throw s}}async function x(t,e,r,n,a,i){switch(r.type){case"ETH":return await ze(t,e,i);case"ERC20":return await Ke(t,e,r.tokenAddress,i);case"ERC721":return await je(t,e,r,n,a,i);default:throw new Error("Unsupported token type")}}async function I(t,e,r,n,a){let i=new EncodingApi(a.apiConfiguration),s=new MintsApi(a.apiConfiguration),o=await x(t,e,n,i,s,a),d=await x(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}async function ae(t,e,r,n,a,i){let s=new EncodingApi(a.apiConfiguration),o=await x(t,e,n,s,i,a),d=await x(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}var ie="ERC20";async function D(t,e,r,n,a){let i=await t.getAddress(),s=await signRegisterEthAddress(e,i,r),d=await Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(i,r,s,n);return t.sendTransaction(d)}async function q(t,e,r,n){let i=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(i)}async function L(t,e,r,n){let i=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(i)}async function se({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await l(t,a.immutableXConfig);let{v3Balance:i,v4Balance:s}=await I(t,r,await t.getAddress(),{type:ie,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await C("asset",ie,a.immutableXConfig,{token_address:n.tokenAddress});if(i>0)return await _(r,t,a)?q(t,r,o.asset_type,a.immutableXConfig):D(t,e,r,o.asset_type,a.immutableXConfig);if(s>0)return L(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var A="ERC721";function ce(t){let{id:e}=t.data,r=t.data.blueprint||"";return N.sanitizeHex(N.utf8ToHex(`{${e}}:{${r}}`))}async function Ze(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await C("asset",A,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await signRegisterEthAddress(e,a,i),p=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,i,o,s.asset_type,r.tokenId);return t.sendTransaction(p)}async function et(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await C("mintable-asset",A,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=ce(r),d=await signRegisterEthAddress(e,a,i),g=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,i,d,s.asset_type,o);return t.sendTransaction(g)}async function tt(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>et(e,r,{type:A,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return Ze(e,r,n,a);throw i})}async function rt(t,e,r,n){let a=await C("mintable-asset",A,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),i=ce(r),o=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,i);return t.sendTransaction(o)}async function nt(t,e,r,n){let a=await C("asset",A,n,{token_id:r.tokenId,token_address:r.tokenAddress}),s=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(s)}async function oe(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>rt(e,r,{type:A,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return nt(e,r,n,a);throw i})}async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i){await l(t,a.immutableXConfig);let s=await t.getAddress(),{v3Balance:o,v4Balance:d}=await ae(t,r,s,{type:A,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,i);if(o>0)return await _(r,t,a)?oe(i,t,r,n,a.immutableXConfig):tt(i,t,e,n,a.immutableXConfig);if(d>0)return oe(i,t,s,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ue="ETH";async function ge({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await l(t,n.immutableXConfig);let{v3Balance:a,v4Balance:i}=await I(t,r,await t.getAddress(),{type:ue},n.immutableXConfig),s=await C("asset",ue,n.immutableXConfig);if(a>0)return await _(r,t,n)?q(t,r,s.asset_type,n.immutableXConfig):D(t,e,r,s.asset_type,n.immutableXConfig);if(i>0)return L(t,r,s.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function le({signers:t,withdrawal:e,config:r}){let n=new imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return re({signers:t,config:r.immutableXConfig,...e},n)}async function fe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let i=new imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return ge({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return se({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i)}}async function Ce({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await l(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TradesApi(n.immutableXConfig.apiConfiguration),s=await i.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=s.data,p=await signRaw(o,t),g=await e.signMessage(d);return (await i.createTradeV3({createTradeRequest:{amount_buy:s.data.amount_buy,amount_sell:s.data.amount_sell,asset_id_buy:s.data.asset_id_buy,asset_id_sell:s.data.asset_id_sell,expiration_timestamp:s.data.expiration_timestamp,fee_info:s.data.fee_info,fees:r.fees,include_fees:!0,nonce:s.data.nonce,order_id:r.order_id,stark_key:s.data.stark_key,vault_id_buy:s.data.vault_id_buy,vault_id_sell:s.data.vault_id_sell,stark_signature:g},xImxEthAddress:a,xImxEthSignature:p})).data}async function dt(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},i=parseUnits(e.amount,"wei"),s=r.immutableXConfig,o=new imx.DepositsApi(s.apiConfiguration),d=new imx.EncodingApi(s.apiConfiguration),p={user:n,token:{type:e.type,data:a},amount:i.toString()},g=await o.getSignableDeposit({getSignableDepositRequest:p}),f=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=g.data.stark_key,w=g.data.vault_id;return dt(t,i,f,c,w,s)}async function mt(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function _e({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,i=await t.getAddress(),s=new imx.TokensApi(n),o=new imx.DepositsApi(n),d=new imx.EncodingApi(n),p=await s.getToken({address:e.tokenAddress}),E={decimals:parseInt(p.data.decimals),token_address:e.tokenAddress},f=parseUnits(e.amount,0),w=await Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,f);await t.sendTransaction(w);let T={user:i,token:{type:e.type,data:E},amount:f.toString()},b=await o.getSignableDeposit({getSignableDepositRequest:T}),Xe=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,De=b.data.stark_key,qe=b.data.vault_id,Le=BigInt(b.data.amount);return mt(t,Le,Xe,De,qe,a)}async function ut(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Ae({signers:{ethSigner:t},deposit:e,config:r}){await l(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,i=new imx.DepositsApi(a.apiConfiguration),s=new imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},p={user:n,token:{type:e.type,data:o},amount:"1".toString()},g=await i.getSignableDeposit({getSignableDepositRequest:p}),f=(await s.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=g.data.stark_key,w=g.data.vault_id,T=Contracts.IERC721.connect(e.tokenAddress,t),b=a.ethConfiguration.coreContractAddress;return await T.isApprovedForAll(n,b)||await T.setApprovalForAll(b,!0),ut(t,e.tokenId,f,c,w,a)}async function be({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Re({signers:t,deposit:e,config:r});case"ERC20":return _e({signers:t,deposit:e,config:r});case"ERC721":return Ae({signers:t,deposit:e,config:r})}}async function ye({signers:t,request:e,config:r}){await l(t.ethSigner,r.immutableXConfig);let n=new imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),i=e.amount,s=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:convertToSignableToken(e),amount:i,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=s.data,p=await signRaw(o,t.ethSigner),g=await t.starkSigner.signMessage(d),E={sender_stark_key:s.data.sender_stark_key,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:g},f=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:E,xImxEthAddress:a,xImxEthSignature:p});return {sent_signature:f?.data.sent_signature,status:f?.data.status?.toString(),time:f?.data.time,transfer_id:f?.data.transfer_id}}var P=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return te(e,this.config)}registerOffchain(){return ee(this.signers,this.config)}batchNftTransfer(e){return Q({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return J({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return fe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return j({signers:this.signers,request:e,config:this.config})}createTrade(e){return Ce({signers:this.signers,request:e,config:this.config})}deposit(e){return be({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return ye({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return _(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return le({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return Y({signers:this.signers,request:e,config:this.config})}};var Se={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ke(t){return !!t?.request}async function Pe(t,e){await t.request({method:Se.CONNECT}),e&&await t.request({method:Se.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var Et={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ve({chainID:t}){let e=await ft();if(!ke(e))throw new Error(Et.PROVIDER_NOT_FOUND);return await Pe(e,t),new BrowserProvider(e)}var R="message";function y(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function S(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var M=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return new Promise((r,n)=>{let a=i=>{S(this.iframe,i,"SIGN_MESSAGE_RESPONSE",s=>{window.removeEventListener(R,a),s.success||n(new Error(s.error?.message)),r(s.data.signedMessage);});};window.addEventListener(R,a),y(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{S(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",i=>{window.removeEventListener(R,n),i.success||r(new Error(i.error?.message)),e(i.data.yCoordinate);});};window.addEventListener(R,n),y(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var Ie="imx-wallet-app",_t={[Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[Environment.PRODUCTION]:"https://wallets.immutable.com"},Tt="display: none;";function ht(){return document.querySelector(`iframe#${Ie}`)}async function At(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",Ie),r.setAttribute("src",_t[t]),r.setAttribute("style",Tt),document.body.appendChild(r),r.onload=()=>e(r);})}async function Oe(t){let e=ht();return e||await At(t)}var yt="Only sign this request if you\u2019ve initiated an action with Immutable X.",St="The L2 IMX Wallet connection has failed";async function Ne(t,e){let r=await t.getSigner(),n=await r.getAddress(),a=await r.signMessage(toUtf8Bytes(yt)),i=await Oe(e);return new Promise((s,o)=>{let d=p=>{S(i,p,"CONNECT_WALLET_RESPONSE",g=>{window.removeEventListener(R,d),g.success||o(new Error(St)),s(new M(g.data.starkPublicKey,i));});};window.addEventListener(R,d),y(i,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function Me(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=i=>{S(e,i,"DISCONNECT_WALLET_RESPONSE",s=>{window.removeEventListener(R,a),!s.success&&s.error&&n(s.error),e.remove(),r();});};window.addEventListener(R,a),y(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var k=class extends Error{type;constructor(e,r){super(e),this.type=r;}},W=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new k(n,e.type)}};var V=class t extends P{static imxSigner;static async connect(e){return await W(async()=>{let r=await ve({chainID:e.immutableXConfig.ethConfiguration.chainID});return this.imxSigner=await Ne(r,e.baseConfig.environment),new t(e,await r.getSigner(),this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new k("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>{await Me(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new k("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var B=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
11
11
 
12
- export { P as GenericIMXProvider, G as MetaMaskIMXProvider, F as ProviderConfiguration };
12
+ export { P as GenericIMXProvider, V as MetaMaskIMXProvider, B as ProviderConfiguration };
@@ -4,9 +4,9 @@ var generatedClients = require('@imtbl/generated-clients');
4
4
  var toolkit = require('@imtbl/toolkit');
5
5
  var xClient = require('@imtbl/x-client');
6
6
  var axios = require('axios');
7
- var O = require('enc-utils');
7
+ var I = require('enc-utils');
8
8
  var ethers = require('ethers');
9
- var Ct = require('@metamask/detect-provider');
9
+ var pt = require('@metamask/detect-provider');
10
10
  var config = require('@imtbl/config');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -29,11 +29,11 @@ function _interopNamespace(e) {
29
29
  return Object.freeze(n);
30
30
  }
31
31
 
32
- var O__namespace = /*#__PURE__*/_interopNamespace(O);
33
- var Ct__default = /*#__PURE__*/_interopDefault(Ct);
32
+ var I__namespace = /*#__PURE__*/_interopNamespace(I);
33
+ var pt__default = /*#__PURE__*/_interopDefault(pt);
34
34
 
35
- function Be(t,e){return t===e.ethConfiguration.chainID}async function u(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!Be(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function Y({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await u(t,n.immutableXConfig);let a=await t.getAddress(),s=new generatedClients.imx.TransfersApi(n.immutableXConfig.apiConfiguration),i=r.type==="ERC721"?"1":r.amount,o=await s.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:toolkit.convertToSignableToken(r),amount:i,receiver:r.receiver}}),{signable_message:d,payload_hash:g}=o.data,m=await toolkit.signRaw(d,t),f=await e.signMessage(g),p={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:f},c=await s.createTransferV1({createTransferRequest:p,xImxEthAddress:a,xImxEthSignature:m});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function Q({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await u(t,n.immutableXConfig);let a=await t.getAddress(),s=new generatedClients.imx.TransfersApi(n.immutableXConfig.apiConfiguration),i=r.map(c=>({amount:"1",token:toolkit.convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await s.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:i}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let g=await toolkit.signRaw(d,t),m=[];for(let c of o.data.signable_responses){let E=await e.signMessage(c.payload_hash),w={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:E};m.push(w);}let f={sender_stark_key:o.data.sender_stark_key,requests:m};return {transfer_ids:(await s.createTransfer({createTransferRequestV2:f,xImxEthAddress:a,xImxEthSignature:g}))?.data.transfer_ids}}async function j({signers:t,request:e,config:r}){await u(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new generatedClients.imx.OrdersApi(r.immutableXConfig.apiConfiguration),s=e.sell.type==="ERC721"?"1":e.sell.amount,i=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:i,token_buy:toolkit.convertToSignableToken(e.buy),amount_sell:s,token_sell:toolkit.convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:g,payload_hash:m}=d.data,f=await toolkit.signRaw(g,t.ethSigner),p=await t.starkSigner.signMessage(m),c=d.data,E={createOrderRequest:{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,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:p,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:f};return {...(await a.createOrderV3(E)).data}}async function J({signers:t,request:e,config:r}){let n=new generatedClients.imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:s,payload_hash:i}=a.data,o=await toolkit.signRaw(s,t.ethSigner),d=await t.starkSigner.signMessage(i),g=await t.ethSigner.getAddress(),m=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:g,xImxEthSignature:o});return {order_id:m.data.order_id,status:m.data.status}}async function ee(t,e){await u(t.ethSigner,e.immutableXConfig);let r=new generatedClients.imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),s=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:i,payload_hash:o}=s.data,d=await toolkit.signRaw(i,t.ethSigner),g=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:g,stark_key:a}})).data}async function te(t,e){try{let n=await new generatedClients.imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(axios.isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function R(t,e,r){await u(e,r.immutableXConfig);let n=r.immutableXConfig,a=xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(s){if(s.reason==="USER_UNREGISTERED")return !1;throw s}}var _=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function re(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await u(r,t.config);let a=t.type==="ERC721"?"1":t.amount,s=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:toolkit.convertToSignableToken(t),amount:a}}),{signable_message:i,payload_hash:o}=s.data,d=await n.signMessage(o),{ethAddress:g,ethSignature:m}=await toolkit.signMessage(i,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:_(s.data.sender_stark_key),sender_vault_id:_(s.data.sender_vault_id),receiver_stark_key:_(s.data.receiver_stark_key),receiver_vault_id:_(s.data.receiver_vault_id),amount:a,asset_id:_(s.data.asset_id),expiration_timestamp:_(s.data.expiration_timestamp),nonce:_(s.data.nonce),stark_signature:d},xImxEthAddress:g,xImxEthSignature:m})).data}async function l(t,e,r,n){return (await new generatedClients.imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function P(t,e,r,n){return xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function Ke(t,e,r){let n=await l("asset","ETH",r);return await P(t,e,n.asset_id,r)}async function je(t,e,r,n){let a=await l("asset","ERC20",n,{token_address:r});return await P(t,e,a.asset_id,n)}async function Je(t,e,r,n,a,s){try{let i=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await l("mintable-asset","ERC721",s,{id:r.tokenId,token_address:r.tokenAddress,...i.data.blueprint&&{blueprint:i.data.blueprint}});return await P(t,e,o.asset_id,s)}catch(i){if(i.response?.status===404){let o=await l("asset","ERC721",s,{token_id:r.tokenId,token_address:r.tokenAddress});return await P(t,e,o.asset_id,s)}throw i}}async function v(t,e,r,n,a,s){switch(r.type){case"ETH":return await Ke(t,e,s);case"ERC20":return await je(t,e,r.tokenAddress,s);case"ERC721":return await Je(t,e,r,n,a,s);default:throw new Error("Unsupported token type")}}async function x(t,e,r,n,a){let s=new xClient.EncodingApi(a.apiConfiguration),i=new xClient.MintsApi(a.apiConfiguration),o=await v(t,e,n,s,i,a),d=await v(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}async function ae(t,e,r,n,a,s){let i=new xClient.EncodingApi(a.apiConfiguration),o=await v(t,e,n,i,s,a),d=await v(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}var se="ERC20";async function D(t,e,r,n,a){let s=await t.getAddress(),i=await xClient.signRegisterEthAddress(e,s,r),d=await xClient.Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(s,r,i,n);return t.sendTransaction(d)}async function U(t,e,r,n){let s=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(s)}async function q(t,e,r,n){let s=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(s)}async function ie({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await u(t,a.immutableXConfig);let{v3Balance:s,v4Balance:i}=await x(t,r,await t.getAddress(),{type:se,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await l("asset",se,a.immutableXConfig,{token_address:n.tokenAddress});if(s>0)return await R(r,t,a)?U(t,r,o.asset_type,a.immutableXConfig):D(t,e,r,o.asset_type,a.immutableXConfig);if(i>0)return q(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var T="ERC721";function ce(t){let{id:e}=t.data,r=t.data.blueprint||"";return O__namespace.sanitizeHex(O__namespace.utf8ToHex(`{${e}}:{${r}}`))}async function et(t,e,r,n){let a=await t.getAddress(),s=await e.getAddress(),i=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await xClient.signRegisterEthAddress(e,a,s),g=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,s,o,i.asset_type,r.tokenId);return t.sendTransaction(g)}async function tt(t,e,r,n){let a=await t.getAddress(),s=await e.getAddress(),i=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=ce(r),d=await xClient.signRegisterEthAddress(e,a,s),m=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,s,d,i.asset_type,o);return t.sendTransaction(m)}async function rt(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(s=>tt(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:s.data.blueprint}},a)).catch(s=>{if(s.response?.status===404)return et(e,r,n,a);throw s})}async function nt(t,e,r,n){let a=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),s=ce(r),o=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,s);return t.sendTransaction(o)}async function at(t,e,r,n){let a=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),i=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(i)}async function oe(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(s=>nt(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:s.data.blueprint}},a)).catch(s=>{if(s.response?.status===404)return at(e,r,n,a);throw s})}async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},s){await u(t,a.immutableXConfig);let i=await t.getAddress(),{v3Balance:o,v4Balance:d}=await ae(t,r,i,{type:T,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,s);if(o>0)return await R(r,t,a)?oe(s,t,r,n,a.immutableXConfig):rt(s,t,e,n,a.immutableXConfig);if(d>0)return oe(s,t,i,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ge="ETH";async function ue({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await u(t,n.immutableXConfig);let{v3Balance:a,v4Balance:s}=await x(t,r,await t.getAddress(),{type:ge},n.immutableXConfig),i=await l("asset",ge,n.immutableXConfig);if(a>0)return await R(r,t,n)?U(t,r,i.asset_type,n.immutableXConfig):D(t,e,r,i.asset_type,n.immutableXConfig);if(s>0)return q(t,r,i.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function le({signers:t,withdrawal:e,config:r}){let n=new generatedClients.imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return re({signers:t,config:r.immutableXConfig,...e},n)}async function fe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let s=new generatedClients.imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return ue({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return ie({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},s)}}async function Ce({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await u(t,n.immutableXConfig);let a=await t.getAddress(),s=new generatedClients.imx.TradesApi(n.immutableXConfig.apiConfiguration),i=await s.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=i.data,g=await toolkit.signRaw(o,t),m=await e.signMessage(d);return (await s.createTradeV3({createTradeRequest:{amount_buy:i.data.amount_buy,amount_sell:i.data.amount_sell,asset_id_buy:i.data.asset_id_buy,asset_id_sell:i.data.asset_id_sell,expiration_timestamp:i.data.expiration_timestamp,fee_info:i.data.fee_info,fees:r.fees,include_fees:!0,nonce:i.data.nonce,order_id:r.order_id,stark_key:i.data.stark_key,vault_id_buy:i.data.vault_id_buy,vault_id_sell:i.data.vault_id_sell,stark_signature:m},xImxEthAddress:a,xImxEthSignature:g})).data}async function ct(t,e,r,n,a,s){let o=await xClient.Contracts.CoreV4.connect(s.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await u(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},s=ethers.parseUnits(e.amount,"wei"),i=r.immutableXConfig,o=new generatedClients.imx.DepositsApi(i.apiConfiguration),d=new generatedClients.imx.EncodingApi(i.apiConfiguration),g={user:n,token:{type:e.type,data:a},amount:s.toString()},m=await o.getSignableDeposit({getSignableDepositRequest:g}),p=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id;return ct(t,s,p,c,E,i)}async function gt(t,e,r,n,a,s){let o=await xClient.Contracts.CoreV4.connect(s.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function _e({signers:{ethSigner:t},deposit:e,config:r}){await u(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,s=await t.getAddress(),i=new generatedClients.imx.TokensApi(n),o=new generatedClients.imx.DepositsApi(n),d=new generatedClients.imx.EncodingApi(n),g=await i.getToken({address:e.tokenAddress}),f={decimals:parseInt(g.data.decimals),token_address:e.tokenAddress},p=ethers.parseUnits(e.amount,0),E=await xClient.Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,p);await t.sendTransaction(E);let w={user:s,token:{type:e.type,data:f},amount:p.toString()},h=await o.getSignableDeposit({getSignableDepositRequest:w}),De=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,Ue=h.data.stark_key,qe=h.data.vault_id,Le=BigInt(h.data.amount);return gt(t,Le,De,Ue,qe,a)}async function ut(t,e,r,n,a,s){let o=await xClient.Contracts.CoreV4.connect(s.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Ae({signers:{ethSigner:t},deposit:e,config:r}){await u(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,s=new generatedClients.imx.DepositsApi(a.apiConfiguration),i=new generatedClients.imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},g={user:n,token:{type:e.type,data:o},amount:"1".toString()},m=await s.getSignableDeposit({getSignableDepositRequest:g}),p=(await i.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id,w=xClient.Contracts.IERC721.connect(e.tokenAddress,t),h=a.ethConfiguration.coreContractAddress;return await w.isApprovedForAll(n,h)||await w.setApprovalForAll(h,!0),ut(t,e.tokenId,p,c,E,a)}async function be({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Re({signers:t,deposit:e,config:r});case"ERC20":return _e({signers:t,deposit:e,config:r});case"ERC721":return Ae({signers:t,deposit:e,config:r})}}async function ye({signers:t,request:e,config:r}){await u(t.ethSigner,r.immutableXConfig);let n=new generatedClients.imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),s=e.amount,i=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:toolkit.convertToSignableToken(e),amount:s,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=i.data,g=await toolkit.signRaw(o,t.ethSigner),m=await t.starkSigner.signMessage(d),f={sender_stark_key:i.data.sender_stark_key,sender_vault_id:i.data.sender_vault_id,receiver_stark_key:i.data.receiver_stark_key,receiver_vault_id:i.data.receiver_vault_id,asset_id:i.data.asset_id,amount:i.data.amount,nonce:i.data.nonce,expiration_timestamp:i.data.expiration_timestamp,stark_signature:m},p=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:g});return {sent_signature:p?.data.sent_signature,status:p?.data.status?.toString(),time:p?.data.time,transfer_id:p?.data.transfer_id}}var S=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return te(e,this.config)}registerOffchain(){return ee(this.signers,this.config)}batchNftTransfer(e){return Q({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return J({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return fe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return j({signers:this.signers,request:e,config:this.config})}createTrade(e){return Ce({signers:this.signers,request:e,config:this.config})}deposit(e){return be({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return ye({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return R(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return le({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return Y({signers:this.signers,request:e,config:this.config})}};var Se={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ke(t){return !!t?.request}async function Pe(t,e){await t.request({method:Se.CONNECT}),e&&await t.request({method:Se.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var Rt={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ve({chainID:t}){let e=await Ct__default.default();if(!ke(e))throw new Error(Rt.PROVIDER_NOT_FOUND);return await Pe(e,t),new ethers.BrowserProvider(e)}var C="message";function A(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function b(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var N=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return console.log("signMessage.rawMessage",{rawMessage:e}),console.log("signMessage.toUtf8Bytes.toString()",{toUtf8Bytes:ethers.toUtf8Bytes(e).toString()}),new Promise((r,n)=>{let a=s=>{b(this.iframe,s,"SIGN_MESSAGE_RESPONSE",i=>{window.removeEventListener(C,a),i.success||n(new Error(i.error?.message)),r(i.data.signedMessage);});};window.addEventListener(C,a),A(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{b(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",s=>{window.removeEventListener(C,n),s.success||r(new Error(s.error?.message)),e(s.data.yCoordinate);});};window.addEventListener(C,n),A(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var Ie="imx-wallet-app",ht={[config.Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[config.Environment.PRODUCTION]:"https://wallets.immutable.com"},At="display: none;";function bt(){return document.querySelector(`iframe#${Ie}`)}async function yt(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",Ie),r.setAttribute("src",ht[t]),r.setAttribute("style",At),document.body.appendChild(r),r.onload=()=>e(r);})}async function Oe(t){let e=bt();return e||await yt(t)}var k="Only sign this request if you\u2019ve initiated an action with Immutable X.",kt="The L2 IMX Wallet connection has failed";async function Me(t,e){let r=await t.getSigner(),n=await r.getAddress();console.log("DEFAULT_CONNECTION_MESSAGE",{message:k}),console.log("toUtf8Bytes.toString()",{toUtf8Bytes:ethers.toUtf8Bytes(k).toString()}),console.log("toUtf8String 1",{toUtf8String:ethers.toUtf8String(ethers.toUtf8Bytes(k))}),console.log("toUtf8String 2",{toUtf8String:ethers.toUtf8String(ethers.getBytes(ethers.toUtf8Bytes(k)))});let a=await r.signMessage(ethers.toUtf8Bytes(k)),s=await Oe(e);return new Promise((i,o)=>{let d=g=>{b(s,g,"CONNECT_WALLET_RESPONSE",m=>{window.removeEventListener(C,d),m.success||o(new Error(kt)),i(new N(m.data.starkPublicKey,s));});};window.addEventListener(C,d),A(s,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function We(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=s=>{b(e,s,"DISCONNECT_WALLET_RESPONSE",i=>{window.removeEventListener(C,a),!i.success&&i.error&&n(i.error),e.remove(),r();});};window.addEventListener(C,a),A(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var y=class extends Error{type;constructor(e,r){super(e),this.type=r;}},W=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new y(n,e.type)}};var B=class t extends S{static imxSigner;static async connect(e){return await W(async()=>{let r=await ve({chainID:e.immutableXConfig.ethConfiguration.chainID});this.imxSigner=await Me(r,e.baseConfig.environment);let n=await r.getSigner();return console.log("metaMaskProvider.getSigner().getAddress()",await n.getAddress()),console.log("imxSigner.getAddress()",this.imxSigner.getAddress()),new t(e,n,this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new y("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>{await We(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new y("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var V=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new xClient.ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
35
+ function qe(t,e){return t===e.ethConfiguration.chainID}async function g(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!qe(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function H({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new generatedClients.imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.type==="ERC721"?"1":r.amount,o=await i.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:toolkit.convertToSignableToken(r),amount:s,receiver:r.receiver}}),{signable_message:d,payload_hash:u}=o.data,m=await toolkit.signRaw(d,t),f=await e.signMessage(u),p={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:f},c=await i.createTransferV1({createTransferRequest:p,xImxEthAddress:a,xImxEthSignature:m});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function F({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new generatedClients.imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.map(c=>({amount:"1",token:toolkit.convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await i.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let u=await toolkit.signRaw(d,t),m=[];for(let c of o.data.signable_responses){let E=await e.signMessage(c.payload_hash),w={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:E};m.push(w);}let f={sender_stark_key:o.data.sender_stark_key,requests:m};return {transfer_ids:(await i.createTransfer({createTransferRequestV2:f,xImxEthAddress:a,xImxEthSignature:u}))?.data.transfer_ids}}async function z({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new generatedClients.imx.OrdersApi(r.immutableXConfig.apiConfiguration),i=e.sell.type==="ERC721"?"1":e.sell.amount,s=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:s,token_buy:toolkit.convertToSignableToken(e.buy),amount_sell:i,token_sell:toolkit.convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:u,payload_hash:m}=d.data,f=await toolkit.signRaw(u,t.ethSigner),p=await t.starkSigner.signMessage(m),c=d.data,E={createOrderRequest:{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,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:p,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:f};return {...(await a.createOrderV3(E)).data}}async function K({signers:t,request:e,config:r}){let n=new generatedClients.imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:i,payload_hash:s}=a.data,o=await toolkit.signRaw(i,t.ethSigner),d=await t.starkSigner.signMessage(s),u=await t.ethSigner.getAddress(),m=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:u,xImxEthSignature:o});return {order_id:m.data.order_id,status:m.data.status}}async function J(t,e){await g(t.ethSigner,e.immutableXConfig);let r=new generatedClients.imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),i=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:s,payload_hash:o}=i.data,d=await toolkit.signRaw(s,t.ethSigner),u=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:u,stark_key:a}})).data}async function Z(t,e){try{let n=await new generatedClients.imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(axios.isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function R(t,e,r){await g(e,r.immutableXConfig);let n=r.immutableXConfig,a=xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(i){if(i.reason==="USER_UNREGISTERED")return !1;throw i}}var _=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function ee(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await g(r,t.config);let a=t.type==="ERC721"?"1":t.amount,i=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:toolkit.convertToSignableToken(t),amount:a}}),{signable_message:s,payload_hash:o}=i.data,d=await n.signMessage(o),{ethAddress:u,ethSignature:m}=await toolkit.signMessage(s,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:_(i.data.sender_stark_key),sender_vault_id:_(i.data.sender_vault_id),receiver_stark_key:_(i.data.receiver_stark_key),receiver_vault_id:_(i.data.receiver_vault_id),amount:a,asset_id:_(i.data.asset_id),expiration_timestamp:_(i.data.expiration_timestamp),nonce:_(i.data.nonce),stark_signature:d},xImxEthAddress:u,xImxEthSignature:m})).data}async function l(t,e,r,n){return (await new generatedClients.imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function k(t,e,r,n){return xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function Qe(t,e,r){let n=await l("asset","ETH",r);return await k(t,e,n.asset_id,r)}async function $e(t,e,r,n){let a=await l("asset","ERC20",n,{token_address:r});return await k(t,e,a.asset_id,n)}async function ze(t,e,r,n,a,i){try{let s=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await l("mintable-asset","ERC721",i,{id:r.tokenId,token_address:r.tokenAddress,...s.data.blueprint&&{blueprint:s.data.blueprint}});return await k(t,e,o.asset_id,i)}catch(s){if(s.response?.status===404){let o=await l("asset","ERC721",i,{token_id:r.tokenId,token_address:r.tokenAddress});return await k(t,e,o.asset_id,i)}throw s}}async function P(t,e,r,n,a,i){switch(r.type){case"ETH":return await Qe(t,e,i);case"ERC20":return await $e(t,e,r.tokenAddress,i);case"ERC721":return await ze(t,e,r,n,a,i);default:throw new Error("Unsupported token type")}}async function v(t,e,r,n,a){let i=new xClient.EncodingApi(a.apiConfiguration),s=new xClient.MintsApi(a.apiConfiguration),o=await P(t,e,n,i,s,a),d=await P(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}async function re(t,e,r,n,a,i){let s=new xClient.EncodingApi(a.apiConfiguration),o=await P(t,e,n,s,i,a),d=await P(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}var ne="ERC20";async function W(t,e,r,n,a){let i=await t.getAddress(),s=await xClient.signRegisterEthAddress(e,i,r),d=await xClient.Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(i,r,s,n);return t.sendTransaction(d)}async function X(t,e,r,n){let i=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(i)}async function D(t,e,r,n){let i=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(i)}async function ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await g(t,a.immutableXConfig);let{v3Balance:i,v4Balance:s}=await v(t,r,await t.getAddress(),{type:ne,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await l("asset",ne,a.immutableXConfig,{token_address:n.tokenAddress});if(i>0)return await R(r,t,a)?X(t,r,o.asset_type,a.immutableXConfig):W(t,e,r,o.asset_type,a.immutableXConfig);if(s>0)return D(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var T="ERC721";function oe(t){let{id:e}=t.data,r=t.data.blueprint||"";return I__namespace.sanitizeHex(I__namespace.utf8ToHex(`{${e}}:{${r}}`))}async function je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await xClient.signRegisterEthAddress(e,a,i),u=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,i,o,s.asset_type,r.tokenId);return t.sendTransaction(u)}async function Je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=oe(r),d=await xClient.signRegisterEthAddress(e,a,i),m=await xClient.Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,i,d,s.asset_type,o);return t.sendTransaction(m)}async function Ze(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>Je(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return je(e,r,n,a);throw i})}async function et(t,e,r,n){let a=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),i=oe(r),o=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,i);return t.sendTransaction(o)}async function tt(t,e,r,n){let a=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),s=await xClient.Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(s)}async function ie(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>et(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return tt(e,r,n,a);throw i})}async function de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i){await g(t,a.immutableXConfig);let s=await t.getAddress(),{v3Balance:o,v4Balance:d}=await re(t,r,s,{type:T,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,i);if(o>0)return await R(r,t,a)?ie(i,t,r,n,a.immutableXConfig):Ze(i,t,e,n,a.immutableXConfig);if(d>0)return ie(i,t,s,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ce="ETH";async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await g(t,n.immutableXConfig);let{v3Balance:a,v4Balance:i}=await v(t,r,await t.getAddress(),{type:ce},n.immutableXConfig),s=await l("asset",ce,n.immutableXConfig);if(a>0)return await R(r,t,n)?X(t,r,s.asset_type,n.immutableXConfig):W(t,e,r,s.asset_type,n.immutableXConfig);if(i>0)return D(t,r,s.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function ge({signers:t,withdrawal:e,config:r}){let n=new generatedClients.imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return ee({signers:t,config:r.immutableXConfig,...e},n)}async function pe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let i=new generatedClients.imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i)}}async function le({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new generatedClients.imx.TradesApi(n.immutableXConfig.apiConfiguration),s=await i.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=s.data,u=await toolkit.signRaw(o,t),m=await e.signMessage(d);return (await i.createTradeV3({createTradeRequest:{amount_buy:s.data.amount_buy,amount_sell:s.data.amount_sell,asset_id_buy:s.data.asset_id_buy,asset_id_sell:s.data.asset_id_sell,expiration_timestamp:s.data.expiration_timestamp,fee_info:s.data.fee_info,fees:r.fees,include_fees:!0,nonce:s.data.nonce,order_id:r.order_id,stark_key:s.data.stark_key,vault_id_buy:s.data.vault_id_buy,vault_id_sell:s.data.vault_id_sell,stark_signature:m},xImxEthAddress:a,xImxEthSignature:u})).data}async function st(t,e,r,n,a,i){let o=await xClient.Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Ce({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},i=ethers.parseUnits(e.amount,"wei"),s=r.immutableXConfig,o=new generatedClients.imx.DepositsApi(s.apiConfiguration),d=new generatedClients.imx.EncodingApi(s.apiConfiguration),u={user:n,token:{type:e.type,data:a},amount:i.toString()},m=await o.getSignableDeposit({getSignableDepositRequest:u}),p=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id;return st(t,i,p,c,E,s)}async function dt(t,e,r,n,a,i){let o=await xClient.Contracts.CoreV4.connect(i.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,i=await t.getAddress(),s=new generatedClients.imx.TokensApi(n),o=new generatedClients.imx.DepositsApi(n),d=new generatedClients.imx.EncodingApi(n),u=await s.getToken({address:e.tokenAddress}),f={decimals:parseInt(u.data.decimals),token_address:e.tokenAddress},p=ethers.parseUnits(e.amount,0),E=await xClient.Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,p);await t.sendTransaction(E);let w={user:i,token:{type:e.type,data:f},amount:p.toString()},h=await o.getSignableDeposit({getSignableDepositRequest:w}),Me=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,We=h.data.stark_key,Xe=h.data.vault_id,De=BigInt(h.data.amount);return dt(t,De,Me,We,Xe,a)}async function ct(t,e,r,n,a,i){let o=await xClient.Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Te({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,i=new generatedClients.imx.DepositsApi(a.apiConfiguration),s=new generatedClients.imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},u={user:n,token:{type:e.type,data:o},amount:"1".toString()},m=await i.getSignableDeposit({getSignableDepositRequest:u}),p=(await s.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id,w=xClient.Contracts.IERC721.connect(e.tokenAddress,t),h=a.ethConfiguration.coreContractAddress;return await w.isApprovedForAll(n,h)||await w.setApprovalForAll(h,!0),ct(t,e.tokenId,p,c,E,a)}async function he({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Ce({signers:t,deposit:e,config:r});case"ERC20":return Re({signers:t,deposit:e,config:r});case"ERC721":return Te({signers:t,deposit:e,config:r})}}async function Ae({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=new generatedClients.imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),i=e.amount,s=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:toolkit.convertToSignableToken(e),amount:i,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=s.data,u=await toolkit.signRaw(o,t.ethSigner),m=await t.starkSigner.signMessage(d),f={sender_stark_key:s.data.sender_stark_key,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:m},p=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:u});return {sent_signature:p?.data.sent_signature,status:p?.data.status?.toString(),time:p?.data.time,transfer_id:p?.data.transfer_id}}var S=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return Z(e,this.config)}registerOffchain(){return J(this.signers,this.config)}batchNftTransfer(e){return F({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return K({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return pe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return z({signers:this.signers,request:e,config:this.config})}createTrade(e){return le({signers:this.signers,request:e,config:this.config})}deposit(e){return he({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return Ae({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return R(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return ge({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return H({signers:this.signers,request:e,config:this.config})}};var be={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ye(t){return !!t?.request}async function Se(t,e){await t.request({method:be.CONNECT}),e&&await t.request({method:be.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var ft={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ke({chainID:t}){let e=await pt__default.default();if(!ye(e))throw new Error(ft.PROVIDER_NOT_FOUND);return await Se(e,t),new ethers.BrowserProvider(e)}var C="message";function A(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function b(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var O=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return new Promise((r,n)=>{let a=i=>{b(this.iframe,i,"SIGN_MESSAGE_RESPONSE",s=>{window.removeEventListener(C,a),s.success||n(new Error(s.error?.message)),r(s.data.signedMessage);});};window.addEventListener(C,a),A(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{b(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",i=>{window.removeEventListener(C,n),i.success||r(new Error(i.error?.message)),e(i.data.yCoordinate);});};window.addEventListener(C,n),A(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var ve="imx-wallet-app",Rt={[config.Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[config.Environment.PRODUCTION]:"https://wallets.immutable.com"},wt="display: none;";function _t(){return document.querySelector(`iframe#${ve}`)}async function Tt(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",ve),r.setAttribute("src",Rt[t]),r.setAttribute("style",wt),document.body.appendChild(r),r.onload=()=>e(r);})}async function xe(t){let e=_t();return e||await Tt(t)}var At="Only sign this request if you\u2019ve initiated an action with Immutable X.",bt="The L2 IMX Wallet connection has failed";async function Ie(t,e){let r=await t.getSigner(),n=await r.getAddress(),a=await r.signMessage(ethers.toUtf8Bytes(At)),i=await xe(e);return new Promise((s,o)=>{let d=u=>{b(i,u,"CONNECT_WALLET_RESPONSE",m=>{window.removeEventListener(C,d),m.success||o(new Error(bt)),s(new O(m.data.starkPublicKey,i));});};window.addEventListener(C,d),A(i,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function Oe(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=i=>{b(e,i,"DISCONNECT_WALLET_RESPONSE",s=>{window.removeEventListener(C,a),!s.success&&s.error&&n(s.error),e.remove(),r();});};window.addEventListener(C,a),A(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var y=class extends Error{type;constructor(e,r){super(e),this.type=r;}},N=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new y(n,e.type)}};var L=class t extends S{static imxSigner;static async connect(e){return await N(async()=>{let r=await ke({chainID:e.immutableXConfig.ethConfiguration.chainID});return this.imxSigner=await Ie(r,e.baseConfig.environment),new t(e,await r.getSigner(),this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new y("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>{await Oe(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new y("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var U=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new xClient.ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
36
36
 
37
37
  exports.GenericIMXProvider = S;
38
- exports.MetaMaskIMXProvider = B;
39
- exports.ProviderConfiguration = V;
38
+ exports.MetaMaskIMXProvider = L;
39
+ exports.ProviderConfiguration = U;
@@ -2,11 +2,11 @@ import { imx } from '@imtbl/generated-clients';
2
2
  import { convertToSignableToken, signRaw, signMessage } from '@imtbl/toolkit';
3
3
  import { ImxConfiguration, Contracts, EncodingApi, MintsApi, signRegisterEthAddress } from '@imtbl/x-client';
4
4
  import { isAxiosError } from 'axios';
5
- import * as O from 'enc-utils';
6
- import { parseUnits, BrowserProvider, toUtf8Bytes, toUtf8String, getBytes } from 'ethers';
7
- import Ct from '@metamask/detect-provider';
5
+ import * as I from 'enc-utils';
6
+ import { parseUnits, BrowserProvider, toUtf8Bytes } from 'ethers';
7
+ import pt from '@metamask/detect-provider';
8
8
  import { Environment } from '@imtbl/config';
9
9
 
10
- function Be(t,e){return t===e.ethConfiguration.chainID}async function u(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!Be(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function Y({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await u(t,n.immutableXConfig);let a=await t.getAddress(),s=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),i=r.type==="ERC721"?"1":r.amount,o=await s.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:convertToSignableToken(r),amount:i,receiver:r.receiver}}),{signable_message:d,payload_hash:g}=o.data,m=await signRaw(d,t),f=await e.signMessage(g),p={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:f},c=await s.createTransferV1({createTransferRequest:p,xImxEthAddress:a,xImxEthSignature:m});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function Q({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await u(t,n.immutableXConfig);let a=await t.getAddress(),s=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),i=r.map(c=>({amount:"1",token:convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await s.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:i}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let g=await signRaw(d,t),m=[];for(let c of o.data.signable_responses){let E=await e.signMessage(c.payload_hash),w={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:E};m.push(w);}let f={sender_stark_key:o.data.sender_stark_key,requests:m};return {transfer_ids:(await s.createTransfer({createTransferRequestV2:f,xImxEthAddress:a,xImxEthSignature:g}))?.data.transfer_ids}}async function j({signers:t,request:e,config:r}){await u(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),s=e.sell.type==="ERC721"?"1":e.sell.amount,i=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:i,token_buy:convertToSignableToken(e.buy),amount_sell:s,token_sell:convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:g,payload_hash:m}=d.data,f=await signRaw(g,t.ethSigner),p=await t.starkSigner.signMessage(m),c=d.data,E={createOrderRequest:{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,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:p,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:f};return {...(await a.createOrderV3(E)).data}}async function J({signers:t,request:e,config:r}){let n=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:s,payload_hash:i}=a.data,o=await signRaw(s,t.ethSigner),d=await t.starkSigner.signMessage(i),g=await t.ethSigner.getAddress(),m=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:g,xImxEthSignature:o});return {order_id:m.data.order_id,status:m.data.status}}async function ee(t,e){await u(t.ethSigner,e.immutableXConfig);let r=new imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),s=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:i,payload_hash:o}=s.data,d=await signRaw(i,t.ethSigner),g=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:g,stark_key:a}})).data}async function te(t,e){try{let n=await new imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function R(t,e,r){await u(e,r.immutableXConfig);let n=r.immutableXConfig,a=Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(s){if(s.reason==="USER_UNREGISTERED")return !1;throw s}}var _=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function re(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await u(r,t.config);let a=t.type==="ERC721"?"1":t.amount,s=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:convertToSignableToken(t),amount:a}}),{signable_message:i,payload_hash:o}=s.data,d=await n.signMessage(o),{ethAddress:g,ethSignature:m}=await signMessage(i,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:_(s.data.sender_stark_key),sender_vault_id:_(s.data.sender_vault_id),receiver_stark_key:_(s.data.receiver_stark_key),receiver_vault_id:_(s.data.receiver_vault_id),amount:a,asset_id:_(s.data.asset_id),expiration_timestamp:_(s.data.expiration_timestamp),nonce:_(s.data.nonce),stark_signature:d},xImxEthAddress:g,xImxEthSignature:m})).data}async function l(t,e,r,n){return (await new imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function P(t,e,r,n){return Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function Ke(t,e,r){let n=await l("asset","ETH",r);return await P(t,e,n.asset_id,r)}async function je(t,e,r,n){let a=await l("asset","ERC20",n,{token_address:r});return await P(t,e,a.asset_id,n)}async function Je(t,e,r,n,a,s){try{let i=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await l("mintable-asset","ERC721",s,{id:r.tokenId,token_address:r.tokenAddress,...i.data.blueprint&&{blueprint:i.data.blueprint}});return await P(t,e,o.asset_id,s)}catch(i){if(i.response?.status===404){let o=await l("asset","ERC721",s,{token_id:r.tokenId,token_address:r.tokenAddress});return await P(t,e,o.asset_id,s)}throw i}}async function v(t,e,r,n,a,s){switch(r.type){case"ETH":return await Ke(t,e,s);case"ERC20":return await je(t,e,r.tokenAddress,s);case"ERC721":return await Je(t,e,r,n,a,s);default:throw new Error("Unsupported token type")}}async function x(t,e,r,n,a){let s=new EncodingApi(a.apiConfiguration),i=new MintsApi(a.apiConfiguration),o=await v(t,e,n,s,i,a),d=await v(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}async function ae(t,e,r,n,a,s){let i=new EncodingApi(a.apiConfiguration),o=await v(t,e,n,i,s,a),d=await v(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}var se="ERC20";async function D(t,e,r,n,a){let s=await t.getAddress(),i=await signRegisterEthAddress(e,s,r),d=await Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(s,r,i,n);return t.sendTransaction(d)}async function U(t,e,r,n){let s=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(s)}async function q(t,e,r,n){let s=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(s)}async function ie({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await u(t,a.immutableXConfig);let{v3Balance:s,v4Balance:i}=await x(t,r,await t.getAddress(),{type:se,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await l("asset",se,a.immutableXConfig,{token_address:n.tokenAddress});if(s>0)return await R(r,t,a)?U(t,r,o.asset_type,a.immutableXConfig):D(t,e,r,o.asset_type,a.immutableXConfig);if(i>0)return q(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var T="ERC721";function ce(t){let{id:e}=t.data,r=t.data.blueprint||"";return O.sanitizeHex(O.utf8ToHex(`{${e}}:{${r}}`))}async function et(t,e,r,n){let a=await t.getAddress(),s=await e.getAddress(),i=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await signRegisterEthAddress(e,a,s),g=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,s,o,i.asset_type,r.tokenId);return t.sendTransaction(g)}async function tt(t,e,r,n){let a=await t.getAddress(),s=await e.getAddress(),i=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=ce(r),d=await signRegisterEthAddress(e,a,s),m=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,s,d,i.asset_type,o);return t.sendTransaction(m)}async function rt(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(s=>tt(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:s.data.blueprint}},a)).catch(s=>{if(s.response?.status===404)return et(e,r,n,a);throw s})}async function nt(t,e,r,n){let a=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),s=ce(r),o=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,s);return t.sendTransaction(o)}async function at(t,e,r,n){let a=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),i=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(i)}async function oe(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(s=>nt(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:s.data.blueprint}},a)).catch(s=>{if(s.response?.status===404)return at(e,r,n,a);throw s})}async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},s){await u(t,a.immutableXConfig);let i=await t.getAddress(),{v3Balance:o,v4Balance:d}=await ae(t,r,i,{type:T,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,s);if(o>0)return await R(r,t,a)?oe(s,t,r,n,a.immutableXConfig):rt(s,t,e,n,a.immutableXConfig);if(d>0)return oe(s,t,i,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ge="ETH";async function ue({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await u(t,n.immutableXConfig);let{v3Balance:a,v4Balance:s}=await x(t,r,await t.getAddress(),{type:ge},n.immutableXConfig),i=await l("asset",ge,n.immutableXConfig);if(a>0)return await R(r,t,n)?U(t,r,i.asset_type,n.immutableXConfig):D(t,e,r,i.asset_type,n.immutableXConfig);if(s>0)return q(t,r,i.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function le({signers:t,withdrawal:e,config:r}){let n=new imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return re({signers:t,config:r.immutableXConfig,...e},n)}async function fe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let s=new imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return ue({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return ie({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},s)}}async function Ce({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await u(t,n.immutableXConfig);let a=await t.getAddress(),s=new imx.TradesApi(n.immutableXConfig.apiConfiguration),i=await s.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=i.data,g=await signRaw(o,t),m=await e.signMessage(d);return (await s.createTradeV3({createTradeRequest:{amount_buy:i.data.amount_buy,amount_sell:i.data.amount_sell,asset_id_buy:i.data.asset_id_buy,asset_id_sell:i.data.asset_id_sell,expiration_timestamp:i.data.expiration_timestamp,fee_info:i.data.fee_info,fees:r.fees,include_fees:!0,nonce:i.data.nonce,order_id:r.order_id,stark_key:i.data.stark_key,vault_id_buy:i.data.vault_id_buy,vault_id_sell:i.data.vault_id_sell,stark_signature:m},xImxEthAddress:a,xImxEthSignature:g})).data}async function ct(t,e,r,n,a,s){let o=await Contracts.CoreV4.connect(s.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await u(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},s=parseUnits(e.amount,"wei"),i=r.immutableXConfig,o=new imx.DepositsApi(i.apiConfiguration),d=new imx.EncodingApi(i.apiConfiguration),g={user:n,token:{type:e.type,data:a},amount:s.toString()},m=await o.getSignableDeposit({getSignableDepositRequest:g}),p=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id;return ct(t,s,p,c,E,i)}async function gt(t,e,r,n,a,s){let o=await Contracts.CoreV4.connect(s.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function _e({signers:{ethSigner:t},deposit:e,config:r}){await u(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,s=await t.getAddress(),i=new imx.TokensApi(n),o=new imx.DepositsApi(n),d=new imx.EncodingApi(n),g=await i.getToken({address:e.tokenAddress}),f={decimals:parseInt(g.data.decimals),token_address:e.tokenAddress},p=parseUnits(e.amount,0),E=await Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,p);await t.sendTransaction(E);let w={user:s,token:{type:e.type,data:f},amount:p.toString()},h=await o.getSignableDeposit({getSignableDepositRequest:w}),De=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,Ue=h.data.stark_key,qe=h.data.vault_id,Le=BigInt(h.data.amount);return gt(t,Le,De,Ue,qe,a)}async function ut(t,e,r,n,a,s){let o=await Contracts.CoreV4.connect(s.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Ae({signers:{ethSigner:t},deposit:e,config:r}){await u(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,s=new imx.DepositsApi(a.apiConfiguration),i=new imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},g={user:n,token:{type:e.type,data:o},amount:"1".toString()},m=await s.getSignableDeposit({getSignableDepositRequest:g}),p=(await i.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id,w=Contracts.IERC721.connect(e.tokenAddress,t),h=a.ethConfiguration.coreContractAddress;return await w.isApprovedForAll(n,h)||await w.setApprovalForAll(h,!0),ut(t,e.tokenId,p,c,E,a)}async function be({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Re({signers:t,deposit:e,config:r});case"ERC20":return _e({signers:t,deposit:e,config:r});case"ERC721":return Ae({signers:t,deposit:e,config:r})}}async function ye({signers:t,request:e,config:r}){await u(t.ethSigner,r.immutableXConfig);let n=new imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),s=e.amount,i=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:convertToSignableToken(e),amount:s,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=i.data,g=await signRaw(o,t.ethSigner),m=await t.starkSigner.signMessage(d),f={sender_stark_key:i.data.sender_stark_key,sender_vault_id:i.data.sender_vault_id,receiver_stark_key:i.data.receiver_stark_key,receiver_vault_id:i.data.receiver_vault_id,asset_id:i.data.asset_id,amount:i.data.amount,nonce:i.data.nonce,expiration_timestamp:i.data.expiration_timestamp,stark_signature:m},p=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:g});return {sent_signature:p?.data.sent_signature,status:p?.data.status?.toString(),time:p?.data.time,transfer_id:p?.data.transfer_id}}var S=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return te(e,this.config)}registerOffchain(){return ee(this.signers,this.config)}batchNftTransfer(e){return Q({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return J({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return fe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return j({signers:this.signers,request:e,config:this.config})}createTrade(e){return Ce({signers:this.signers,request:e,config:this.config})}deposit(e){return be({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return ye({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return R(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return le({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return Y({signers:this.signers,request:e,config:this.config})}};var Se={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ke(t){return !!t?.request}async function Pe(t,e){await t.request({method:Se.CONNECT}),e&&await t.request({method:Se.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var Rt={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ve({chainID:t}){let e=await Ct();if(!ke(e))throw new Error(Rt.PROVIDER_NOT_FOUND);return await Pe(e,t),new BrowserProvider(e)}var C="message";function A(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function b(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var N=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return console.log("signMessage.rawMessage",{rawMessage:e}),console.log("signMessage.toUtf8Bytes.toString()",{toUtf8Bytes:toUtf8Bytes(e).toString()}),new Promise((r,n)=>{let a=s=>{b(this.iframe,s,"SIGN_MESSAGE_RESPONSE",i=>{window.removeEventListener(C,a),i.success||n(new Error(i.error?.message)),r(i.data.signedMessage);});};window.addEventListener(C,a),A(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{b(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",s=>{window.removeEventListener(C,n),s.success||r(new Error(s.error?.message)),e(s.data.yCoordinate);});};window.addEventListener(C,n),A(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var Ie="imx-wallet-app",ht={[Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[Environment.PRODUCTION]:"https://wallets.immutable.com"},At="display: none;";function bt(){return document.querySelector(`iframe#${Ie}`)}async function yt(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",Ie),r.setAttribute("src",ht[t]),r.setAttribute("style",At),document.body.appendChild(r),r.onload=()=>e(r);})}async function Oe(t){let e=bt();return e||await yt(t)}var k="Only sign this request if you\u2019ve initiated an action with Immutable X.",kt="The L2 IMX Wallet connection has failed";async function Me(t,e){let r=await t.getSigner(),n=await r.getAddress();console.log("DEFAULT_CONNECTION_MESSAGE",{message:k}),console.log("toUtf8Bytes.toString()",{toUtf8Bytes:toUtf8Bytes(k).toString()}),console.log("toUtf8String 1",{toUtf8String:toUtf8String(toUtf8Bytes(k))}),console.log("toUtf8String 2",{toUtf8String:toUtf8String(getBytes(toUtf8Bytes(k)))});let a=await r.signMessage(toUtf8Bytes(k)),s=await Oe(e);return new Promise((i,o)=>{let d=g=>{b(s,g,"CONNECT_WALLET_RESPONSE",m=>{window.removeEventListener(C,d),m.success||o(new Error(kt)),i(new N(m.data.starkPublicKey,s));});};window.addEventListener(C,d),A(s,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function We(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=s=>{b(e,s,"DISCONNECT_WALLET_RESPONSE",i=>{window.removeEventListener(C,a),!i.success&&i.error&&n(i.error),e.remove(),r();});};window.addEventListener(C,a),A(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var y=class extends Error{type;constructor(e,r){super(e),this.type=r;}},W=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new y(n,e.type)}};var B=class t extends S{static imxSigner;static async connect(e){return await W(async()=>{let r=await ve({chainID:e.immutableXConfig.ethConfiguration.chainID});this.imxSigner=await Me(r,e.baseConfig.environment);let n=await r.getSigner();return console.log("metaMaskProvider.getSigner().getAddress()",await n.getAddress()),console.log("imxSigner.getAddress()",this.imxSigner.getAddress()),new t(e,n,this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new y("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>{await We(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new y("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return W(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var V=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
10
+ function qe(t,e){return t===e.ethConfiguration.chainID}async function g(t,e){let r=(await t.provider?.getNetwork())?.chainId;if(!qe(Number(r),e))throw new Error("The wallet used for this operation is not connected to the correct network.")}async function H({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.type==="ERC721"?"1":r.amount,o=await i.getSignableTransferV1({getSignableTransferRequest:{sender:a,token:convertToSignableToken(r),amount:s,receiver:r.receiver}}),{signable_message:d,payload_hash:u}=o.data,m=await signRaw(d,t),f=await e.signMessage(u),p={sender_stark_key:o.data.sender_stark_key,sender_vault_id:o.data.sender_vault_id,receiver_stark_key:o.data.receiver_stark_key,receiver_vault_id:o.data.receiver_vault_id,asset_id:o.data.asset_id,amount:o.data.amount,nonce:o.data.nonce,expiration_timestamp:o.data.expiration_timestamp,stark_signature:f},c=await i.createTransferV1({createTransferRequest:p,xImxEthAddress:a,xImxEthSignature:m});return {sent_signature:c?.data.sent_signature,status:c?.data.status?.toString(),time:c?.data.time,transfer_id:c?.data.transfer_id}}async function F({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TransfersApi(n.immutableXConfig.apiConfiguration),s=r.map(c=>({amount:"1",token:convertToSignableToken({type:"ERC721",tokenId:c.tokenId,tokenAddress:c.tokenAddress}),receiver:c.receiver})),o=await i.getSignableTransfer({getSignableTransferRequestV2:{sender_ether_key:a,signable_requests:s}}),d=o.data.signable_message;if(d===void 0)throw new Error("Invalid response from Signable registration offchain");let u=await signRaw(d,t),m=[];for(let c of o.data.signable_responses){let E=await e.signMessage(c.payload_hash),w={sender_vault_id:c.sender_vault_id,receiver_stark_key:c.receiver_stark_key,receiver_vault_id:c.receiver_vault_id,asset_id:c.asset_id,amount:c.amount,nonce:c.nonce,expiration_timestamp:c.expiration_timestamp,stark_signature:E};m.push(w);}let f={sender_stark_key:o.data.sender_stark_key,requests:m};return {transfer_ids:(await i.createTransfer({createTransferRequestV2:f,xImxEthAddress:a,xImxEthSignature:u}))?.data.transfer_ids}}async function z({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=await t.ethSigner.getAddress(),a=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),i=e.sell.type==="ERC721"?"1":e.sell.amount,s=e.buy.type==="ERC721"?"1":e.buy.amount,o={user:n,amount_buy:s,token_buy:convertToSignableToken(e.buy),amount_sell:i,token_sell:convertToSignableToken(e.sell),fees:e.fees,expiration_timestamp:e.expiration_timestamp},d=await a.getSignableOrder({getSignableOrderRequestV3:o}),{signable_message:u,payload_hash:m}=d.data,f=await signRaw(u,t.ethSigner),p=await t.starkSigner.signMessage(m),c=d.data,E={createOrderRequest:{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,fees:e.fees,nonce:c.nonce,stark_key:c.stark_key,stark_signature:p,vault_id_buy:c.vault_id_buy,vault_id_sell:c.vault_id_sell},xImxEthAddress:n,xImxEthSignature:f};return {...(await a.createOrderV3(E)).data}}async function K({signers:t,request:e,config:r}){let n=new imx.OrdersApi(r.immutableXConfig.apiConfiguration),a=await n.getSignableCancelOrderV3({getSignableCancelOrderRequest:{order_id:e.order_id}}),{signable_message:i,payload_hash:s}=a.data,o=await signRaw(i,t.ethSigner),d=await t.starkSigner.signMessage(s),u=await t.ethSigner.getAddress(),m=await n.cancelOrderV3({id:e.order_id.toString(),cancelOrderRequest:{order_id:e.order_id,stark_signature:d},xImxEthAddress:u,xImxEthSignature:o});return {order_id:m.data.order_id,status:m.data.status}}async function J(t,e){await g(t.ethSigner,e.immutableXConfig);let r=new imx.UsersApi(e.immutableXConfig.apiConfiguration),n=await t.ethSigner.getAddress(),a=await t.starkSigner.getAddress(),i=await r.getSignableRegistrationOffchain({getSignableRegistrationRequest:{ether_key:n,stark_key:a}}),{signable_message:s,payload_hash:o}=i.data,d=await signRaw(s,t.ethSigner),u=await t.starkSigner.signMessage(o);return (await r.registerUser({registerUserRequest:{eth_signature:d,ether_key:n,stark_signature:u,stark_key:a}})).data}async function Z(t,e){try{let n=await new imx.UsersApi(e.immutableXConfig.apiConfiguration).getUsers({user:t}),{accounts:a}=n.data;return a?.length>0}catch(r){if(isAxiosError(r)&&r.response?.status===404)return !1;throw r}}async function R(t,e,r){await g(e,r.immutableXConfig);let n=r.immutableXConfig,a=Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,e);try{return await a.isRegistered(t)}catch(i){if(i.reason==="USER_UNREGISTERED")return !1;throw i}}var _=t=>{if(t!==void 0)return t;throw new Error("undefined field exception")};async function ee(t,e){let{signers:{ethSigner:r,starkSigner:n}}=t;await g(r,t.config);let a=t.type==="ERC721"?"1":t.amount,i=await e.getSignableWithdrawalV2({getSignableWithdrawalRequest:{user:await r.getAddress(),token:convertToSignableToken(t),amount:a}}),{signable_message:s,payload_hash:o}=i.data,d=await n.signMessage(o),{ethAddress:u,ethSignature:m}=await signMessage(s,r);return (await e.createWithdrawalV2({createWithdrawalRequestV2:{sender_stark_key:_(i.data.sender_stark_key),sender_vault_id:_(i.data.sender_vault_id),receiver_stark_key:_(i.data.receiver_stark_key),receiver_vault_id:_(i.data.receiver_vault_id),amount:a,asset_id:_(i.data.asset_id),expiration_timestamp:_(i.data.expiration_timestamp),nonce:_(i.data.nonce),stark_signature:d},xImxEthAddress:u,xImxEthSignature:m})).data}async function l(t,e,r,n){return (await new imx.EncodingApi(r.apiConfiguration).encodeAsset({assetType:t,encodeAssetRequest:{token:{type:e,...n&&{data:n}}}})).data}async function k(t,e,r,n){return Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).getWithdrawalBalance(e,r)}async function Qe(t,e,r){let n=await l("asset","ETH",r);return await k(t,e,n.asset_id,r)}async function $e(t,e,r,n){let a=await l("asset","ERC20",n,{token_address:r});return await k(t,e,a.asset_id,n)}async function ze(t,e,r,n,a,i){try{let s=await a.getMintableTokenDetailsByClientTokenId({tokenAddress:r.tokenAddress,tokenId:r.tokenId}),o=await l("mintable-asset","ERC721",i,{id:r.tokenId,token_address:r.tokenAddress,...s.data.blueprint&&{blueprint:s.data.blueprint}});return await k(t,e,o.asset_id,i)}catch(s){if(s.response?.status===404){let o=await l("asset","ERC721",i,{token_id:r.tokenId,token_address:r.tokenAddress});return await k(t,e,o.asset_id,i)}throw s}}async function P(t,e,r,n,a,i){switch(r.type){case"ETH":return await Qe(t,e,i);case"ERC20":return await $e(t,e,r.tokenAddress,i);case"ERC721":return await ze(t,e,r,n,a,i);default:throw new Error("Unsupported token type")}}async function v(t,e,r,n,a){let i=new EncodingApi(a.apiConfiguration),s=new MintsApi(a.apiConfiguration),o=await P(t,e,n,i,s,a),d=await P(t,r,n,i,s,a);return {v3Balance:o,v4Balance:d}}async function re(t,e,r,n,a,i){let s=new EncodingApi(a.apiConfiguration),o=await P(t,e,n,s,i,a),d=await P(t,r,n,s,i,a);return {v3Balance:o,v4Balance:d}}var ne="ERC20";async function W(t,e,r,n,a){let i=await t.getAddress(),s=await signRegisterEthAddress(e,i,r),d=await Contracts.RegistrationV4.connect(a.ethConfiguration.registrationV4ContractAddress||a.ethConfiguration.registrationContractAddress,t).registerAndWithdrawAll.populateTransaction(i,r,s,n);return t.sendTransaction(d)}async function X(t,e,r,n){let i=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).withdrawAll.populateTransaction(await t.getAddress(),e,r);return t.sendTransaction(i)}async function D(t,e,r,n){let i=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdraw.populateTransaction(await t.getAddress(),r);return t.sendTransaction(i)}async function ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a}){await g(t,a.immutableXConfig);let{v3Balance:i,v4Balance:s}=await v(t,r,await t.getAddress(),{type:ne,tokenAddress:n.tokenAddress},a.immutableXConfig),o=await l("asset",ne,a.immutableXConfig,{token_address:n.tokenAddress});if(i>0)return await R(r,t,a)?X(t,r,o.asset_type,a.immutableXConfig):W(t,e,r,o.asset_type,a.immutableXConfig);if(s>0)return D(t,r,o.asset_type,a.immutableXConfig);throw new Error("No balance to withdraw")}var T="ERC721";function oe(t){let{id:e}=t.data,r=t.data.blueprint||"";return I.sanitizeHex(I.utf8ToHex(`{${e}}:{${r}}`))}async function je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),o=await signRegisterEthAddress(e,a,i),u=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerAndWithdrawNft.populateTransaction(a,i,o,s.asset_type,r.tokenId);return t.sendTransaction(u)}async function Je(t,e,r,n){let a=await t.getAddress(),i=await e.getAddress(),s=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),o=oe(r),d=await signRegisterEthAddress(e,a,i),m=await Contracts.RegistrationV4.connect(n.ethConfiguration.registrationV4ContractAddress||n.ethConfiguration.registrationContractAddress,t).registerWithdrawAndMint.populateTransaction(a,i,d,s.asset_type,o);return t.sendTransaction(m)}async function Ze(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>Je(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return je(e,r,n,a);throw i})}async function et(t,e,r,n){let a=await l("mintable-asset",T,n,{id:r.data.id,token_address:r.data.tokenAddress,...r.data.blueprint&&{blueprint:r.data.blueprint}}),i=oe(r),o=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawAndMint.populateTransaction(e,a.asset_type,i);return t.sendTransaction(o)}async function tt(t,e,r,n){let a=await l("asset",T,n,{token_id:r.tokenId,token_address:r.tokenAddress}),s=await Contracts.CoreV4.connect(n.ethConfiguration.coreContractAddress,t).withdrawNft.populateTransaction(e,a.asset_type,r.tokenId);return t.sendTransaction(s)}async function ie(t,e,r,n,a){return t.getMintableTokenDetailsByClientTokenId({tokenAddress:n.tokenAddress,tokenId:n.tokenId}).then(i=>et(e,r,{type:T,data:{id:n.tokenId,tokenAddress:n.tokenAddress,blueprint:i.data.blueprint}},a)).catch(i=>{if(i.response?.status===404)return tt(e,r,n,a);throw i})}async function de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i){await g(t,a.immutableXConfig);let s=await t.getAddress(),{v3Balance:o,v4Balance:d}=await re(t,r,s,{type:T,tokenAddress:n.tokenAddress,tokenId:n.tokenId},a.immutableXConfig,i);if(o>0)return await R(r,t,a)?ie(i,t,r,n,a.immutableXConfig):Ze(i,t,e,n,a.immutableXConfig);if(d>0)return ie(i,t,s,n,a.immutableXConfig);throw new Error("No balance to withdraw")}var ce="ETH";async function me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:n}){await g(t,n.immutableXConfig);let{v3Balance:a,v4Balance:i}=await v(t,r,await t.getAddress(),{type:ce},n.immutableXConfig),s=await l("asset",ce,n.immutableXConfig);if(a>0)return await R(r,t,n)?X(t,r,s.asset_type,n.immutableXConfig):W(t,e,r,s.asset_type,n.immutableXConfig);if(i>0)return D(t,r,s.asset_type,n.immutableXConfig);throw new Error("No balance to withdraw")}async function ge({signers:t,withdrawal:e,config:r}){let n=new imx.WithdrawalsApi(r.immutableXConfig.apiConfiguration);return ee({signers:t,config:r.immutableXConfig,...e},n)}async function pe({signers:{ethSigner:t,starkSigner:e},starkPublicKey:r,token:n,config:a}){let i=new imx.MintsApi(a.immutableXConfig.apiConfiguration);switch(n.type){case"ETH":return me({ethSigner:t,starkSigner:e,starkPublicKey:r,config:a});case"ERC20":return ae({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a});case"ERC721":return de({ethSigner:t,starkSigner:e,starkPublicKey:r,token:n,config:a},i)}}async function le({signers:{ethSigner:t,starkSigner:e},request:r,config:n}){await g(t,n.immutableXConfig);let a=await t.getAddress(),i=new imx.TradesApi(n.immutableXConfig.apiConfiguration),s=await i.getSignableTrade({getSignableTradeRequest:{user:a,order_id:r.order_id,fees:r.fees}}),{signable_message:o,payload_hash:d}=s.data,u=await signRaw(o,t),m=await e.signMessage(d);return (await i.createTradeV3({createTradeRequest:{amount_buy:s.data.amount_buy,amount_sell:s.data.amount_sell,asset_id_buy:s.data.asset_id_buy,asset_id_sell:s.data.asset_id_sell,expiration_timestamp:s.data.expiration_timestamp,fee_info:s.data.fee_info,fees:r.fees,include_fees:!0,nonce:s.data.nonce,order_id:r.order_id,stark_key:s.data.stark_key,vault_id_buy:s.data.vault_id_buy,vault_id_sell:s.data.vault_id_sell,stark_signature:m},xImxEthAddress:a,xImxEthSignature:u})).data}async function st(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t)["deposit(uint256,uint256,uint256)"].populateTransaction(n,r,a);return t.sendTransaction({...o,value:e})}async function Ce({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),a={decimals:18},i=parseUnits(e.amount,"wei"),s=r.immutableXConfig,o=new imx.DepositsApi(s.apiConfiguration),d=new imx.EncodingApi(s.apiConfiguration),u={user:n,token:{type:e.type,data:a},amount:i.toString()},m=await o.getSignableDeposit({getSignableDepositRequest:u}),p=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id;return st(t,i,p,c,E,s)}async function dt(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.coreContractAddress,t).depositERC20.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Re({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let{apiConfiguration:n,ethConfiguration:a}=r.immutableXConfig,i=await t.getAddress(),s=new imx.TokensApi(n),o=new imx.DepositsApi(n),d=new imx.EncodingApi(n),u=await s.getToken({address:e.tokenAddress}),f={decimals:parseInt(u.data.decimals),token_address:e.tokenAddress},p=parseUnits(e.amount,0),E=await Contracts.IERC20.connect(e.tokenAddress,t).approve.populateTransaction(a.coreContractAddress,p);await t.sendTransaction(E);let w={user:i,token:{type:e.type,data:f},amount:p.toString()},h=await o.getSignableDeposit({getSignableDepositRequest:w}),Me=(await d.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress}}}})).data.asset_type,We=h.data.stark_key,Xe=h.data.vault_id,De=BigInt(h.data.amount);return dt(t,De,Me,We,Xe,a)}async function ct(t,e,r,n,a,i){let o=await Contracts.CoreV4.connect(i.ethConfiguration.coreContractAddress,t).depositNft.populateTransaction(n,r,a,e);return t.sendTransaction(o)}async function Te({signers:{ethSigner:t},deposit:e,config:r}){await g(t,r.immutableXConfig);let n=await t.getAddress(),{immutableXConfig:a}=r,i=new imx.DepositsApi(a.apiConfiguration),s=new imx.EncodingApi(a.apiConfiguration),o={token_address:e.tokenAddress,token_id:e.tokenId},u={user:n,token:{type:e.type,data:o},amount:"1".toString()},m=await i.getSignableDeposit({getSignableDepositRequest:u}),p=(await s.encodeAsset({assetType:"asset",encodeAssetRequest:{token:{type:e.type,data:{token_address:e.tokenAddress,token_id:e.tokenId}}}})).data.asset_type,c=m.data.stark_key,E=m.data.vault_id,w=Contracts.IERC721.connect(e.tokenAddress,t),h=a.ethConfiguration.coreContractAddress;return await w.isApprovedForAll(n,h)||await w.setApprovalForAll(h,!0),ct(t,e.tokenId,p,c,E,a)}async function he({signers:t,deposit:e,config:r}){switch(e.type){case"ETH":return Ce({signers:t,deposit:e,config:r});case"ERC20":return Re({signers:t,deposit:e,config:r});case"ERC721":return Te({signers:t,deposit:e,config:r})}}async function Ae({signers:t,request:e,config:r}){await g(t.ethSigner,r.immutableXConfig);let n=new imx.ExchangesApi(r.immutableXConfig.apiConfiguration),a=await t.ethSigner.getAddress(),i=e.amount,s=await n.getExchangeSignableTransfer({id:e.transactionID,getSignableTransferRequest:{sender:a,token:convertToSignableToken(e),amount:i,receiver:e.receiver}}),{signable_message:o,payload_hash:d}=s.data,u=await signRaw(o,t.ethSigner),m=await t.starkSigner.signMessage(d),f={sender_stark_key:s.data.sender_stark_key,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:m},p=await n.createExchangeTransfer({id:e.transactionID,createTransferRequest:f,xImxEthAddress:a,xImxEthSignature:u});return {sent_signature:p?.data.sent_signature,status:p?.data.status?.toString(),time:p?.data.time,transfer_id:p?.data.transfer_id}}var S=class{config;signers;constructor(e,r,n){this.config=e,this.signers={ethSigner:r,starkSigner:n};}async getAddress(){return this.signers.ethSigner.getAddress()}async isRegisteredOffchain(){let e=await this.getAddress();return Z(e,this.config)}registerOffchain(){return J(this.signers,this.config)}batchNftTransfer(e){return F({signers:this.signers,request:e,config:this.config})}cancelOrder(e){return K({signers:this.signers,request:e,config:this.config})}completeWithdrawal(e,r){return pe({config:this.config,signers:this.signers,token:r,starkPublicKey:e})}createOrder(e){return z({signers:this.signers,request:e,config:this.config})}createTrade(e){return le({signers:this.signers,request:e,config:this.config})}deposit(e){return he({signers:this.signers,deposit:e,config:this.config})}exchangeTransfer(e){return Ae({signers:this.signers,request:e,config:this.config})}async isRegisteredOnchain(){let e=await this.signers.starkSigner.getAddress();return R(e,this.signers.ethSigner,this.config)}prepareWithdrawal(e){return ge({signers:this.signers,withdrawal:e,config:this.config})}transfer(e){return H({signers:this.signers,request:e,config:this.config})}};var be={SWITCH_CHAIN:"wallet_switchEthereumChain",CONNECT:"eth_requestAccounts"};function ye(t){return !!t?.request}async function Se(t,e){await t.request({method:be.CONNECT}),e&&await t.request({method:be.SWITCH_CHAIN,params:[{chainId:`0x${e.toString(16)}`}]});}var ft={PROVIDER_NOT_FOUND:"The Metamask provider was not found"};async function ke({chainID:t}){let e=await pt();if(!ye(e))throw new Error(ft.PROVIDER_NOT_FOUND);return await Se(e,t),new BrowserProvider(e)}var C="message";function A(t,e){t&&t.contentWindow&&t.contentWindow.postMessage(e,new URL(t.src).origin);}function b(t,e,r,n){if(t&&e.source!==t.contentWindow)return;let a=e.data;a.type===r&&n(a.details);}var O=class{publicAddress;iframe;constructor(e,r){this.publicAddress=e,this.iframe=r;}getAddress(){return this.publicAddress}signMessage(e){return new Promise((r,n)=>{let a=i=>{b(this.iframe,i,"SIGN_MESSAGE_RESPONSE",s=>{window.removeEventListener(C,a),s.success||n(new Error(s.error?.message)),r(s.data.signedMessage);});};window.addEventListener(C,a),A(this.iframe,{type:"SIGN_MESSAGE_REQUEST",details:{starkPublicKey:this.publicAddress,message:e}});})}getIFrame(){return this.iframe}getYCoordinate(){return new Promise((e,r)=>{let n=a=>{b(this.iframe,a,"GET_Y_COORDINATE_RESPONSE",i=>{window.removeEventListener(C,n),i.success||r(new Error(i.error?.message)),e(i.data.yCoordinate);});};window.addEventListener(C,n),A(this.iframe,{type:"GET_Y_COORDINATE_REQUEST",details:{starkPublicKey:this.publicAddress}});})}};var ve="imx-wallet-app",Rt={[Environment.SANDBOX]:"https://wallets.sandbox.immutable.com",[Environment.PRODUCTION]:"https://wallets.immutable.com"},wt="display: none;";function _t(){return document.querySelector(`iframe#${ve}`)}async function Tt(t){return new Promise(e=>{let r=document.createElement("iframe");r.setAttribute("id",ve),r.setAttribute("src",Rt[t]),r.setAttribute("style",wt),document.body.appendChild(r),r.onload=()=>e(r);})}async function xe(t){let e=_t();return e||await Tt(t)}var At="Only sign this request if you\u2019ve initiated an action with Immutable X.",bt="The L2 IMX Wallet connection has failed";async function Ie(t,e){let r=await t.getSigner(),n=await r.getAddress(),a=await r.signMessage(toUtf8Bytes(At)),i=await xe(e);return new Promise((s,o)=>{let d=u=>{b(i,u,"CONNECT_WALLET_RESPONSE",m=>{window.removeEventListener(C,d),m.success||o(new Error(bt)),s(new O(m.data.starkPublicKey,i));});};window.addEventListener(C,d),A(i,{type:"CONNECT_WALLET_REQUEST",details:{ethAddress:n,signature:a}});})}async function Oe(t){let e=t.getIFrame();return new Promise((r,n)=>{let a=i=>{b(e,i,"DISCONNECT_WALLET_RESPONSE",s=>{window.removeEventListener(C,a),!s.success&&s.error&&n(s.error),e.remove(),r();});};window.addEventListener(C,a),A(e,{type:"DISCONNECT_WALLET_REQUEST",details:{starkPublicKey:t.getAddress()}});})}var y=class extends Error{type;constructor(e,r){super(e),this.type=r;}},N=async(t,e)=>{try{return await t()}catch(r){let n=e.message||`${r.message}`||"UnknownError";throw new y(n,e.type)}};var L=class t extends S{static imxSigner;static async connect(e){return await N(async()=>{let r=await ke({chainID:e.immutableXConfig.ethConfiguration.chainID});return this.imxSigner=await Ie(r,e.baseConfig.environment),new t(e,await r.getSigner(),this.imxSigner)},{type:"WALLET_CONNECTION_ERROR"})}static async disconnect(){if(!this.imxSigner)throw new y("Attempted to disconnect from the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>{await Oe(this.imxSigner);},{type:"PROVIDER_CONNECTION_ERROR"})}static async signMessage(e){if(!this.imxSigner)throw new y("Attempted to sign a message with the MetaMask IMX provider without an established connection","PROVIDER_CONNECTION_ERROR");return N(async()=>await this.imxSigner.signMessage(e),{type:"PROVIDER_CONNECTION_ERROR"})}};var U=class{immutableXConfig;baseConfig;constructor({baseConfig:e,overrides:r}){if(this.baseConfig=e,r)this.immutableXConfig=r.immutableXConfig;else {let n=new ImxConfiguration({baseConfig:e});this.immutableXConfig=n.immutableXConfig;}}};
11
11
 
12
- export { S as GenericIMXProvider, B as MetaMaskIMXProvider, V as ProviderConfiguration };
12
+ export { S as GenericIMXProvider, L as MetaMaskIMXProvider, U as ProviderConfiguration };
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@imtbl/x-provider",
3
3
  "description": "Provider package for Immutable SDK",
4
- "version": "2.1.10-alpha.0",
4
+ "version": "2.1.10-alpha.2",
5
5
  "author": "Immutable",
6
6
  "bugs": "https://github.com/immutable/ts-immutable-sdk/issues",
7
7
  "dependencies": {
8
- "@imtbl/config": "2.1.10-alpha.0",
9
- "@imtbl/generated-clients": "2.1.10-alpha.0",
10
- "@imtbl/toolkit": "2.1.10-alpha.0",
11
- "@imtbl/x-client": "2.1.10-alpha.0",
12
- "@magic-ext/oidc": "12.0.0",
8
+ "@imtbl/config": "2.1.10-alpha.2",
9
+ "@imtbl/generated-clients": "2.1.10-alpha.2",
10
+ "@imtbl/toolkit": "2.1.10-alpha.2",
11
+ "@imtbl/x-client": "2.1.10-alpha.2",
12
+ "@magic-ext/oidc": "12.0.2",
13
13
  "@metamask/detect-provider": "^2.0.0",
14
14
  "axios": "^1.6.5",
15
15
  "enc-utils": "^3.0.0",
16
16
  "ethers": "^6.13.4",
17
- "magic-sdk": "^29.0.0",
17
+ "magic-sdk": "^29.0.2",
18
18
  "oidc-client-ts": "2.4.0"
19
19
  },
20
20
  "devDependencies": {