@rango-dev/queue-manager-rango-preset 0.5.1-next.0 → 0.5.1-next.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.
- package/dist/helpers.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +3 -3
- package/dist/shared.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/helpers.ts +3 -3
- package/src/shared.ts +2 -3
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,SAAS,EAGV,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAEL,IAAI,EACJ,OAAO,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var at=Object.defineProperty;var l=(e,t)=>at(e,"name",{value:t,configurable:!0});var ot="c6381a79-2817-4602-83bf-6a641a409e32",oe={API_KEY:ot};function se(e){return oe[e]||""}l(se,"getConfig");function xe(e){let t;return typeof structuredClone=="function"?t=structuredClone(e):t=JSON.parse(JSON.stringify(e)),oe=t,oe}l(xe,"initConfig");import{getBlockChainNameFromId as kt,Network as xt}from"@rango-dev/wallets-shared";import{readAccountAddress as At}from"@rango-dev/wallets-core";import{TransactionType as ue,isEvmTransaction as _t,isCosmosTransaction as yt,isSolanaTransaction as ht,isTronTransaction as Ct,isStarknetTransaction as Rt,isTransferTransaction as Nt}from"rango-sdk";var ie="Waiting for other swaps to complete",Ae="Waiting for connecting wallet",_e=l((e,t)=>`Please change your ${e||"wallet"} account to ${t||"proper address"}`,"ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET"),V=l(e=>`Please connect to ${e||"your wallet"} by using bellow button or top right button on page.`,"ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION"),J=l(e=>`Please change your network to ${e}.`,"ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK");import{Status as de}from"@rango-dev/queue-manager-core";import{SignerErrorCode as O,SignerError as st,isSignerErrorCode as it,isAPIErrorCode as lt}from"rango-types";var ct="Assertion failed (Unexpected behaviour)",ut="Create transaction failed in Rango Server",ye="Input wallet not found",k=class extends Error{constructor(n,r,a,i){super(r);this._isPrettyError=!0;Object.setPrototypeOf(this,k.prototype),k.prototype._isPrettyError=!0,this.code=n,this.detail=i,this.root=a}static isPrettyError(n){return n instanceof k||Object.prototype.hasOwnProperty.call(n,"_isPrettyError")}getErrorDetail(){let n=typeof this.root=="object"&&this.root&&this.root.error?this.root.error:JSON.stringify(this.root),r=typeof this.root=="string"?this.root:this.root instanceof Error?this.root.message:n;return{extraMessage:this.message,extraMessageDetail:this.detail||r,extraMessageErrorCode:this.code||null}}static AssertionFailed(n){return new k("CLIENT_UNEXPECTED_BEHAVIOUR",ct,n)}static BadStatusCode(n,r){return new k("TX_FAIL",n,null,`status code = ${r}`)}static CreateTransaction(n){return new k("FETCH_TX_FAILED",ut,null,n)}static WalletMissing(){return new k("CLIENT_UNEXPECTED_BEHAVIOUR",ye,null,"Server requested for a blockchain or address not selected by user")}static BlockchainMissing(){return new k("CLIENT_UNEXPECTED_BEHAVIOUR",ye,null,"Server requested for a blockchain or address not selected by user")}};l(k,"PrettyError");function he(e){let t="CLIENT_UNEXPECTED_BEHAVIOUR";try{return e?lt(e)?e:it(e)?{[O.REJECTED_BY_USER]:"USER_REJECT",[O.SIGN_TX_ERROR]:"CALL_WALLET_FAILED",[O.SEND_TX_ERROR]:"SEND_TX_FAILED",[O.NOT_IMPLEMENTED]:t,[O.OPERATION_UNSUPPORTED]:t,[O.UNEXPECTED_BEHAVIOUR]:t}[e]:t:t}catch{return t}}l(he,"mapAppErrorCodesToAPIErrorCode");var P=l(e=>{if(!e)return{extraMessage:"",extraMessageErrorCode:null};if(k.isPrettyError(e))return e.getErrorDetail();if(st.isSignerError(e)){let t=e.getErrorDetail();return{extraMessage:t.message,extraMessageDetail:t.detail,extraMessageErrorCode:t.code}}return e instanceof Error?{extraMessage:e.toString(),extraMessageErrorCode:null}:typeof e!="string"?{extraMessage:JSON.stringify(e),extraMessageErrorCode:null}:{extraMessage:e,extraMessageErrorCode:null}},"prettifyErrorMessage");import Ne from"bignumber.js";import Ce from"bignumber.js";var Re=l((e,t=null,n=null)=>{if(e===null||e==="")return"";let r=new Ce(e),a=1,i=1e3;for(let s=0;s<60;s++)if(new Ce(r.toFixed(s,a)).eq(r)){i=s;break}if(r.gte(1e4))return r.toFormat(0,a);if(r.gte(1e3)||r.gte(100))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,1))),a);if(r.gte(1))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,2))),a);if(r.gte(.01))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,4))),a);for(let s=t||4;s<17;s++)if(r.gte(Math.pow(10,-s)))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,s))),a);return r.isEqualTo(0)?"0":r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,8))),a)},"numberToString");import{isCosmosBlockchain as pt,isEvmBlockchain as dt,isStarknetBlockchain as gt,isTronBlockchain as ft}from"rango-types";var Y=(a=>(a.WaitingForConnectingWallet="waitingForConnectingWallet",a.WaitingForQueue="waitingForQueue",a.WaitingForNetworkChange="waitingForNetworkChange",a.NetworkChanged="networkChanged",a))(Y||{}),j=(a=>(a.error="error",a.warning="warning",a.info="info",a.success="success",a))(j||{}),B=l((e,t)=>{try{return N(e,t)}catch{return null}},"getCurrentBlockchainOfOrNull"),N=l((e,t)=>{let n=t.evmTransaction?.blockChain||t.evmApprovalTransaction?.blockChain||t.starknetTransaction?.blockChain||t.starknetApprovalTransaction?.blockChain||t.tronTransaction?.blockChain||t.tronApprovalTransaction?.blockChain||t.cosmosTransaction?.blockChain||t.solanaTransaction?.blockChain;if(n)return n;let r=t.transferTransaction?.fromWalletAddress;if(!r)throw k.BlockchainMissing();let a=Object.keys(e.wallets).find(i=>e.wallets[i]?.address===r)||null;if(a==null)throw k.BlockchainMissing();return a},"getCurrentBlockchainOf"),St=l(e=>{if(pt(e))return e.info?.explorerUrlToTx;if(dt(e)||gt(e)||ft(e))return e.info.transactionUrl},"getBlockchainMetaExplorerBaseUrl"),F=l((e,t,n)=>{let r=n[t],a=St(r);if(a)return a.indexOf("/{txHash}")!==-1?a.replace("{txHash}",e?.toLowerCase()):`${a}/${e?.toLowerCase()}`},"getScannerUrl");function ve(e,t){return e.steps.find(n=>n.status!=="failed"&&n.status!=="success"&&n.id!==t.id)||null}l(ve,"getNextStep");var le=l((e,t)=>{let n=e.wallets[t.evmTransaction?.blockChain||""]||e.wallets[t.evmApprovalTransaction?.blockChain||""]||e.wallets[t.tronTransaction?.blockChain||""]||e.wallets[t.tronApprovalTransaction?.blockChain||""]||e.wallets[t.starknetTransaction?.blockChain||""]||e.wallets[t.starknetApprovalTransaction?.blockChain||""]||e.wallets[t.cosmosTransaction?.blockChain||""]||e.wallets[t.solanaTransaction?.blockChain||""]||(t.transferTransaction?.fromWalletAddress?{address:t.transferTransaction?.fromWalletAddress}:null)||null;if(n==null)throw k.WalletMissing();return n.address},"getCurrentAddressOf");function M(e,t){let n=le(e,t),r=Object.keys(e.wallets).map(o=>({k:o,v:e.wallets[o]})).find(({v:o})=>o.address===n)||null,a=r?.k||null,i=r?.v||null,s=i?.walletType;if(i===null)throw k.AssertionFailed(`Wallet for source ${a} not passed: walletType: ${s}`);return i}l(M,"getRelatedWallet");function ce(e,t){try{return M(e,t)}catch{return null}}l(ce,"getRelatedWalletOrNull");var Tt=l((e,t,n,r)=>r?.find(i=>i.blockchain===e&&i.symbol?.toUpperCase()===t?.toUpperCase()&&i.address===n)?.usdPrice||null,"getUsdPrice");function wt(e,t){let n=new Ne(0);for(let r=0;r<e.fee.length;r++){let a=e.fee[r];if(a.expenseType==="DECREASE_FROM_OUTPUT")continue;let i=Tt(a.asset.blockchain,a.asset.symbol,a.asset.address,t);n=n.plus(new Ne(a.amount).multipliedBy(i||0))}return n}l(wt,"getUsdFeeOfStep");function mt(e,t,n,r,a,i){let s=t.result;if(!s)throw Error("Simulation result should not be null");return{creationTime:new Date().getTime().toString(),finishTime:null,requestId:t.requestId||"",inputAmount:e,wallets:n,status:"running",isPaused:!1,extraMessage:null,extraMessageSeverity:null,extraMessageDetail:null,extraMessageErrorCode:null,networkStatusExtraMessage:null,networkStatusExtraMessageDetail:null,lastNotificationTime:null,settings:r,simulationResult:s,validateBalanceOrFee:a,steps:t.result?.swaps?.map((o,u)=>({id:u+1,fromBlockchain:o.from.blockchain,fromBlockchainLogo:o.from.blockchainLogo,fromLogo:o.from.logo,fromSymbol:o.from.symbol,fromSymbolAddress:o.from.address,fromDecimals:o.from.decimals,fromAmountPrecision:o.fromAmountPrecision,fromAmountMinValue:o.fromAmountMinValue,fromAmountMaxValue:o.fromAmountMaxValue,fromAmountRestrictionType:o.fromAmountRestrictionType,toBlockchain:o.to.blockchain,toBlockchainLogo:o.to.blockchainLogo,toSymbol:o.to.symbol,toSymbolAddress:o.to.address,toDecimals:o.to.decimals,toLogo:o.to.logo,swapperId:o.swapperId,swapperLogo:o.swapperLogo,swapperType:o.swapperType,expectedOutputAmountHumanReadable:o.toAmount,outputAmount:"",feeInUsd:i?Re(wt(o,i?.tokens),null,8):null,estimatedTimeInSeconds:o.estimatedTimeInSeconds||null,status:"created",networkStatus:null,startTransactionTime:new Date().getTime(),externalTransactionId:null,executedTransactionId:null,executedTransactionTime:null,explorerUrl:null,diagnosisUrl:null,trackingCode:null,internalSteps:null,evmTransaction:null,evmApprovalTransaction:null,starknetTransaction:null,starknetApprovalTransaction:null,tronTransaction:null,tronApprovalTransaction:null,cosmosTransaction:null,solanaTransaction:null,transferTransaction:null,hasAlreadyProceededToSign:!1}))||[]}}l(mt,"calculatePendingSwap");import*as Pe from"@sentry/browser";function Ie(e,t,n,r){try{Pe.captureException(e,{tags:{requestId:t.requestId,rpc:!0,swapper:n?.swapperId||"",walletType:r||""},level:"warning"})}catch(a){console.log({e:a})}}l(Ie,"logRPCError");import{RangoClient as Et}from"rango-sdk";var z,I=l(()=>z||(z=new Et(se("API_KEY"),se("BASE_URL")),z),"httpService");var pe=null;function Z(){return{claimedBy:()=>pe?.id,setClaimer:e=>{pe={id:e}},reset:()=>{pe=null}}}l(Z,"claimQueue");var D={};function ee(){return{getTransactionDataByHash:e=>D[e]||{},setTransactionDataByHash:(e,t)=>{D[e]||(D[e]={}),D[e].response=t.response||D[e].response,D[e].receiptReceived=t.receiptReceived||D[e].receiptReceived||!1}}}l(ee,"useTransactionsData");function ge(e){let n=(e?.split(":")[0]||"").split("-"),r=n[n.length-1],a=n.slice(0,-1);return a[a.length-1]===r&&a.pop(),[a.join("-"),r]}l(ge,"splitWalletNetwork");var m=l(e=>e.steps.find(t=>t.status!=="failed"&&t.status!=="success")||null,"getCurrentStep"),te=l(e=>{let{evmTransaction:t,evmApprovalTransaction:n,cosmosTransaction:r,solanaTransaction:a,transferTransaction:i,starknetApprovalTransaction:s,starknetTransaction:o,tronApprovalTransaction:u,tronTransaction:c}=e;return t||n||r||a||i||s||o||u||c},"getCurrentStepTx"),ne=l((e,t)=>(e.transferTransaction=null,e.cosmosTransaction=null,e.evmTransaction=null,e.solanaTransaction=null,e.evmApprovalTransaction=null,e.starknetApprovalTransaction=null,e.starknetTransaction=null,e.tronApprovalTransaction=null,e.tronTransaction=null,_t(t)?t.isApprovalTx?e.evmApprovalTransaction=t:e.evmTransaction=t:yt(t)?e.cosmosTransaction=t:ht(t)?e.solanaTransaction=t:Nt(t)?e.transferTransaction=t:Rt(t)?t.isApprovalTx?e.starknetApprovalTransaction=t:e.starknetTransaction=t:Ct(t)&&(t.isApprovalTx?e.tronApprovalTransaction=t:e.tronTransaction=t),e),"setCurrentStepTx"),fe=l(e=>te(e)?.type,"getCurrentStepTxType"),vt=l(e=>{let{evmApprovalTransaction:t,starknetApprovalTransaction:n,tronApprovalTransaction:r}=e;return!!(t||n||r)},"isApprovalCurrentStepTx");function R({getStorage:e,setStorage:t,nextStatus:n,nextStepStatus:r,message:a,details:i,errorCode:s=null,hasAlreadyProceededToSign:o}){let u=e().swapDetails,c=m(u);if(r&&c&&(c.status=r),n&&(u.status=n),u.hasAlreadyProceededToSign=o,n&&["failed","success"].includes(n)&&(u.finishTime=new Date().getTime().toString()),(a||i)&&(u.extraMessage=a||"",u.extraMessageDetail=i||""),r&&["failed"].includes(r)){let g=i&&i.includes("Warning")?"Swap canceled by user.":i,p=ce(u,c)?.walletType;u.extraMessageSeverity="error",I().reportFailure({requestId:u.requestId,step:c?.id||1,eventType:he(s),reason:g||"",data:p?{wallet:p}:void 0}).then().catch()}else r&&["running"].includes(r)?u.extraMessageSeverity="info":r&&["success","approved"].includes(r)?u.extraMessageSeverity="success":r&&["waitingForApproval"].includes(r)&&(u.extraMessageSeverity="warning");return r==="running"&&c&&(c.startTransactionTime=new Date().getTime()),t({...e(),swapDetails:u}),{swap:u,step:c}}l(R,"updateSwapStatus");function Pt({getStorage:e,setStorage:t},n,r,a,i){let s=e().swapDetails;s.hasAlreadyProceededToSign=null;let o=m(s);o.executedTransactionId=n,o.executedTransactionTime=new Date().getTime().toString(),i?.url&&(o.explorerUrl=[...o.explorerUrl||[],{url:i.url,description:i.description||null}]),a==="check_tx_status"?(s.extraMessage="Checking transaction status ...",s.extraMessageDetail="",s.extraMessageSeverity="info"):a==="check_approve_tx_status"&&(s.extraMessage="Checking approve transaction status ...",s.extraMessageDetail="",s.extraMessageSeverity="info"),t({...e(),swapDetails:s}),a&&r({eventType:a,swap:s,step:o})}l(Pt,"setStepTransactionIds");function It({getStorage:e,setStorage:t},n,r){let a=e().swapDetails,i=m(a);if(!i)return;let s=new Date;a.lastNotificationTime=s.getTime().toString(),!(i.networkStatus==="waitingForConnectingWallet"&&a.networkStatusExtraMessage===n&&a.networkStatusExtraMessageDetail===r)&&(i.networkStatus="waitingForConnectingWallet",a.networkStatusExtraMessage=n,a.networkStatusExtraMessageDetail=r,t({...e(),swapDetails:a}))}l(It,"markRunningSwapAsWaitingForConnectingWallet");function Me({getStorage:e,setStorage:t}){let n=e().swapDetails,r=m(n);if(!r)return;let{type:a}=v(n),i=N(n,r),s=`Change ${a} wallet network to ${i}`,o=`Please change your ${a} wallet network to ${i}.`,u=new Date;return n.lastNotificationTime=u.getTime().toString(),r.networkStatus="waitingForNetworkChange",n.networkStatusExtraMessage=s,n.networkStatusExtraMessageDetail=o,t({...e(),swapDetails:n}),{swap:n,step:r}}l(Me,"markRunningSwapAsSwitchingNetwork");function De({getStorage:e,setStorage:t,notifier:n}){let r=e().swapDetails,a=m(r);if(a)return r.networkStatusExtraMessage="",r.networkStatusExtraMessageDetail="",a.networkStatus="waitingForQueue",n({eventType:"waiting_for_queue",swap:r,step:a}),t({...e(),swapDetails:r}),{swap:r,step:a}}l(De,"markRunningSwapAsDependsOnOtherQueues");function re(e){return new Promise(t=>setTimeout(t,e))}l(re,"delay");var Wt=l((e,t)=>e.wallets[t]?.walletType,"getSwapWalletType");function Mt(e){return e===null||e?.blockchains===null||e?.blockchains.length===0}l(Mt,"isWalletNull");function be(e,t){return t&&e[t]?e[t].size?e[t].get(xt.ETHEREUM):e[t]:null}l(be,"getEvmProvider");function v(e){let t=m(e),n=B(e,t);if(!n)return{type:null,network:null,address:null};let r=Wt(e,n),a=e.wallets[n];return{type:r||null,network:n,address:a?a.address:null}}l(v,"getRequiredWallet");async function Dt(e){try{return await e.request({method:"eth_chainId"})||e?.chainId}catch{return e?.chainId}}l(Dt,"getChainId");async function Oe(e,t,n,r,a){if(Mt(n))return!1;let i=B(e,t);if(!i)return!1;if(r.evmBasedChains.find(s=>s.name===i)){try{let s=e.wallets[i];if(s){let o=be(a,s.walletType),u=await Dt(o);if(u){let c=kt(u,Object.entries(r.blockchains).map(([,g])=>g));if(c&&c.toLowerCase()===i.toLowerCase())return!0;if(c&&c.toLowerCase()!==i.toLowerCase())return!1}}}catch(s){console.log(s)}return!1}return!0}l(Oe,"isNetworkMatchedForTransaction");var Be=l((e,t)=>(e.wallets[t.evmTransaction?.blockChain||""]||e.wallets[t.evmApprovalTransaction?.blockChain||""]||e.wallets[t.tronTransaction?.blockChain||""]||e.wallets[t.tronApprovalTransaction?.blockChain||""]||e.wallets[t.starknetTransaction?.blockChain||""]||e.wallets[t.starknetApprovalTransaction?.blockChain||""]||e.wallets[t.cosmosTransaction?.blockChain||""]||e.wallets[t.solanaTransaction?.blockChain||""]||t.transferTransaction?.fromWalletAddress||null)!==null,"isTxAlreadyCreated");function ae(e){let{getStorage:t,setStorage:n}=e,r=t().swapDetails,a=m(r);a?.networkStatus&&(a.networkStatus=null,n({...t(),swapDetails:r}))}l(ae,"resetNetworkStatus");function Ue(e,t={message:"",details:"",status:null}){let{message:n,details:r,status:a}=t,{getStorage:i,setStorage:s}=e,o=i().swapDetails,u=m(o);u?.networkStatus&&(o.networkStatusExtraMessage=n,o.networkStatusExtraMessageDetail=r,u.networkStatus=a,s({...i(),swapDetails:o}))}l(Ue,"updateNetworkStatus");function Fe(e,t){let{context:n,queue:r}=t,a=r.getStorage().swapDetails,{ok:i,reason:s}=Se(a,n.state);if(!i){let o=m(a);n.notifier({eventType:s==="account_miss_match"?"waiting_for_change_wallet_account":"waiting_for_connecting_wallet",swap:a,step:o}),It({getStorage:r.getStorage.bind(r),setStorage:r.setStorage.bind(r)},Ae,e.reason.description);return}r.unblock()}l(Fe,"onBlockForConnectWallet");function Qe(e,t){let{context:n,queue:r}=t,a=r.getStorage().swapDetails;if(!m(a)||a.status!=="running")return;let s=Me({getStorage:r.getStorage.bind(r),setStorage:r.setStorage.bind(r)});s&&n.notifier({eventType:"waiting_for_network_change",swap:s.swap,step:s.step});let{type:o,network:u}=v(a);if(o&&u&&n.canSwitchNetworkTo(o,u)){let c=n.switchNetwork(o,u);c&&c.then(()=>{r.unblock()}).catch(g=>{console.log({error:g})})}}l(Qe,"onBlockForChangeNetwork");function Le(e,t){let{getBlockedTasks:n,forceExecute:r,queue:a,manager:i,context:s}=t,{setClaimer:o,claimedBy:u,reset:c}=Z(),g=n().filter(x=>x.reason.reason==="depends_on_other_queues");if(g.length===0)return;let p=u(),d=!!p;if(p===a.id)return;if(d){De({getStorage:a.getStorage.bind(a),setStorage:a.setStorage.bind(a),notifier:s.notifier});return}let f=g.find(x=>x.queue_id===t.queue_id);f||(f=g[0]),o(f.queue_id);let A=f.storage.get(),{type:S,network:T,address:w}=v(A.swapDetails);r(f.queue_id,{claimedBy:u(),resetClaimedBy:()=>{c(),we(`${S}-${T}:${w}`,s.notifier,i,s.canSwitchNetworkTo)}})}l(Le,"onDependsOnOtherQueues");function Se(e,t){let{type:n,address:r}=v(e);if(!n||!r)return{ok:!1,reason:"not_connected"};let a=t(n),{accounts:i,connected:s}=a,o=i||[];return s?{ok:o.some(c=>{let{address:g}=At(c);return r.toLocaleLowerCase()===g.toLocaleLowerCase()}),reason:"account_miss_match"}:{ok:!1,reason:"not_connected"}}l(Se,"isRequiredWalletConnected");function He(e){let{setTransactionDataByHash:t}=ee(),{getStorage:n,setStorage:r,failed:a,next:i,schedule:s,context:o}=e,{meta:u,getSigners:c,notifier:g,isMobileWallet:p}=o,d=n().swapDetails,f=m(d),A=M(d,f),S=p(A?.walletType),T=le(d,f),w=c(A.walletType),x=N(d,f),E=l(()=>{e.context.resetClaimedBy&&e.context.resetClaimedBy()},"onFinish"),_=te(f),y=_?.type,h=vt(f),b=[ue.EVM,ue.STARKNET,ue.TRON].includes(y),W=typeof d.hasAlreadyProceededToSign=="boolean",L,H,q,G,K;h?(G=`Waiting for approval of ${f?.fromSymbol} coin ${S?"on your mobile phone!":""}`,K="Waiting for approve transaction to be mined and confirmed successfully",H="waitingForApproval",L=void 0,q="confirm_approve_contract"):W?(G="Transaction is expired. Please try again.",H="failed",L="failed",K="",q="transaction_expired"):(G="Executing transaction ...",H="running",L="running",K=`${S?"Check your mobile phone!":""}`,q=b?"calling_smart_contract":"confirm_transfer");let nt=R({getStorage:n,setStorage:r,nextStepStatus:H,nextStatus:L,message:G,details:K,hasAlreadyProceededToSign:h?void 0:W,errorCode:W?"TX_EXPIRED":void 0});if(g({eventType:q,...nt}),W){a(),E();return}w.getSigner(y).signAndSendTx(_,T,null).then(({hash:C,response:X})=>{let $=F(C,x,u.blockchains);Pt(e,C,g,h?"check_approve_tx_status":"check_tx_status",$?{url:$,description:h?"Approve":"Swap"}:void 0),X&&t(C,{response:X}),s("CHECK_TRANSACTION_STATUS"),i(),E()},C=>{if(d.status==="failed")return;let{extraMessage:X,extraMessageDetail:$,extraMessageErrorCode:ke}=P(C);C&&C?.root&&C?.root?.message&&C?.root?.code&&C?.root?.reason&&Ie(C.root,d,f,A?.walletType);let rt=R({getStorage:n,setStorage:r,nextStatus:"failed",nextStepStatus:"failed",message:X,details:$,errorCode:ke});g({eventType:ke==="REJECTED_BY_USER"?"contract_rejected":b?"smart_contract_call_failed":"transfer_failed",...rt}),a(),E()})}l(He,"singTransaction");function qe(e){let{wallet_network:t,evmChains:n,manager:r}=e,[a,i]=ge(t);n.some(s=>s.name==i)&&r?.getAll().forEach(s=>{let o=s.list.getStorage(),u=o?.swapDetails;if(u&&u.status==="running"){let c=m(u);if(c){let g=o?.swapDetails.wallets[c.fromBlockchain]?.walletType,p=Object.keys(s.list.state.tasks).some(d=>{let f=s.list.state.tasks[d];return f.status===de.BLOCKED&&["waiting_for_connecting_wallet"].includes(f.blockedFor?.reason)});if(g===a&&p&&B(u,c)!=i){let d=s.list,{type:f}=v(u),A=J(f);s.list.block({reason:{reason:"waiting_for_network_change",description:A},silent:!0});let S=Me({getStorage:d.getStorage.bind(d),setStorage:d.setStorage.bind(d)});S&&e?.notifier({eventType:"waiting_for_network_change",swap:S.swap,step:S.step})}}}})}l(qe,"checkWaitingForConnectWalletChange");function Te(e){e?.getAll().forEach(t=>{if(Object.keys(t.list.state.tasks).some(r=>{let a=t.list.state.tasks[r];return a.status===de.BLOCKED&&["waiting_for_network_change","depends_on_other_queues"].includes(a.blockedFor?.reason)})){let r=t.list.getStorage()?.swapDetails;if(r.status==="running"){let{type:a}=v(r),i=V(a);t.list.block({reason:{reason:"waiting_for_connecting_wallet",description:i}})}}})}l(Te,"checkWaitingForNetworkChange");function bt(e){let t=e?.getAll()||new Map,n=[];return t.forEach(r=>{let i=r.list.getStorage()?.swapDetails;!i||i.status!=="running"||n.push(i)}),n}l(bt,"getRunningSwaps");function Ot(e,t){e.forEach(n=>{let r=m(n),a;r?.networkStatus==="waitingForQueue"?a="waiting_for_queue":n?.status==="running"&&(a="waiting_for_connecting_wallet"),a&&t&&t({eventType:a,swap:n,step:r})})}l(Ot,"resetRunningSwapNotifsOnPageLoad");function we(e,t,n,r,a={fallbackToOnlyWallet:!0}){let[i,s]=ge(e);if(!i||!s)return;let o=[],u=[];n?.getAll().forEach(g=>{if(g.status===de.BLOCKED){let p=g.list.getStorage(),d=p?.swapDetails;if(d&&d.status==="running"){let f=m(d);f&&(B(d,f)==s&&p?.swapDetails.wallets[s]?.walletType===i?o.push(g.list):p?.swapDetails.wallets[f.fromBlockchain]?.walletType===i&&u.push(g.list))}}});let c;if(o.length>0){if(c=o[0],o.length>1)for(let g=1;g<o.length;g++){let p=o[g];De({getStorage:p.getStorage.bind(p),setStorage:p.setStorage.bind(p),notifier:t})}}else u.length>0&&a.fallbackToOnlyWallet&&(c=u[0]);r?.(i,s)?c?.checkBlock():c?.unblock()}l(we,"retryOn");function Ge(e){return!!e.evmTransaction||!!e.evmApprovalTransaction}l(Ge,"isNeedBlockQueueForParallel");async function Ke(e){let t=await e;if(!t.ok||!t.transaction)throw k.CreateTransaction(t.error||"bad response from create tx endpoint");return t}l(Ke,"throwOnOK");function Bt(e,t){let{reset:n}=Z();e.actions.cancel();let r=R({getStorage:e.actions.getStorage,setStorage:e.actions.setStorage,message:"Swap canceled by user.",details:"Warning: If you've already signed and sent a transaction, it won't be affected, but next swap steps will not be executed.",nextStatus:"failed",nextStepStatus:"failed",errorCode:"USER_CANCEL"});return n(),t&&t?.retry(),r}l(Bt,"cancelSwap");var Xe=5e3;async function Ut({getStorage:e,setStorage:t,next:n,schedule:r,retry:a,failed:i,context:s}){let o=e().swapDetails,{meta:u}=s,c=m(o);if(!c?.executedTransactionId)return;let g=c.executedTransactionId,p=!1,d=null,f=null,{getTransactionDataByHash:A,setTransactionDataByHash:S}=ee();try{let E=fe(c),_=M(o,c);E&&_&&(f=s.getSigners(_.walletType).getSigner(E))}catch{}try{let{response:E,receiptReceived:_}=A(g);if(f?.wait&&!_){let{hash:y,response:h}=await f.wait(g,E);if(y!==g){c.executedTransactionId=y||c.executedTransactionId;let b=N(o,c),W=F(c.executedTransactionId,b,u.blockchains);W&&c.explorerUrl&&c.explorerUrl?.length>=1&&(c.explorerUrl[c.explorerUrl.length-1]={url:W,description:"Replaced Swap"}),g=c.executedTransactionId,y&&h&&S(y,{response:h})}else S(y,{receiptReceived:!0})}}catch(E){let{extraMessage:_,extraMessageDetail:y,extraMessageErrorCode:h}=P(E),b=R({getStorage:e,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",message:_,details:y,errorCode:h});s?.notifier({eventType:"task_failed",...b}),p=!0}try{d=await I().checkStatus({requestId:o.requestId,txId:g,step:c.id})}catch{await re(Xe),a();return}if(p)return i();if(c?.status==="failed")return;let T=d?.outputAmount||(c.outputAmount?c.outputAmount:null),w=c.outputAmount||null;o.extraMessage=d?.extraMessage||o.extraMessage,o.extraMessageSeverity="info",o.extraMessageDetail="",c.status=d?.status||c.status,c.diagnosisUrl=d?.diagnosisUrl||c.diagnosisUrl||null,c.outputAmount=T||c.outputAmount,c.explorerUrl=d?.explorerUrl||c.explorerUrl,c.internalSteps=d?.steps||null;let x=d?.newTx;if(x&&(c.status="created",c.executedTransactionId=null,c.executedTransactionTime=null,ne(c,x)),w===null&&T!==null?s.notifier({eventType:"step_completed_with_output",swap:o,step:c}):w===null&&T===null&&s.notifier({eventType:"check_tx_status",swap:o,step:c}),c.status==="success"){let E=ve(o,c);o.extraMessageDetail="",o.extraMessage=E?`starting next step: ${E.swapperId}: ${E.fromBlockchain} -> ${E.toBlockchain}`:""}else c.status==="failed"&&(o.extraMessage="Transaction failed in blockchain",o.extraMessageSeverity="error",o.extraMessageDetail=d?.extraMessage||"",o.status="failed",o.finishTime=new Date().getTime().toString());t({...e(),swapDetails:o}),d?.status==="failed"?i():d?.status==="success"||d?.status==="running"&&d.newTx?(r("SCHEDULE_NEXT_STEP"),n()):(await re(Xe),a())}l(Ut,"checkTransactionStatus");async function Ft({getStorage:e,setStorage:t,next:n,schedule:r,retry:a,failed:i,context:s}){let o=e().swapDetails,{meta:u}=s,{getTransactionDataByHash:c,setTransactionDataByHash:g}=ee(),p=m(o);if(!p){console.log("ignore check status, current step is null");return}if(!p?.executedTransactionId)return;let d=p.executedTransactionId,f=null;try{let S=fe(p),T=M(o,p);S&&T&&(f=s.getSigners(T.walletType).getSigner(S))}catch{}try{let{response:S,receiptReceived:T}=c(d);if(f?.wait&&!T){let{hash:w,response:x}=await f.wait(d,S);if(w!==d){p.executedTransactionId=w||p.executedTransactionId;let E=N(o,p),_=F(p.executedTransactionId,E,u.blockchains);_&&p.explorerUrl&&p.explorerUrl?.length>=1&&(p.explorerUrl[p.explorerUrl.length-1]={url:_,description:"Replaced Approve"}),d=p.executedTransactionId,w&&x&&g(w,{response:x})}else g(w,{receiptReceived:!0})}}catch(S){let{extraMessage:T,extraMessageDetail:w,extraMessageErrorCode:x}=P(S),E=R({getStorage:e,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",message:T,details:w,errorCode:x});return s?.notifier({eventType:"task_failed",...E}),i()}let A=!1;try{let S=await I().checkApproval(o.requestId,p.executedTransactionId);if(p?.status==="failed")return;if(A=S.isApproved,!A&&(S.txStatus==="failed"||S.txStatus==="success")){let T,w;S.txStatus==="failed"?(T="Approve transaction failed",w="Smart contract approval tx failed in blockchain."):(T="Not enough approval",S.requiredApprovedAmount&&S.currentApprovedAmount?w=`Required approval: ${S.requiredApprovedAmount}, current approval: ${S.currentApprovedAmount}`:w="You still don't have enough approval for this swap.");let x=R({getStorage:e,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",errorCode:"INSUFFICIENT_APPROVE",message:T,details:w});s.notifier({eventType:"not_enough_approval",...x}),i()}else A||s.notifier({eventType:"check_approve_tx_status",swap:o,step:p})}catch{A=!1}A?(p.status="approved",o.extraMessage=`Spending ${p.fromSymbol} approved successfully.`,o.extraMessageDetail=null,o.extraMessageSeverity="success",p.evmApprovalTransaction=null,p.executedTransactionId=null,p.executedTransactionTime=null,p.starknetApprovalTransaction=null,p.tronApprovalTransaction=null,t({...e(),swapDetails:o}),s.notifier({eventType:"contract_confirmed",swap:o,step:p}),r("SCHEDULE_NEXT_STEP"),n()):(await re(2e3),a())}l(Ft,"checkApprovalStatus");async function $e(e){let t=e.getStorage().swapDetails,n=m(t);if(!n){console.log("ignore check status, current step is null",t.requestId);return}ae(e),n.status==="running"?await Ut(e):n.status==="waitingForApproval"&&await Ft(e)}l($e,"checkStatus");async function Ve(e){let{setStorage:t,getStorage:n,next:r,schedule:a,context:i}=e,s=n().swapDetails,o=m(s);if(!te(o)){let c={requestId:s.requestId,step:o.id,userSettings:{slippage:s.settings.slippage,infiniteApprove:s.settings.infiniteApprove},validations:{balance:s.validateBalanceOrFee,fee:s.validateBalanceOrFee}};try{let{transaction:g}=await Ke(I().createTransaction(c));g&&ne(o,g),t({...n(),swapDetails:s}),a("EXECUTE_TRANSACTION"),r()}catch(g){s.status="failed",s.finishTime=new Date().getTime().toString();let{extraMessage:p,extraMessageDetail:d}=P(g),f=R({getStorage:n,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",message:p,details:d,errorCode:"FETCH_TX_FAILED"});i.notifier({eventType:"task_failed",...f}),e.failed()}}}l(Ve,"createTransaction");async function Je(e){let{getStorage:t,context:n}=e,{meta:r,wallets:a,providers:i}=n,{claimedBy:s}=Z(),o=n.claimedBy===n._queue?.id,u=l(T=>{e.block(T),o&&e.context.resetClaimedBy&&e.context.resetClaimedBy()},"requestBlock"),c=t().swapDetails,g=m(c);if(ae(e),!Se(c,n.state).ok){let{type:T,address:w}=v(c),x=a?.blockchains?.find(y=>!y.accounts?.find(h=>h.walletType===T)),E=!a||x?V(T):_e(T,w),_={reason:"waiting_for_connecting_wallet",description:E};u(_);return}let d=await Oe(c,g,a,r,i);if(!!s()&&!o&&!d){let T=ie,w={reason:"depends_on_other_queues",details:T};u(w);return}else if(d)Ue(e,{message:"",details:"Wallet network changed successfully",status:"networkChanged"});else{let T=N(c,g),w=J(T),x={reason:"waiting_for_network_change",details:w};u(x);return}if(Ge(g)&&!o){let T={reason:"depends_on_other_queues",description:ie,details:{}};u(T);return}He(e)}l(Je,"executeTransaction");function Ye({schedule:e,next:t,failed:n,setStorage:r,getStorage:a,context:i}){let s=a().swapDetails,o=m(s),u=s.steps.find(c=>c.status==="failed");if(o&&!u){if(Be(s,o))return e("EXECUTE_TRANSACTION"),t();if(o?.executedTransactionId)return e("CHECK_TRANSACTION_STATUS"),t();s.status="running",r({...a(),swapDetails:s}),e("CREATE_TRANSACTION"),t()}else s.status=u?"failed":"success",s.finishTime=new Date().getTime().toString(),r({...a(),swapDetails:s}),i.notifier({eventType:u?"task_failed":"task_completed",swap:s,step:null}),u?n():t()}l(Ye,"scheduleNextStep");function je({schedule:e,next:t}){e("SCHEDULE_NEXT_STEP"),t()}l(je,"start");var ze={name:"swap",actions:{["START"]:je,["SCHEDULE_NEXT_STEP"]:Ye,["CREATE_TRANSACTION"]:Ve,["EXECUTE_TRANSACTION"]:Je,["CHECK_TRANSACTION_STATUS"]:$e},run:["START"],whenTaskBlocked:(e,t)=>{e.reason.reason==="waiting_for_connecting_wallet"?Fe(e,t):e.reason.reason==="waiting_for_network_change"?Qe(e,t):e.reason.reason==="depends_on_other_queues"&&Le(e,t)}};import{useManager as Gt}from"@rango-dev/queue-manager-react";import{useEffect as Ee,useState as Kt}from"react";import{Persistor as Qt,Status as Q,DB_NAME as Lt}from"@rango-dev/queue-manager-core";import{v4 as Ht}from"uuid";var Ze="migratedToQueueManager";function me(){return!!window.localStorage.getItem(Ze)}l(me,"migrated");async function qt(){try{return(await window.indexedDB.databases()).map(e=>e.name).includes(Lt)}catch{return!1}}l(qt,"hasQueueManagerOnIDB");async function et(){let e=window.localStorage.getItem("pendingSwaps"),t=await qt();if(!e||me()||t)return!0;let n=JSON.parse(e),r=[];n.forEach(s=>{if(s.status==="running"){let o=Ht(),u={id:s.requestId,createdAt:Number(s.creationTime),name:"swap",status:Q.RUNNING,storage:{swapDetails:s},state:{status:Q.RUNNING,activeTaskIndex:0,tasks:{[o]:{blockedFor:null,status:Q.RUNNING}}},tasks:[{id:o,action:"SCHEDULE_NEXT_STEP"}]};r.push(u)}else{let o=s.status==="success"?Q.SUCCESS:Q.FAILED,u={id:s.requestId,createdAt:Number(s.creationTime),name:"swap",status:o,storage:{swapDetails:s},state:{status:o,activeTaskIndex:0,tasks:{}},tasks:[]};r.push(u)}});let a=new Qt,i=r.map(s=>a.insertQueue(s));return await Promise.all(i),window.localStorage.setItem(Ze,"1"),!0}l(et,"migration");var tt=0;function Xt(){let e=me(),[t,n]=Kt(e);return Ee(()=>{(async()=>tt||(tt=1,et().finally(()=>{n(!0)})))()},[]),{status:t}}l(Xt,"useMigration");function $t(e){let{manager:t}=Gt();Ee(()=>{e.lastConnectedWallet&&(qe({evmChains:e.evmChains,wallet_network:e.lastConnectedWallet,manager:t,notifier:e.notifier}),we(e.lastConnectedWallet,e.notifier,t,e.canSwitchNetworkTo))},[e.lastConnectedWallet]),Ee(()=>{e.disconnectedWallet&&(Te(t),e.clearDisconnectedWallet())},[e.disconnectedWallet])}l($t,"useQueueManager");function ra(e){return xe(e),ze}l(ra,"makeQueueDefinition");export{j as MessageSeverity,Y as PendingSwapNetworkStatus,k as PrettyError,mt as calculatePendingSwap,Bt as cancelSwap,Te as checkWaitingForNetworkChange,B as getCurrentBlockchainOfOrNull,m as getCurrentStep,be as getEvmProvider,M as getRelatedWallet,ce as getRelatedWalletOrNull,v as getRequiredWallet,bt as getRunningSwaps,ra as makeQueueDefinition,P as prettifyErrorMessage,Ot as resetRunningSwapNotifsOnPageLoad,ge as splitWalletNetwork,R as updateSwapStatus,Xt as useMigration,$t as useQueueManager};
|
|
1
|
+
var at=Object.defineProperty;var l=(e,t)=>at(e,"name",{value:t,configurable:!0});var ot="c6381a79-2817-4602-83bf-6a641a409e32",oe={API_KEY:ot};function se(e){return oe[e]||""}l(se,"getConfig");function xe(e){let t;return typeof structuredClone=="function"?t=structuredClone(e):t=JSON.parse(JSON.stringify(e)),oe=t,oe}l(xe,"initConfig");import{getBlockChainNameFromId as kt,Networks as xt}from"@rango-dev/wallets-shared";import{readAccountAddress as At}from"@rango-dev/wallets-core";import{TransactionType as ue,isEvmTransaction as _t,isCosmosTransaction as yt,isSolanaTransaction as ht,isTronTransaction as Ct,isStarknetTransaction as Rt,isTransferTransaction as Nt}from"rango-sdk";var ie="Waiting for other swaps to complete",Ae="Waiting for connecting wallet",_e=l((e,t)=>`Please change your ${e||"wallet"} account to ${t||"proper address"}`,"ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET"),V=l(e=>`Please connect to ${e||"your wallet"} by using bellow button or top right button on page.`,"ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION"),J=l(e=>`Please change your network to ${e}.`,"ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK");import{Status as de}from"@rango-dev/queue-manager-core";import{SignerErrorCode as O,SignerError as st,isSignerErrorCode as it,isAPIErrorCode as lt}from"rango-types";var ct="Assertion failed (Unexpected behaviour)",ut="Create transaction failed in Rango Server",ye="Input wallet not found",k=class extends Error{constructor(n,r,a,i){super(r);this._isPrettyError=!0;Object.setPrototypeOf(this,k.prototype),k.prototype._isPrettyError=!0,this.code=n,this.detail=i,this.root=a}static isPrettyError(n){return n instanceof k||Object.prototype.hasOwnProperty.call(n,"_isPrettyError")}getErrorDetail(){let n=typeof this.root=="object"&&this.root&&this.root.error?this.root.error:JSON.stringify(this.root),r=typeof this.root=="string"?this.root:this.root instanceof Error?this.root.message:n;return{extraMessage:this.message,extraMessageDetail:this.detail||r,extraMessageErrorCode:this.code||null}}static AssertionFailed(n){return new k("CLIENT_UNEXPECTED_BEHAVIOUR",ct,n)}static BadStatusCode(n,r){return new k("TX_FAIL",n,null,`status code = ${r}`)}static CreateTransaction(n){return new k("FETCH_TX_FAILED",ut,null,n)}static WalletMissing(){return new k("CLIENT_UNEXPECTED_BEHAVIOUR",ye,null,"Server requested for a blockchain or address not selected by user")}static BlockchainMissing(){return new k("CLIENT_UNEXPECTED_BEHAVIOUR",ye,null,"Server requested for a blockchain or address not selected by user")}};l(k,"PrettyError");function he(e){let t="CLIENT_UNEXPECTED_BEHAVIOUR";try{return e?lt(e)?e:it(e)?{[O.REJECTED_BY_USER]:"USER_REJECT",[O.SIGN_TX_ERROR]:"CALL_WALLET_FAILED",[O.SEND_TX_ERROR]:"SEND_TX_FAILED",[O.NOT_IMPLEMENTED]:t,[O.OPERATION_UNSUPPORTED]:t,[O.UNEXPECTED_BEHAVIOUR]:t}[e]:t:t}catch{return t}}l(he,"mapAppErrorCodesToAPIErrorCode");var P=l(e=>{if(!e)return{extraMessage:"",extraMessageErrorCode:null};if(k.isPrettyError(e))return e.getErrorDetail();if(st.isSignerError(e)){let t=e.getErrorDetail();return{extraMessage:t.message,extraMessageDetail:t.detail,extraMessageErrorCode:t.code}}return e instanceof Error?{extraMessage:e.toString(),extraMessageErrorCode:null}:typeof e!="string"?{extraMessage:JSON.stringify(e),extraMessageErrorCode:null}:{extraMessage:e,extraMessageErrorCode:null}},"prettifyErrorMessage");import Ne from"bignumber.js";import Ce from"bignumber.js";var Re=l((e,t=null,n=null)=>{if(e===null||e==="")return"";let r=new Ce(e),a=1,i=1e3;for(let s=0;s<60;s++)if(new Ce(r.toFixed(s,a)).eq(r)){i=s;break}if(r.gte(1e4))return r.toFormat(0,a);if(r.gte(1e3)||r.gte(100))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,1))),a);if(r.gte(1))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,2))),a);if(r.gte(.01))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,4))),a);for(let s=t||4;s<17;s++)if(r.gte(Math.pow(10,-s)))return r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,s))),a);return r.isEqualTo(0)?"0":r.toFormat(Math.min(i,Math.min(n||100,Math.max(t||0,8))),a)},"numberToString");import{isCosmosBlockchain as pt,isEvmBlockchain as dt,isStarknetBlockchain as gt,isTronBlockchain as ft}from"rango-types";var Y=(a=>(a.WaitingForConnectingWallet="waitingForConnectingWallet",a.WaitingForQueue="waitingForQueue",a.WaitingForNetworkChange="waitingForNetworkChange",a.NetworkChanged="networkChanged",a))(Y||{}),j=(a=>(a.error="error",a.warning="warning",a.info="info",a.success="success",a))(j||{}),B=l((e,t)=>{try{return N(e,t)}catch{return null}},"getCurrentBlockchainOfOrNull"),N=l((e,t)=>{let n=t.evmTransaction?.blockChain||t.evmApprovalTransaction?.blockChain||t.starknetTransaction?.blockChain||t.starknetApprovalTransaction?.blockChain||t.tronTransaction?.blockChain||t.tronApprovalTransaction?.blockChain||t.cosmosTransaction?.blockChain||t.solanaTransaction?.blockChain;if(n)return n;let r=t.transferTransaction?.fromWalletAddress;if(!r)throw k.BlockchainMissing();let a=Object.keys(e.wallets).find(i=>e.wallets[i]?.address===r)||null;if(a==null)throw k.BlockchainMissing();return a},"getCurrentBlockchainOf"),St=l(e=>{if(pt(e))return e.info?.explorerUrlToTx;if(dt(e)||gt(e)||ft(e))return e.info.transactionUrl},"getBlockchainMetaExplorerBaseUrl"),F=l((e,t,n)=>{let r=n[t],a=St(r);if(a)return a.indexOf("/{txHash}")!==-1?a.replace("{txHash}",e?.toLowerCase()):`${a}/${e?.toLowerCase()}`},"getScannerUrl");function ve(e,t){return e.steps.find(n=>n.status!=="failed"&&n.status!=="success"&&n.id!==t.id)||null}l(ve,"getNextStep");var le=l((e,t)=>{let n=e.wallets[t.evmTransaction?.blockChain||""]||e.wallets[t.evmApprovalTransaction?.blockChain||""]||e.wallets[t.tronTransaction?.blockChain||""]||e.wallets[t.tronApprovalTransaction?.blockChain||""]||e.wallets[t.starknetTransaction?.blockChain||""]||e.wallets[t.starknetApprovalTransaction?.blockChain||""]||e.wallets[t.cosmosTransaction?.blockChain||""]||e.wallets[t.solanaTransaction?.blockChain||""]||(t.transferTransaction?.fromWalletAddress?{address:t.transferTransaction?.fromWalletAddress}:null)||null;if(n==null)throw k.WalletMissing();return n.address},"getCurrentAddressOf");function M(e,t){let n=le(e,t),r=Object.keys(e.wallets).map(o=>({k:o,v:e.wallets[o]})).find(({v:o})=>o.address===n)||null,a=r?.k||null,i=r?.v||null,s=i?.walletType;if(i===null)throw k.AssertionFailed(`Wallet for source ${a} not passed: walletType: ${s}`);return i}l(M,"getRelatedWallet");function ce(e,t){try{return M(e,t)}catch{return null}}l(ce,"getRelatedWalletOrNull");var Tt=l((e,t,n,r)=>r?.find(i=>i.blockchain===e&&i.symbol?.toUpperCase()===t?.toUpperCase()&&i.address===n)?.usdPrice||null,"getUsdPrice");function wt(e,t){let n=new Ne(0);for(let r=0;r<e.fee.length;r++){let a=e.fee[r];if(a.expenseType==="DECREASE_FROM_OUTPUT")continue;let i=Tt(a.asset.blockchain,a.asset.symbol,a.asset.address,t);n=n.plus(new Ne(a.amount).multipliedBy(i||0))}return n}l(wt,"getUsdFeeOfStep");function mt(e,t,n,r,a,i){let s=t.result;if(!s)throw Error("Simulation result should not be null");return{creationTime:new Date().getTime().toString(),finishTime:null,requestId:t.requestId||"",inputAmount:e,wallets:n,status:"running",isPaused:!1,extraMessage:null,extraMessageSeverity:null,extraMessageDetail:null,extraMessageErrorCode:null,networkStatusExtraMessage:null,networkStatusExtraMessageDetail:null,lastNotificationTime:null,settings:r,simulationResult:s,validateBalanceOrFee:a,steps:t.result?.swaps?.map((o,u)=>({id:u+1,fromBlockchain:o.from.blockchain,fromBlockchainLogo:o.from.blockchainLogo,fromLogo:o.from.logo,fromSymbol:o.from.symbol,fromSymbolAddress:o.from.address,fromDecimals:o.from.decimals,fromAmountPrecision:o.fromAmountPrecision,fromAmountMinValue:o.fromAmountMinValue,fromAmountMaxValue:o.fromAmountMaxValue,fromAmountRestrictionType:o.fromAmountRestrictionType,toBlockchain:o.to.blockchain,toBlockchainLogo:o.to.blockchainLogo,toSymbol:o.to.symbol,toSymbolAddress:o.to.address,toDecimals:o.to.decimals,toLogo:o.to.logo,swapperId:o.swapperId,swapperLogo:o.swapperLogo,swapperType:o.swapperType,expectedOutputAmountHumanReadable:o.toAmount,outputAmount:"",feeInUsd:i?Re(wt(o,i?.tokens),null,8):null,estimatedTimeInSeconds:o.estimatedTimeInSeconds||null,status:"created",networkStatus:null,startTransactionTime:new Date().getTime(),externalTransactionId:null,executedTransactionId:null,executedTransactionTime:null,explorerUrl:null,diagnosisUrl:null,trackingCode:null,internalSteps:null,evmTransaction:null,evmApprovalTransaction:null,starknetTransaction:null,starknetApprovalTransaction:null,tronTransaction:null,tronApprovalTransaction:null,cosmosTransaction:null,solanaTransaction:null,transferTransaction:null,hasAlreadyProceededToSign:!1}))||[]}}l(mt,"calculatePendingSwap");import*as Pe from"@sentry/browser";function Ie(e,t,n,r){try{Pe.captureException(e,{tags:{requestId:t.requestId,rpc:!0,swapper:n?.swapperId||"",walletType:r||""},level:"warning"})}catch(a){console.log({e:a})}}l(Ie,"logRPCError");import{RangoClient as Et}from"rango-sdk";var z,I=l(()=>z||(z=new Et(se("API_KEY"),se("BASE_URL")),z),"httpService");var pe=null;function Z(){return{claimedBy:()=>pe?.id,setClaimer:e=>{pe={id:e}},reset:()=>{pe=null}}}l(Z,"claimQueue");var D={};function ee(){return{getTransactionDataByHash:e=>D[e]||{},setTransactionDataByHash:(e,t)=>{D[e]||(D[e]={}),D[e].response=t.response||D[e].response,D[e].receiptReceived=t.receiptReceived||D[e].receiptReceived||!1}}}l(ee,"useTransactionsData");function ge(e){let n=(e?.split(":")[0]||"").split("-"),r=n[n.length-1],a=n.slice(0,-1);return a[a.length-1]===r&&a.pop(),[a.join("-"),r]}l(ge,"splitWalletNetwork");var m=l(e=>e.steps.find(t=>t.status!=="failed"&&t.status!=="success")||null,"getCurrentStep"),te=l(e=>{let{evmTransaction:t,evmApprovalTransaction:n,cosmosTransaction:r,solanaTransaction:a,transferTransaction:i,starknetApprovalTransaction:s,starknetTransaction:o,tronApprovalTransaction:u,tronTransaction:c}=e;return t||n||r||a||i||s||o||u||c},"getCurrentStepTx"),ne=l((e,t)=>(e.transferTransaction=null,e.cosmosTransaction=null,e.evmTransaction=null,e.solanaTransaction=null,e.evmApprovalTransaction=null,e.starknetApprovalTransaction=null,e.starknetTransaction=null,e.tronApprovalTransaction=null,e.tronTransaction=null,_t(t)?t.isApprovalTx?e.evmApprovalTransaction=t:e.evmTransaction=t:yt(t)?e.cosmosTransaction=t:ht(t)?e.solanaTransaction=t:Nt(t)?e.transferTransaction=t:Rt(t)?t.isApprovalTx?e.starknetApprovalTransaction=t:e.starknetTransaction=t:Ct(t)&&(t.isApprovalTx?e.tronApprovalTransaction=t:e.tronTransaction=t),e),"setCurrentStepTx"),fe=l(e=>te(e)?.type,"getCurrentStepTxType"),vt=l(e=>{let{evmApprovalTransaction:t,starknetApprovalTransaction:n,tronApprovalTransaction:r}=e;return!!(t||n||r)},"isApprovalCurrentStepTx");function R({getStorage:e,setStorage:t,nextStatus:n,nextStepStatus:r,message:a,details:i,errorCode:s=null,hasAlreadyProceededToSign:o}){let u=e().swapDetails,c=m(u);if(r&&c&&(c.status=r),n&&(u.status=n),u.hasAlreadyProceededToSign=o,n&&["failed","success"].includes(n)&&(u.finishTime=new Date().getTime().toString()),(a||i)&&(u.extraMessage=a||"",u.extraMessageDetail=i||""),r&&["failed"].includes(r)){let g=i&&i.includes("Warning")?"Swap canceled by user.":i,p=ce(u,c)?.walletType;u.extraMessageSeverity="error",I().reportFailure({requestId:u.requestId,step:c?.id||1,eventType:he(s),reason:g||"",data:p?{wallet:p}:void 0}).then().catch()}else r&&["running"].includes(r)?u.extraMessageSeverity="info":r&&["success","approved"].includes(r)?u.extraMessageSeverity="success":r&&["waitingForApproval"].includes(r)&&(u.extraMessageSeverity="warning");return r==="running"&&c&&(c.startTransactionTime=new Date().getTime()),t({...e(),swapDetails:u}),{swap:u,step:c}}l(R,"updateSwapStatus");function Pt({getStorage:e,setStorage:t},n,r,a,i){let s=e().swapDetails;s.hasAlreadyProceededToSign=null;let o=m(s);o.executedTransactionId=n,o.executedTransactionTime=new Date().getTime().toString(),i?.url&&(o.explorerUrl=[...o.explorerUrl||[],{url:i.url,description:i.description||null}]),a==="check_tx_status"?(s.extraMessage="Checking transaction status ...",s.extraMessageDetail="",s.extraMessageSeverity="info"):a==="check_approve_tx_status"&&(s.extraMessage="Checking approve transaction status ...",s.extraMessageDetail="",s.extraMessageSeverity="info"),t({...e(),swapDetails:s}),a&&r({eventType:a,swap:s,step:o})}l(Pt,"setStepTransactionIds");function It({getStorage:e,setStorage:t},n,r){let a=e().swapDetails,i=m(a);if(!i)return;let s=new Date;a.lastNotificationTime=s.getTime().toString(),!(i.networkStatus==="waitingForConnectingWallet"&&a.networkStatusExtraMessage===n&&a.networkStatusExtraMessageDetail===r)&&(i.networkStatus="waitingForConnectingWallet",a.networkStatusExtraMessage=n,a.networkStatusExtraMessageDetail=r,t({...e(),swapDetails:a}))}l(It,"markRunningSwapAsWaitingForConnectingWallet");function Me({getStorage:e,setStorage:t}){let n=e().swapDetails,r=m(n);if(!r)return;let{type:a}=v(n),i=N(n,r),s=`Change ${a} wallet network to ${i}`,o=`Please change your ${a} wallet network to ${i}.`,u=new Date;return n.lastNotificationTime=u.getTime().toString(),r.networkStatus="waitingForNetworkChange",n.networkStatusExtraMessage=s,n.networkStatusExtraMessageDetail=o,t({...e(),swapDetails:n}),{swap:n,step:r}}l(Me,"markRunningSwapAsSwitchingNetwork");function De({getStorage:e,setStorage:t,notifier:n}){let r=e().swapDetails,a=m(r);if(a)return r.networkStatusExtraMessage="",r.networkStatusExtraMessageDetail="",a.networkStatus="waitingForQueue",n({eventType:"waiting_for_queue",swap:r,step:a}),t({...e(),swapDetails:r}),{swap:r,step:a}}l(De,"markRunningSwapAsDependsOnOtherQueues");function re(e){return new Promise(t=>setTimeout(t,e))}l(re,"delay");var Wt=l((e,t)=>e.wallets[t]?.walletType,"getSwapWalletType");function Mt(e){return e===null||e?.blockchains===null||e?.blockchains.length===0}l(Mt,"isWalletNull");function be(e,t){return t&&e[t]?e[t].size?e[t].get(xt.ETHEREUM):e[t]:null}l(be,"getEvmProvider");function v(e){let t=m(e),n=B(e,t);if(!n)return{type:null,network:null,address:null};let r=Wt(e,n),a=e.wallets[n];return{type:r||null,network:n,address:a?a.address:null}}l(v,"getRequiredWallet");async function Dt(e){try{return await e.request({method:"eth_chainId"})||e?.chainId}catch{return e?.chainId}}l(Dt,"getChainId");async function Oe(e,t,n,r,a){if(Mt(n))return!1;let i=B(e,t);if(!i)return!1;if(r.evmBasedChains.find(s=>s.name===i)){try{let s=e.wallets[i];if(s){let o=be(a,s.walletType),u=await Dt(o);if(u){let c=kt(u,Object.entries(r.blockchains).map(([,g])=>g));if(c&&c.toLowerCase()===i.toLowerCase())return!0;if(c&&c.toLowerCase()!==i.toLowerCase())return!1}}}catch(s){console.log(s)}return!1}return!0}l(Oe,"isNetworkMatchedForTransaction");var Be=l((e,t)=>(e.wallets[t.evmTransaction?.blockChain||""]||e.wallets[t.evmApprovalTransaction?.blockChain||""]||e.wallets[t.tronTransaction?.blockChain||""]||e.wallets[t.tronApprovalTransaction?.blockChain||""]||e.wallets[t.starknetTransaction?.blockChain||""]||e.wallets[t.starknetApprovalTransaction?.blockChain||""]||e.wallets[t.cosmosTransaction?.blockChain||""]||e.wallets[t.solanaTransaction?.blockChain||""]||t.transferTransaction?.fromWalletAddress||null)!==null,"isTxAlreadyCreated");function ae(e){let{getStorage:t,setStorage:n}=e,r=t().swapDetails,a=m(r);a?.networkStatus&&(a.networkStatus=null,n({...t(),swapDetails:r}))}l(ae,"resetNetworkStatus");function Ue(e,t={message:"",details:"",status:null}){let{message:n,details:r,status:a}=t,{getStorage:i,setStorage:s}=e,o=i().swapDetails,u=m(o);u?.networkStatus&&(o.networkStatusExtraMessage=n,o.networkStatusExtraMessageDetail=r,u.networkStatus=a,s({...i(),swapDetails:o}))}l(Ue,"updateNetworkStatus");function Fe(e,t){let{context:n,queue:r}=t,a=r.getStorage().swapDetails,{ok:i,reason:s}=Se(a,n.state);if(!i){let o=m(a);n.notifier({eventType:s==="account_miss_match"?"waiting_for_change_wallet_account":"waiting_for_connecting_wallet",swap:a,step:o}),It({getStorage:r.getStorage.bind(r),setStorage:r.setStorage.bind(r)},Ae,e.reason.description);return}r.unblock()}l(Fe,"onBlockForConnectWallet");function Qe(e,t){let{context:n,queue:r}=t,a=r.getStorage().swapDetails;if(!m(a)||a.status!=="running")return;let s=Me({getStorage:r.getStorage.bind(r),setStorage:r.setStorage.bind(r)});s&&n.notifier({eventType:"waiting_for_network_change",swap:s.swap,step:s.step});let{type:o,network:u}=v(a);if(o&&u&&n.canSwitchNetworkTo(o,u)){let c=n.switchNetwork(o,u);c&&c.then(()=>{r.unblock()}).catch(g=>{console.log({error:g})})}}l(Qe,"onBlockForChangeNetwork");function Le(e,t){let{getBlockedTasks:n,forceExecute:r,queue:a,manager:i,context:s}=t,{setClaimer:o,claimedBy:u,reset:c}=Z(),g=n().filter(x=>x.reason.reason==="depends_on_other_queues");if(g.length===0)return;let p=u(),d=!!p;if(p===a.id)return;if(d){De({getStorage:a.getStorage.bind(a),setStorage:a.setStorage.bind(a),notifier:s.notifier});return}let f=g.find(x=>x.queue_id===t.queue_id);f||(f=g[0]),o(f.queue_id);let A=f.storage.get(),{type:S,network:T,address:w}=v(A.swapDetails);r(f.queue_id,{claimedBy:u(),resetClaimedBy:()=>{c(),we(`${S}-${T}:${w}`,s.notifier,i,s.canSwitchNetworkTo)}})}l(Le,"onDependsOnOtherQueues");function Se(e,t){let{type:n,address:r}=v(e);if(!n||!r)return{ok:!1,reason:"not_connected"};let a=t(n),{accounts:i,connected:s}=a,o=i||[];return s?{ok:o.some(c=>{let{address:g}=At(c);return r.toLocaleLowerCase()===g.toLocaleLowerCase()}),reason:"account_miss_match"}:{ok:!1,reason:"not_connected"}}l(Se,"isRequiredWalletConnected");function He(e){let{setTransactionDataByHash:t}=ee(),{getStorage:n,setStorage:r,failed:a,next:i,schedule:s,context:o}=e,{meta:u,getSigners:c,notifier:g,isMobileWallet:p}=o,d=n().swapDetails,f=m(d),A=M(d,f),S=p(A?.walletType),T=le(d,f),w=c(A.walletType),x=N(d,f),E=l(()=>{e.context.resetClaimedBy&&e.context.resetClaimedBy()},"onFinish"),_=te(f),y=_?.type,h=vt(f),b=[ue.EVM,ue.STARKNET,ue.TRON].includes(y),W=typeof d.hasAlreadyProceededToSign=="boolean",L,H,q,G,K;h?(G=`Waiting for approval of ${f?.fromSymbol} coin ${S?"on your mobile phone!":""}`,K="Waiting for approve transaction to be mined and confirmed successfully",H="waitingForApproval",L=void 0,q="confirm_approve_contract"):W?(G="Transaction is expired. Please try again.",H="failed",L="failed",K="",q="transaction_expired"):(G="Executing transaction ...",H="running",L="running",K=`${S?"Check your mobile phone!":""}`,q=b?"calling_smart_contract":"confirm_transfer");let nt=R({getStorage:n,setStorage:r,nextStepStatus:H,nextStatus:L,message:G,details:K,hasAlreadyProceededToSign:h?void 0:W,errorCode:W?"TX_EXPIRED":void 0});if(g({eventType:q,...nt}),W){a(),E();return}w.getSigner(y).signAndSendTx(_,T,null).then(({hash:C,response:X})=>{let $=F(C,x,u.blockchains);Pt(e,C,g,h?"check_approve_tx_status":"check_tx_status",$?{url:$,description:h?"Approve":"Swap"}:void 0),X&&t(C,{response:X}),s("CHECK_TRANSACTION_STATUS"),i(),E()},C=>{if(d.status==="failed")return;let{extraMessage:X,extraMessageDetail:$,extraMessageErrorCode:ke}=P(C);C&&C?.root&&C?.root?.message&&C?.root?.code&&C?.root?.reason&&Ie(C.root,d,f,A?.walletType);let rt=R({getStorage:n,setStorage:r,nextStatus:"failed",nextStepStatus:"failed",message:X,details:$,errorCode:ke});g({eventType:ke==="REJECTED_BY_USER"?"contract_rejected":b?"smart_contract_call_failed":"transfer_failed",...rt}),a(),E()})}l(He,"singTransaction");function qe(e){let{wallet_network:t,evmChains:n,manager:r}=e,[a,i]=ge(t);n.some(s=>s.name==i)&&r?.getAll().forEach(s=>{let o=s.list.getStorage(),u=o?.swapDetails;if(u&&u.status==="running"){let c=m(u);if(c){let g=o?.swapDetails.wallets[c.fromBlockchain]?.walletType,p=Object.keys(s.list.state.tasks).some(d=>{let f=s.list.state.tasks[d];return f.status===de.BLOCKED&&["waiting_for_connecting_wallet"].includes(f.blockedFor?.reason)});if(g===a&&p&&B(u,c)!=i){let d=s.list,{type:f}=v(u),A=J(f);s.list.block({reason:{reason:"waiting_for_network_change",description:A},silent:!0});let S=Me({getStorage:d.getStorage.bind(d),setStorage:d.setStorage.bind(d)});S&&e?.notifier({eventType:"waiting_for_network_change",swap:S.swap,step:S.step})}}}})}l(qe,"checkWaitingForConnectWalletChange");function Te(e){e?.getAll().forEach(t=>{if(Object.keys(t.list.state.tasks).some(r=>{let a=t.list.state.tasks[r];return a.status===de.BLOCKED&&["waiting_for_network_change","depends_on_other_queues"].includes(a.blockedFor?.reason)})){let r=t.list.getStorage()?.swapDetails;if(r.status==="running"){let{type:a}=v(r),i=V(a);t.list.block({reason:{reason:"waiting_for_connecting_wallet",description:i}})}}})}l(Te,"checkWaitingForNetworkChange");function bt(e){let t=e?.getAll()||new Map,n=[];return t.forEach(r=>{let i=r.list.getStorage()?.swapDetails;!i||i.status!=="running"||n.push(i)}),n}l(bt,"getRunningSwaps");function Ot(e,t){e.forEach(n=>{let r=m(n),a;r?.networkStatus==="waitingForQueue"?a="waiting_for_queue":n?.status==="running"&&(a="waiting_for_connecting_wallet"),a&&t&&t({eventType:a,swap:n,step:r})})}l(Ot,"resetRunningSwapNotifsOnPageLoad");function we(e,t,n,r,a={fallbackToOnlyWallet:!0}){let[i,s]=ge(e);if(!i||!s)return;let o=[],u=[];n?.getAll().forEach(g=>{if(g.status===de.BLOCKED){let p=g.list.getStorage(),d=p?.swapDetails;if(d&&d.status==="running"){let f=m(d);f&&(B(d,f)==s&&p?.swapDetails.wallets[s]?.walletType===i?o.push(g.list):p?.swapDetails.wallets[f.fromBlockchain]?.walletType===i&&u.push(g.list))}}});let c;if(o.length>0){if(c=o[0],o.length>1)for(let g=1;g<o.length;g++){let p=o[g];De({getStorage:p.getStorage.bind(p),setStorage:p.setStorage.bind(p),notifier:t})}}else u.length>0&&a.fallbackToOnlyWallet&&(c=u[0]);r?.(i,s)?c?.checkBlock():c?.unblock()}l(we,"retryOn");function Ge(e){return!!e.evmTransaction||!!e.evmApprovalTransaction}l(Ge,"isNeedBlockQueueForParallel");async function Ke(e){let t=await e;if(!t.ok||!t.transaction)throw k.CreateTransaction(t.error||"bad response from create tx endpoint");return t}l(Ke,"throwOnOK");function Bt(e,t){let{reset:n}=Z();e.actions.cancel();let r=R({getStorage:e.actions.getStorage,setStorage:e.actions.setStorage,message:"Swap canceled by user.",details:"Warning: If you've already signed and sent a transaction, it won't be affected, but next swap steps will not be executed.",nextStatus:"failed",nextStepStatus:"failed",errorCode:"USER_CANCEL"});return n(),t&&t?.retry(),r}l(Bt,"cancelSwap");var Xe=5e3;async function Ut({getStorage:e,setStorage:t,next:n,schedule:r,retry:a,failed:i,context:s}){let o=e().swapDetails,{meta:u}=s,c=m(o);if(!c?.executedTransactionId)return;let g=c.executedTransactionId,p=!1,d=null,f=null,{getTransactionDataByHash:A,setTransactionDataByHash:S}=ee();try{let E=fe(c),_=M(o,c);E&&_&&(f=s.getSigners(_.walletType).getSigner(E))}catch{}try{let{response:E,receiptReceived:_}=A(g);if(f?.wait&&!_){let{hash:y,response:h}=await f.wait(g,E);if(y!==g){c.executedTransactionId=y||c.executedTransactionId;let b=N(o,c),W=F(c.executedTransactionId,b,u.blockchains);W&&c.explorerUrl&&c.explorerUrl?.length>=1&&(c.explorerUrl[c.explorerUrl.length-1]={url:W,description:"Replaced Swap"}),g=c.executedTransactionId,y&&h&&S(y,{response:h})}else S(y,{receiptReceived:!0})}}catch(E){let{extraMessage:_,extraMessageDetail:y,extraMessageErrorCode:h}=P(E),b=R({getStorage:e,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",message:_,details:y,errorCode:h});s?.notifier({eventType:"task_failed",...b}),p=!0}try{d=await I().checkStatus({requestId:o.requestId,txId:g,step:c.id})}catch{await re(Xe),a();return}if(p)return i();if(c?.status==="failed")return;let T=d?.outputAmount||(c.outputAmount?c.outputAmount:null),w=c.outputAmount||null;o.extraMessage=d?.extraMessage||o.extraMessage,o.extraMessageSeverity="info",o.extraMessageDetail="",c.status=d?.status||c.status,c.diagnosisUrl=d?.diagnosisUrl||c.diagnosisUrl||null,c.outputAmount=T||c.outputAmount,c.explorerUrl=d?.explorerUrl||c.explorerUrl,c.internalSteps=d?.steps||null;let x=d?.newTx;if(x&&(c.status="created",c.executedTransactionId=null,c.executedTransactionTime=null,ne(c,x)),w===null&&T!==null?s.notifier({eventType:"step_completed_with_output",swap:o,step:c}):w===null&&T===null&&s.notifier({eventType:"check_tx_status",swap:o,step:c}),c.status==="success"){let E=ve(o,c);o.extraMessageDetail="",o.extraMessage=E?`starting next step: ${E.swapperId}: ${E.fromBlockchain} -> ${E.toBlockchain}`:""}else c.status==="failed"&&(o.extraMessage="Transaction failed in blockchain",o.extraMessageSeverity="error",o.extraMessageDetail=d?.extraMessage||"",o.status="failed",o.finishTime=new Date().getTime().toString());t({...e(),swapDetails:o}),d?.status==="failed"?i():d?.status==="success"||d?.status==="running"&&d.newTx?(r("SCHEDULE_NEXT_STEP"),n()):(await re(Xe),a())}l(Ut,"checkTransactionStatus");async function Ft({getStorage:e,setStorage:t,next:n,schedule:r,retry:a,failed:i,context:s}){let o=e().swapDetails,{meta:u}=s,{getTransactionDataByHash:c,setTransactionDataByHash:g}=ee(),p=m(o);if(!p){console.log("ignore check status, current step is null");return}if(!p?.executedTransactionId)return;let d=p.executedTransactionId,f=null;try{let S=fe(p),T=M(o,p);S&&T&&(f=s.getSigners(T.walletType).getSigner(S))}catch{}try{let{response:S,receiptReceived:T}=c(d);if(f?.wait&&!T){let{hash:w,response:x}=await f.wait(d,S);if(w!==d){p.executedTransactionId=w||p.executedTransactionId;let E=N(o,p),_=F(p.executedTransactionId,E,u.blockchains);_&&p.explorerUrl&&p.explorerUrl?.length>=1&&(p.explorerUrl[p.explorerUrl.length-1]={url:_,description:"Replaced Approve"}),d=p.executedTransactionId,w&&x&&g(w,{response:x})}else g(w,{receiptReceived:!0})}}catch(S){let{extraMessage:T,extraMessageDetail:w,extraMessageErrorCode:x}=P(S),E=R({getStorage:e,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",message:T,details:w,errorCode:x});return s?.notifier({eventType:"task_failed",...E}),i()}let A=!1;try{let S=await I().checkApproval(o.requestId,p.executedTransactionId);if(p?.status==="failed")return;if(A=S.isApproved,!A&&(S.txStatus==="failed"||S.txStatus==="success")){let T,w;S.txStatus==="failed"?(T="Approve transaction failed",w="Smart contract approval tx failed in blockchain."):(T="Not enough approval",S.requiredApprovedAmount&&S.currentApprovedAmount?w=`Required approval: ${S.requiredApprovedAmount}, current approval: ${S.currentApprovedAmount}`:w="You still don't have enough approval for this swap.");let x=R({getStorage:e,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",errorCode:"INSUFFICIENT_APPROVE",message:T,details:w});s.notifier({eventType:"not_enough_approval",...x}),i()}else A||s.notifier({eventType:"check_approve_tx_status",swap:o,step:p})}catch{A=!1}A?(p.status="approved",o.extraMessage=`Spending ${p.fromSymbol} approved successfully.`,o.extraMessageDetail=null,o.extraMessageSeverity="success",p.evmApprovalTransaction=null,p.executedTransactionId=null,p.executedTransactionTime=null,p.starknetApprovalTransaction=null,p.tronApprovalTransaction=null,t({...e(),swapDetails:o}),s.notifier({eventType:"contract_confirmed",swap:o,step:p}),r("SCHEDULE_NEXT_STEP"),n()):(await re(2e3),a())}l(Ft,"checkApprovalStatus");async function $e(e){let t=e.getStorage().swapDetails,n=m(t);if(!n){console.log("ignore check status, current step is null",t.requestId);return}ae(e),n.status==="running"?await Ut(e):n.status==="waitingForApproval"&&await Ft(e)}l($e,"checkStatus");async function Ve(e){let{setStorage:t,getStorage:n,next:r,schedule:a,context:i}=e,s=n().swapDetails,o=m(s);if(!te(o)){let c={requestId:s.requestId,step:o.id,userSettings:{slippage:s.settings.slippage,infiniteApprove:s.settings.infiniteApprove},validations:{balance:s.validateBalanceOrFee,fee:s.validateBalanceOrFee}};try{let{transaction:g}=await Ke(I().createTransaction(c));g&&ne(o,g),t({...n(),swapDetails:s}),a("EXECUTE_TRANSACTION"),r()}catch(g){s.status="failed",s.finishTime=new Date().getTime().toString();let{extraMessage:p,extraMessageDetail:d}=P(g),f=R({getStorage:n,setStorage:t,nextStatus:"failed",nextStepStatus:"failed",message:p,details:d,errorCode:"FETCH_TX_FAILED"});i.notifier({eventType:"task_failed",...f}),e.failed()}}}l(Ve,"createTransaction");async function Je(e){let{getStorage:t,context:n}=e,{meta:r,wallets:a,providers:i}=n,{claimedBy:s}=Z(),o=n.claimedBy===n._queue?.id,u=l(T=>{e.block(T),o&&e.context.resetClaimedBy&&e.context.resetClaimedBy()},"requestBlock"),c=t().swapDetails,g=m(c);if(ae(e),!Se(c,n.state).ok){let{type:T,address:w}=v(c),x=a?.blockchains?.find(y=>!y.accounts?.find(h=>h.walletType===T)),E=!a||x?V(T):_e(T,w),_={reason:"waiting_for_connecting_wallet",description:E};u(_);return}let d=await Oe(c,g,a,r,i);if(!!s()&&!o&&!d){let T=ie,w={reason:"depends_on_other_queues",details:T};u(w);return}else if(d)Ue(e,{message:"",details:"Wallet network changed successfully",status:"networkChanged"});else{let T=N(c,g),w=J(T),x={reason:"waiting_for_network_change",details:w};u(x);return}if(Ge(g)&&!o){let T={reason:"depends_on_other_queues",description:ie,details:{}};u(T);return}He(e)}l(Je,"executeTransaction");function Ye({schedule:e,next:t,failed:n,setStorage:r,getStorage:a,context:i}){let s=a().swapDetails,o=m(s),u=s.steps.find(c=>c.status==="failed");if(o&&!u){if(Be(s,o))return e("EXECUTE_TRANSACTION"),t();if(o?.executedTransactionId)return e("CHECK_TRANSACTION_STATUS"),t();s.status="running",r({...a(),swapDetails:s}),e("CREATE_TRANSACTION"),t()}else s.status=u?"failed":"success",s.finishTime=new Date().getTime().toString(),r({...a(),swapDetails:s}),i.notifier({eventType:u?"task_failed":"task_completed",swap:s,step:null}),u?n():t()}l(Ye,"scheduleNextStep");function je({schedule:e,next:t}){e("SCHEDULE_NEXT_STEP"),t()}l(je,"start");var ze={name:"swap",actions:{["START"]:je,["SCHEDULE_NEXT_STEP"]:Ye,["CREATE_TRANSACTION"]:Ve,["EXECUTE_TRANSACTION"]:Je,["CHECK_TRANSACTION_STATUS"]:$e},run:["START"],whenTaskBlocked:(e,t)=>{e.reason.reason==="waiting_for_connecting_wallet"?Fe(e,t):e.reason.reason==="waiting_for_network_change"?Qe(e,t):e.reason.reason==="depends_on_other_queues"&&Le(e,t)}};import{useManager as Gt}from"@rango-dev/queue-manager-react";import{useEffect as Ee,useState as Kt}from"react";import{Persistor as Qt,Status as Q,DB_NAME as Lt}from"@rango-dev/queue-manager-core";import{v4 as Ht}from"uuid";var Ze="migratedToQueueManager";function me(){return!!window.localStorage.getItem(Ze)}l(me,"migrated");async function qt(){try{return(await window.indexedDB.databases()).map(e=>e.name).includes(Lt)}catch{return!1}}l(qt,"hasQueueManagerOnIDB");async function et(){let e=window.localStorage.getItem("pendingSwaps"),t=await qt();if(!e||me()||t)return!0;let n=JSON.parse(e),r=[];n.forEach(s=>{if(s.status==="running"){let o=Ht(),u={id:s.requestId,createdAt:Number(s.creationTime),name:"swap",status:Q.RUNNING,storage:{swapDetails:s},state:{status:Q.RUNNING,activeTaskIndex:0,tasks:{[o]:{blockedFor:null,status:Q.RUNNING}}},tasks:[{id:o,action:"SCHEDULE_NEXT_STEP"}]};r.push(u)}else{let o=s.status==="success"?Q.SUCCESS:Q.FAILED,u={id:s.requestId,createdAt:Number(s.creationTime),name:"swap",status:o,storage:{swapDetails:s},state:{status:o,activeTaskIndex:0,tasks:{}},tasks:[]};r.push(u)}});let a=new Qt,i=r.map(s=>a.insertQueue(s));return await Promise.all(i),window.localStorage.setItem(Ze,"1"),!0}l(et,"migration");var tt=0;function Xt(){let e=me(),[t,n]=Kt(e);return Ee(()=>{(async()=>tt||(tt=1,et().finally(()=>{n(!0)})))()},[]),{status:t}}l(Xt,"useMigration");function $t(e){let{manager:t}=Gt();Ee(()=>{e.lastConnectedWallet&&(qe({evmChains:e.evmChains,wallet_network:e.lastConnectedWallet,manager:t,notifier:e.notifier}),we(e.lastConnectedWallet,e.notifier,t,e.canSwitchNetworkTo))},[e.lastConnectedWallet]),Ee(()=>{e.disconnectedWallet&&(Te(t),e.clearDisconnectedWallet())},[e.disconnectedWallet])}l($t,"useQueueManager");function aa(e){return xe(e),ze}l(aa,"makeQueueDefinition");export{j as MessageSeverity,Y as PendingSwapNetworkStatus,k as PrettyError,mt as calculatePendingSwap,Bt as cancelSwap,Te as checkWaitingForNetworkChange,B as getCurrentBlockchainOfOrNull,m as getCurrentStep,be as getEvmProvider,M as getRelatedWallet,ce as getRelatedWalletOrNull,v as getRequiredWallet,bt as getRunningSwaps,aa as makeQueueDefinition,P as prettifyErrorMessage,Ot as resetRunningSwapNotifsOnPageLoad,ge as splitWalletNetwork,R as updateSwapStatus,Xt as useMigration,$t as useQueueManager};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/configs.ts", "../src/helpers.ts", "../src/constants.ts", "../src/shared-errors.ts", "../src/shared.ts", "../src/numbers.ts", "../src/shared-sentry.ts", "../src/services/httpService.ts", "../src/actions/checkStatus.ts", "../src/actions/createTransaction.ts", "../src/actions/executeTransaction.ts", "../src/actions/scheduleNextStep.ts", "../src/actions/start.ts", "../src/queueDef.ts", "../src/hooks.ts", "../src/migration.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\n// this API key is limited and\n// it is only for test purpose\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n", "import {\n ExecuterActions,\n QueueInfo,\n QueueName,\n QueueType,\n} from '@rango-dev/queue-manager-core';\nimport {\n BlockReason,\n SwapActionTypes,\n SwapQueueContext,\n SwapQueueDef,\n SwapStorage,\n} from './types';\nimport {\n getBlockChainNameFromId,\n Meta,\n Network,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { Providers, readAccountAddress } from '@rango-dev/wallets-core';\n\nimport {\n Transaction,\n TransactionType,\n EvmBlockchainMeta,\n CreateTransactionResponse,\n isEvmTransaction,\n isCosmosTransaction,\n isSolanaTransaction,\n isTronTransaction,\n isStarknetTransaction,\n isTransferTransaction,\n} from 'rango-sdk';\n\nimport {\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n} from './constants';\nimport { Manager } from '@rango-dev/queue-manager-core';\nimport { Status } from '@rango-dev/queue-manager-core';\nimport {\n EventType,\n getCurrentBlockchainOf,\n getCurrentBlockchainOfOrNull,\n getScannerUrl,\n getRelatedWalletOrNull,\n MessageSeverity,\n PendingSwap,\n PendingSwapNetworkStatus,\n PendingSwapStep,\n StepStatus,\n SwapStatus,\n Wallet,\n getRelatedWallet,\n getCurrentAddressOf,\n} from './shared';\nimport { logRPCError } from './shared-sentry';\nimport {\n PrettyError,\n mapAppErrorCodesToAPIErrorCode,\n prettifyErrorMessage,\n} from './shared-errors';\nimport { httpService } from './services';\nimport { APIErrorCode, SignerErrorCode } from 'rango-types/lib';\n\ntype WhenTaskBlocked = Parameters<NonNullable<SwapQueueDef['whenTaskBlocked']>>;\ntype WhenTaskBlockedEvent = WhenTaskBlocked[0];\ntype WhenTaskBlockedMeta = WhenTaskBlocked[1];\n\nlet swapClaimedBy: { id: string } | null = null;\n\n/**\n *\n * We simply use module-level variable to keep track of which queue has claimed the execution of parallel runnings.\n *\n */\nexport function claimQueue() {\n return {\n claimedBy: () => swapClaimedBy?.id,\n setClaimer: (queue_id: string) => {\n swapClaimedBy = {\n id: queue_id,\n };\n },\n reset: () => {\n swapClaimedBy = null;\n },\n };\n}\n\n/**\n *\n * We use module-level variable to keep track of\n * map of transactions hash to the TransactionResponse and ...\n *\n */\ntype TransactionData = {\n response?: any; // e.g. TransactionResponse in case of EVM transactions\n receiptReceived?: boolean; // e.g. is TransactionReceipt ready in case of EVM transactions\n};\nconst swapTransactionToDataMap: { [id: string]: TransactionData } = {};\nexport function useTransactionsData() {\n return {\n getTransactionDataByHash: (hash: string) =>\n swapTransactionToDataMap[hash] || {},\n setTransactionDataByHash: (hash: string, data: TransactionData) => {\n const r = swapTransactionToDataMap[hash];\n if (!r) swapTransactionToDataMap[hash] = {};\n swapTransactionToDataMap[hash].response =\n data.response || swapTransactionToDataMap[hash].response;\n swapTransactionToDataMap[hash].receiptReceived =\n data.receiptReceived ||\n swapTransactionToDataMap[hash].receiptReceived ||\n false;\n },\n };\n}\n\n/**\n * Sample inputs are:\n * - \"metamask-ETH\"\n * - \"metamask-BSC-BSC:0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n * - \"token-pocket-BSC-BSC:0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n * Returns \"wallet and network\" separately, even if the wallet is dashed inside.\n *\n */\n\nexport function splitWalletNetwork(input: string): string[] {\n const removedAddressInput = input?.split(':')[0] || '';\n const splittedInput = removedAddressInput.split('-');\n const network = splittedInput[splittedInput.length - 1];\n const walletNetwork = splittedInput.slice(0, -1);\n\n if (walletNetwork[walletNetwork.length - 1] === network) {\n walletNetwork.pop();\n }\n const wallet = walletNetwork.join('-');\n\n return [wallet, network];\n}\n\n/**\n *\n * Returns `steps`, if it's a `running` swap.\n * Each `PendingSwap` has a `steps` inside it, `steps` shows how many tasks should be created and run to finish the swap.\n *\n */\nexport const getCurrentStep = (swap: PendingSwap): PendingSwapStep | null => {\n return (\n swap.steps.find(\n (step) => step.status !== 'failed' && step.status !== 'success'\n ) || null\n );\n};\n\n/**\n *\n * Returns current step transaction\n *\n */\nexport const getCurrentStepTx = (\n currentStep: PendingSwapStep\n): Transaction | null => {\n const {\n evmTransaction,\n evmApprovalTransaction,\n cosmosTransaction,\n solanaTransaction,\n transferTransaction,\n starknetApprovalTransaction,\n starknetTransaction,\n tronApprovalTransaction,\n tronTransaction,\n } = currentStep;\n return (\n evmTransaction ||\n evmApprovalTransaction ||\n cosmosTransaction ||\n solanaTransaction ||\n transferTransaction ||\n starknetApprovalTransaction ||\n starknetTransaction ||\n tronApprovalTransaction ||\n tronTransaction\n );\n};\n\n/**\n *\n * Set current step transaction\n *\n */\nexport const setCurrentStepTx = (\n currentStep: PendingSwapStep,\n transaction: Transaction\n): PendingSwapStep => {\n currentStep.transferTransaction = null;\n currentStep.cosmosTransaction = null;\n currentStep.evmTransaction = null;\n currentStep.solanaTransaction = null;\n currentStep.evmApprovalTransaction = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.starknetTransaction = null;\n currentStep.tronApprovalTransaction = null;\n currentStep.tronTransaction = null;\n\n if (isEvmTransaction(transaction)) {\n if (transaction.isApprovalTx)\n currentStep.evmApprovalTransaction = transaction;\n else currentStep.evmTransaction = transaction;\n } else if (isCosmosTransaction(transaction)) {\n currentStep.cosmosTransaction = transaction;\n } else if (isSolanaTransaction(transaction)) {\n currentStep.solanaTransaction = transaction;\n } else if (isTransferTransaction(transaction)) {\n currentStep.transferTransaction = transaction;\n } else if (isStarknetTransaction(transaction)) {\n if (transaction.isApprovalTx)\n currentStep.starknetApprovalTransaction = transaction;\n else currentStep.starknetTransaction = transaction;\n } else if (isTronTransaction(transaction)) {\n if (transaction.isApprovalTx)\n currentStep.tronApprovalTransaction = transaction;\n else currentStep.tronTransaction = transaction;\n }\n return currentStep;\n};\n\n/**\n *\n * Returns current step transaction type\n *\n */\nexport const getCurrentStepTxType = (\n currentStep: PendingSwapStep\n): TransactionType | undefined => {\n return getCurrentStepTx(currentStep)?.type;\n};\n\n/**\n *\n * Returns a boolean indicating that current step is an approval tx or not.\n *\n */\nexport const isApprovalCurrentStepTx = (\n currentStep: PendingSwapStep\n): boolean => {\n const {\n evmApprovalTransaction,\n starknetApprovalTransaction,\n tronApprovalTransaction,\n } = currentStep;\n return !!(\n evmApprovalTransaction ||\n starknetApprovalTransaction ||\n tronApprovalTransaction\n );\n};\n\n/**\n * When we are doing a swap, there are some common fields that will be updated together.\n * This function helps us to update a swap status and also it will update some more fields like `extraMessageSeverity` based on the input.\n */\nexport function updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus,\n nextStepStatus,\n message,\n details,\n errorCode = null,\n hasAlreadyProceededToSign,\n}: {\n getStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['getStorage'];\n setStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['setStorage'];\n nextStatus?: SwapStatus;\n nextStepStatus?: StepStatus;\n message?: string;\n details?: string | null | undefined;\n errorCode?: APIErrorCode | SignerErrorCode | null;\n hasAlreadyProceededToSign?: boolean;\n}): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n if (!!nextStepStatus && !!currentStep) currentStep.status = nextStepStatus;\n\n if (nextStatus) swap.status = nextStatus;\n swap.hasAlreadyProceededToSign = hasAlreadyProceededToSign;\n if (!!nextStatus && ['failed', 'success'].includes(nextStatus))\n swap.finishTime = new Date().getTime().toString();\n\n if (!!message || !!details) {\n swap.extraMessage = message || '';\n swap.extraMessageDetail = details || '';\n }\n\n if (!!nextStepStatus && ['failed'].includes(nextStepStatus)) {\n //if user cancel the swap, we should pass relevant reason to the server.\n const errorReason =\n details && details.includes('Warning')\n ? 'Swap canceled by user.'\n : details;\n const walletType = getRelatedWalletOrNull(swap, currentStep!)?.walletType;\n swap.extraMessageSeverity = MessageSeverity.error;\n\n httpService()\n .reportFailure({\n requestId: swap.requestId,\n step: currentStep?.id || 1,\n eventType: mapAppErrorCodesToAPIErrorCode(errorCode),\n reason: errorReason || '',\n data: walletType ? { wallet: walletType } : undefined,\n })\n .then()\n .catch();\n } else if (!!nextStepStatus && ['running'].includes(nextStepStatus))\n swap.extraMessageSeverity = MessageSeverity.info;\n else if (!!nextStepStatus && ['success', 'approved'].includes(nextStepStatus))\n swap.extraMessageSeverity = MessageSeverity.success;\n else if (nextStepStatus && ['waitingForApproval'].includes(nextStepStatus))\n swap.extraMessageSeverity = MessageSeverity.warning;\n\n if (nextStepStatus === 'running' && currentStep)\n currentStep.startTransactionTime = new Date().getTime();\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\n/**\n *\n * Set current step transaction hash, update pending swap status, and notify user if needed\n *\n */\nexport function setStepTransactionIds(\n { getStorage, setStorage }: ExecuterActions<SwapStorage, SwapActionTypes>,\n txId: string | null,\n notifier: SwapQueueContext['notifier'],\n eventType?: EventType,\n explorerUrl?: { url?: string; description?: string }\n): void {\n const swap = getStorage().swapDetails;\n swap.hasAlreadyProceededToSign = null;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n currentStep.executedTransactionId = txId;\n currentStep.executedTransactionTime = new Date().getTime().toString();\n if (explorerUrl?.url)\n currentStep.explorerUrl = [\n ...(currentStep.explorerUrl || []),\n {\n url: explorerUrl.url,\n description: explorerUrl.description || null,\n },\n ];\n if (eventType === 'check_tx_status') {\n swap.extraMessage = 'Checking transaction status ...';\n swap.extraMessageDetail = '';\n swap.extraMessageSeverity = MessageSeverity.info;\n } else if (eventType === 'check_approve_tx_status') {\n swap.extraMessage = 'Checking approve transaction status ...';\n swap.extraMessageDetail = '';\n swap.extraMessageSeverity = MessageSeverity.info;\n }\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n if (eventType)\n notifier({ eventType: eventType, swap: swap, step: currentStep });\n}\n\n/**\n * If a swap needs a wallet to be connected,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage,\n setStorage,\n }: Pick<ExecuterActions, 'getStorage' | 'setStorage'>,\n reason: string,\n reasonDetail: string\n): void {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) return;\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n const isAlreadyMarked =\n currentStep.networkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet &&\n swap.networkStatusExtraMessage === reason &&\n swap.networkStatusExtraMessageDetail === reasonDetail;\n\n if (isAlreadyMarked) {\n return;\n }\n\n currentStep.networkStatus =\n PendingSwapNetworkStatus.WaitingForConnectingWallet;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n}\n\n/**\n * If a swap needs a certain network to proceed,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsSwitchingNetwork({\n getStorage,\n setStorage,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'>):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) return;\n\n // Generate message\n const { type } = getRequiredWallet(swap);\n const fromBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const reason = `Change ${type} wallet network to ${fromBlockchain}`;\n const reasonDetail = `Please change your ${type} wallet network to ${fromBlockchain}.`;\n\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForNetworkChange;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\n/**\n * We are marking the queue as it depends on other queues to be run (on Parallel mode)\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsDependsOnOtherQueues({\n getStorage,\n setStorage,\n notifier,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'> & {\n notifier: SwapQueueContext['notifier'];\n}):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) return;\n\n swap.networkStatusExtraMessage = '';\n swap.networkStatusExtraMessageDetail = '';\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForQueue;\n\n notifier({\n eventType: 'waiting_for_queue',\n swap,\n step: currentStep,\n });\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\nexport function delay(ms: number): Promise<unknown> {\n return new Promise((res) => setTimeout(res, ms));\n}\n\n/**\n *\n * To execute a swap, we are keeping the user prefrences on what wallet they are going to use for a sepecific blockchain\n * By passing the swap and the network we are looking for, it returns the wallet name that user selected.\n *\n */\nexport const getSwapWalletType = (\n swap: PendingSwap,\n network: Network\n): WalletType => {\n return swap.wallets[network]?.walletType;\n};\n\n/**\n *\n * We are keeping the connected wallet in a specific structure (`Wallet`),\n * By using this function we normally want to check a specific wallet is connected and exists or not.\n *\n */\nexport function isWalletNull(wallet: Wallet | null): boolean {\n return (\n wallet === null ||\n wallet?.blockchains === null ||\n wallet?.blockchains.length === 0\n );\n}\n\n/**\n * On our implementation for `wallets` package, We keep the instance in 2 ways\n * If it's a single chain wallet, it returns the instance directly,\n * If it's a multichain wallet, it returns a `Map` of instances.\n * This function will get the `ETHEREUM` instance in both types.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getEvmProvider(providers: Providers, type: WalletType): any {\n if (type && providers[type]) {\n // we need this because provider can return an instance or a map of instances, so what you are doing here is try to detect that.\n if (providers[type].size) return providers[type].get(Network.ETHEREUM);\n\n return providers[type];\n }\n return null;\n}\n\n/**\n * In a `PendingSwap`, each step needs a wallet to proceed,\n * By using this function we can access what wallet exactly we need to run current step.\n */\nexport function getRequiredWallet(swap: PendingSwap): {\n type: WalletType | null;\n network: Network | null;\n address: string | null;\n} {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const step = getCurrentStep(swap)!;\n const bcName = getCurrentBlockchainOfOrNull(swap, step);\n if (!bcName) {\n return {\n type: null,\n network: null,\n address: null,\n };\n }\n\n const walletType = getSwapWalletType(swap, bcName);\n const sourceWallet = swap.wallets[bcName];\n\n return {\n type: walletType || null,\n network: bcName,\n address: sourceWallet ? sourceWallet.address : null,\n };\n}\n\n/**\n * On EVM compatible wallets, There is one instance with different chains (like Polygon)\n * To get the chain from instance we will use this function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function getChainId(provider: any): Promise<string | number | null> {\n try {\n const chainId: number | string | null =\n (await provider.request({ method: 'eth_chainId' })) || provider?.chainId;\n return chainId;\n } catch {\n return provider?.chainId;\n }\n}\n\n/**\n * For running a swap safely, we need to make sure about the state of wallet\n * which means the netowrk/chain of wallet should be exactly on what a transaction needs.\n */\nexport async function isNetworkMatchedForTransaction(\n swap: PendingSwap,\n step: PendingSwapStep,\n wallet: Wallet | null,\n meta: Meta,\n providers: Providers\n): Promise<boolean> {\n if (isWalletNull(wallet)) {\n return false;\n }\n const fromBlockChain = getCurrentBlockchainOfOrNull(swap, step);\n if (!fromBlockChain) return false;\n\n if (\n meta.evmBasedChains.find(\n (evmBlochain) => evmBlochain.name === fromBlockChain\n )\n ) {\n try {\n const sourceWallet = swap.wallets[fromBlockChain];\n if (sourceWallet) {\n const provider = getEvmProvider(providers, sourceWallet.walletType);\n const chainId: number | string | null = await getChainId(provider);\n if (chainId) {\n const blockChain = getBlockChainNameFromId(\n chainId,\n Object.entries(meta.blockchains).map(\n ([, blockchainMeta]) => blockchainMeta\n )\n );\n if (\n blockChain &&\n blockChain.toLowerCase() === fromBlockChain.toLowerCase()\n )\n return true;\n if (\n blockChain &&\n blockChain.toLowerCase() !== fromBlockChain.toLowerCase()\n )\n return false;\n }\n }\n } catch (e) {\n console.log(e);\n }\n return false;\n }\n return true;\n}\n\nexport const isTxAlreadyCreated = (\n swap: PendingSwap,\n step: PendingSwapStep\n): boolean => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n step.transferTransaction?.fromWalletAddress ||\n null;\n\n return result !== null;\n};\n\nexport function resetNetworkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): void {\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n currentStep.networkStatus = null;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\nexport function updateNetworkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>,\n data: {\n message: string;\n details: string;\n status: PendingSwapNetworkStatus | null;\n } = {\n message: '',\n details: '',\n status: null,\n }\n): void {\n const { message, details, status } = data;\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n swap.networkStatusExtraMessage = message;\n swap.networkStatusExtraMessageDetail = details;\n currentStep.networkStatus = status;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for wallet),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required wallet is connected, unblock the queue to be run.\n */\nexport function onBlockForConnectWallet(\n event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const { ok, reason } = isRequiredWalletConnected(swap, context.state);\n\n if (!ok) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n context.notifier({\n eventType:\n reason === 'account_miss_match'\n ? 'waiting_for_change_wallet_account'\n : 'waiting_for_connecting_wallet',\n swap: swap,\n step: currentStep,\n });\n\n markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n },\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n event.reason.description\n );\n\n return;\n }\n\n queue.unblock();\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required network is connected, unblock the queue to be run.\n * Note: it automatically try to switch the network if its `provider` supports.\n */\nexport function onBlockForChangeNetwork(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n\n if (!currentStep || swap.status !== 'running') return;\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n });\n\n if (result) {\n context.notifier({\n eventType: 'waiting_for_network_change',\n swap: result.swap,\n step: result.step,\n });\n }\n\n // Try to auto switch\n const { type, network } = getRequiredWallet(swap);\n if (!!type && !!network) {\n if (context.canSwitchNetworkTo(type, network)) {\n const result = context.switchNetwork(type, network);\n if (result) {\n result\n .then(() => {\n queue.unblock();\n })\n .catch((error) => {\n // ignore switch network errors\n console.log({ error });\n });\n }\n }\n }\n}\n\n/**\n * Event handler for blocked tasks. (Parallel mode)\n * If a transcation execution flow is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks the blocked tasks, if there is no active `claimed` queue, try to give it to the best candidate.\n */\nexport function onDependsOnOtherQueues(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { getBlockedTasks, forceExecute, queue, manager, context } = meta;\n const { setClaimer, claimedBy, reset } = claimQueue();\n\n // We only needs those blocked tasks that have DEPENDS_ON_OTHER_QUEUES reason.\n const blockedTasks = getBlockedTasks().filter(\n (task) => task.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES\n );\n\n if (blockedTasks.length === 0) {\n return;\n }\n\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId;\n\n if (claimerId === queue.id) return;\n\n // Check if any queue `claimed` before, if yes, we don't should do anything.\n if (isClaimedByAnyQueue) {\n // We need to keep the latest swap messages\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n notifier: context.notifier,\n });\n return;\n }\n\n // Prioritize current queue to be run first.\n\n let task = blockedTasks.find((task) => {\n return task.queue_id === meta.queue_id;\n });\n\n // If current task isn't available anymore, fallback to first blocked task.\n if (!task) {\n const firstBlockedTask = blockedTasks[0];\n task = firstBlockedTask;\n }\n\n setClaimer(task.queue_id);\n const claimedStorage = task.storage.get() as SwapStorage;\n const { type, network, address } = getRequiredWallet(\n claimedStorage.swapDetails\n );\n\n // Run\n forceExecute(task.queue_id, {\n claimedBy: claimedBy(),\n resetClaimedBy: () => {\n reset();\n // TODO: Use key generator\n retryOn(\n `${type}-${network}:${address}`,\n context.notifier,\n manager,\n context.canSwitchNetworkTo\n );\n },\n });\n}\n\nexport function isRequiredWalletConnected(\n swap: PendingSwap,\n getState: (type: WalletType) => WalletState\n): { ok: boolean; reason: 'not_connected' | 'account_miss_match' } {\n const { type, address } = getRequiredWallet(swap);\n if (!type || !address) {\n return { ok: false, reason: 'not_connected' };\n }\n const walletState = getState(type);\n const { accounts, connected } = walletState;\n const connectedAccounts = accounts || [];\n if (!connected) return { ok: false, reason: 'not_connected' };\n\n const matched = connectedAccounts.some((account) => {\n const { address: accountAddress } = readAccountAddress(account);\n return address.toLocaleLowerCase() === accountAddress.toLocaleLowerCase();\n });\n return { ok: matched, reason: 'account_miss_match' };\n}\n\nexport function singTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): void {\n const { setTransactionDataByHash } = useTransactionsData();\n const { getStorage, setStorage, failed, next, schedule, context } = actions;\n const { meta, getSigners, notifier, isMobileWallet } = context;\n const swap = getStorage().swapDetails;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n\n const sourceWallet = getRelatedWallet(swap, currentStep);\n const mobileWallet = isMobileWallet(sourceWallet?.walletType);\n const walletAddress = getCurrentAddressOf(swap, currentStep);\n const walletSigners = getSigners(sourceWallet.walletType);\n const currentStepBlockchain = getCurrentBlockchainOf(swap, currentStep);\n\n const onFinish = () => {\n // TODO resetClaimedBy is undefined here\n if (actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const tx = getCurrentStepTx(currentStep);\n const txType = tx?.type;\n const isApproval = isApprovalCurrentStepTx(currentStep);\n const isSmartContractCall = [\n TransactionType.EVM,\n TransactionType.STARKNET,\n TransactionType.TRON,\n ].includes(txType!);\n\n const hasAlreadyProceededToSign =\n typeof swap.hasAlreadyProceededToSign === 'boolean';\n\n let nextStatus: SwapStatus | undefined,\n nextStepStatus: StepStatus,\n eventType: EventType,\n message: string,\n details: string;\n\n if (isApproval) {\n message = `Waiting for approval of ${currentStep?.fromSymbol} coin ${\n mobileWallet ? 'on your mobile phone!' : ''\n }`;\n details =\n 'Waiting for approve transaction to be mined and confirmed successfully';\n nextStepStatus = 'waitingForApproval';\n nextStatus = undefined;\n eventType = 'confirm_approve_contract';\n } else if (hasAlreadyProceededToSign) {\n message = 'Transaction is expired. Please try again.';\n nextStepStatus = 'failed';\n nextStatus = 'failed';\n details = '';\n eventType = 'transaction_expired';\n } else {\n message = 'Executing transaction ...';\n nextStepStatus = 'running';\n nextStatus = 'running';\n details = `${mobileWallet ? 'Check your mobile phone!' : ''}`;\n eventType = isSmartContractCall\n ? 'calling_smart_contract'\n : 'confirm_transfer';\n }\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStepStatus,\n nextStatus,\n message: message,\n details: details,\n hasAlreadyProceededToSign: isApproval\n ? undefined\n : hasAlreadyProceededToSign,\n errorCode: hasAlreadyProceededToSign ? 'TX_EXPIRED' : undefined,\n });\n notifier({\n eventType,\n ...updateResult,\n });\n\n if (hasAlreadyProceededToSign) {\n failed();\n onFinish();\n return;\n }\n const signer = walletSigners.getSigner(txType!);\n signer.signAndSendTx(tx!, walletAddress, null).then(\n ({ hash, response }) => {\n const explorerUrl = getScannerUrl(\n hash,\n currentStepBlockchain,\n meta.blockchains\n );\n setStepTransactionIds(\n actions,\n hash,\n notifier,\n isApproval ? 'check_approve_tx_status' : 'check_tx_status',\n explorerUrl\n ? { url: explorerUrl, description: isApproval ? 'Approve' : 'Swap' }\n : undefined\n );\n // response used for evm transactions to get receipt and track replaced\n response && setTransactionDataByHash(hash, { response });\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n next();\n onFinish();\n },\n (error) => {\n if (swap.status === 'failed') return;\n\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n\n // if it is an rpc error with details, send the log to sentry\n if (\n error &&\n error?.root &&\n error?.root?.message &&\n error?.root?.code &&\n error?.root?.reason\n )\n logRPCError(error.root, swap, currentStep, sourceWallet?.walletType);\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n const eventType =\n extraMessageErrorCode === 'REJECTED_BY_USER'\n ? 'contract_rejected'\n : isSmartContractCall\n ? 'smart_contract_call_failed'\n : 'transfer_failed';\n notifier({\n eventType,\n ...updateResult,\n });\n failed();\n onFinish();\n }\n );\n}\n\nexport function checkWaitingForConnectWalletChange(params: {\n wallet_network: string;\n manager?: Manager;\n evmChains: EvmBlockchainMeta[];\n notifier: SwapQueueContext['notifier'];\n}): void {\n const { wallet_network, evmChains, manager } = params;\n const [wallet, network] = splitWalletNetwork(wallet_network);\n // We only need change network for EVM chains.\n if (!evmChains.some((chain) => chain.name == network)) return;\n\n manager?.getAll().forEach((q) => {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n const currentStepRequiredWallet =\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType;\n const hasWaitingForConnect = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n // TODO double check later\n [BlockReason.WAIT_FOR_CONNECT_WALLET].includes(\n task.blockedFor?.reason\n )\n );\n }\n );\n\n if (\n currentStepRequiredWallet === wallet &&\n hasWaitingForConnect &&\n getCurrentBlockchainOfOrNull(swap, currentStep) != network\n ) {\n const queueInstance = q.list;\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(type);\n\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n description,\n },\n silent: true,\n });\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queueInstance.getStorage.bind(queueInstance),\n setStorage: queueInstance.setStorage.bind(queueInstance),\n });\n\n if (result) {\n params?.notifier({\n eventType: 'waiting_for_network_change',\n swap: result.swap,\n step: result.step,\n });\n }\n }\n }\n }\n });\n}\n\nexport function checkWaitingForNetworkChange(manager?: Manager): void {\n manager?.getAll().forEach((q) => {\n const hasWaitingForNetwork = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n [\n BlockReason.WAIT_FOR_NETWORK_CHANGE,\n BlockReason.DEPENDS_ON_OTHER_QUEUES,\n ].includes(task.blockedFor?.reason)\n );\n }\n );\n\n if (hasWaitingForNetwork) {\n const swap = q.list.getStorage()\n ?.swapDetails as SwapStorage['swapDetails'];\n if (swap.status === 'running') {\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type);\n\n // Change the block reason to waiting for connecting wallet\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n },\n });\n }\n }\n });\n}\n\n/**\n * Get list of all running swaps\n *\n * @param manager\n * @returns list of pending swaps\n */\nexport function getRunningSwaps(manager: Manager): PendingSwap[] {\n const queues = manager?.getAll() || new Map<QueueName, QueueInfo>();\n const result: PendingSwap[] = [];\n queues.forEach((q) => {\n // retry only on affected queues\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (!swap || swap.status !== 'running') return;\n result.push(swap);\n });\n return result;\n}\n\n/**\n *\n * Trying to reset notifications for pending swaps to correct message on page load.\n * We could remove this after supporting auto connect for wallets.\n *\n * @param swaps\n * @param notifier\n * @returns\n */\nexport function resetRunningSwapNotifsOnPageLoad(\n runningSwaps: PendingSwap[],\n notifier: SwapQueueContext['notifier']\n) {\n runningSwaps.forEach((swap) => {\n const currentStep = getCurrentStep(swap);\n let eventType: EventType | undefined;\n if (currentStep?.networkStatus === PendingSwapNetworkStatus.WaitingForQueue)\n eventType = 'waiting_for_queue';\n else if (swap?.status === 'running') {\n eventType = 'waiting_for_connecting_wallet';\n }\n if (!!eventType && !!notifier) {\n notifier({\n eventType,\n swap: swap,\n step: currentStep,\n });\n }\n });\n}\n\n/**\n *\n * Try to run blocked tasks by wallet and network name.\n * Goes through queues and extract blocked queues with matched wallet.\n * If found any blocked tasks with same wallet and network, runs them.\n * If not, runs only blocked tasks with matched wallet.\n *\n * @param wallet_network a string includes `wallet` type and `network` type.\n * @param manager\n * @returns\n */\nexport function retryOn(\n wallet_network: string,\n notifier: SwapQueueContext['notifier'],\n manager?: Manager,\n canSwitchNetworkTo?: (type: WalletType, network: Network) => boolean,\n options = { fallbackToOnlyWallet: true }\n): void {\n const [wallet, network] = splitWalletNetwork(wallet_network);\n if (!wallet || !network) {\n return;\n }\n\n const walletAndNetworkMatched: QueueType[] = [];\n const onlyWalletMatched: QueueType[] = [];\n\n manager?.getAll().forEach((q) => {\n // retry only on affected queues\n if (q.status === Status.BLOCKED) {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n if (\n getCurrentBlockchainOfOrNull(swap, currentStep) == network &&\n queueStorage?.swapDetails.wallets[network]?.walletType === wallet\n ) {\n walletAndNetworkMatched.push(q.list);\n } else if (\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType === wallet\n ) {\n onlyWalletMatched.push(q.list);\n }\n }\n }\n }\n });\n\n let finalQueueToBeRun: QueueType | undefined = undefined;\n if (walletAndNetworkMatched.length > 0) {\n finalQueueToBeRun = walletAndNetworkMatched[0];\n\n if (walletAndNetworkMatched.length > 1) {\n for (let i = 1; i < walletAndNetworkMatched.length; i++) {\n const currentQueue = walletAndNetworkMatched[i];\n\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: currentQueue.getStorage.bind(currentQueue),\n setStorage: currentQueue.setStorage.bind(currentQueue),\n notifier: notifier,\n });\n }\n }\n } else if (onlyWalletMatched.length > 0 && options.fallbackToOnlyWallet) {\n finalQueueToBeRun = onlyWalletMatched[0];\n }\n\n if (!canSwitchNetworkTo?.(wallet, network as Network))\n finalQueueToBeRun?.unblock();\n else finalQueueToBeRun?.checkBlock();\n}\n\n/* \n For avoiding conflict by making too many requests to wallet, we need to make sure\n We only run one request at a time (In parallel mode).\n */\nexport function isNeedBlockQueueForParallel(step: PendingSwapStep): boolean {\n return !!step.evmTransaction || !!step.evmApprovalTransaction;\n}\n\n/*\nCreate transaction endpoint doesn't return error code on http status code,\nFor backward compatibilty with server and sdk, we use this wrapper to reject the promise.\n*/\nexport async function throwOnOK(\n rawResponse: Promise<CreateTransactionResponse>\n): Promise<CreateTransactionResponse> {\n const responseBody = await rawResponse;\n if (!responseBody.ok || !responseBody.transaction) {\n throw PrettyError.CreateTransaction(\n responseBody.error || 'bad response from create tx endpoint'\n );\n }\n return responseBody;\n}\n\nexport function cancelSwap(\n swap: QueueInfo,\n manager?: Manager\n): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} {\n const { reset } = claimQueue();\n swap.actions.cancel();\n\n const updateResult = updateSwapStatus({\n getStorage: swap.actions.getStorage,\n setStorage: swap.actions.setStorage,\n message: 'Swap canceled by user.',\n details:\n \"Warning: If you've already signed and sent a transaction, it won't be affected, but next swap steps will not be executed.\",\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'USER_CANCEL',\n });\n reset();\n if (manager) manager?.retry();\n\n return updateResult;\n}\n", "export const ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES =\n 'Waiting for other swaps to complete';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET = 'Waiting for connecting wallet';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET = (\n type: string | null,\n address: string | null\n): string =>\n `Please change your ${type || 'wallet'} account to ${\n address || 'proper address'\n }`;\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION = (\n type: string | null\n): string =>\n `Please connect to ${\n type || 'your wallet'\n } by using bellow button or top right button on page.`;\nexport const ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK = (\n network: string | null\n): string => `Please change your network to ${network}.`;\n", "import type {\n APIErrorCode,\n SignerErrorCode as SignerErrorCodeType,\n} from 'rango-types';\nimport {\n SignerErrorCode,\n SignerError,\n isSignerErrorCode,\n isAPIErrorCode,\n} from 'rango-types';\n\nexport type ErrorDetail = {\n extraMessage: string;\n extraMessageDetail?: string | null | undefined;\n extraMessageErrorCode: SignerErrorCodeType | APIErrorCode | null;\n};\n\nconst ERROR_ASSERTION_FAILED = 'Assertion failed (Unexpected behaviour)';\nconst ERROR_CREATE_TRANSACTION = 'Create transaction failed in Rango Server';\nconst ERROR_INPUT_WALLET_NOT_FOUND = 'Input wallet not found';\n\ntype ErrorRoot = string | Record<string, string> | null;\n\nexport class PrettyError extends Error {\n private readonly detail?: string;\n private readonly root?: ErrorRoot;\n private readonly code?: APIErrorCode;\n public _isPrettyError = true;\n\n constructor(\n code: APIErrorCode,\n m: string,\n root?: ErrorRoot,\n detail?: string\n ) {\n super(m);\n Object.setPrototypeOf(this, PrettyError.prototype);\n PrettyError.prototype._isPrettyError = true;\n this.code = code;\n this.detail = detail;\n this.root = root;\n }\n\n static isPrettyError(obj: unknown): obj is PrettyError {\n return (\n obj instanceof PrettyError ||\n Object.prototype.hasOwnProperty.call(obj, '_isPrettyError')\n );\n }\n\n getErrorDetail(): ErrorDetail {\n const rawMessage =\n typeof this.root === 'object' && this.root && this.root.error\n ? this.root.error\n : JSON.stringify(this.root);\n const rootStr =\n typeof this.root === 'string'\n ? this.root\n : this.root instanceof Error\n ? this.root.message\n : rawMessage;\n return {\n extraMessage: this.message,\n extraMessageDetail: this.detail || rootStr,\n extraMessageErrorCode: this.code || null,\n };\n }\n\n static AssertionFailed(m: string): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_ASSERTION_FAILED,\n m\n );\n }\n\n static BadStatusCode(\n message: string,\n statusCode: number | string\n ): PrettyError {\n return new PrettyError(\n 'TX_FAIL',\n message,\n null,\n `status code = ${statusCode}`\n );\n }\n\n static CreateTransaction(detail: string): PrettyError {\n return new PrettyError(\n 'FETCH_TX_FAILED',\n ERROR_CREATE_TRANSACTION,\n null,\n detail\n );\n }\n\n static WalletMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n\n static BlockchainMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n}\n\nexport function mapAppErrorCodesToAPIErrorCode(\n errorCode: string | null\n): APIErrorCode {\n const defaultErrorCode = 'CLIENT_UNEXPECTED_BEHAVIOUR';\n try {\n if (!errorCode) return defaultErrorCode;\n if (isAPIErrorCode(errorCode)) return errorCode;\n if (isSignerErrorCode(errorCode)) {\n const t: { [key in SignerErrorCodeType]: APIErrorCode } = {\n [SignerErrorCode.REJECTED_BY_USER]: 'USER_REJECT',\n [SignerErrorCode.SIGN_TX_ERROR]: 'CALL_WALLET_FAILED',\n [SignerErrorCode.SEND_TX_ERROR]: 'SEND_TX_FAILED',\n [SignerErrorCode.NOT_IMPLEMENTED]: defaultErrorCode,\n [SignerErrorCode.OPERATION_UNSUPPORTED]: defaultErrorCode,\n [SignerErrorCode.UNEXPECTED_BEHAVIOUR]: defaultErrorCode,\n };\n return t[errorCode];\n }\n return defaultErrorCode;\n } catch (err) {\n return defaultErrorCode;\n }\n}\n\nexport const prettifyErrorMessage = (obj: unknown): ErrorDetail => {\n if (!obj) return { extraMessage: '', extraMessageErrorCode: null };\n if (PrettyError.isPrettyError(obj)) return obj.getErrorDetail();\n if (SignerError.isSignerError(obj)) {\n const t = obj.getErrorDetail();\n return {\n extraMessage: t.message,\n extraMessageDetail: t.detail,\n extraMessageErrorCode: t.code,\n };\n }\n if (obj instanceof Error)\n return {\n extraMessage: obj.toString(),\n extraMessageErrorCode: null,\n };\n if (typeof obj !== 'string')\n return {\n extraMessage: JSON.stringify(obj),\n extraMessageErrorCode: null,\n };\n return { extraMessage: obj, extraMessageErrorCode: null };\n};\n", "import { Network, WalletType } from '@rango-dev/wallets-shared';\nimport {\n CosmosTransaction,\n EvmTransaction,\n SimulationResult,\n SolanaTransaction,\n StarknetTransaction,\n TronTransaction,\n Transfer as TransferTransaction,\n AmountRestrictionType,\n BestRouteResponse,\n MetaResponse,\n Token,\n SwapResult,\n BlockchainMeta,\n} from 'rango-sdk';\n\nimport { PrettyError } from './shared-errors';\nimport BigNumber from 'bignumber.js';\nimport { numberToString } from './numbers';\nimport {\n isCosmosBlockchain,\n isEvmBlockchain,\n isStarknetBlockchain,\n isTronBlockchain,\n} from 'rango-types';\n\nexport interface PendingSwapWithQueueID {\n id: string;\n swap: PendingSwap;\n}\n\nexport type SwapProgressNotification = {\n eventType: EventType;\n swap: PendingSwap | null;\n step: PendingSwapStep | null;\n};\n\nexport type WalletBalance = {\n chain: Network;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport type Account = {\n balances: WalletBalance[] | null;\n address: string;\n loading: boolean;\n walletType: WalletType;\n error: boolean;\n explorerUrl: string | null;\n isConnected?: boolean;\n};\nexport type Blockchain = { name: string; accounts: Account[] };\nexport type Wallet = { blockchains: Blockchain[] };\n\nexport type EventType =\n | 'swap_started'\n | 'confirm_contract'\n | 'confirm_transfer'\n | 'task_failed'\n | 'task_completed'\n | 'task_canceled'\n | 'task_paused'\n | 'contract_confirmed'\n | 'confirm_approve_contract'\n | 'contract_rejected'\n | 'check_tx_status'\n | 'check_approve_tx_status'\n | 'transfer_rejected'\n | 'transfer_failed'\n | 'calling_smart_contract'\n | 'smart_contract_called'\n | 'smart_contract_call_failed'\n | 'step_completed_with_output'\n | 'waiting_for_network_change'\n | 'waiting_for_connecting_wallet'\n | 'waiting_for_change_wallet_account'\n | 'network_changed'\n | 'not_enough_balance'\n | 'not_enough_approval'\n | 'waiting_for_queue'\n | 'check_fee_failed'\n | 'route_failed_to_find'\n | 'transaction_expired';\n\nexport type SwapSavedSettings = {\n slippage: string;\n disabledSwappersIds?: string[];\n disabledSwappersGroups?: string[];\n infiniteApprove?: boolean;\n};\n\ntype InternalStepState =\n | 'PENDING'\n | 'CREATED'\n | 'WAITING'\n | 'SIGNED'\n | 'SUCCESSED'\n | 'FAILED';\n\nexport type SwapperStatusStep = {\n name: string;\n state: InternalStepState;\n current: boolean;\n};\n\nexport enum PendingSwapNetworkStatus {\n WaitingForConnectingWallet = 'waitingForConnectingWallet',\n WaitingForQueue = 'waitingForQueue',\n WaitingForNetworkChange = 'waitingForNetworkChange',\n NetworkChanged = 'networkChanged',\n}\n\nexport type SwapExplorerUrl = {\n url: string;\n description: string | null;\n};\n\nexport type StepStatus =\n | 'created'\n | 'running'\n | 'failed'\n | 'success'\n | 'waitingForApproval'\n | 'approved';\n\nexport type PendingSwapStep = {\n // routing data\n id: number;\n fromBlockchain: string;\n fromSymbol: string;\n fromSymbolAddress: string | null;\n fromDecimals: number;\n fromAmountPrecision: string | null;\n fromAmountMinValue: string | null;\n fromAmountMaxValue: string | null;\n fromAmountRestrictionType: AmountRestrictionType | null;\n fromLogo: string;\n toBlockchain: string;\n toSymbol: string;\n toSymbolAddress: string | null;\n toDecimals: number;\n toLogo: string;\n swapperId: string;\n expectedOutputAmountHumanReadable: string | null;\n startTransactionTime: number;\n internalSteps: SwapperStatusStep[] | null;\n estimatedTimeInSeconds: number | null;\n\n // status data\n status: StepStatus;\n networkStatus: PendingSwapNetworkStatus | null;\n executedTransactionId: string | null;\n executedTransactionTime: string | null;\n explorerUrl: SwapExplorerUrl[] | null;\n diagnosisUrl: string | null;\n outputAmount: string | null;\n\n // txs data\n cosmosTransaction: CosmosTransaction | null;\n transferTransaction: TransferTransaction | null;\n solanaTransaction: SolanaTransaction | null;\n evmApprovalTransaction: EvmTransaction | null;\n evmTransaction: EvmTransaction | null;\n tronApprovalTransaction: TronTransaction | null;\n tronTransaction: TronTransaction | null;\n starknetApprovalTransaction: StarknetTransaction | null;\n starknetTransaction: StarknetTransaction | null;\n\n // missing fields in older versions\n // keeping null for backward compatability\n swapperLogo: string | null;\n swapperType: string | null;\n fromBlockchainLogo: string | null;\n toBlockchainLogo: string | null;\n feeInUsd: string | null;\n};\n\nexport type WalletTypeAndAddress = {\n walletType: WalletType;\n address: string;\n};\n\nexport enum MessageSeverity {\n error = 'error',\n warning = 'warning',\n info = 'info',\n success = 'success',\n}\n\nexport type SwapStatus = 'running' | 'failed' | 'success';\n\nexport type PendingSwap = {\n creationTime: string;\n finishTime: string | null;\n requestId: string;\n inputAmount: string;\n status: SwapStatus;\n isPaused: boolean;\n extraMessage: string | null;\n extraMessageSeverity: MessageSeverity | null;\n extraMessageErrorCode: string | null;\n extraMessageDetail: string | null | undefined;\n networkStatusExtraMessage: string | null;\n networkStatusExtraMessageDetail: string | null;\n lastNotificationTime: string | null;\n wallets: { [p: string]: WalletTypeAndAddress };\n settings: SwapSavedSettings;\n steps: PendingSwapStep[];\n simulationResult: SimulationResult;\n validateBalanceOrFee: boolean;\n hasAlreadyProceededToSign?: boolean | null;\n};\n\nexport const getCurrentBlockchainOfOrNull = (\n swap: PendingSwap,\n step: PendingSwapStep\n): Network | null => {\n try {\n return getCurrentBlockchainOf(swap, step);\n } catch (e) {\n return null;\n }\n};\n\nexport const getCurrentBlockchainOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): Network => {\n const b1 =\n step.evmTransaction?.blockChain ||\n step.evmApprovalTransaction?.blockChain ||\n step.starknetTransaction?.blockChain ||\n step.starknetApprovalTransaction?.blockChain ||\n step.tronTransaction?.blockChain ||\n step.tronApprovalTransaction?.blockChain ||\n step.cosmosTransaction?.blockChain ||\n step.solanaTransaction?.blockChain;\n if (!!b1) return b1 as Network;\n\n const transferAddress = step.transferTransaction?.fromWalletAddress;\n if (!transferAddress) throw PrettyError.BlockchainMissing();\n\n const blockchain =\n Object.keys(swap.wallets).find(\n (b) => swap.wallets[b]?.address === transferAddress\n ) || null;\n if (blockchain == null) throw PrettyError.BlockchainMissing();\n\n // TODO: check why it returns string\n return blockchain as Network;\n};\n\nconst getBlockchainMetaExplorerBaseUrl = (\n blockchainMeta: BlockchainMeta\n): string | undefined => {\n if (isCosmosBlockchain(blockchainMeta))\n return blockchainMeta.info?.explorerUrlToTx;\n else if (\n isEvmBlockchain(blockchainMeta) ||\n isStarknetBlockchain(blockchainMeta) ||\n isTronBlockchain(blockchainMeta)\n )\n return blockchainMeta.info.transactionUrl;\n return;\n};\n\nexport const getScannerUrl = (\n txHash: string,\n network: Network,\n blockchainMetaMap: { [key: string]: BlockchainMeta }\n): string | undefined => {\n const blockchainMeta = blockchainMetaMap[network];\n const baseUrl = getBlockchainMetaExplorerBaseUrl(blockchainMeta);\n if (!baseUrl) return;\n if (baseUrl.indexOf('/{txHash}') !== -1)\n return baseUrl.replace('{txHash}', txHash?.toLowerCase());\n return `${baseUrl}/${txHash?.toLowerCase()}`;\n};\n\nexport function getNextStep(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): PendingSwapStep | null {\n return (\n swap.steps.find(\n (step) =>\n step.status !== 'failed' &&\n step.status !== 'success' &&\n step.id !== currentStep.id\n ) || null\n );\n}\n\n/**\n * Returns the wallet address, based on the current step of `PendingSwap`.\n */\nexport const getCurrentAddressOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): string => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n (step.transferTransaction?.fromWalletAddress\n ? { address: step.transferTransaction?.fromWalletAddress }\n : null) ||\n null;\n if (result == null) throw PrettyError.WalletMissing();\n return result.address;\n};\n\nexport function getRelatedWallet(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): WalletTypeAndAddress {\n const walletAddress = getCurrentAddressOf(swap, currentStep);\n const walletKV =\n Object.keys(swap.wallets)\n .map((k) => ({ k, v: swap.wallets[k] }))\n .find(({ v }) => v.address === walletAddress) || null;\n const blockchain = walletKV?.k || null;\n const wallet = walletKV?.v || null;\n\n const walletType = wallet?.walletType;\n if (wallet === null)\n throw PrettyError.AssertionFailed(\n `Wallet for source ${blockchain} not passed: walletType: ${walletType}`\n );\n return wallet;\n}\n\nexport function getRelatedWalletOrNull(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): WalletTypeAndAddress | null {\n try {\n return getRelatedWallet(swap, currentStep);\n } catch (e) {\n return null;\n }\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\n): BigNumber {\n let totalFeeInUsd = new BigNumber(0);\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') continue;\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function calculatePendingSwap(\n inputAmount: string,\n bestRoute: BestRouteResponse,\n wallets: { [p: string]: WalletTypeAndAddress },\n settings: SwapSavedSettings,\n validateBalanceOrFee: boolean,\n meta: MetaResponse | null\n): PendingSwap {\n const simulationResult = bestRoute.result;\n if (!simulationResult) throw Error('Simulation result should not be null');\n\n return {\n creationTime: new Date().getTime().toString(),\n finishTime: null,\n requestId: bestRoute.requestId || '',\n inputAmount: inputAmount,\n wallets,\n status: 'running',\n isPaused: false,\n extraMessage: null,\n extraMessageSeverity: null,\n extraMessageDetail: null,\n extraMessageErrorCode: null,\n networkStatusExtraMessage: null,\n networkStatusExtraMessageDetail: null,\n lastNotificationTime: null,\n settings: settings,\n simulationResult: simulationResult,\n validateBalanceOrFee,\n steps:\n bestRoute.result?.swaps?.map((swap, index) => {\n return {\n id: index + 1,\n\n // from\n fromBlockchain: swap.from.blockchain,\n fromBlockchainLogo: swap.from.blockchainLogo,\n fromLogo: swap.from.logo,\n fromSymbol: swap.from.symbol,\n fromSymbolAddress: swap.from.address,\n fromDecimals: swap.from.decimals,\n fromAmountPrecision: swap.fromAmountPrecision,\n fromAmountMinValue: swap.fromAmountMinValue,\n fromAmountMaxValue: swap.fromAmountMaxValue,\n fromAmountRestrictionType: swap.fromAmountRestrictionType,\n\n // to\n toBlockchain: swap.to.blockchain,\n toBlockchainLogo: swap.to.blockchainLogo,\n toSymbol: swap.to.symbol,\n toSymbolAddress: swap.to.address,\n toDecimals: swap.to.decimals,\n toLogo: swap.to.logo,\n\n // swapper\n swapperId: swap.swapperId,\n swapperLogo: swap.swapperLogo,\n swapperType: swap.swapperType,\n\n // output, fee, timing\n expectedOutputAmountHumanReadable: swap.toAmount,\n outputAmount: '',\n feeInUsd: meta\n ? numberToString(getUsdFeeOfStep(swap, meta?.tokens), null, 8)\n : null,\n estimatedTimeInSeconds: swap.estimatedTimeInSeconds || null,\n\n // status, tracking\n status: 'created',\n networkStatus: null,\n startTransactionTime: new Date().getTime(),\n externalTransactionId: null,\n executedTransactionId: null,\n executedTransactionTime: null,\n explorerUrl: null,\n diagnosisUrl: null,\n trackingCode: null,\n internalSteps: null,\n\n // transactions\n evmTransaction: null,\n evmApprovalTransaction: null,\n starknetTransaction: null,\n starknetApprovalTransaction: null,\n tronTransaction: null,\n tronApprovalTransaction: null,\n cosmosTransaction: null,\n solanaTransaction: null,\n transferTransaction: null,\n\n // front fields\n hasAlreadyProceededToSign: false,\n };\n }) || [],\n };\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const numberToString = (\n number: BigNumber | string | null,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null) return '';\n if (number === '') return '';\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) return n.toFormat(0, roundingMode);\n if (n.gte(1000))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(100))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(1))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n if (n.gte(0.01))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n for (let i = minDecimals || 4; i < 17; i++)\n if (n.gte(Math.pow(10, -i)))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n if (n.isEqualTo(0)) return '0';\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n", "import * as Sentry from '@sentry/browser';\nimport { PendingSwap, PendingSwapStep } from './shared';\nimport { WalletType } from '@rango-dev/wallets-shared';\n\nexport function logRPCError(\n error: unknown,\n swap: PendingSwap,\n currentStep: PendingSwapStep | undefined,\n walletType: WalletType | undefined\n): void {\n try {\n Sentry.captureException(error, {\n tags: {\n requestId: swap.requestId,\n rpc: true,\n swapper: currentStep?.swapperId || '',\n walletType: walletType || '',\n },\n level: 'warning' as any,\n });\n } catch (e) {\n console.log({ e });\n }\n}\n", "import { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport {\n delay,\n getCurrentStep,\n getCurrentStepTxType,\n resetNetworkStatus,\n setCurrentStepTx,\n updateSwapStatus,\n useTransactionsData,\n} from '../helpers';\nimport { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport {\n getCurrentBlockchainOf,\n getNextStep,\n getRelatedWallet,\n getScannerUrl,\n MessageSeverity,\n} from '../shared';\nimport { Transaction, TransactionStatusResponse } from 'rango-sdk';\nimport { httpService } from '../services';\nimport type { GenericSigner } from 'rango-types';\nimport { prettifyErrorMessage } from '../shared-errors';\n\nconst INTERVAL_FOR_CHECK = 5_000;\n\n/**\n * Subscribe to status of swap transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkTransactionStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails;\n const { meta } = context;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n\n if (!currentStep?.executedTransactionId) return;\n let txId = currentStep.executedTransactionId;\n\n let getTxReceiptFailed = false;\n let status: TransactionStatusResponse | null = null;\n let signer: GenericSigner<Transaction> | null = null;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n useTransactionsData();\n\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet)\n signer = context.getSigners(sourceWallet.walletType).getSigner(txType);\n } catch (error) {\n // wallet is not connected yet\n // no need to do anything\n }\n\n try {\n // if wallet is connected, try to get transaction reciept\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n if (signer?.wait && !receiptReceived) {\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepBlockchain,\n meta.blockchains\n );\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Swap',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse)\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n context?.notifier({\n eventType: 'task_failed',\n ...updateResult,\n });\n getTxReceiptFailed = true;\n // We shouldn't return here, because we need to trigger check status job in backend.\n // This is not a ui requirement but the backend one.\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n status = await httpService().checkStatus({\n requestId: swap.requestId,\n txId,\n step: currentStep.id,\n });\n } catch (e) {\n await delay(INTERVAL_FOR_CHECK);\n retry();\n return;\n }\n\n // If user cancel swap during check status api call,\n // or getting transaction receipt failed,\n // we should ignore check status response and return\n if (getTxReceiptFailed) return failed();\n if (currentStep?.status === 'failed') return;\n\n const outputAmount: string | null =\n status?.outputAmount ||\n (currentStep.outputAmount ? currentStep.outputAmount : null);\n const prevOutputAmount = currentStep.outputAmount || null;\n swap.extraMessage = status?.extraMessage || swap.extraMessage;\n swap.extraMessageSeverity = MessageSeverity.info;\n swap.extraMessageDetail = '';\n\n currentStep.status = status?.status || currentStep.status;\n currentStep.diagnosisUrl =\n status?.diagnosisUrl || currentStep.diagnosisUrl || null;\n currentStep.outputAmount = outputAmount || currentStep.outputAmount;\n currentStep.explorerUrl = status?.explorerUrl || currentStep.explorerUrl;\n currentStep.internalSteps = status?.steps || null;\n\n const newTransaction = status?.newTx;\n\n if (newTransaction) {\n currentStep.status = 'created';\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n setCurrentStepTx(currentStep, newTransaction);\n }\n\n if (prevOutputAmount === null && outputAmount !== null)\n context.notifier({\n eventType: 'step_completed_with_output',\n swap: swap,\n step: currentStep,\n });\n else if (prevOutputAmount === null && outputAmount === null) {\n // it is needed to set notification after reloading the page\n context.notifier({\n eventType: 'check_tx_status',\n swap: swap,\n step: currentStep,\n });\n }\n\n if (currentStep.status === 'success') {\n const nextStep = getNextStep(swap, currentStep);\n swap.extraMessageDetail = '';\n swap.extraMessage = nextStep\n ? `starting next step: ${nextStep.swapperId}: ${nextStep.fromBlockchain} -> ${nextStep.toBlockchain}`\n : '';\n } else if (currentStep.status === 'failed') {\n swap.extraMessage = 'Transaction failed in blockchain';\n swap.extraMessageSeverity = MessageSeverity.error;\n swap.extraMessageDetail = status?.extraMessage || '';\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n }\n\n // Sync data with storage\n setStorage({ ...getStorage(), swapDetails: swap });\n\n if (status?.status === 'failed') {\n failed();\n } else if (\n status?.status === 'success' ||\n (status?.status === 'running' && !!status.newTx)\n ) {\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(INTERVAL_FOR_CHECK);\n retry();\n }\n}\n\n/**\n * Subscribe to status of approval transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkApprovalStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const { meta } = context;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n useTransactionsData();\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null');\n return;\n }\n\n if (!currentStep?.executedTransactionId) return;\n let txId = currentStep.executedTransactionId;\n\n let signer: GenericSigner<Transaction> | null = null;\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet)\n signer = context.getSigners(sourceWallet.walletType).getSigner(txType);\n } catch (error) {\n // wallet is not connected yet\n // no need to do anything\n }\n\n try {\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n // if wallet is connected, try to get transaction reciept\n if (signer?.wait && !receiptReceived) {\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepBlockchain,\n meta.blockchains\n );\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Approve',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse)\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n context?.notifier({\n eventType: 'task_failed',\n ...updateResult,\n });\n return failed();\n }\n\n let isApproved = false;\n try {\n const response = await httpService().checkApproval(\n swap.requestId,\n currentStep.executedTransactionId\n );\n // If user cancel swap during check status api call, we should ignore check approval response\n if (currentStep?.status === 'failed') return;\n\n isApproved = response.isApproved;\n if (\n !isApproved &&\n (response.txStatus === 'failed' || response.txStatus === 'success')\n ) {\n let message, details;\n if (response.txStatus === 'failed') {\n message = 'Approve transaction failed';\n details = 'Smart contract approval tx failed in blockchain.';\n } else {\n message = 'Not enough approval';\n if (response.requiredApprovedAmount && response.currentApprovedAmount)\n details = `Required approval: ${response.requiredApprovedAmount}, current approval: ${response.currentApprovedAmount}`;\n else details = `You still don't have enough approval for this swap.`;\n }\n // approve transaction failed on\n // we should fail the whole swap\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'INSUFFICIENT_APPROVE',\n message: message,\n details: details,\n });\n context.notifier({\n eventType: 'not_enough_approval',\n ...updateResult,\n });\n failed();\n } else if (!isApproved) {\n // it is needed to set notification after reloading the page\n context.notifier({\n eventType: 'check_approve_tx_status',\n swap: swap,\n step: currentStep,\n });\n }\n } catch (e) {\n isApproved = false;\n }\n if (isApproved) {\n currentStep.status = 'approved';\n swap.extraMessage = `Spending ${currentStep.fromSymbol} approved successfully.`;\n swap.extraMessageDetail = null;\n swap.extraMessageSeverity = MessageSeverity.success;\n currentStep.evmApprovalTransaction = null;\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.tronApprovalTransaction = null;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n context.notifier({\n eventType: 'contract_confirmed',\n swap: swap,\n step: currentStep,\n });\n\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(2000);\n retry();\n }\n}\n\n/**\n *\n * For doing a swap the user needs to accept a `contract` so it can use the user balance.\n * There is two types of check status:\n * 1. Checking approval transaction (Give permission to a contract)\n * 2. Checking swap transaction.\n *\n */\nexport async function checkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const swap = actions.getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null', swap.requestId);\n return;\n }\n\n // Reset network status\n // Because when check status is on `loading` or `failed` status, it shows previous message that isn't related to current state.\n resetNetworkStatus(actions);\n\n if (currentStep.status === 'running') {\n await checkTransactionStatus(actions);\n } else if (currentStep.status === 'waitingForApproval') {\n await checkApprovalStatus(actions);\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport {\n getCurrentStep,\n updateSwapStatus,\n throwOnOK,\n getCurrentStepTx,\n setCurrentStepTx,\n} from '../helpers';\nimport { prettifyErrorMessage } from '../shared-errors';\nimport { CreateTransactionRequest } from 'rango-sdk';\nimport { httpService } from '../services';\n\n/**\n *\n * When a user asks for a swap, We first create the transaction by sending a request to server\n * Server will return the transaction that need to be sent to wallet.\n * It can be failed if server goes through an error, If not, we will schedule the `EXECTUTE_TRANSACTION`.\n *\n */\nexport async function createTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { setStorage, getStorage, next, schedule, context } = actions;\n const swap = getStorage().swapDetails;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n const transaction = getCurrentStepTx(currentStep);\n\n if (!transaction) {\n const request: CreateTransactionRequest = {\n requestId: swap.requestId,\n step: currentStep.id,\n userSettings: {\n slippage: swap.settings.slippage,\n infiniteApprove: swap.settings.infiniteApprove,\n },\n validations: {\n balance: swap.validateBalanceOrFee,\n fee: swap.validateBalanceOrFee,\n },\n };\n try {\n // Getting transcation from server.\n\n const { transaction } = await throwOnOK(\n httpService().createTransaction(request)\n );\n\n if (transaction) setCurrentStepTx(currentStep, transaction);\n\n setStorage({ ...getStorage(), swapDetails: swap });\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n next();\n } catch (error) {\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n const { extraMessage, extraMessageDetail } = prettifyErrorMessage(error);\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: 'FETCH_TX_FAILED',\n });\n context.notifier({\n eventType: 'task_failed',\n ...updateResult,\n });\n\n actions.failed();\n }\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport {\n ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET,\n} from '../constants';\n\nimport {\n getCurrentStep,\n isNetworkMatchedForTransaction,\n isRequiredWalletConnected,\n updateNetworkStatus,\n singTransaction,\n resetNetworkStatus,\n getRequiredWallet,\n isNeedBlockQueueForParallel,\n claimQueue,\n} from '../helpers';\nimport { getCurrentBlockchainOf, PendingSwapNetworkStatus } from '../shared';\nimport {\n BlockReason,\n SwapActionTypes,\n SwapQueueContext,\n SwapStorage,\n} from '../types';\n\n/**\n * Excecute a created transaction.\n *\n * This function implemented the parallel mode by `claim` mechanism which means\n * All the queues the meet certain situation (like multiple evm transaction) will go through\n * a `claim` mechanims that decides which queue should be run and it blocks other ones.\n *\n * A queue will be go to sign process, if the wallet and network is matched.\n */\nexport async function executeTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { getStorage, context } = actions;\n const { meta, wallets, providers } = context;\n const { claimedBy } = claimQueue();\n\n const isClaimed = context.claimedBy === context._queue?.id;\n const requestBlock: typeof actions.block = (blockedFor) => {\n actions.block(blockedFor);\n if (isClaimed && actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const swap = getStorage().swapDetails;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n\n // Resetting network status, so we will set it again during the running of this task.\n resetNetworkStatus(actions);\n\n /* Make sure wallet is connected and also the connected wallet is matched with tx by checking address. */\n const isWrongAddress = !isRequiredWalletConnected(swap, context.state).ok;\n if (isWrongAddress) {\n const { type, address } = getRequiredWallet(swap);\n const isWalletInCompatible = wallets?.blockchains?.find(\n (w) => !w.accounts?.find((account) => account.walletType === type)\n );\n const description =\n !wallets || isWalletInCompatible\n ? ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type)\n : ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET(type, address);\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n };\n requestBlock(blockedFor);\n return;\n }\n\n /* Wallet should be on correct network */\n const networkMatched = await isNetworkMatchedForTransaction(\n swap,\n currentStep,\n wallets,\n meta,\n providers\n );\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId && !isClaimed;\n if (isClaimedByAnyQueue && !networkMatched) {\n const details = ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES;\n\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n } else if (!networkMatched) {\n const fromBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const details = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(fromBlockchain);\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n } else {\n // Update network to mark it as network changed successfully.\n updateNetworkStatus(actions, {\n message: '',\n details: 'Wallet network changed successfully',\n status: PendingSwapNetworkStatus.NetworkChanged,\n });\n }\n\n /* \n For avoiding conflict by making too many requests to wallet, we need to make sure\n We only run one request at a time (In parallel mode).\n */\n const needsToBlockQueue = isNeedBlockQueueForParallel(currentStep);\n\n if (needsToBlockQueue && !isClaimed) {\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n description: ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n details: {},\n };\n requestBlock(blockedFor);\n return;\n }\n\n // All the conditions are met. We can safely send the tx to wallet for sign.\n singTransaction(actions);\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport { getCurrentStep, isTxAlreadyCreated } from '../helpers';\n\n/**\n *\n * This function is responsibe for scheduling the correct `action` based on `PendingSwap` status.\n * It means `action`s schedule this step to decide what should be the next step/task.\n *\n * It's acts like a `while(true)` and will `break` the loop on certain `action`s like `CHECK_STATUS`.\n *\n *\n */\nexport function scheduleNextStep({\n schedule,\n next,\n failed,\n setStorage,\n getStorage,\n context,\n}: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>): void {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n const isFailed = swap.steps.find((step) => step.status === 'failed');\n\n if (!!currentStep && !isFailed) {\n if (isTxAlreadyCreated(swap, currentStep)) {\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n return next();\n }\n\n if (currentStep?.executedTransactionId) {\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n return next();\n }\n\n swap.status = 'running';\n\n setStorage({ ...getStorage(), swapDetails: swap });\n\n schedule(SwapActionTypes.CREATE_TRANSACTION);\n next();\n } else {\n swap.status = isFailed ? 'failed' : 'success';\n swap.finishTime = new Date().getTime().toString();\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n context.notifier({\n eventType: isFailed ? 'task_failed' : 'task_completed',\n swap: swap,\n step: null,\n });\n\n if (isFailed) failed();\n else next();\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { SwapActionTypes, SwapStorage } from '../types';\n\nexport function start({\n schedule,\n next,\n}: ExecuterActions<SwapStorage, SwapActionTypes>): void {\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n}\n", "import { BlockReason, SwapActionTypes, SwapQueueDef } from './types';\nimport { checkStatus } from './actions/checkStatus';\nimport { createTransaction } from './actions/createTransaction';\nimport { executeTransaction } from './actions/executeTransaction';\nimport { scheduleNextStep } from './actions/scheduleNextStep';\nimport { start } from './actions/start';\nimport {\n onBlockForChangeNetwork,\n onBlockForConnectWallet,\n onDependsOnOtherQueues,\n} from './helpers';\n\n/**\n *\n * The idea behind this queue is to be able dynamically add some steps.\n * After running a swap, it can be blocked (like on waiting for switch netwrok)\n * or waits for something happend (like checking status of a transaction from server)\n *\n */\nexport const swapQueueDef: SwapQueueDef = {\n name: 'swap',\n actions: {\n [SwapActionTypes.START]: start,\n [SwapActionTypes.SCHEDULE_NEXT_STEP]: scheduleNextStep,\n [SwapActionTypes.CREATE_TRANSACTION]: createTransaction,\n [SwapActionTypes.EXECUTE_TRANSACTION]: executeTransaction,\n [SwapActionTypes.CHECK_TRANSACTION_STATUS]: checkStatus,\n },\n run: [SwapActionTypes.START],\n whenTaskBlocked: (event, meta) => {\n if (event.reason.reason === BlockReason.WAIT_FOR_CONNECT_WALLET) {\n onBlockForConnectWallet(event, meta);\n } else if (event.reason.reason === BlockReason.WAIT_FOR_NETWORK_CHANGE) {\n onBlockForChangeNetwork(event, meta);\n } else if (event.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES) {\n onDependsOnOtherQueues(event, meta);\n }\n },\n};\n", "import { useManager } from '@rango-dev/queue-manager-react';\nimport { useEffect, useState } from 'react';\nimport {\n checkWaitingForConnectWalletChange,\n checkWaitingForNetworkChange,\n retryOn,\n} from './helpers';\nimport { migrated, migration } from './migration';\nimport { UseQueueManagerParams } from './types';\n\nlet isCalled = 0;\n\n/**\n *\n * Runs a migration (old swaps from localstorage to queue manager's IndexedDB)\n * It will be run only once on page load.\n *\n */\nfunction useMigration(): {\n status: boolean;\n} {\n const isMigrated = migrated();\n const [status, setStatus] = useState<boolean>(isMigrated);\n\n useEffect(() => {\n (async () => {\n // Preventing react to be called twice on Strict Mode (development)\n if (isCalled) return;\n isCalled = 1;\n\n migration().finally(() => {\n setStatus(true);\n });\n })();\n }, []);\n\n return {\n status,\n };\n}\n\n/**\n *\n * On initial load and also connect/disconnet we may need to update swap's notified message.\n * And also if a new wallet is connected we will retry the queue to see we can resume it or not.\n *\n */\nfunction useQueueManager(params: UseQueueManagerParams): void {\n const { manager } = useManager();\n\n useEffect(() => {\n if (params.lastConnectedWallet) {\n checkWaitingForConnectWalletChange({\n evmChains: params.evmChains,\n wallet_network: params.lastConnectedWallet,\n manager,\n notifier: params.notifier,\n });\n retryOn(\n params.lastConnectedWallet,\n params.notifier,\n manager,\n params.canSwitchNetworkTo\n );\n }\n }, [params.lastConnectedWallet]);\n\n useEffect(() => {\n if (params.disconnectedWallet) {\n checkWaitingForNetworkChange(manager);\n\n /* \n We need to reset the state value, so if a wallet disconnected twice (after reconnect),\n this effect will be run properly.\n */\n params.clearDisconnectedWallet();\n }\n }, [params.disconnectedWallet]);\n}\n\nexport { useQueueManager, useMigration };\n", "import {\n PersistedQueue,\n Persistor,\n Status,\n DB_NAME,\n} from '@rango-dev/queue-manager-core';\nimport { v4 as uuid } from 'uuid';\nimport { PendingSwap } from './shared';\nimport { SwapActionTypes } from './types';\n\nconst MIGRATED_KEY = 'migratedToQueueManager';\n\n/**\n *\n * If `MIGRATED_KEY` is set, it means we already migrated data from localstorage.\n *\n */\nfunction migrated(): boolean {\n return !!window.localStorage.getItem(MIGRATED_KEY);\n}\n\nasync function hasQueueManagerOnIDB(): Promise<boolean> {\n try {\n return (await (window.indexedDB as any).databases())\n .map((db: any) => db.name)\n .includes(DB_NAME);\n } catch {\n return false;\n }\n}\n\n/**\n *\n * By calling this function, we first check if the data already migrated or not,\n * If not, starting to migrating to IndexedDb with proper format that queue manager is understand.\n *\n */\nasync function migration(): Promise<boolean> {\n const swapsFromStorage = window.localStorage.getItem('pendingSwaps');\n const hasIndexDB = await hasQueueManagerOnIDB();\n\n // For new users or already migrated.\n if (!swapsFromStorage || migrated() || hasIndexDB) {\n return true;\n }\n\n // For old users, but they didn't do any swaps yet.\n const swaps: PendingSwap[] = JSON.parse(swapsFromStorage);\n const convertedSwaps: PersistedQueue[] = [];\n\n swaps.forEach((swap) => {\n /* \n For running task we need to add some more work\n We need to create a queue task to be run and resume the running task from queue manager.\n */\n if (swap.status === 'running') {\n const taskId = uuid();\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status: Status.RUNNING,\n storage: {\n swapDetails: swap,\n },\n state: {\n status: Status.RUNNING,\n activeTaskIndex: 0,\n tasks: {\n [taskId]: {\n blockedFor: null,\n status: Status.RUNNING,\n },\n },\n },\n tasks: [\n {\n id: taskId,\n action: SwapActionTypes.SCHEDULE_NEXT_STEP,\n },\n ],\n };\n convertedSwaps.push(convertedSwap);\n } else {\n /*\n * For failed or successful swaps, we only move it to IndexedDB,\n * And there is no need to consider them to be run.\n */\n const status = swap.status === 'success' ? Status.SUCCESS : Status.FAILED;\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status,\n storage: {\n swapDetails: swap,\n },\n state: {\n status,\n activeTaskIndex: 0,\n tasks: {},\n },\n tasks: [],\n };\n\n convertedSwaps.push(convertedSwap);\n }\n });\n\n // Getting an instance from persistor, so we can directly put our data inside it.\n const persistor = new Persistor();\n\n const promises = convertedSwaps.map((queue) => persistor.insertQueue(queue));\n await Promise.all(promises);\n\n // Mark as the data has been successfully migrated.\n window.localStorage.setItem(MIGRATED_KEY, '1');\n\n return true;\n}\n\nexport { migration, migrated };\n", "import { Configs, initConfig } from './configs';\nimport { SwapQueueDef } from './types';\nimport { swapQueueDef } from './queueDef';\n\nexport { PrettyError, prettifyErrorMessage } from './shared-errors';\nexport type { SwapQueueContext, SwapStorage } from './types';\nexport type {\n PendingSwapWithQueueID,\n PendingSwapStep,\n PendingSwap,\n EventType,\n SwapProgressNotification,\n} from './shared';\nexport {\n getCurrentBlockchainOfOrNull,\n getRelatedWalletOrNull,\n getRelatedWallet,\n MessageSeverity,\n PendingSwapNetworkStatus,\n calculatePendingSwap,\n} from './shared';\nexport {\n updateSwapStatus,\n checkWaitingForNetworkChange,\n getCurrentStep,\n getEvmProvider,\n cancelSwap,\n getRequiredWallet,\n getRunningSwaps,\n splitWalletNetwork,\n resetRunningSwapNotifsOnPageLoad,\n} from './helpers';\nexport { useMigration, useQueueManager } from './hooks';\n\nexport function makeQueueDefinition(configs: Configs): SwapQueueDef {\n initConfig(configs);\n return swapQueueDef;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["RANGO_PUBLIC_API_KEY", "configs", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "getBlockChainNameFromId", "
|
|
4
|
+
"sourcesContent": ["export interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\n// this API key is limited and\n// it is only for test purpose\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n", "import {\n ExecuterActions,\n QueueInfo,\n QueueName,\n QueueType,\n} from '@rango-dev/queue-manager-core';\nimport {\n BlockReason,\n SwapActionTypes,\n SwapQueueContext,\n SwapQueueDef,\n SwapStorage,\n} from './types';\nimport {\n getBlockChainNameFromId,\n Meta,\n Network,\n Networks,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { Providers, readAccountAddress } from '@rango-dev/wallets-core';\n\nimport {\n Transaction,\n TransactionType,\n EvmBlockchainMeta,\n CreateTransactionResponse,\n isEvmTransaction,\n isCosmosTransaction,\n isSolanaTransaction,\n isTronTransaction,\n isStarknetTransaction,\n isTransferTransaction,\n} from 'rango-sdk';\n\nimport {\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n} from './constants';\nimport { Manager } from '@rango-dev/queue-manager-core';\nimport { Status } from '@rango-dev/queue-manager-core';\nimport {\n EventType,\n getCurrentBlockchainOf,\n getCurrentBlockchainOfOrNull,\n getScannerUrl,\n getRelatedWalletOrNull,\n MessageSeverity,\n PendingSwap,\n PendingSwapNetworkStatus,\n PendingSwapStep,\n StepStatus,\n SwapStatus,\n Wallet,\n getRelatedWallet,\n getCurrentAddressOf,\n} from './shared';\nimport { logRPCError } from './shared-sentry';\nimport {\n PrettyError,\n mapAppErrorCodesToAPIErrorCode,\n prettifyErrorMessage,\n} from './shared-errors';\nimport { httpService } from './services';\nimport { APIErrorCode, SignerErrorCode } from 'rango-types/lib';\n\ntype WhenTaskBlocked = Parameters<NonNullable<SwapQueueDef['whenTaskBlocked']>>;\ntype WhenTaskBlockedEvent = WhenTaskBlocked[0];\ntype WhenTaskBlockedMeta = WhenTaskBlocked[1];\n\nlet swapClaimedBy: { id: string } | null = null;\n\n/**\n *\n * We simply use module-level variable to keep track of which queue has claimed the execution of parallel runnings.\n *\n */\nexport function claimQueue() {\n return {\n claimedBy: () => swapClaimedBy?.id,\n setClaimer: (queue_id: string) => {\n swapClaimedBy = {\n id: queue_id,\n };\n },\n reset: () => {\n swapClaimedBy = null;\n },\n };\n}\n\n/**\n *\n * We use module-level variable to keep track of\n * map of transactions hash to the TransactionResponse and ...\n *\n */\ntype TransactionData = {\n response?: any; // e.g. TransactionResponse in case of EVM transactions\n receiptReceived?: boolean; // e.g. is TransactionReceipt ready in case of EVM transactions\n};\nconst swapTransactionToDataMap: { [id: string]: TransactionData } = {};\nexport function useTransactionsData() {\n return {\n getTransactionDataByHash: (hash: string) =>\n swapTransactionToDataMap[hash] || {},\n setTransactionDataByHash: (hash: string, data: TransactionData) => {\n const r = swapTransactionToDataMap[hash];\n if (!r) swapTransactionToDataMap[hash] = {};\n swapTransactionToDataMap[hash].response =\n data.response || swapTransactionToDataMap[hash].response;\n swapTransactionToDataMap[hash].receiptReceived =\n data.receiptReceived ||\n swapTransactionToDataMap[hash].receiptReceived ||\n false;\n },\n };\n}\n\n/**\n * Sample inputs are:\n * - \"metamask-ETH\"\n * - \"metamask-BSC-BSC:0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n * - \"token-pocket-BSC-BSC:0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n * Returns \"wallet and network\" separately, even if the wallet is dashed inside.\n *\n */\n\nexport function splitWalletNetwork(input: string): string[] {\n const removedAddressInput = input?.split(':')[0] || '';\n const splittedInput = removedAddressInput.split('-');\n const network = splittedInput[splittedInput.length - 1];\n const walletNetwork = splittedInput.slice(0, -1);\n\n if (walletNetwork[walletNetwork.length - 1] === network) {\n walletNetwork.pop();\n }\n const wallet = walletNetwork.join('-');\n\n return [wallet, network];\n}\n\n/**\n *\n * Returns `steps`, if it's a `running` swap.\n * Each `PendingSwap` has a `steps` inside it, `steps` shows how many tasks should be created and run to finish the swap.\n *\n */\nexport const getCurrentStep = (swap: PendingSwap): PendingSwapStep | null => {\n return (\n swap.steps.find(\n (step) => step.status !== 'failed' && step.status !== 'success'\n ) || null\n );\n};\n\n/**\n *\n * Returns current step transaction\n *\n */\nexport const getCurrentStepTx = (\n currentStep: PendingSwapStep\n): Transaction | null => {\n const {\n evmTransaction,\n evmApprovalTransaction,\n cosmosTransaction,\n solanaTransaction,\n transferTransaction,\n starknetApprovalTransaction,\n starknetTransaction,\n tronApprovalTransaction,\n tronTransaction,\n } = currentStep;\n return (\n evmTransaction ||\n evmApprovalTransaction ||\n cosmosTransaction ||\n solanaTransaction ||\n transferTransaction ||\n starknetApprovalTransaction ||\n starknetTransaction ||\n tronApprovalTransaction ||\n tronTransaction\n );\n};\n\n/**\n *\n * Set current step transaction\n *\n */\nexport const setCurrentStepTx = (\n currentStep: PendingSwapStep,\n transaction: Transaction\n): PendingSwapStep => {\n currentStep.transferTransaction = null;\n currentStep.cosmosTransaction = null;\n currentStep.evmTransaction = null;\n currentStep.solanaTransaction = null;\n currentStep.evmApprovalTransaction = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.starknetTransaction = null;\n currentStep.tronApprovalTransaction = null;\n currentStep.tronTransaction = null;\n\n if (isEvmTransaction(transaction)) {\n if (transaction.isApprovalTx)\n currentStep.evmApprovalTransaction = transaction;\n else currentStep.evmTransaction = transaction;\n } else if (isCosmosTransaction(transaction)) {\n currentStep.cosmosTransaction = transaction;\n } else if (isSolanaTransaction(transaction)) {\n currentStep.solanaTransaction = transaction;\n } else if (isTransferTransaction(transaction)) {\n currentStep.transferTransaction = transaction;\n } else if (isStarknetTransaction(transaction)) {\n if (transaction.isApprovalTx)\n currentStep.starknetApprovalTransaction = transaction;\n else currentStep.starknetTransaction = transaction;\n } else if (isTronTransaction(transaction)) {\n if (transaction.isApprovalTx)\n currentStep.tronApprovalTransaction = transaction;\n else currentStep.tronTransaction = transaction;\n }\n return currentStep;\n};\n\n/**\n *\n * Returns current step transaction type\n *\n */\nexport const getCurrentStepTxType = (\n currentStep: PendingSwapStep\n): TransactionType | undefined => {\n return getCurrentStepTx(currentStep)?.type;\n};\n\n/**\n *\n * Returns a boolean indicating that current step is an approval tx or not.\n *\n */\nexport const isApprovalCurrentStepTx = (\n currentStep: PendingSwapStep\n): boolean => {\n const {\n evmApprovalTransaction,\n starknetApprovalTransaction,\n tronApprovalTransaction,\n } = currentStep;\n return !!(\n evmApprovalTransaction ||\n starknetApprovalTransaction ||\n tronApprovalTransaction\n );\n};\n\n/**\n * When we are doing a swap, there are some common fields that will be updated together.\n * This function helps us to update a swap status and also it will update some more fields like `extraMessageSeverity` based on the input.\n */\nexport function updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus,\n nextStepStatus,\n message,\n details,\n errorCode = null,\n hasAlreadyProceededToSign,\n}: {\n getStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['getStorage'];\n setStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['setStorage'];\n nextStatus?: SwapStatus;\n nextStepStatus?: StepStatus;\n message?: string;\n details?: string | null | undefined;\n errorCode?: APIErrorCode | SignerErrorCode | null;\n hasAlreadyProceededToSign?: boolean;\n}): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n if (!!nextStepStatus && !!currentStep) currentStep.status = nextStepStatus;\n\n if (nextStatus) swap.status = nextStatus;\n swap.hasAlreadyProceededToSign = hasAlreadyProceededToSign;\n if (!!nextStatus && ['failed', 'success'].includes(nextStatus))\n swap.finishTime = new Date().getTime().toString();\n\n if (!!message || !!details) {\n swap.extraMessage = message || '';\n swap.extraMessageDetail = details || '';\n }\n\n if (!!nextStepStatus && ['failed'].includes(nextStepStatus)) {\n //if user cancel the swap, we should pass relevant reason to the server.\n const errorReason =\n details && details.includes('Warning')\n ? 'Swap canceled by user.'\n : details;\n const walletType = getRelatedWalletOrNull(swap, currentStep!)?.walletType;\n swap.extraMessageSeverity = MessageSeverity.error;\n\n httpService()\n .reportFailure({\n requestId: swap.requestId,\n step: currentStep?.id || 1,\n eventType: mapAppErrorCodesToAPIErrorCode(errorCode),\n reason: errorReason || '',\n data: walletType ? { wallet: walletType } : undefined,\n })\n .then()\n .catch();\n } else if (!!nextStepStatus && ['running'].includes(nextStepStatus))\n swap.extraMessageSeverity = MessageSeverity.info;\n else if (!!nextStepStatus && ['success', 'approved'].includes(nextStepStatus))\n swap.extraMessageSeverity = MessageSeverity.success;\n else if (nextStepStatus && ['waitingForApproval'].includes(nextStepStatus))\n swap.extraMessageSeverity = MessageSeverity.warning;\n\n if (nextStepStatus === 'running' && currentStep)\n currentStep.startTransactionTime = new Date().getTime();\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\n/**\n *\n * Set current step transaction hash, update pending swap status, and notify user if needed\n *\n */\nexport function setStepTransactionIds(\n { getStorage, setStorage }: ExecuterActions<SwapStorage, SwapActionTypes>,\n txId: string | null,\n notifier: SwapQueueContext['notifier'],\n eventType?: EventType,\n explorerUrl?: { url?: string; description?: string }\n): void {\n const swap = getStorage().swapDetails;\n swap.hasAlreadyProceededToSign = null;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n currentStep.executedTransactionId = txId;\n currentStep.executedTransactionTime = new Date().getTime().toString();\n if (explorerUrl?.url)\n currentStep.explorerUrl = [\n ...(currentStep.explorerUrl || []),\n {\n url: explorerUrl.url,\n description: explorerUrl.description || null,\n },\n ];\n if (eventType === 'check_tx_status') {\n swap.extraMessage = 'Checking transaction status ...';\n swap.extraMessageDetail = '';\n swap.extraMessageSeverity = MessageSeverity.info;\n } else if (eventType === 'check_approve_tx_status') {\n swap.extraMessage = 'Checking approve transaction status ...';\n swap.extraMessageDetail = '';\n swap.extraMessageSeverity = MessageSeverity.info;\n }\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n if (eventType)\n notifier({ eventType: eventType, swap: swap, step: currentStep });\n}\n\n/**\n * If a swap needs a wallet to be connected,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage,\n setStorage,\n }: Pick<ExecuterActions, 'getStorage' | 'setStorage'>,\n reason: string,\n reasonDetail: string\n): void {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) return;\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n const isAlreadyMarked =\n currentStep.networkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet &&\n swap.networkStatusExtraMessage === reason &&\n swap.networkStatusExtraMessageDetail === reasonDetail;\n\n if (isAlreadyMarked) {\n return;\n }\n\n currentStep.networkStatus =\n PendingSwapNetworkStatus.WaitingForConnectingWallet;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n}\n\n/**\n * If a swap needs a certain network to proceed,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsSwitchingNetwork({\n getStorage,\n setStorage,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'>):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) return;\n\n // Generate message\n const { type } = getRequiredWallet(swap);\n const fromBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const reason = `Change ${type} wallet network to ${fromBlockchain}`;\n const reasonDetail = `Please change your ${type} wallet network to ${fromBlockchain}.`;\n\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForNetworkChange;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\n/**\n * We are marking the queue as it depends on other queues to be run (on Parallel mode)\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsDependsOnOtherQueues({\n getStorage,\n setStorage,\n notifier,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'> & {\n notifier: SwapQueueContext['notifier'];\n}):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) return;\n\n swap.networkStatusExtraMessage = '';\n swap.networkStatusExtraMessageDetail = '';\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForQueue;\n\n notifier({\n eventType: 'waiting_for_queue',\n swap,\n step: currentStep,\n });\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\nexport function delay(ms: number): Promise<unknown> {\n return new Promise((res) => setTimeout(res, ms));\n}\n\n/**\n *\n * To execute a swap, we are keeping the user prefrences on what wallet they are going to use for a sepecific blockchain\n * By passing the swap and the network we are looking for, it returns the wallet name that user selected.\n *\n */\nexport const getSwapWalletType = (\n swap: PendingSwap,\n network: Network\n): WalletType => {\n return swap.wallets[network]?.walletType;\n};\n\n/**\n *\n * We are keeping the connected wallet in a specific structure (`Wallet`),\n * By using this function we normally want to check a specific wallet is connected and exists or not.\n *\n */\nexport function isWalletNull(wallet: Wallet | null): boolean {\n return (\n wallet === null ||\n wallet?.blockchains === null ||\n wallet?.blockchains.length === 0\n );\n}\n\n/**\n * On our implementation for `wallets` package, We keep the instance in 2 ways\n * If it's a single chain wallet, it returns the instance directly,\n * If it's a multichain wallet, it returns a `Map` of instances.\n * This function will get the `ETHEREUM` instance in both types.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getEvmProvider(providers: Providers, type: WalletType): any {\n if (type && providers[type]) {\n // we need this because provider can return an instance or a map of instances, so what you are doing here is try to detect that.\n if (providers[type].size) return providers[type].get(Networks.ETHEREUM);\n\n return providers[type];\n }\n return null;\n}\n\n/**\n * In a `PendingSwap`, each step needs a wallet to proceed,\n * By using this function we can access what wallet exactly we need to run current step.\n */\nexport function getRequiredWallet(swap: PendingSwap): {\n type: WalletType | null;\n network: Network | null;\n address: string | null;\n} {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const step = getCurrentStep(swap)!;\n const bcName = getCurrentBlockchainOfOrNull(swap, step);\n if (!bcName) {\n return {\n type: null,\n network: null,\n address: null,\n };\n }\n\n const walletType = getSwapWalletType(swap, bcName);\n const sourceWallet = swap.wallets[bcName];\n\n return {\n type: walletType || null,\n network: bcName,\n address: sourceWallet ? sourceWallet.address : null,\n };\n}\n\n/**\n * On EVM compatible wallets, There is one instance with different chains (like Polygon)\n * To get the chain from instance we will use this function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function getChainId(provider: any): Promise<string | number | null> {\n try {\n const chainId: number | string | null =\n (await provider.request({ method: 'eth_chainId' })) || provider?.chainId;\n return chainId;\n } catch {\n return provider?.chainId;\n }\n}\n\n/**\n * For running a swap safely, we need to make sure about the state of wallet\n * which means the netowrk/chain of wallet should be exactly on what a transaction needs.\n */\nexport async function isNetworkMatchedForTransaction(\n swap: PendingSwap,\n step: PendingSwapStep,\n wallet: Wallet | null,\n meta: Meta,\n providers: Providers\n): Promise<boolean> {\n if (isWalletNull(wallet)) {\n return false;\n }\n const fromBlockChain = getCurrentBlockchainOfOrNull(swap, step);\n if (!fromBlockChain) return false;\n\n if (\n meta.evmBasedChains.find(\n (evmBlochain) => evmBlochain.name === fromBlockChain\n )\n ) {\n try {\n const sourceWallet = swap.wallets[fromBlockChain];\n if (sourceWallet) {\n const provider = getEvmProvider(providers, sourceWallet.walletType);\n const chainId: number | string | null = await getChainId(provider);\n if (chainId) {\n const blockChain = getBlockChainNameFromId(\n chainId,\n Object.entries(meta.blockchains).map(\n ([, blockchainMeta]) => blockchainMeta\n )\n );\n if (\n blockChain &&\n blockChain.toLowerCase() === fromBlockChain.toLowerCase()\n )\n return true;\n if (\n blockChain &&\n blockChain.toLowerCase() !== fromBlockChain.toLowerCase()\n )\n return false;\n }\n }\n } catch (e) {\n console.log(e);\n }\n return false;\n }\n return true;\n}\n\nexport const isTxAlreadyCreated = (\n swap: PendingSwap,\n step: PendingSwapStep\n): boolean => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n step.transferTransaction?.fromWalletAddress ||\n null;\n\n return result !== null;\n};\n\nexport function resetNetworkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): void {\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n currentStep.networkStatus = null;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\nexport function updateNetworkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>,\n data: {\n message: string;\n details: string;\n status: PendingSwapNetworkStatus | null;\n } = {\n message: '',\n details: '',\n status: null,\n }\n): void {\n const { message, details, status } = data;\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n swap.networkStatusExtraMessage = message;\n swap.networkStatusExtraMessageDetail = details;\n currentStep.networkStatus = status;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for wallet),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required wallet is connected, unblock the queue to be run.\n */\nexport function onBlockForConnectWallet(\n event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const { ok, reason } = isRequiredWalletConnected(swap, context.state);\n\n if (!ok) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n context.notifier({\n eventType:\n reason === 'account_miss_match'\n ? 'waiting_for_change_wallet_account'\n : 'waiting_for_connecting_wallet',\n swap: swap,\n step: currentStep,\n });\n\n markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n },\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n event.reason.description\n );\n\n return;\n }\n\n queue.unblock();\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required network is connected, unblock the queue to be run.\n * Note: it automatically try to switch the network if its `provider` supports.\n */\nexport function onBlockForChangeNetwork(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n\n if (!currentStep || swap.status !== 'running') return;\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n });\n\n if (result) {\n context.notifier({\n eventType: 'waiting_for_network_change',\n swap: result.swap,\n step: result.step,\n });\n }\n\n // Try to auto switch\n const { type, network } = getRequiredWallet(swap);\n if (!!type && !!network) {\n if (context.canSwitchNetworkTo(type, network)) {\n const result = context.switchNetwork(type, network);\n if (result) {\n result\n .then(() => {\n queue.unblock();\n })\n .catch((error) => {\n // ignore switch network errors\n console.log({ error });\n });\n }\n }\n }\n}\n\n/**\n * Event handler for blocked tasks. (Parallel mode)\n * If a transcation execution flow is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks the blocked tasks, if there is no active `claimed` queue, try to give it to the best candidate.\n */\nexport function onDependsOnOtherQueues(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { getBlockedTasks, forceExecute, queue, manager, context } = meta;\n const { setClaimer, claimedBy, reset } = claimQueue();\n\n // We only needs those blocked tasks that have DEPENDS_ON_OTHER_QUEUES reason.\n const blockedTasks = getBlockedTasks().filter(\n (task) => task.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES\n );\n\n if (blockedTasks.length === 0) {\n return;\n }\n\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId;\n\n if (claimerId === queue.id) return;\n\n // Check if any queue `claimed` before, if yes, we don't should do anything.\n if (isClaimedByAnyQueue) {\n // We need to keep the latest swap messages\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n notifier: context.notifier,\n });\n return;\n }\n\n // Prioritize current queue to be run first.\n\n let task = blockedTasks.find((task) => {\n return task.queue_id === meta.queue_id;\n });\n\n // If current task isn't available anymore, fallback to first blocked task.\n if (!task) {\n const firstBlockedTask = blockedTasks[0];\n task = firstBlockedTask;\n }\n\n setClaimer(task.queue_id);\n const claimedStorage = task.storage.get() as SwapStorage;\n const { type, network, address } = getRequiredWallet(\n claimedStorage.swapDetails\n );\n\n // Run\n forceExecute(task.queue_id, {\n claimedBy: claimedBy(),\n resetClaimedBy: () => {\n reset();\n // TODO: Use key generator\n retryOn(\n `${type}-${network}:${address}`,\n context.notifier,\n manager,\n context.canSwitchNetworkTo\n );\n },\n });\n}\n\nexport function isRequiredWalletConnected(\n swap: PendingSwap,\n getState: (type: WalletType) => WalletState\n): { ok: boolean; reason: 'not_connected' | 'account_miss_match' } {\n const { type, address } = getRequiredWallet(swap);\n if (!type || !address) {\n return { ok: false, reason: 'not_connected' };\n }\n const walletState = getState(type);\n const { accounts, connected } = walletState;\n const connectedAccounts = accounts || [];\n if (!connected) return { ok: false, reason: 'not_connected' };\n\n const matched = connectedAccounts.some((account) => {\n const { address: accountAddress } = readAccountAddress(account);\n return address.toLocaleLowerCase() === accountAddress.toLocaleLowerCase();\n });\n return { ok: matched, reason: 'account_miss_match' };\n}\n\nexport function singTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): void {\n const { setTransactionDataByHash } = useTransactionsData();\n const { getStorage, setStorage, failed, next, schedule, context } = actions;\n const { meta, getSigners, notifier, isMobileWallet } = context;\n const swap = getStorage().swapDetails;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n\n const sourceWallet = getRelatedWallet(swap, currentStep);\n const mobileWallet = isMobileWallet(sourceWallet?.walletType);\n const walletAddress = getCurrentAddressOf(swap, currentStep);\n const walletSigners = getSigners(sourceWallet.walletType);\n const currentStepBlockchain = getCurrentBlockchainOf(swap, currentStep);\n\n const onFinish = () => {\n // TODO resetClaimedBy is undefined here\n if (actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const tx = getCurrentStepTx(currentStep);\n const txType = tx?.type;\n const isApproval = isApprovalCurrentStepTx(currentStep);\n const isSmartContractCall = [\n TransactionType.EVM,\n TransactionType.STARKNET,\n TransactionType.TRON,\n ].includes(txType!);\n\n const hasAlreadyProceededToSign =\n typeof swap.hasAlreadyProceededToSign === 'boolean';\n\n let nextStatus: SwapStatus | undefined,\n nextStepStatus: StepStatus,\n eventType: EventType,\n message: string,\n details: string;\n\n if (isApproval) {\n message = `Waiting for approval of ${currentStep?.fromSymbol} coin ${\n mobileWallet ? 'on your mobile phone!' : ''\n }`;\n details =\n 'Waiting for approve transaction to be mined and confirmed successfully';\n nextStepStatus = 'waitingForApproval';\n nextStatus = undefined;\n eventType = 'confirm_approve_contract';\n } else if (hasAlreadyProceededToSign) {\n message = 'Transaction is expired. Please try again.';\n nextStepStatus = 'failed';\n nextStatus = 'failed';\n details = '';\n eventType = 'transaction_expired';\n } else {\n message = 'Executing transaction ...';\n nextStepStatus = 'running';\n nextStatus = 'running';\n details = `${mobileWallet ? 'Check your mobile phone!' : ''}`;\n eventType = isSmartContractCall\n ? 'calling_smart_contract'\n : 'confirm_transfer';\n }\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStepStatus,\n nextStatus,\n message: message,\n details: details,\n hasAlreadyProceededToSign: isApproval\n ? undefined\n : hasAlreadyProceededToSign,\n errorCode: hasAlreadyProceededToSign ? 'TX_EXPIRED' : undefined,\n });\n notifier({\n eventType,\n ...updateResult,\n });\n\n if (hasAlreadyProceededToSign) {\n failed();\n onFinish();\n return;\n }\n const signer = walletSigners.getSigner(txType!);\n signer.signAndSendTx(tx!, walletAddress, null).then(\n ({ hash, response }) => {\n const explorerUrl = getScannerUrl(\n hash,\n currentStepBlockchain,\n meta.blockchains\n );\n setStepTransactionIds(\n actions,\n hash,\n notifier,\n isApproval ? 'check_approve_tx_status' : 'check_tx_status',\n explorerUrl\n ? { url: explorerUrl, description: isApproval ? 'Approve' : 'Swap' }\n : undefined\n );\n // response used for evm transactions to get receipt and track replaced\n response && setTransactionDataByHash(hash, { response });\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n next();\n onFinish();\n },\n (error) => {\n if (swap.status === 'failed') return;\n\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n\n // if it is an rpc error with details, send the log to sentry\n if (\n error &&\n error?.root &&\n error?.root?.message &&\n error?.root?.code &&\n error?.root?.reason\n )\n logRPCError(error.root, swap, currentStep, sourceWallet?.walletType);\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n const eventType =\n extraMessageErrorCode === 'REJECTED_BY_USER'\n ? 'contract_rejected'\n : isSmartContractCall\n ? 'smart_contract_call_failed'\n : 'transfer_failed';\n notifier({\n eventType,\n ...updateResult,\n });\n failed();\n onFinish();\n }\n );\n}\n\nexport function checkWaitingForConnectWalletChange(params: {\n wallet_network: string;\n manager?: Manager;\n evmChains: EvmBlockchainMeta[];\n notifier: SwapQueueContext['notifier'];\n}): void {\n const { wallet_network, evmChains, manager } = params;\n const [wallet, network] = splitWalletNetwork(wallet_network);\n // We only need change network for EVM chains.\n if (!evmChains.some((chain) => chain.name == network)) return;\n\n manager?.getAll().forEach((q) => {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n const currentStepRequiredWallet =\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType;\n const hasWaitingForConnect = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n // TODO double check later\n [BlockReason.WAIT_FOR_CONNECT_WALLET].includes(\n task.blockedFor?.reason\n )\n );\n }\n );\n\n if (\n currentStepRequiredWallet === wallet &&\n hasWaitingForConnect &&\n getCurrentBlockchainOfOrNull(swap, currentStep) != network\n ) {\n const queueInstance = q.list;\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(type);\n\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n description,\n },\n silent: true,\n });\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queueInstance.getStorage.bind(queueInstance),\n setStorage: queueInstance.setStorage.bind(queueInstance),\n });\n\n if (result) {\n params?.notifier({\n eventType: 'waiting_for_network_change',\n swap: result.swap,\n step: result.step,\n });\n }\n }\n }\n }\n });\n}\n\nexport function checkWaitingForNetworkChange(manager?: Manager): void {\n manager?.getAll().forEach((q) => {\n const hasWaitingForNetwork = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n [\n BlockReason.WAIT_FOR_NETWORK_CHANGE,\n BlockReason.DEPENDS_ON_OTHER_QUEUES,\n ].includes(task.blockedFor?.reason)\n );\n }\n );\n\n if (hasWaitingForNetwork) {\n const swap = q.list.getStorage()\n ?.swapDetails as SwapStorage['swapDetails'];\n if (swap.status === 'running') {\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type);\n\n // Change the block reason to waiting for connecting wallet\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n },\n });\n }\n }\n });\n}\n\n/**\n * Get list of all running swaps\n *\n * @param manager\n * @returns list of pending swaps\n */\nexport function getRunningSwaps(manager: Manager): PendingSwap[] {\n const queues = manager?.getAll() || new Map<QueueName, QueueInfo>();\n const result: PendingSwap[] = [];\n queues.forEach((q) => {\n // retry only on affected queues\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (!swap || swap.status !== 'running') return;\n result.push(swap);\n });\n return result;\n}\n\n/**\n *\n * Trying to reset notifications for pending swaps to correct message on page load.\n * We could remove this after supporting auto connect for wallets.\n *\n * @param swaps\n * @param notifier\n * @returns\n */\nexport function resetRunningSwapNotifsOnPageLoad(\n runningSwaps: PendingSwap[],\n notifier: SwapQueueContext['notifier']\n) {\n runningSwaps.forEach((swap) => {\n const currentStep = getCurrentStep(swap);\n let eventType: EventType | undefined;\n if (currentStep?.networkStatus === PendingSwapNetworkStatus.WaitingForQueue)\n eventType = 'waiting_for_queue';\n else if (swap?.status === 'running') {\n eventType = 'waiting_for_connecting_wallet';\n }\n if (!!eventType && !!notifier) {\n notifier({\n eventType,\n swap: swap,\n step: currentStep,\n });\n }\n });\n}\n\n/**\n *\n * Try to run blocked tasks by wallet and network name.\n * Goes through queues and extract blocked queues with matched wallet.\n * If found any blocked tasks with same wallet and network, runs them.\n * If not, runs only blocked tasks with matched wallet.\n *\n * @param wallet_network a string includes `wallet` type and `network` type.\n * @param manager\n * @returns\n */\nexport function retryOn(\n wallet_network: string,\n notifier: SwapQueueContext['notifier'],\n manager?: Manager,\n canSwitchNetworkTo?: (type: WalletType, network: Network) => boolean,\n options = { fallbackToOnlyWallet: true }\n): void {\n const [wallet, network] = splitWalletNetwork(wallet_network);\n if (!wallet || !network) {\n return;\n }\n\n const walletAndNetworkMatched: QueueType[] = [];\n const onlyWalletMatched: QueueType[] = [];\n\n manager?.getAll().forEach((q) => {\n // retry only on affected queues\n if (q.status === Status.BLOCKED) {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n if (\n getCurrentBlockchainOfOrNull(swap, currentStep) == network &&\n queueStorage?.swapDetails.wallets[network]?.walletType === wallet\n ) {\n walletAndNetworkMatched.push(q.list);\n } else if (\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType === wallet\n ) {\n onlyWalletMatched.push(q.list);\n }\n }\n }\n }\n });\n\n let finalQueueToBeRun: QueueType | undefined = undefined;\n if (walletAndNetworkMatched.length > 0) {\n finalQueueToBeRun = walletAndNetworkMatched[0];\n\n if (walletAndNetworkMatched.length > 1) {\n for (let i = 1; i < walletAndNetworkMatched.length; i++) {\n const currentQueue = walletAndNetworkMatched[i];\n\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: currentQueue.getStorage.bind(currentQueue),\n setStorage: currentQueue.setStorage.bind(currentQueue),\n notifier: notifier,\n });\n }\n }\n } else if (onlyWalletMatched.length > 0 && options.fallbackToOnlyWallet) {\n finalQueueToBeRun = onlyWalletMatched[0];\n }\n\n if (!canSwitchNetworkTo?.(wallet, network)) finalQueueToBeRun?.unblock();\n else finalQueueToBeRun?.checkBlock();\n}\n\n/* \n For avoiding conflict by making too many requests to wallet, we need to make sure\n We only run one request at a time (In parallel mode).\n */\nexport function isNeedBlockQueueForParallel(step: PendingSwapStep): boolean {\n return !!step.evmTransaction || !!step.evmApprovalTransaction;\n}\n\n/*\nCreate transaction endpoint doesn't return error code on http status code,\nFor backward compatibilty with server and sdk, we use this wrapper to reject the promise.\n*/\nexport async function throwOnOK(\n rawResponse: Promise<CreateTransactionResponse>\n): Promise<CreateTransactionResponse> {\n const responseBody = await rawResponse;\n if (!responseBody.ok || !responseBody.transaction) {\n throw PrettyError.CreateTransaction(\n responseBody.error || 'bad response from create tx endpoint'\n );\n }\n return responseBody;\n}\n\nexport function cancelSwap(\n swap: QueueInfo,\n manager?: Manager\n): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} {\n const { reset } = claimQueue();\n swap.actions.cancel();\n\n const updateResult = updateSwapStatus({\n getStorage: swap.actions.getStorage,\n setStorage: swap.actions.setStorage,\n message: 'Swap canceled by user.',\n details:\n \"Warning: If you've already signed and sent a transaction, it won't be affected, but next swap steps will not be executed.\",\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'USER_CANCEL',\n });\n reset();\n if (manager) manager?.retry();\n\n return updateResult;\n}\n", "export const ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES =\n 'Waiting for other swaps to complete';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET = 'Waiting for connecting wallet';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET = (\n type: string | null,\n address: string | null\n): string =>\n `Please change your ${type || 'wallet'} account to ${\n address || 'proper address'\n }`;\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION = (\n type: string | null\n): string =>\n `Please connect to ${\n type || 'your wallet'\n } by using bellow button or top right button on page.`;\nexport const ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK = (\n network: string | null\n): string => `Please change your network to ${network}.`;\n", "import type {\n APIErrorCode,\n SignerErrorCode as SignerErrorCodeType,\n} from 'rango-types';\nimport {\n SignerErrorCode,\n SignerError,\n isSignerErrorCode,\n isAPIErrorCode,\n} from 'rango-types';\n\nexport type ErrorDetail = {\n extraMessage: string;\n extraMessageDetail?: string | null | undefined;\n extraMessageErrorCode: SignerErrorCodeType | APIErrorCode | null;\n};\n\nconst ERROR_ASSERTION_FAILED = 'Assertion failed (Unexpected behaviour)';\nconst ERROR_CREATE_TRANSACTION = 'Create transaction failed in Rango Server';\nconst ERROR_INPUT_WALLET_NOT_FOUND = 'Input wallet not found';\n\ntype ErrorRoot = string | Record<string, string> | null;\n\nexport class PrettyError extends Error {\n private readonly detail?: string;\n private readonly root?: ErrorRoot;\n private readonly code?: APIErrorCode;\n public _isPrettyError = true;\n\n constructor(\n code: APIErrorCode,\n m: string,\n root?: ErrorRoot,\n detail?: string\n ) {\n super(m);\n Object.setPrototypeOf(this, PrettyError.prototype);\n PrettyError.prototype._isPrettyError = true;\n this.code = code;\n this.detail = detail;\n this.root = root;\n }\n\n static isPrettyError(obj: unknown): obj is PrettyError {\n return (\n obj instanceof PrettyError ||\n Object.prototype.hasOwnProperty.call(obj, '_isPrettyError')\n );\n }\n\n getErrorDetail(): ErrorDetail {\n const rawMessage =\n typeof this.root === 'object' && this.root && this.root.error\n ? this.root.error\n : JSON.stringify(this.root);\n const rootStr =\n typeof this.root === 'string'\n ? this.root\n : this.root instanceof Error\n ? this.root.message\n : rawMessage;\n return {\n extraMessage: this.message,\n extraMessageDetail: this.detail || rootStr,\n extraMessageErrorCode: this.code || null,\n };\n }\n\n static AssertionFailed(m: string): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_ASSERTION_FAILED,\n m\n );\n }\n\n static BadStatusCode(\n message: string,\n statusCode: number | string\n ): PrettyError {\n return new PrettyError(\n 'TX_FAIL',\n message,\n null,\n `status code = ${statusCode}`\n );\n }\n\n static CreateTransaction(detail: string): PrettyError {\n return new PrettyError(\n 'FETCH_TX_FAILED',\n ERROR_CREATE_TRANSACTION,\n null,\n detail\n );\n }\n\n static WalletMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n\n static BlockchainMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n}\n\nexport function mapAppErrorCodesToAPIErrorCode(\n errorCode: string | null\n): APIErrorCode {\n const defaultErrorCode = 'CLIENT_UNEXPECTED_BEHAVIOUR';\n try {\n if (!errorCode) return defaultErrorCode;\n if (isAPIErrorCode(errorCode)) return errorCode;\n if (isSignerErrorCode(errorCode)) {\n const t: { [key in SignerErrorCodeType]: APIErrorCode } = {\n [SignerErrorCode.REJECTED_BY_USER]: 'USER_REJECT',\n [SignerErrorCode.SIGN_TX_ERROR]: 'CALL_WALLET_FAILED',\n [SignerErrorCode.SEND_TX_ERROR]: 'SEND_TX_FAILED',\n [SignerErrorCode.NOT_IMPLEMENTED]: defaultErrorCode,\n [SignerErrorCode.OPERATION_UNSUPPORTED]: defaultErrorCode,\n [SignerErrorCode.UNEXPECTED_BEHAVIOUR]: defaultErrorCode,\n };\n return t[errorCode];\n }\n return defaultErrorCode;\n } catch (err) {\n return defaultErrorCode;\n }\n}\n\nexport const prettifyErrorMessage = (obj: unknown): ErrorDetail => {\n if (!obj) return { extraMessage: '', extraMessageErrorCode: null };\n if (PrettyError.isPrettyError(obj)) return obj.getErrorDetail();\n if (SignerError.isSignerError(obj)) {\n const t = obj.getErrorDetail();\n return {\n extraMessage: t.message,\n extraMessageDetail: t.detail,\n extraMessageErrorCode: t.code,\n };\n }\n if (obj instanceof Error)\n return {\n extraMessage: obj.toString(),\n extraMessageErrorCode: null,\n };\n if (typeof obj !== 'string')\n return {\n extraMessage: JSON.stringify(obj),\n extraMessageErrorCode: null,\n };\n return { extraMessage: obj, extraMessageErrorCode: null };\n};\n", "import { Network, WalletType } from '@rango-dev/wallets-shared';\nimport {\n CosmosTransaction,\n EvmTransaction,\n SimulationResult,\n SolanaTransaction,\n StarknetTransaction,\n TronTransaction,\n Transfer as TransferTransaction,\n AmountRestrictionType,\n BestRouteResponse,\n MetaResponse,\n Token,\n SwapResult,\n BlockchainMeta,\n} from 'rango-sdk';\n\nimport { PrettyError } from './shared-errors';\nimport BigNumber from 'bignumber.js';\nimport { numberToString } from './numbers';\nimport {\n isCosmosBlockchain,\n isEvmBlockchain,\n isStarknetBlockchain,\n isTronBlockchain,\n} from 'rango-types';\n\nexport interface PendingSwapWithQueueID {\n id: string;\n swap: PendingSwap;\n}\n\nexport type SwapProgressNotification = {\n eventType: EventType;\n swap: PendingSwap | null;\n step: PendingSwapStep | null;\n};\n\nexport type WalletBalance = {\n chain: Network;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport type Account = {\n balances: WalletBalance[] | null;\n address: string;\n loading: boolean;\n walletType: WalletType;\n error: boolean;\n explorerUrl: string | null;\n isConnected?: boolean;\n};\nexport type Blockchain = { name: string; accounts: Account[] };\nexport type Wallet = { blockchains: Blockchain[] };\n\nexport type EventType =\n | 'swap_started'\n | 'confirm_contract'\n | 'confirm_transfer'\n | 'task_failed'\n | 'task_completed'\n | 'task_canceled'\n | 'task_paused'\n | 'contract_confirmed'\n | 'confirm_approve_contract'\n | 'contract_rejected'\n | 'check_tx_status'\n | 'check_approve_tx_status'\n | 'transfer_rejected'\n | 'transfer_failed'\n | 'calling_smart_contract'\n | 'smart_contract_called'\n | 'smart_contract_call_failed'\n | 'step_completed_with_output'\n | 'waiting_for_network_change'\n | 'waiting_for_connecting_wallet'\n | 'waiting_for_change_wallet_account'\n | 'network_changed'\n | 'not_enough_balance'\n | 'not_enough_approval'\n | 'waiting_for_queue'\n | 'check_fee_failed'\n | 'route_failed_to_find'\n | 'transaction_expired';\n\nexport type SwapSavedSettings = {\n slippage: string;\n disabledSwappersIds?: string[];\n disabledSwappersGroups?: string[];\n infiniteApprove?: boolean;\n};\n\ntype InternalStepState =\n | 'PENDING'\n | 'CREATED'\n | 'WAITING'\n | 'SIGNED'\n | 'SUCCESSED'\n | 'FAILED';\n\nexport type SwapperStatusStep = {\n name: string;\n state: InternalStepState;\n current: boolean;\n};\n\nexport enum PendingSwapNetworkStatus {\n WaitingForConnectingWallet = 'waitingForConnectingWallet',\n WaitingForQueue = 'waitingForQueue',\n WaitingForNetworkChange = 'waitingForNetworkChange',\n NetworkChanged = 'networkChanged',\n}\n\nexport type SwapExplorerUrl = {\n url: string;\n description: string | null;\n};\n\nexport type StepStatus =\n | 'created'\n | 'running'\n | 'failed'\n | 'success'\n | 'waitingForApproval'\n | 'approved';\n\nexport type PendingSwapStep = {\n // routing data\n id: number;\n fromBlockchain: string;\n fromSymbol: string;\n fromSymbolAddress: string | null;\n fromDecimals: number;\n fromAmountPrecision: string | null;\n fromAmountMinValue: string | null;\n fromAmountMaxValue: string | null;\n fromAmountRestrictionType: AmountRestrictionType | null;\n fromLogo: string;\n toBlockchain: string;\n toSymbol: string;\n toSymbolAddress: string | null;\n toDecimals: number;\n toLogo: string;\n swapperId: string;\n expectedOutputAmountHumanReadable: string | null;\n startTransactionTime: number;\n internalSteps: SwapperStatusStep[] | null;\n estimatedTimeInSeconds: number | null;\n\n // status data\n status: StepStatus;\n networkStatus: PendingSwapNetworkStatus | null;\n executedTransactionId: string | null;\n executedTransactionTime: string | null;\n explorerUrl: SwapExplorerUrl[] | null;\n diagnosisUrl: string | null;\n outputAmount: string | null;\n\n // txs data\n cosmosTransaction: CosmosTransaction | null;\n transferTransaction: TransferTransaction | null;\n solanaTransaction: SolanaTransaction | null;\n evmApprovalTransaction: EvmTransaction | null;\n evmTransaction: EvmTransaction | null;\n tronApprovalTransaction: TronTransaction | null;\n tronTransaction: TronTransaction | null;\n starknetApprovalTransaction: StarknetTransaction | null;\n starknetTransaction: StarknetTransaction | null;\n\n // missing fields in older versions\n // keeping null for backward compatability\n swapperLogo: string | null;\n swapperType: string | null;\n fromBlockchainLogo: string | null;\n toBlockchainLogo: string | null;\n feeInUsd: string | null;\n};\n\nexport type WalletTypeAndAddress = {\n walletType: WalletType;\n address: string;\n};\n\nexport enum MessageSeverity {\n error = 'error',\n warning = 'warning',\n info = 'info',\n success = 'success',\n}\n\nexport type SwapStatus = 'running' | 'failed' | 'success';\n\nexport type PendingSwap = {\n creationTime: string;\n finishTime: string | null;\n requestId: string;\n inputAmount: string;\n status: SwapStatus;\n isPaused: boolean;\n extraMessage: string | null;\n extraMessageSeverity: MessageSeverity | null;\n extraMessageErrorCode: string | null;\n extraMessageDetail: string | null | undefined;\n networkStatusExtraMessage: string | null;\n networkStatusExtraMessageDetail: string | null;\n lastNotificationTime: string | null;\n wallets: { [p: string]: WalletTypeAndAddress };\n settings: SwapSavedSettings;\n steps: PendingSwapStep[];\n simulationResult: SimulationResult;\n validateBalanceOrFee: boolean;\n hasAlreadyProceededToSign?: boolean | null;\n};\n\nexport const getCurrentBlockchainOfOrNull = (\n swap: PendingSwap,\n step: PendingSwapStep\n): Network | null => {\n try {\n return getCurrentBlockchainOf(swap, step);\n } catch (e) {\n return null;\n }\n};\n\nexport const getCurrentBlockchainOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): Network => {\n const b1 =\n step.evmTransaction?.blockChain ||\n step.evmApprovalTransaction?.blockChain ||\n step.starknetTransaction?.blockChain ||\n step.starknetApprovalTransaction?.blockChain ||\n step.tronTransaction?.blockChain ||\n step.tronApprovalTransaction?.blockChain ||\n step.cosmosTransaction?.blockChain ||\n step.solanaTransaction?.blockChain;\n if (b1) return b1;\n\n const transferAddress = step.transferTransaction?.fromWalletAddress;\n if (!transferAddress) throw PrettyError.BlockchainMissing();\n\n const blockchain =\n Object.keys(swap.wallets).find(\n (b) => swap.wallets[b]?.address === transferAddress\n ) || null;\n if (blockchain == null) throw PrettyError.BlockchainMissing();\n\n return blockchain;\n};\n\nconst getBlockchainMetaExplorerBaseUrl = (\n blockchainMeta: BlockchainMeta\n): string | undefined => {\n if (isCosmosBlockchain(blockchainMeta))\n return blockchainMeta.info?.explorerUrlToTx;\n else if (\n isEvmBlockchain(blockchainMeta) ||\n isStarknetBlockchain(blockchainMeta) ||\n isTronBlockchain(blockchainMeta)\n )\n return blockchainMeta.info.transactionUrl;\n return;\n};\n\nexport const getScannerUrl = (\n txHash: string,\n network: Network,\n blockchainMetaMap: { [key: string]: BlockchainMeta }\n): string | undefined => {\n const blockchainMeta = blockchainMetaMap[network];\n const baseUrl = getBlockchainMetaExplorerBaseUrl(blockchainMeta);\n if (!baseUrl) return;\n if (baseUrl.indexOf('/{txHash}') !== -1)\n return baseUrl.replace('{txHash}', txHash?.toLowerCase());\n return `${baseUrl}/${txHash?.toLowerCase()}`;\n};\n\nexport function getNextStep(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): PendingSwapStep | null {\n return (\n swap.steps.find(\n (step) =>\n step.status !== 'failed' &&\n step.status !== 'success' &&\n step.id !== currentStep.id\n ) || null\n );\n}\n\n/**\n * Returns the wallet address, based on the current step of `PendingSwap`.\n */\nexport const getCurrentAddressOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): string => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n (step.transferTransaction?.fromWalletAddress\n ? { address: step.transferTransaction?.fromWalletAddress }\n : null) ||\n null;\n if (result == null) throw PrettyError.WalletMissing();\n return result.address;\n};\n\nexport function getRelatedWallet(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): WalletTypeAndAddress {\n const walletAddress = getCurrentAddressOf(swap, currentStep);\n const walletKV =\n Object.keys(swap.wallets)\n .map((k) => ({ k, v: swap.wallets[k] }))\n .find(({ v }) => v.address === walletAddress) || null;\n const blockchain = walletKV?.k || null;\n const wallet = walletKV?.v || null;\n\n const walletType = wallet?.walletType;\n if (wallet === null)\n throw PrettyError.AssertionFailed(\n `Wallet for source ${blockchain} not passed: walletType: ${walletType}`\n );\n return wallet;\n}\n\nexport function getRelatedWalletOrNull(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): WalletTypeAndAddress | null {\n try {\n return getRelatedWallet(swap, currentStep);\n } catch (e) {\n return null;\n }\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\n): BigNumber {\n let totalFeeInUsd = new BigNumber(0);\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') continue;\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function calculatePendingSwap(\n inputAmount: string,\n bestRoute: BestRouteResponse,\n wallets: { [p: string]: WalletTypeAndAddress },\n settings: SwapSavedSettings,\n validateBalanceOrFee: boolean,\n meta: MetaResponse | null\n): PendingSwap {\n const simulationResult = bestRoute.result;\n if (!simulationResult) throw Error('Simulation result should not be null');\n\n return {\n creationTime: new Date().getTime().toString(),\n finishTime: null,\n requestId: bestRoute.requestId || '',\n inputAmount: inputAmount,\n wallets,\n status: 'running',\n isPaused: false,\n extraMessage: null,\n extraMessageSeverity: null,\n extraMessageDetail: null,\n extraMessageErrorCode: null,\n networkStatusExtraMessage: null,\n networkStatusExtraMessageDetail: null,\n lastNotificationTime: null,\n settings: settings,\n simulationResult: simulationResult,\n validateBalanceOrFee,\n steps:\n bestRoute.result?.swaps?.map((swap, index) => {\n return {\n id: index + 1,\n\n // from\n fromBlockchain: swap.from.blockchain,\n fromBlockchainLogo: swap.from.blockchainLogo,\n fromLogo: swap.from.logo,\n fromSymbol: swap.from.symbol,\n fromSymbolAddress: swap.from.address,\n fromDecimals: swap.from.decimals,\n fromAmountPrecision: swap.fromAmountPrecision,\n fromAmountMinValue: swap.fromAmountMinValue,\n fromAmountMaxValue: swap.fromAmountMaxValue,\n fromAmountRestrictionType: swap.fromAmountRestrictionType,\n\n // to\n toBlockchain: swap.to.blockchain,\n toBlockchainLogo: swap.to.blockchainLogo,\n toSymbol: swap.to.symbol,\n toSymbolAddress: swap.to.address,\n toDecimals: swap.to.decimals,\n toLogo: swap.to.logo,\n\n // swapper\n swapperId: swap.swapperId,\n swapperLogo: swap.swapperLogo,\n swapperType: swap.swapperType,\n\n // output, fee, timing\n expectedOutputAmountHumanReadable: swap.toAmount,\n outputAmount: '',\n feeInUsd: meta\n ? numberToString(getUsdFeeOfStep(swap, meta?.tokens), null, 8)\n : null,\n estimatedTimeInSeconds: swap.estimatedTimeInSeconds || null,\n\n // status, tracking\n status: 'created',\n networkStatus: null,\n startTransactionTime: new Date().getTime(),\n externalTransactionId: null,\n executedTransactionId: null,\n executedTransactionTime: null,\n explorerUrl: null,\n diagnosisUrl: null,\n trackingCode: null,\n internalSteps: null,\n\n // transactions\n evmTransaction: null,\n evmApprovalTransaction: null,\n starknetTransaction: null,\n starknetApprovalTransaction: null,\n tronTransaction: null,\n tronApprovalTransaction: null,\n cosmosTransaction: null,\n solanaTransaction: null,\n transferTransaction: null,\n\n // front fields\n hasAlreadyProceededToSign: false,\n };\n }) || [],\n };\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const numberToString = (\n number: BigNumber | string | null,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null) return '';\n if (number === '') return '';\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) return n.toFormat(0, roundingMode);\n if (n.gte(1000))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(100))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(1))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n if (n.gte(0.01))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n for (let i = minDecimals || 4; i < 17; i++)\n if (n.gte(Math.pow(10, -i)))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n if (n.isEqualTo(0)) return '0';\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n", "import * as Sentry from '@sentry/browser';\nimport { PendingSwap, PendingSwapStep } from './shared';\nimport { WalletType } from '@rango-dev/wallets-shared';\n\nexport function logRPCError(\n error: unknown,\n swap: PendingSwap,\n currentStep: PendingSwapStep | undefined,\n walletType: WalletType | undefined\n): void {\n try {\n Sentry.captureException(error, {\n tags: {\n requestId: swap.requestId,\n rpc: true,\n swapper: currentStep?.swapperId || '',\n walletType: walletType || '',\n },\n level: 'warning' as any,\n });\n } catch (e) {\n console.log({ e });\n }\n}\n", "import { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport {\n delay,\n getCurrentStep,\n getCurrentStepTxType,\n resetNetworkStatus,\n setCurrentStepTx,\n updateSwapStatus,\n useTransactionsData,\n} from '../helpers';\nimport { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport {\n getCurrentBlockchainOf,\n getNextStep,\n getRelatedWallet,\n getScannerUrl,\n MessageSeverity,\n} from '../shared';\nimport { Transaction, TransactionStatusResponse } from 'rango-sdk';\nimport { httpService } from '../services';\nimport type { GenericSigner } from 'rango-types';\nimport { prettifyErrorMessage } from '../shared-errors';\n\nconst INTERVAL_FOR_CHECK = 5_000;\n\n/**\n * Subscribe to status of swap transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkTransactionStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails;\n const { meta } = context;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n\n if (!currentStep?.executedTransactionId) return;\n let txId = currentStep.executedTransactionId;\n\n let getTxReceiptFailed = false;\n let status: TransactionStatusResponse | null = null;\n let signer: GenericSigner<Transaction> | null = null;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n useTransactionsData();\n\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet)\n signer = context.getSigners(sourceWallet.walletType).getSigner(txType);\n } catch (error) {\n // wallet is not connected yet\n // no need to do anything\n }\n\n try {\n // if wallet is connected, try to get transaction reciept\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n if (signer?.wait && !receiptReceived) {\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepBlockchain,\n meta.blockchains\n );\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Swap',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse)\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n context?.notifier({\n eventType: 'task_failed',\n ...updateResult,\n });\n getTxReceiptFailed = true;\n // We shouldn't return here, because we need to trigger check status job in backend.\n // This is not a ui requirement but the backend one.\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n status = await httpService().checkStatus({\n requestId: swap.requestId,\n txId,\n step: currentStep.id,\n });\n } catch (e) {\n await delay(INTERVAL_FOR_CHECK);\n retry();\n return;\n }\n\n // If user cancel swap during check status api call,\n // or getting transaction receipt failed,\n // we should ignore check status response and return\n if (getTxReceiptFailed) return failed();\n if (currentStep?.status === 'failed') return;\n\n const outputAmount: string | null =\n status?.outputAmount ||\n (currentStep.outputAmount ? currentStep.outputAmount : null);\n const prevOutputAmount = currentStep.outputAmount || null;\n swap.extraMessage = status?.extraMessage || swap.extraMessage;\n swap.extraMessageSeverity = MessageSeverity.info;\n swap.extraMessageDetail = '';\n\n currentStep.status = status?.status || currentStep.status;\n currentStep.diagnosisUrl =\n status?.diagnosisUrl || currentStep.diagnosisUrl || null;\n currentStep.outputAmount = outputAmount || currentStep.outputAmount;\n currentStep.explorerUrl = status?.explorerUrl || currentStep.explorerUrl;\n currentStep.internalSteps = status?.steps || null;\n\n const newTransaction = status?.newTx;\n\n if (newTransaction) {\n currentStep.status = 'created';\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n setCurrentStepTx(currentStep, newTransaction);\n }\n\n if (prevOutputAmount === null && outputAmount !== null)\n context.notifier({\n eventType: 'step_completed_with_output',\n swap: swap,\n step: currentStep,\n });\n else if (prevOutputAmount === null && outputAmount === null) {\n // it is needed to set notification after reloading the page\n context.notifier({\n eventType: 'check_tx_status',\n swap: swap,\n step: currentStep,\n });\n }\n\n if (currentStep.status === 'success') {\n const nextStep = getNextStep(swap, currentStep);\n swap.extraMessageDetail = '';\n swap.extraMessage = nextStep\n ? `starting next step: ${nextStep.swapperId}: ${nextStep.fromBlockchain} -> ${nextStep.toBlockchain}`\n : '';\n } else if (currentStep.status === 'failed') {\n swap.extraMessage = 'Transaction failed in blockchain';\n swap.extraMessageSeverity = MessageSeverity.error;\n swap.extraMessageDetail = status?.extraMessage || '';\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n }\n\n // Sync data with storage\n setStorage({ ...getStorage(), swapDetails: swap });\n\n if (status?.status === 'failed') {\n failed();\n } else if (\n status?.status === 'success' ||\n (status?.status === 'running' && !!status.newTx)\n ) {\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(INTERVAL_FOR_CHECK);\n retry();\n }\n}\n\n/**\n * Subscribe to status of approval transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkApprovalStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const { meta } = context;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n useTransactionsData();\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null');\n return;\n }\n\n if (!currentStep?.executedTransactionId) return;\n let txId = currentStep.executedTransactionId;\n\n let signer: GenericSigner<Transaction> | null = null;\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet)\n signer = context.getSigners(sourceWallet.walletType).getSigner(txType);\n } catch (error) {\n // wallet is not connected yet\n // no need to do anything\n }\n\n try {\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n // if wallet is connected, try to get transaction reciept\n if (signer?.wait && !receiptReceived) {\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepBlockchain,\n meta.blockchains\n );\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Approve',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse)\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n context?.notifier({\n eventType: 'task_failed',\n ...updateResult,\n });\n return failed();\n }\n\n let isApproved = false;\n try {\n const response = await httpService().checkApproval(\n swap.requestId,\n currentStep.executedTransactionId\n );\n // If user cancel swap during check status api call, we should ignore check approval response\n if (currentStep?.status === 'failed') return;\n\n isApproved = response.isApproved;\n if (\n !isApproved &&\n (response.txStatus === 'failed' || response.txStatus === 'success')\n ) {\n let message, details;\n if (response.txStatus === 'failed') {\n message = 'Approve transaction failed';\n details = 'Smart contract approval tx failed in blockchain.';\n } else {\n message = 'Not enough approval';\n if (response.requiredApprovedAmount && response.currentApprovedAmount)\n details = `Required approval: ${response.requiredApprovedAmount}, current approval: ${response.currentApprovedAmount}`;\n else details = `You still don't have enough approval for this swap.`;\n }\n // approve transaction failed on\n // we should fail the whole swap\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'INSUFFICIENT_APPROVE',\n message: message,\n details: details,\n });\n context.notifier({\n eventType: 'not_enough_approval',\n ...updateResult,\n });\n failed();\n } else if (!isApproved) {\n // it is needed to set notification after reloading the page\n context.notifier({\n eventType: 'check_approve_tx_status',\n swap: swap,\n step: currentStep,\n });\n }\n } catch (e) {\n isApproved = false;\n }\n if (isApproved) {\n currentStep.status = 'approved';\n swap.extraMessage = `Spending ${currentStep.fromSymbol} approved successfully.`;\n swap.extraMessageDetail = null;\n swap.extraMessageSeverity = MessageSeverity.success;\n currentStep.evmApprovalTransaction = null;\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.tronApprovalTransaction = null;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n context.notifier({\n eventType: 'contract_confirmed',\n swap: swap,\n step: currentStep,\n });\n\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(2000);\n retry();\n }\n}\n\n/**\n *\n * For doing a swap the user needs to accept a `contract` so it can use the user balance.\n * There is two types of check status:\n * 1. Checking approval transaction (Give permission to a contract)\n * 2. Checking swap transaction.\n *\n */\nexport async function checkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const swap = actions.getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null', swap.requestId);\n return;\n }\n\n // Reset network status\n // Because when check status is on `loading` or `failed` status, it shows previous message that isn't related to current state.\n resetNetworkStatus(actions);\n\n if (currentStep.status === 'running') {\n await checkTransactionStatus(actions);\n } else if (currentStep.status === 'waitingForApproval') {\n await checkApprovalStatus(actions);\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport {\n getCurrentStep,\n updateSwapStatus,\n throwOnOK,\n getCurrentStepTx,\n setCurrentStepTx,\n} from '../helpers';\nimport { prettifyErrorMessage } from '../shared-errors';\nimport { CreateTransactionRequest } from 'rango-sdk';\nimport { httpService } from '../services';\n\n/**\n *\n * When a user asks for a swap, We first create the transaction by sending a request to server\n * Server will return the transaction that need to be sent to wallet.\n * It can be failed if server goes through an error, If not, we will schedule the `EXECTUTE_TRANSACTION`.\n *\n */\nexport async function createTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { setStorage, getStorage, next, schedule, context } = actions;\n const swap = getStorage().swapDetails;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n const transaction = getCurrentStepTx(currentStep);\n\n if (!transaction) {\n const request: CreateTransactionRequest = {\n requestId: swap.requestId,\n step: currentStep.id,\n userSettings: {\n slippage: swap.settings.slippage,\n infiniteApprove: swap.settings.infiniteApprove,\n },\n validations: {\n balance: swap.validateBalanceOrFee,\n fee: swap.validateBalanceOrFee,\n },\n };\n try {\n // Getting transcation from server.\n\n const { transaction } = await throwOnOK(\n httpService().createTransaction(request)\n );\n\n if (transaction) setCurrentStepTx(currentStep, transaction);\n\n setStorage({ ...getStorage(), swapDetails: swap });\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n next();\n } catch (error) {\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n const { extraMessage, extraMessageDetail } = prettifyErrorMessage(error);\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: 'FETCH_TX_FAILED',\n });\n context.notifier({\n eventType: 'task_failed',\n ...updateResult,\n });\n\n actions.failed();\n }\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport {\n ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET,\n} from '../constants';\n\nimport {\n getCurrentStep,\n isNetworkMatchedForTransaction,\n isRequiredWalletConnected,\n updateNetworkStatus,\n singTransaction,\n resetNetworkStatus,\n getRequiredWallet,\n isNeedBlockQueueForParallel,\n claimQueue,\n} from '../helpers';\nimport { getCurrentBlockchainOf, PendingSwapNetworkStatus } from '../shared';\nimport {\n BlockReason,\n SwapActionTypes,\n SwapQueueContext,\n SwapStorage,\n} from '../types';\n\n/**\n * Excecute a created transaction.\n *\n * This function implemented the parallel mode by `claim` mechanism which means\n * All the queues the meet certain situation (like multiple evm transaction) will go through\n * a `claim` mechanims that decides which queue should be run and it blocks other ones.\n *\n * A queue will be go to sign process, if the wallet and network is matched.\n */\nexport async function executeTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { getStorage, context } = actions;\n const { meta, wallets, providers } = context;\n const { claimedBy } = claimQueue();\n\n const isClaimed = context.claimedBy === context._queue?.id;\n const requestBlock: typeof actions.block = (blockedFor) => {\n actions.block(blockedFor);\n if (isClaimed && actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const swap = getStorage().swapDetails;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentStep = getCurrentStep(swap)!;\n\n // Resetting network status, so we will set it again during the running of this task.\n resetNetworkStatus(actions);\n\n /* Make sure wallet is connected and also the connected wallet is matched with tx by checking address. */\n const isWrongAddress = !isRequiredWalletConnected(swap, context.state).ok;\n if (isWrongAddress) {\n const { type, address } = getRequiredWallet(swap);\n const isWalletInCompatible = wallets?.blockchains?.find(\n (w) => !w.accounts?.find((account) => account.walletType === type)\n );\n const description =\n !wallets || isWalletInCompatible\n ? ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type)\n : ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET(type, address);\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n };\n requestBlock(blockedFor);\n return;\n }\n\n /* Wallet should be on correct network */\n const networkMatched = await isNetworkMatchedForTransaction(\n swap,\n currentStep,\n wallets,\n meta,\n providers\n );\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId && !isClaimed;\n if (isClaimedByAnyQueue && !networkMatched) {\n const details = ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES;\n\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n } else if (!networkMatched) {\n const fromBlockchain = getCurrentBlockchainOf(swap, currentStep);\n const details = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(fromBlockchain);\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n } else {\n // Update network to mark it as network changed successfully.\n updateNetworkStatus(actions, {\n message: '',\n details: 'Wallet network changed successfully',\n status: PendingSwapNetworkStatus.NetworkChanged,\n });\n }\n\n /* \n For avoiding conflict by making too many requests to wallet, we need to make sure\n We only run one request at a time (In parallel mode).\n */\n const needsToBlockQueue = isNeedBlockQueueForParallel(currentStep);\n\n if (needsToBlockQueue && !isClaimed) {\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n description: ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n details: {},\n };\n requestBlock(blockedFor);\n return;\n }\n\n // All the conditions are met. We can safely send the tx to wallet for sign.\n singTransaction(actions);\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport { getCurrentStep, isTxAlreadyCreated } from '../helpers';\n\n/**\n *\n * This function is responsibe for scheduling the correct `action` based on `PendingSwap` status.\n * It means `action`s schedule this step to decide what should be the next step/task.\n *\n * It's acts like a `while(true)` and will `break` the loop on certain `action`s like `CHECK_STATUS`.\n *\n *\n */\nexport function scheduleNextStep({\n schedule,\n next,\n failed,\n setStorage,\n getStorage,\n context,\n}: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>): void {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n const isFailed = swap.steps.find((step) => step.status === 'failed');\n\n if (!!currentStep && !isFailed) {\n if (isTxAlreadyCreated(swap, currentStep)) {\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n return next();\n }\n\n if (currentStep?.executedTransactionId) {\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n return next();\n }\n\n swap.status = 'running';\n\n setStorage({ ...getStorage(), swapDetails: swap });\n\n schedule(SwapActionTypes.CREATE_TRANSACTION);\n next();\n } else {\n swap.status = isFailed ? 'failed' : 'success';\n swap.finishTime = new Date().getTime().toString();\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n context.notifier({\n eventType: isFailed ? 'task_failed' : 'task_completed',\n swap: swap,\n step: null,\n });\n\n if (isFailed) failed();\n else next();\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { SwapActionTypes, SwapStorage } from '../types';\n\nexport function start({\n schedule,\n next,\n}: ExecuterActions<SwapStorage, SwapActionTypes>): void {\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n}\n", "import { BlockReason, SwapActionTypes, SwapQueueDef } from './types';\nimport { checkStatus } from './actions/checkStatus';\nimport { createTransaction } from './actions/createTransaction';\nimport { executeTransaction } from './actions/executeTransaction';\nimport { scheduleNextStep } from './actions/scheduleNextStep';\nimport { start } from './actions/start';\nimport {\n onBlockForChangeNetwork,\n onBlockForConnectWallet,\n onDependsOnOtherQueues,\n} from './helpers';\n\n/**\n *\n * The idea behind this queue is to be able dynamically add some steps.\n * After running a swap, it can be blocked (like on waiting for switch netwrok)\n * or waits for something happend (like checking status of a transaction from server)\n *\n */\nexport const swapQueueDef: SwapQueueDef = {\n name: 'swap',\n actions: {\n [SwapActionTypes.START]: start,\n [SwapActionTypes.SCHEDULE_NEXT_STEP]: scheduleNextStep,\n [SwapActionTypes.CREATE_TRANSACTION]: createTransaction,\n [SwapActionTypes.EXECUTE_TRANSACTION]: executeTransaction,\n [SwapActionTypes.CHECK_TRANSACTION_STATUS]: checkStatus,\n },\n run: [SwapActionTypes.START],\n whenTaskBlocked: (event, meta) => {\n if (event.reason.reason === BlockReason.WAIT_FOR_CONNECT_WALLET) {\n onBlockForConnectWallet(event, meta);\n } else if (event.reason.reason === BlockReason.WAIT_FOR_NETWORK_CHANGE) {\n onBlockForChangeNetwork(event, meta);\n } else if (event.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES) {\n onDependsOnOtherQueues(event, meta);\n }\n },\n};\n", "import { useManager } from '@rango-dev/queue-manager-react';\nimport { useEffect, useState } from 'react';\nimport {\n checkWaitingForConnectWalletChange,\n checkWaitingForNetworkChange,\n retryOn,\n} from './helpers';\nimport { migrated, migration } from './migration';\nimport { UseQueueManagerParams } from './types';\n\nlet isCalled = 0;\n\n/**\n *\n * Runs a migration (old swaps from localstorage to queue manager's IndexedDB)\n * It will be run only once on page load.\n *\n */\nfunction useMigration(): {\n status: boolean;\n} {\n const isMigrated = migrated();\n const [status, setStatus] = useState<boolean>(isMigrated);\n\n useEffect(() => {\n (async () => {\n // Preventing react to be called twice on Strict Mode (development)\n if (isCalled) return;\n isCalled = 1;\n\n migration().finally(() => {\n setStatus(true);\n });\n })();\n }, []);\n\n return {\n status,\n };\n}\n\n/**\n *\n * On initial load and also connect/disconnet we may need to update swap's notified message.\n * And also if a new wallet is connected we will retry the queue to see we can resume it or not.\n *\n */\nfunction useQueueManager(params: UseQueueManagerParams): void {\n const { manager } = useManager();\n\n useEffect(() => {\n if (params.lastConnectedWallet) {\n checkWaitingForConnectWalletChange({\n evmChains: params.evmChains,\n wallet_network: params.lastConnectedWallet,\n manager,\n notifier: params.notifier,\n });\n retryOn(\n params.lastConnectedWallet,\n params.notifier,\n manager,\n params.canSwitchNetworkTo\n );\n }\n }, [params.lastConnectedWallet]);\n\n useEffect(() => {\n if (params.disconnectedWallet) {\n checkWaitingForNetworkChange(manager);\n\n /* \n We need to reset the state value, so if a wallet disconnected twice (after reconnect),\n this effect will be run properly.\n */\n params.clearDisconnectedWallet();\n }\n }, [params.disconnectedWallet]);\n}\n\nexport { useQueueManager, useMigration };\n", "import {\n PersistedQueue,\n Persistor,\n Status,\n DB_NAME,\n} from '@rango-dev/queue-manager-core';\nimport { v4 as uuid } from 'uuid';\nimport { PendingSwap } from './shared';\nimport { SwapActionTypes } from './types';\n\nconst MIGRATED_KEY = 'migratedToQueueManager';\n\n/**\n *\n * If `MIGRATED_KEY` is set, it means we already migrated data from localstorage.\n *\n */\nfunction migrated(): boolean {\n return !!window.localStorage.getItem(MIGRATED_KEY);\n}\n\nasync function hasQueueManagerOnIDB(): Promise<boolean> {\n try {\n return (await (window.indexedDB as any).databases())\n .map((db: any) => db.name)\n .includes(DB_NAME);\n } catch {\n return false;\n }\n}\n\n/**\n *\n * By calling this function, we first check if the data already migrated or not,\n * If not, starting to migrating to IndexedDb with proper format that queue manager is understand.\n *\n */\nasync function migration(): Promise<boolean> {\n const swapsFromStorage = window.localStorage.getItem('pendingSwaps');\n const hasIndexDB = await hasQueueManagerOnIDB();\n\n // For new users or already migrated.\n if (!swapsFromStorage || migrated() || hasIndexDB) {\n return true;\n }\n\n // For old users, but they didn't do any swaps yet.\n const swaps: PendingSwap[] = JSON.parse(swapsFromStorage);\n const convertedSwaps: PersistedQueue[] = [];\n\n swaps.forEach((swap) => {\n /* \n For running task we need to add some more work\n We need to create a queue task to be run and resume the running task from queue manager.\n */\n if (swap.status === 'running') {\n const taskId = uuid();\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status: Status.RUNNING,\n storage: {\n swapDetails: swap,\n },\n state: {\n status: Status.RUNNING,\n activeTaskIndex: 0,\n tasks: {\n [taskId]: {\n blockedFor: null,\n status: Status.RUNNING,\n },\n },\n },\n tasks: [\n {\n id: taskId,\n action: SwapActionTypes.SCHEDULE_NEXT_STEP,\n },\n ],\n };\n convertedSwaps.push(convertedSwap);\n } else {\n /*\n * For failed or successful swaps, we only move it to IndexedDB,\n * And there is no need to consider them to be run.\n */\n const status = swap.status === 'success' ? Status.SUCCESS : Status.FAILED;\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status,\n storage: {\n swapDetails: swap,\n },\n state: {\n status,\n activeTaskIndex: 0,\n tasks: {},\n },\n tasks: [],\n };\n\n convertedSwaps.push(convertedSwap);\n }\n });\n\n // Getting an instance from persistor, so we can directly put our data inside it.\n const persistor = new Persistor();\n\n const promises = convertedSwaps.map((queue) => persistor.insertQueue(queue));\n await Promise.all(promises);\n\n // Mark as the data has been successfully migrated.\n window.localStorage.setItem(MIGRATED_KEY, '1');\n\n return true;\n}\n\nexport { migration, migrated };\n", "import { Configs, initConfig } from './configs';\nimport { SwapQueueDef } from './types';\nimport { swapQueueDef } from './queueDef';\n\nexport { PrettyError, prettifyErrorMessage } from './shared-errors';\nexport type { SwapQueueContext, SwapStorage } from './types';\nexport type {\n PendingSwapWithQueueID,\n PendingSwapStep,\n PendingSwap,\n EventType,\n SwapProgressNotification,\n} from './shared';\nexport {\n getCurrentBlockchainOfOrNull,\n getRelatedWalletOrNull,\n getRelatedWallet,\n MessageSeverity,\n PendingSwapNetworkStatus,\n calculatePendingSwap,\n} from './shared';\nexport {\n updateSwapStatus,\n checkWaitingForNetworkChange,\n getCurrentStep,\n getEvmProvider,\n cancelSwap,\n getRequiredWallet,\n getRunningSwaps,\n splitWalletNetwork,\n resetRunningSwapNotifsOnPageLoad,\n} from './helpers';\nexport { useMigration, useQueueManager } from './hooks';\n\nexport function makeQueueDefinition(configs: Configs): SwapQueueDef {\n initConfig(configs);\n return swapQueueDef;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["RANGO_PUBLIC_API_KEY", "configs", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "getBlockChainNameFromId", "Networks", "readAccountAddress", "TransactionType", "isEvmTransaction", "isCosmosTransaction", "isSolanaTransaction", "isTronTransaction", "isStarknetTransaction", "isTransferTransaction", "ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES", "ERROR_MESSAGE_WAIT_FOR_WALLET", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET", "__name", "type", "address", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "network", "Status", "SignerErrorCode", "SignerError", "isSignerErrorCode", "isAPIErrorCode", "ERROR_ASSERTION_FAILED", "ERROR_CREATE_TRANSACTION", "ERROR_INPUT_WALLET_NOT_FOUND", "PrettyError", "code", "m", "root", "detail", "obj", "rawMessage", "rootStr", "message", "statusCode", "__name", "mapAppErrorCodesToAPIErrorCode", "errorCode", "defaultErrorCode", "isAPIErrorCode", "isSignerErrorCode", "SignerErrorCode", "prettifyErrorMessage", "SignerError", "BigNumber", "BigNumber", "numberToString", "__name", "number", "minDecimals", "maxDecimals", "n", "BigNumber", "roundingMode", "maxI", "i", "isCosmosBlockchain", "isEvmBlockchain", "isStarknetBlockchain", "isTronBlockchain", "PendingSwapNetworkStatus", "MessageSeverity", "getCurrentBlockchainOfOrNull", "__name", "swap", "step", "getCurrentBlockchainOf", "b1", "transferAddress", "PrettyError", "blockchain", "b", "getBlockchainMetaExplorerBaseUrl", "blockchainMeta", "isCosmosBlockchain", "isEvmBlockchain", "isStarknetBlockchain", "isTronBlockchain", "getScannerUrl", "txHash", "network", "blockchainMetaMap", "baseUrl", "getNextStep", "currentStep", "getCurrentAddressOf", "result", "getRelatedWallet", "walletAddress", "walletKV", "k", "v", "wallet", "walletType", "getRelatedWalletOrNull", "getUsdPrice", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "totalFeeInUsd", "BigNumber", "i", "fee", "unitPrice", "calculatePendingSwap", "inputAmount", "bestRoute", "wallets", "settings", "validateBalanceOrFee", "meta", "simulationResult", "index", "numberToString", "Sentry", "logRPCError", "error", "swap", "currentStep", "walletType", "e", "__name", "RangoClient", "rango", "httpService", "__name", "RangoClient", "getConfig", "swapClaimedBy", "claimQueue", "queue_id", "__name", "swapTransactionToDataMap", "useTransactionsData", "hash", "data", "splitWalletNetwork", "input", "splittedInput", "network", "walletNetwork", "getCurrentStep", "swap", "step", "getCurrentStepTx", "currentStep", "evmTransaction", "evmApprovalTransaction", "cosmosTransaction", "solanaTransaction", "transferTransaction", "starknetApprovalTransaction", "starknetTransaction", "tronApprovalTransaction", "tronTransaction", "setCurrentStepTx", "transaction", "isEvmTransaction", "isCosmosTransaction", "isSolanaTransaction", "isTransferTransaction", "isStarknetTransaction", "isTronTransaction", "getCurrentStepTxType", "isApprovalCurrentStepTx", "updateSwapStatus", "getStorage", "setStorage", "nextStatus", "nextStepStatus", "message", "details", "errorCode", "hasAlreadyProceededToSign", "errorReason", "walletType", "getRelatedWalletOrNull", "httpService", "mapAppErrorCodesToAPIErrorCode", "setStepTransactionIds", "txId", "notifier", "eventType", "explorerUrl", "markRunningSwapAsWaitingForConnectingWallet", "reason", "reasonDetail", "currentTime", "markRunningSwapAsSwitchingNetwork", "type", "getRequiredWallet", "fromBlockchain", "getCurrentBlockchainOf", "markRunningSwapAsDependsOnOtherQueues", "delay", "ms", "res", "getSwapWalletType", "isWalletNull", "wallet", "getEvmProvider", "providers", "Networks", "bcName", "getCurrentBlockchainOfOrNull", "sourceWallet", "getChainId", "provider", "isNetworkMatchedForTransaction", "meta", "fromBlockChain", "evmBlochain", "chainId", "blockChain", "getBlockChainNameFromId", "blockchainMeta", "e", "isTxAlreadyCreated", "resetNetworkStatus", "actions", "updateNetworkStatus", "status", "onBlockForConnectWallet", "event", "context", "queue", "ok", "isRequiredWalletConnected", "ERROR_MESSAGE_WAIT_FOR_WALLET", "onBlockForChangeNetwork", "_event", "result", "error", "onDependsOnOtherQueues", "getBlockedTasks", "forceExecute", "manager", "setClaimer", "claimedBy", "reset", "blockedTasks", "task", "claimerId", "isClaimedByAnyQueue", "claimedStorage", "address", "retryOn", "getState", "walletState", "accounts", "connected", "connectedAccounts", "account", "accountAddress", "readAccountAddress", "singTransaction", "setTransactionDataByHash", "failed", "next", "schedule", "getSigners", "isMobileWallet", "getRelatedWallet", "mobileWallet", "walletAddress", "getCurrentAddressOf", "walletSigners", "currentStepBlockchain", "onFinish", "tx", "txType", "isApproval", "isSmartContractCall", "TransactionType", "updateResult", "response", "getScannerUrl", "extraMessage", "extraMessageDetail", "extraMessageErrorCode", "prettifyErrorMessage", "logRPCError", "checkWaitingForConnectWalletChange", "params", "wallet_network", "evmChains", "chain", "q", "queueStorage", "currentStepRequiredWallet", "hasWaitingForConnect", "taskId", "Status", "queueInstance", "description", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "checkWaitingForNetworkChange", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "getRunningSwaps", "queues", "resetRunningSwapNotifsOnPageLoad", "runningSwaps", "canSwitchNetworkTo", "options", "walletAndNetworkMatched", "onlyWalletMatched", "finalQueueToBeRun", "i", "currentQueue", "isNeedBlockQueueForParallel", "throwOnOK", "rawResponse", "responseBody", "PrettyError", "cancelSwap", "INTERVAL_FOR_CHECK", "checkTransactionStatus", "getStorage", "setStorage", "next", "schedule", "retry", "failed", "context", "swap", "meta", "currentStep", "getCurrentStep", "txId", "getTxReceiptFailed", "status", "signer", "getTransactionDataByHash", "setTransactionDataByHash", "useTransactionsData", "txType", "getCurrentStepTxType", "sourceWallet", "getRelatedWallet", "txResponse", "receiptReceived", "updatedTxHash", "updatedTxResponse", "currentStepBlockchain", "getCurrentBlockchainOf", "explorerUrl", "getScannerUrl", "error", "extraMessage", "extraMessageDetail", "extraMessageErrorCode", "prettifyErrorMessage", "updateResult", "updateSwapStatus", "httpService", "delay", "outputAmount", "prevOutputAmount", "newTransaction", "setCurrentStepTx", "nextStep", "getNextStep", "__name", "checkApprovalStatus", "isApproved", "response", "message", "details", "checkStatus", "actions", "resetNetworkStatus", "createTransaction", "actions", "setStorage", "getStorage", "next", "schedule", "context", "swap", "currentStep", "getCurrentStep", "getCurrentStepTx", "request", "transaction", "throwOnOK", "httpService", "setCurrentStepTx", "error", "extraMessage", "extraMessageDetail", "prettifyErrorMessage", "updateResult", "updateSwapStatus", "__name", "executeTransaction", "actions", "getStorage", "context", "meta", "wallets", "providers", "claimedBy", "claimQueue", "isClaimed", "requestBlock", "__name", "blockedFor", "swap", "currentStep", "getCurrentStep", "resetNetworkStatus", "isRequiredWalletConnected", "type", "address", "getRequiredWallet", "isWalletInCompatible", "w", "account", "description", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET", "networkMatched", "isNetworkMatchedForTransaction", "details", "ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES", "updateNetworkStatus", "fromBlockchain", "getCurrentBlockchainOf", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "isNeedBlockQueueForParallel", "singTransaction", "scheduleNextStep", "schedule", "next", "failed", "setStorage", "getStorage", "context", "swap", "currentStep", "getCurrentStep", "isFailed", "step", "isTxAlreadyCreated", "__name", "start", "schedule", "next", "__name", "swapQueueDef", "start", "scheduleNextStep", "createTransaction", "executeTransaction", "checkStatus", "event", "meta", "onBlockForConnectWallet", "onBlockForChangeNetwork", "onDependsOnOtherQueues", "useManager", "useEffect", "useState", "Persistor", "Status", "DB_NAME", "uuid", "MIGRATED_KEY", "migrated", "__name", "hasQueueManagerOnIDB", "db", "DB_NAME", "migration", "swapsFromStorage", "hasIndexDB", "swaps", "convertedSwaps", "swap", "taskId", "uuid", "convertedSwap", "Status", "status", "persistor", "Persistor", "promises", "queue", "isCalled", "useMigration", "isMigrated", "migrated", "status", "setStatus", "useState", "useEffect", "migration", "__name", "useQueueManager", "params", "manager", "useManager", "checkWaitingForConnectWalletChange", "retryOn", "checkWaitingForNetworkChange", "makeQueueDefinition", "configs", "initConfig", "swapQueueDef", "__name"]
|
|
7
7
|
}
|
package/dist/shared.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/helpers.ts
CHANGED
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
getBlockChainNameFromId,
|
|
16
16
|
Meta,
|
|
17
17
|
Network,
|
|
18
|
+
Networks,
|
|
18
19
|
WalletState,
|
|
19
20
|
WalletType,
|
|
20
21
|
} from '@rango-dev/wallets-shared';
|
|
@@ -554,7 +555,7 @@ export function isWalletNull(wallet: Wallet | null): boolean {
|
|
|
554
555
|
export function getEvmProvider(providers: Providers, type: WalletType): any {
|
|
555
556
|
if (type && providers[type]) {
|
|
556
557
|
// we need this because provider can return an instance or a map of instances, so what you are doing here is try to detect that.
|
|
557
|
-
if (providers[type].size) return providers[type].get(
|
|
558
|
+
if (providers[type].size) return providers[type].get(Networks.ETHEREUM);
|
|
558
559
|
|
|
559
560
|
return providers[type];
|
|
560
561
|
}
|
|
@@ -1277,8 +1278,7 @@ export function retryOn(
|
|
|
1277
1278
|
finalQueueToBeRun = onlyWalletMatched[0];
|
|
1278
1279
|
}
|
|
1279
1280
|
|
|
1280
|
-
if (!canSwitchNetworkTo?.(wallet, network
|
|
1281
|
-
finalQueueToBeRun?.unblock();
|
|
1281
|
+
if (!canSwitchNetworkTo?.(wallet, network)) finalQueueToBeRun?.unblock();
|
|
1282
1282
|
else finalQueueToBeRun?.checkBlock();
|
|
1283
1283
|
}
|
|
1284
1284
|
|
package/src/shared.ts
CHANGED
|
@@ -243,7 +243,7 @@ export const getCurrentBlockchainOf = (
|
|
|
243
243
|
step.tronApprovalTransaction?.blockChain ||
|
|
244
244
|
step.cosmosTransaction?.blockChain ||
|
|
245
245
|
step.solanaTransaction?.blockChain;
|
|
246
|
-
if (
|
|
246
|
+
if (b1) return b1;
|
|
247
247
|
|
|
248
248
|
const transferAddress = step.transferTransaction?.fromWalletAddress;
|
|
249
249
|
if (!transferAddress) throw PrettyError.BlockchainMissing();
|
|
@@ -254,8 +254,7 @@ export const getCurrentBlockchainOf = (
|
|
|
254
254
|
) || null;
|
|
255
255
|
if (blockchain == null) throw PrettyError.BlockchainMissing();
|
|
256
256
|
|
|
257
|
-
|
|
258
|
-
return blockchain as Network;
|
|
257
|
+
return blockchain;
|
|
259
258
|
};
|
|
260
259
|
|
|
261
260
|
const getBlockchainMetaExplorerBaseUrl = (
|