@avalabs/evm-module 3.6.0 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import yr from 'xss';
13
13
  import { ChainId } from '@avalabs/core-chains-sdk';
14
14
  import oo from 'lodash.startcase';
15
15
 
16
- function Ht(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function Pt(t){let e,r=0;for(e=0;e<t.length;e++){let n=Ht(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}var ee=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=B.exponential()})=>{let a=0,o=0,s;for(;o<r;){o>0&&await Cn(a);try{let c=await t(o);if(e(c))return c}catch(c){s=c;}a=n(o),o++;}let i=s?`Max retry exceeded. ${s}`:"Max retry exceeded.";throw new Error(i)},B=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}static linearThenExponential(e,r){return n=>{if(n<e)return (n+1)*r;let a=n-e+1,o=e*r,s=2*r*(Math.pow(2,a)-1);return o+s}}};function Cn(t){return new Promise(e=>setTimeout(e,t))}var Rt=t=>ee({operation:e=>t(e>0),maxRetries:2,backoffPolicy:B.constant(1),isSuccess:e=>e?.status?.error_code!==429});async function U(t,e,r=fetch){let n=await r(...t);if(!n.ok)throw new Error(`Request failed with status ${n.status}`);let a=await n.json();return e.parse(a)}var Ce=class{constructor(e,r){this.proxyApiUrl=e;this.fetchFn=r;}simplePrice(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}simplePriceByContractAddresses(e){let{id:r,...n}=e,a=new URLSearchParams(n);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${a}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}};var wn=z$1.array(z$1.object({internalId:z$1.string(),id:z$1.string(),symbol:z$1.string(),name:z$1.string(),image:z$1.string().optional().nullable(),current_price:z$1.number().optional().nullable(),price_change_percentage_24h:z$1.number().optional().nullable(),market_cap:z$1.number().optional().nullable(),total_volume:z$1.number().optional().nullable(),platforms:z$1.record(z$1.string(),z$1.string())})),He=class{constructor(e){this.proxyApiUrl=e;}watchlistToken(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/watchlist/tokens?${r}`,{method:"GET",headers:{"Content-Type":"application/json"}}],wn)}};var q,te,re,me,z=class{constructor({storage:e,proxyApiUrl:r,fetch:n}){c(this,q,void 0);c(this,te,void 0);c(this,re,void 0);c(this,me,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(a=>{let o=e[a];n[a]={},r.forEach(s=>{n[a]={[s]:{price:o?.[s],change24:o?.[`${s}_24h_change`],vol24:o?.[`${s}_24h_vol`],marketCap:o?.[`${s}_market_cap`]}};});}),n});d(this,q,e),d(this,te,r),d(this,re,n??globalThis.fetch),d(this,me,getBasicCoingeckoHttp(void 0,b(this,re)));}async getWatchlistDataForToken({tokenDetails:e,currency:r=VsCurrencyType.USD}){let n=(await new He(b(this,te)).watchlistToken({tokens:e.symbol,currency:r})).filter(o=>e.isNative?o.internalId===`NATIVE-${e.symbol.toLowerCase()}`:o.platforms[e.caip2Id]===e.address),[a]=n;return a?{priceInCurrency:a.current_price??0,change24:a.price_change_percentage_24h??0,marketCap:a.market_cap??0,vol24:a.total_volume??0}:{priceInCurrency:0,change24:0,marketCap:0,vol24:0}}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,o=`getSimplePrice-${e?`${Pt(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b(this,q)?.get?.(o),n)return n;try{n=await Rt(s=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:s}));}catch{n=void 0;}return b(this,q)?.set?.(o,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let a,s=`getPricesWithMarketDataByAddresses-${`${Pt(e)}-${r}-${n}`}`;if(a=b(this,q)?.get?.(s),a)return a;try{a=await Rt(i=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:i}));}catch(i){console.error(i),a=void 0;}return b(this,q)?.set?.(s,a),a}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:a=!1}){if(a){let o=await new Ce(b(this,te),b(this,re)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0});return this.transformSimplePriceResponse(o,[n])}return simpleTokenPrice(b(this,me),{assetPlatformId:e,tokenAddresses:r,currencies:[n],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:n=!1,vol24:a=!1,change24:o=!1,lastUpdated:s=!1,useCoingeckoProxy:i=!1,shouldThrow:c=!0}){if(i){let l=await new Ce(b(this,te),b(this,re)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:a,include_24hr_change:o,include_last_updated_at:s});return this.transformSimplePriceResponse(l,r)}return simplePrice(b(this,me),{coinIds:e,currencies:r,marketCap:n,vol24:a,change24:o,lastUpdated:s,shouldThrow:c})}};q=new WeakMap,te=new WeakMap,re=new WeakMap,me=new WeakMap;var Mn="https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json",Ln="https://latest.currency-api.pages.dev/v1/currencies/usd.min.json",qt=object({date:string(),usd:record(number())}),je=async()=>{try{return await U([Mn],qt)}catch{return await U([Ln],qt)}};var St=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),ze=(t,e)=>({label:t,value:e,type:DetailItemType.LINK}),de=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e});var Ye=(t,e)=>({label:t,type:DetailItemType.NETWORK,value:e});var xt=({name:t,version:e})=>{switch(t){case AppName.CORE_MOBILE_IOS:case AppName.CORE_MOBILE_ANDROID:case AppName.CORE_WEB:case AppName.CORE_EXTENSION:case AppName.EXPLORER:return {"x-application-name":t,"x-application-version":e};case AppName.OTHER:return}};var zt=process.env.GLACIER_API_KEY;var we=()=>zt;var $n={rltoken:we()},ne,Ke,Je,Kt,Xe,Jt,_e=class extends FetchHttpRequest{constructor(r){super(r);c(this,Je);c(this,Xe);c(this,ne,3);c(this,Ke,B.exponential());}request(r){let n={...$n,...r.query||{}},a={...r,query:Object.keys(n).length>0?n:void 0},o=()=>super.request(a);return b(this,ne)>0?e(this,Xe,Jt).call(this,o):e(this,Je,Kt).call(this,o)}};ne=new WeakMap,Ke=new WeakMap,Je=new WeakSet,Kt=function(r){let n=r();return new CancelablePromise((a,o,s)=>{s(()=>n.cancel()),n.then(i=>{d(this,ne,0),a(i);}).catch(i=>{if(i instanceof ApiError){let c=i.status===429,l=i.status>=500&&i.status<600;d(this,ne,b(this,ne)+Number(c||l));}o(i);});})},Xe=new WeakSet,Jt=function(r){let n=b(this,Ke).call(this,b(this,ne));return new CancelablePromise((a,o,s)=>{let i=setTimeout(()=>{let c=r();s(()=>{c.cancel(),clearTimeout(i);}),c.then(a).catch(o);},n);})};var F=(t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}});var Xt={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider/index.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:[],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["personal_sign","eth_sendTransaction","eth_sendTransactionBatch","eth_*","web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"],nonRestrictedMethods:["eth_requestAccounts","eth_decrypt","eth_getEncryptionPublicKey","eth_subscribe","eth_unsubscribe","eth_blockNumber","eth_call","eth_chainId","eth_coinbase","eth_estimateGas","eth_feeHistory","eth_gasPrice","eth_getBalance","eth_getBlockByHash","eth_getBlockByNumber","eth_getBlockTransactionCountByHash","eth_getBlockTransactionCountByNumber","eth_getCode","eth_getFilterChanges","eth_getFilterLogs","eth_getLogs","eth_getProof","eth_getStorageAt","eth_getTransactionByBlockHashAndIndex","eth_getTransactionByBlockNumberAndIndex","eth_getTransactionByHash","eth_getTransactionCount","eth_getTransactionReceipt","eth_getUncleCountByBlockHash","eth_getUncleCountByBlockNumber","eth_newBlockFilter","eth_newFilter","eth_newPendingTransactionFilter","eth_syncing","eth_uninstallFilter","net_version","net_peerCount","net_listening","web3_sha3","web3_clientVersion"]}},manifestVersion:"0.1"};var Zt="DUMMY_API_KEY";var Hn={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},jn={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},er=t=>{switch(t){case Environment.PRODUCTION:return Hn;case Environment.DEV:return jn}};var Ze=({accountIndex:t,derivationPathType:e})=>{if(t<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");switch(e){case"bip44":return {[NetworkVMType.EVM]:`m/44'/60'/0'/0/${t}`};case"ledger_live":return {[NetworkVMType.EVM]:`m/44'/60'/${t}'/0/0`};default:throw rpcErrors.invalidParams(`Unsupported derivation path type: ${e}`)}};var nr=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var ar=async t=>{let{secretId:e,approvalController:r}=t,n=nr(t)?Ze(t).EVM:void 0,a=await r.requestPublicKey({curve:"secp256k1",secretId:e,derivationPath:n});return {[NetworkVMType.EVM]:computeAddress(`0x${a}`)}};var N=async t=>{let{chainId:e,chainName:r,rpcUrl:n,multiContractAddress:a,pollingInterval:o=2e3}=t,s=new JsonRpcBatchInternal({maxCalls:40,multiContractAddress:a},Xn(n),new Network(r,e));return s.pollingInterval=o,s},Jn=["glacier-api.avax.network","proxy-api.avax.network"];function Xn(t){let e=new URL(t),r=we();if(r&&Jn.includes(e.hostname)){let n=e.searchParams;return n.set("token",r),e.search=n.toString(),e.toString()}return t}var fe=z$1.object({from:z$1.string().length(42),to:z$1.string().length(42).optional(),data:z$1.string().optional(),value:z$1.string().startsWith("0x").optional(),gas:z$1.string().startsWith("0x").optional(),gasPrice:z$1.string().startsWith("0x").optional(),maxFeePerGas:z$1.string().startsWith("0x").optional(),maxPriorityFeePerGas:z$1.string().startsWith("0x").optional(),nonce:z$1.string().optional(),chainId:z$1.string().optional().or(z$1.number().optional()),accessList:z$1.array(z$1.object({address:z$1.string().startsWith("0x"),storageKeys:z$1.array(z$1.string())})).optional()});var or=z$1.tuple([fe,fe]).rest(fe).refine(t=>It(t,"chainId"),{message:'All transactions must use the same "chainId"'}).refine(t=>It(t,"from"),{message:'All transactions must use the same "from" address'}).refine(t=>ta(t,"nonce")||ea(t,"nonce"),{message:'Each transaction needs a different "nonce". Make them different, or leave them empty for all transactions.'}),Zn=z$1.object({skipIntermediateTxs:z$1.boolean().optional()}),Qn=z$1.union([or,z$1.object({transactions:or,options:Zn.optional()})]);function ea(t,e){return !It(t,e)}function ta(t,e){return t.every(r=>r[e]===void 0||r[e]==="")}function It(t,e){return new Set(t.map(n=>n[e])).size===1}var sr=t=>{let e=Qn.safeParse(t);return e.success?Array.isArray(e.data)?{success:!0,data:{transactions:e.data,options:{}}}:{success:!0,data:{transactions:e.data.transactions,options:e.data.options??{}}}:e};var Qe=async({from:t,provider:e})=>e.getTransactionCount(t);var ir=async(t,e)=>{if(t[0].nonce)return;let r=await Qe({from:t[0].from,provider:e});return Promise.all(t.map(async(n,a)=>{n.nonce=String(r+a);}))};var cr=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER],ae=(s=>(s.TOTAL_SUPPLY="totalSupply",s.BALANCE_OF="balanceOf",s.TRANSFER="transfer",s.TRANSFER_FROM="transferFrom",s.APPROVE="approve",s.ALLOWANCE="allowance",s))(ae||{});var et=t=>{if(t.data)try{let r=new Interface(gr.abi).parseTransaction({data:t.data,value:t.value}),n=r?.name??r?.fragment?.name;return n&&aa(n)?n:void 0}catch{return}};function aa(t){return Object.values(ae).includes(t)}var tt=(t,e,r,{isSimulationSuccessful:n,balanceChange:a,tokenApprovals:o,alert:s})=>{let{dappInfo:i}=t,c=et(r),l="Do you approve this transaction?";c==="approve"&&(l="Do you approve this spend limit?");let p=[de("Account",r.from),Ye("Network",{name:e.chainName,logoUri:e.logoUri}),ze("Website",i)];r.to&&p.push(de("Contract",r.to));let u={title:l,details:[{title:"Transaction Details",items:p}],networkFeeSelector:!0,alert:s,balanceChange:a,tokenApprovals:o,isSimulationSuccessful:n},f={type:RpcMethod.ETH_SEND_TRANSACTION,account:r.from,data:{type:2,nonce:Number(r.nonce),gasLimit:Number(r.gas),maxFeePerGas:r.maxFeePerGas,maxPriorityFeePerGas:r.maxPriorityFeePerGas,to:r.to,from:r.from,data:r.data,value:r.value,chainId:r.chainId??e.chainId,accessList:r.accessList}};return {displayData:u,signingData:f}};var rt=async(t,e,r)=>{if("txHash"in e)return e.txHash;let n=()=>t.send("eth_sendRawTransaction",[e.signedData]);return r?.shouldRetry?ee({operation:()=>n(),isSuccess:()=>!0,maxRetries:6,backoffPolicy:B.linearThenExponential(4,1e3)}):n()};function ye(t,e,r="tx"){return `${t}/${r}/${e}`}var Be=async({explorerUrl:t,provider:e,txHash:r,onTransactionPending:n,onTransactionConfirmed:a,onTransactionReverted:o,request:s})=>{try{let i=ye(t,r);if(n({txHash:r,request:s,explorerLink:i}),(await ee({operation:async()=>e.getTransactionReceipt(r),isSuccess:p=>!!p,backoffPolicy:B.linearThenExponential(15,750),maxRetries:20}))?.status===1)return a({txHash:r,explorerLink:i,request:s}),!0}catch(i){console.error(i);}return o({txHash:r,request:s}),!1};var nt=new Map,lr=(t,e,r)=>(nt.set(t,{signingRequests:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:a},o)=>{let s=nt.get(t);if(!s)throw rpcErrors.resourceNotFound();let{signingRequests:i}=s,l={signingRequests:i.map((p,u)=>{if(o===void 0||o===u){let{signingData:f}=p;return {signingData:{...f,data:{...f.data,maxFeePerGas:n??f.data.maxFeePerGas,maxPriorityFeePerGas:a??f.data.maxPriorityFeePerGas}},displayData:p.displayData}}return p}),displayData:r};return nt.set(t,l),l},cleanup:()=>nt.delete(t)});function oe(t){return !("type"in t)}function at(t){return t.type===TokenType.ERC20}function pr(t){return typeof t.to=="string"}function mr(t){return "requestBatchApproval"in t&&typeof t.requestBatchApproval=="function"}function ca(t){return typeof t=="object"&&t!==null&&"ins"in t&&"outs"in t&&Array.isArray(t.ins)&&Array.isArray(t.outs)}function la(t){return typeof t=="object"&&t!==null&&"approvals"in t&&"isEditable"in t&&Array.isArray(t.approvals)}function Ct(t){return ca(t)?t.ins.length===0&&t.outs.length===0:la(t)?t.approvals.length===0:!1}var dr=async({chainId:t,params:e,domain:r,withGasEstimation:n,blockaid:a})=>{let o=["validation","simulation"];return n&&o.push("gas_estimation"),a.evm.transactionBulk.scan({chain:t.toString(),options:o,data:e,metadata:r&&r.length>0?{domain:r}:{non_dapp:!0}})},ur=async({chainId:t,params:e,domain:r,blockaid:n})=>n.evm.transaction.scan({account_address:e.from,chain:t.toString(),options:["validation","simulation"],data:{from:e.from,to:e.to,data:e.data,value:e.value,gas:e.gas,gas_price:e.gasPrice},metadata:r&&r.length>0?{domain:r}:{non_dapp:!0}}),fr=async({chainId:t,accountAddress:e,data:r,domain:n,blockaid:a})=>a.evm.jsonRpc.scan({chain:t.toString(),options:["validation","simulation"],account_address:e,data:r,metadata:n&&n.length>0?{domain:n}:{non_dapp:!0}});var Tr=async(t,e,r)=>{if(!t.data)return {tokenApprovals:void 0,balanceChange:void 0};try{let n=new ethers.Contract(t.to,gr.abi,r),a=await Promise.all([n.name?.(),n.symbol?.(),n.decimals?.()]),o=yr(a[0]),s=yr(a[1]),i=parseInt(a[2]),c={type:TokenType.ERC20,name:o,chainId:e,symbol:s,decimals:i,address:t.to,contractType:"ERC-20"},l=new ethers.Interface(gr.abi),p=l.getFunction(t.data.slice(0,10)),u=l.decodeFunctionData(t.data.slice(0,10),t.data);if(p?.name==="transfer")return {balanceChange:{outs:[{items:[{displayValue:new TokenUnit(u.amount,c.decimals,c.symbol).toDisplay(),usdPrice:void 0}],token:c}],ins:[]}};if(p?.name==="approve")return {tokenApprovals:{isEditable:!0,approvals:[{token:c,spenderAddress:u.spender,value:u.amount}]}}}catch(n){console.error("parseErc20Tx error",n);}return {tokenApprovals:void 0,balanceChange:void 0}};var Y={[AlertType.WARNING]:{type:AlertType.WARNING,details:{title:"Suspicious transaction",description:"Use caution, this transaction might be malicious."}},[AlertType.DANGER]:{type:AlertType.DANGER,details:{title:"Scam transaction",description:"This transaction has been flagged as malicious, I understand the risk.",body:["This transaction is malicious","do not proceed"],actionTitles:{reject:"Reject Transaction",proceed:"Proceed Anyway"}}}};var vr=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,provider:a,blockaid:o})=>{let s;try{s=await ur({chainId:n,params:r,domain:e,blockaid:o});}catch(i){console.error("simulateTransaction error",i);}return wt({rpcMethod:t,params:r,chainId:n,provider:a,simulationResult:s})},wt=async({rpcMethod:t,params:e,chainId:r,provider:n,simulationResult:a})=>{let o,s,i,c=!1,l;if(a){let{validation:p,simulation:u,gas_estimation:f}=a;!p||p.result_type==="Error"||p.result_type==="Warning"?o=Y[AlertType.WARNING]:p.result_type==="Malicious"&&(o=Y[AlertType.DANGER]),u?.status==="Success"&&(c=!0,i=br(t,u.account_summary),s=Er(u.account_summary.assets_diffs)),f?.status==="Success"&&(l=Number(f.estimate));}if(!c&&pr(e)){let p=await Tr(e,r,n);s=p.balanceChange,i=p.tokenApprovals;}return {alert:o,balanceChange:s,tokenApprovals:i,isSimulationSuccessful:c,estimatedGasLimit:l}},ga=t=>t.trace_type==="ExposureTrace",Ta=(t,e)=>`${t.toLowerCase()}.${e.toLowerCase()}`,ka=t=>t===void 0||t.length===0?{}:t.reduce((e,r)=>ga(r)?{[Ta(r.spender,r.asset.address)]:r}:e,{}),br=(t,e)=>{let{traces:r}=e,n=ka(r),a=Object.entries(n).map(([s,i])=>{let c=Pr(i.asset);if(!c)return;let l={token:c,spenderAddress:i.spender,logoUri:c.logoUri};if(i.type==="ERC20ExposureTrace"){let{exposed:{raw_value:p,value:u,usd_price:f}}=i;if(!u||u<=0)return;l.value=p,l.usdPrice=`${f}`;}if(i.type==="ERC721ExposureTrace")if(!i.exposed)l.value=`0x${MaxUint256.toString(16)}`;else {let{usd_price:p,amount:u}=i.exposed;l.value=`${u}`,l.usdPrice=`${p}`;}return l}).filter(Boolean);return a.length===0?void 0:{isEditable:a.length===1&&a[0]?.token.type===TokenType.ERC20&&t===RpcMethod.ETH_SEND_TRANSACTION,approvals:a}},Er=t=>{let e=kr(t,"in"),r=kr(t,"out");if(!(e.length===0&&r.length===0))return {ins:e,outs:r}},kr=(t,e)=>t.filter(r=>r[e].length>0).sort((r,n)=>r[e].length-n[e].length).map(r=>{let n=r.asset,a="address"in n?Pr(n):va(n);if(!a)return;let o=r[e].map(s=>{let i;if("value"in s&&s.value)if("decimals"in a){let u=numberToBN(s.value,a.decimals);i=balanceToDisplayValue(u,a.decimals);}else isHexString(s.value)&&(i=parseInt(s.value,16).toString());else "type"in a&&a.type===TokenType.ERC721&&(i="1");if(!i)return;let c="logo_url"in s?s.logo_url:void 0,l="token_id"in s?s.token_id:void 0;return {displayValue:i,usdPrice:s.usd_price,...c!==void 0&&{logoUri:c},...l!==void 0&&{tokenId:l}}}).filter(s=>s!==void 0);return {token:a,items:o}}).filter(r=>r!==void 0),Pr=t=>{let e;return t.type==="ERC20"?e={type:TokenType.ERC20,address:t.address,decimals:t.decimals,name:t.name??t.symbol??"",symbol:t.symbol??"",logoUri:t.logo_url}:t.type==="ERC1155"?e={type:TokenType.ERC1155,address:t.address,logoUri:t.logo_url,name:t.name,symbol:t.symbol}:t.type==="ERC721"?e={type:TokenType.ERC721,address:t.address,logoUri:t.logo_url,name:t.name,symbol:t.symbol}:t.type==="NONERC"&&(e={type:TokenType.NONERC,address:t.address,logoUri:t.logo_url,name:t.name,symbol:t.symbol}),e},va=t=>({name:t.name??"",symbol:t.symbol??"",decimals:t.decimals,description:"",logoUri:t.logo_url}),Rr=async({request:t,dAppUrl:e,accountAddress:r,chainId:n,data:a,blockaid:o})=>{let s,i,c;try{let{validation:l,simulation:p}=await fr({chainId:n,accountAddress:r,data:a,domain:e,blockaid:o});!l||l.result_type==="Error"||l.result_type==="Warning"?s=Y[AlertType.WARNING]:l.result_type==="Malicious"&&(s=Y[AlertType.DANGER]),p?.status==="Success"&&(c=br(t.method,p.account_summary),i=Er(p.account_summary.assets_diffs));}catch(l){console.error("processJsonRpcSimulation error",l),s=Y[AlertType.WARNING];}return {alert:s,balanceChange:i,tokenApprovals:c}};var xr=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,provider:a,populateMissingGas:o,blockaid:s})=>{let i;try{i=await dr({chainId:n,params:r,domain:e,withGasEstimation:o,blockaid:s});}catch(d){return console.error("simulateTransactionBatch error",d),{isSimulationSuccessful:!1,alert:Y[AlertType.WARNING],scans:[]}}let c=await Promise.all(i.map(async(d,y)=>{let v=r[y],P=await wt({chainId:n,params:r[y],provider:a,rpcMethod:t,simulationResult:d});return o&&!v.gas&&P.estimatedGasLimit&&(v.gas=`0x${P.estimatedGasLimit.toString(16)}`),{transaction:v,...P}})),l=c.every(d=>d.isSimulationSuccessful),p=ba(c),u=Pa(c),f=Ea(c);return {isSimulationSuccessful:l,alert:p,balanceChange:u,tokenApprovals:f,scans:c.map(d=>(d.tokenApprovals&&(d.tokenApprovals.isEditable=!1),d))}},ba=t=>{let e={[AlertType.INFO]:0,[AlertType.WARNING]:1,[AlertType.DANGER]:2};return t.reduce((r,{alert:n})=>n&&(!r||e[n.type]>e[r.type])?n:r,void 0)},Ea=t=>{let e=t.reduce((r,{tokenApprovals:n})=>(n&&n.approvals.forEach(a=>{let o=r.approvals.find(s=>a.token.address===s.token.address&&a.spenderAddress===s.spenderAddress);if(!o){r.approvals.push({...a});return}o.value=a.value,o.usdPrice=a.usdPrice;}),r),{approvals:[],isEditable:!1});return Ra(e,t),Ct(e)?void 0:e},Pa=t=>{let e=t.reduce((r,{balanceChange:n})=>(n&&(n.ins.forEach(a=>{let o=Sr(r.ins,a);o?o.items.push(...a.items):r.ins.push(a);}),n.outs.forEach(a=>{let o=Sr(r.outs,a);o?o.items.push(...a.items):r.outs.push({...a});})),r),{ins:[],outs:[]});return Ct(e)?void 0:e},Sr=(t,e)=>t.find(r=>oe(r.token)&&oe(e.token)?r.token.symbol===e.token.symbol:!oe(r.token)&&!oe(e.token)?r.token.address===e.token.address:!1),Ra=(t,e)=>{for(let r of t.approvals)for(let n of e)if(!(!n.isSimulationSuccessful||!n.balanceChange||!n.balanceChange.outs.some(o=>!oe(o.token)&&!oe(r.token)&&o.token.address===r.token.address)))if(!n.tokenApprovals)t.approvals=t.approvals.filter(o=>o.spenderAddress!==r.spenderAddress&&r.token.address!==o.token.address);else {let o=n.tokenApprovals.approvals.find(s=>s.spenderAddress===r.spenderAddress&&s.token.address===r.token.address);if(!o)continue;r.usdPrice=o.usdPrice,r.value=o.value;}};var Ir=async({request:t,network:e,approvalController:r,blockaid:n})=>{let{params:a}=t,{data:o,success:s,error:i}=sr(a);if(!s)return console.error("invalid params",i),{error:rpcErrors.invalidParams(F("Transaction params are invalid",i))};let{transactions:c,options:l={}}=o,{skipIntermediateTxs:p=!1}=l,u=await N({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});try{await ir(c,u);}catch(C){return console.error("Unable to calculate nonce",C),{error:rpcErrors.internal(F("Unable to calculate nonce",C))}}let f=c.every(C=>Number(C.gas)>0),{alert:d,balanceChange:y,isSimulationSuccessful:v,tokenApprovals:P,scans:b}=await xr({rpcMethod:t.method,chainId:e.chainId,params:c,dAppUrl:t.dappInfo.url,provider:u,populateMissingGas:!f,blockaid:n});if(!b.every(({transaction:C})=>Number(C.gas)>0))return console.error("Gas limit is missing in some transactions"),{error:rpcErrors.internal({message:"Gas limit is missing in some transactions"})};let x={title:"Do you approve these transactions?",details:[{title:"Transaction Details",items:[de("Account",c[0].from),Ye("Network",{name:e.chainName,logoUri:e.logoUri}),ze("Website",t.dappInfo)]}],isSimulationSuccessful:v,balanceChange:y,alert:d,tokenApprovals:P,networkFeeSelector:!0},g=b.map(C=>tt(t,e,C.transaction,C)),{cleanup:k,updateTx:G}=lr(t.requestId,g,x),W=await r.requestBatchApproval({request:t,signingRequests:g,displayData:x,updateTx:G});if(k(),"error"in W)return {error:W.error};if(W.result.length!==c.length)return {error:rpcErrors.internal({message:`Invalid number of signatures. Expected ${c.length}, got ${W.result.length}`})};let Ae=[];for(let[C,An]of W.result.entries()){let Wt=C===W.result.length-1,Et=await rt(u,An);if(Wt&&Be({explorerUrl:e.explorerUrl??"",provider:u,txHash:Et,onTransactionPending:r.onTransactionPending,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,request:t}),!Wt&&!p&&!await Be({explorerUrl:e.explorerUrl??"",provider:u,txHash:Et,onTransactionPending:r.onTransactionPending,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,request:t}))return {error:rpcErrors.internal({message:`Transaction ${C+1} failed! Batch execution stopped`})};Ae.push(Et);}return {result:Ae}};function Ar(t,e,r){return new ethers.Contract(t,gr.abi).interface.encodeFunctionData("approve",[e,r])}var it=new Map,Cr=(t,e,r)=>(it.set(t,{signingData:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:a,approvalLimit:o,gasLimit:s})=>{let i=it.get(t);if(!i)throw rpcErrors.resourceNotFound();let{signingData:c,displayData:l}=i,p={...c,data:{...c.data,gasLimit:s??c.data.gasLimit,maxFeePerGas:n??c.data.maxFeePerGas,maxPriorityFeePerGas:a??c.data.maxPriorityFeePerGas}},u={...l};if(typeof o=="string"){if(!o.startsWith("0x"))throw rpcErrors.invalidInput("Expected approvalLimit to be a hexadecimal number (0x-prefixed)");let d=l.tokenApprovals;Ia(d),Aa(c.data.data);let y=d.approvals[0];p.data.data=Ar(y.token.address,y.spenderAddress,o),u.tokenApprovals={approvals:[{...y,value:o}],isEditable:!0};}let f={signingData:p,displayData:u};return it.set(t,f),f},cleanup:()=>it.delete(t)});function Ia(t){if(!t||!t.isEditable||t.approvals.length!==1)throw rpcErrors.invalidInput("Cannot edit the token approval for this request. Please start a new request instead.")}function Aa(t){if((!t||t==="0x"?null:et({data:t??void 0}))!=="approve")throw rpcErrors.invalidInput("Cannot change invoked method for requests in progress. Please start a new request instead.")}var wr=async({transactionParams:{from:t,to:e,data:r,value:n,accessList:a},provider:o})=>{let s=await o.getTransactionCount(t);return Number(await o.estimateGas({from:t,to:e,nonce:s,data:r,value:n,accessList:a}))};var wa=z$1.tuple([fe]),_r=t=>wa.safeParse(t);var Nr=async({request:t,network:e,approvalController:r,blockaid:n})=>{let{params:a}=t,{data:o,error:s,success:i}=_r(a);if(!i)return console.error("invalid params",s),{error:rpcErrors.invalidParams(F("Transaction params are invalid",s))};let[c]=o,l=await N({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});if(!c.gas||Number(c.gas)<0)try{let S=await wr({transactionParams:{from:c.from,to:c.to,data:c.data,value:c.value,accessList:c.accessList},provider:l});c.gas="0x"+S.toString(16);}catch(S){return {error:rpcErrors.internal(F("Unable to calculate gas limit",S))}}if(!c.nonce)try{let S=await Qe({from:c.from,provider:l});c.nonce=String(S);}catch(S){return {error:rpcErrors.internal(F("Unable to calculate nonce",S))}}let p=await vr({rpcMethod:t.method,chainId:e.chainId,params:c,dAppUrl:t.dappInfo.url,provider:l,blockaid:n}),{displayData:u,signingData:f}=tt(t,e,c,p),{updateTx:d,cleanup:y}=Cr(t.requestId,f,u),v=await r.requestApproval({request:t,displayData:u,signingData:f,updateTx:d});if(y(),"error"in v)return {error:v.error};let P,b=t.context?.shouldRetry===!0;try{P=await rt(l,v,{shouldRetry:b});}catch(S){return {error:rpcErrors.internal(F("Unable to get transaction hash",S))}}return Be({explorerUrl:e.explorerUrl??"",provider:l,txHash:P,onTransactionPending:r.onTransactionPending,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,request:t}),{result:P}};var _t=t=>{let e="";e+=`Domain
16
+ function Ht(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function Pt(t){let e,r=0;for(e=0;e<t.length;e++){let n=Ht(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}var ee=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=B.exponential()})=>{let a=0,o=0,s;for(;o<r;){o>0&&await Cn(a);try{let c=await t(o);if(e(c))return c}catch(c){s=c;}a=n(o),o++;}let i=s?`Max retry exceeded. ${s}`:"Max retry exceeded.";throw new Error(i)},B=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}static linearThenExponential(e,r){return n=>{if(n<e)return (n+1)*r;let a=n-e+1,o=e*r,s=2*r*(Math.pow(2,a)-1);return o+s}}};function Cn(t){return new Promise(e=>setTimeout(e,t))}var Rt=t=>ee({operation:e=>t(e>0),maxRetries:2,backoffPolicy:B.constant(1),isSuccess:e=>e?.status?.error_code!==429});async function U(t,e,r=fetch){let n=await r(...t);if(!n.ok)throw new Error(`Request failed with status ${n.status}`);let a=await n.json();return e.parse(a)}var Ce=class{constructor(e,r){this.proxyApiUrl=e;this.fetchFn=r;}simplePrice(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}simplePriceByContractAddresses(e){let{id:r,...n}=e,a=new URLSearchParams(n);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${a}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}};var wn=z$1.array(z$1.object({internalId:z$1.string(),id:z$1.string(),symbol:z$1.string(),name:z$1.string(),image:z$1.string().optional().nullable(),current_price:z$1.number().optional().nullable(),price_change_percentage_24h:z$1.number().optional().nullable(),market_cap:z$1.number().optional().nullable(),total_volume:z$1.number().optional().nullable(),platforms:z$1.record(z$1.string(),z$1.string())})),He=class{constructor(e){this.proxyApiUrl=e;}watchlistToken(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/watchlist/tokens?${r}`,{method:"GET",headers:{"Content-Type":"application/json"}}],wn)}};var q,te,re,me,z=class{constructor({storage:e,proxyApiUrl:r,fetch:n}){c(this,q,void 0);c(this,te,void 0);c(this,re,void 0);c(this,me,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(a=>{let o=e[a];n[a]={},r.forEach(s=>{n[a]={[s]:{price:o?.[s],change24:o?.[`${s}_24h_change`],vol24:o?.[`${s}_24h_vol`],marketCap:o?.[`${s}_market_cap`]}};});}),n});d(this,q,e),d(this,te,r),d(this,re,n??globalThis.fetch),d(this,me,getBasicCoingeckoHttp(void 0,b(this,re)));}async getWatchlistDataForToken({tokenDetails:e,currency:r=VsCurrencyType.USD}){let n=(await new He(b(this,te)).watchlistToken({tokens:e.symbol,currency:r})).filter(o=>e.isNative?o.internalId===`NATIVE-${e.symbol.toLowerCase()}`:o.platforms[e.caip2Id]===e.address),[a]=n;return a?{priceInCurrency:a.current_price??0,change24:a.price_change_percentage_24h??0,marketCap:a.market_cap??0,vol24:a.total_volume??0}:{priceInCurrency:0,change24:0,marketCap:0,vol24:0}}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,o=`getSimplePrice-${e?`${Pt(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b(this,q)?.get?.(o),n)return n;try{n=await Rt(s=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:s}));}catch{n=void 0;}return b(this,q)?.set?.(o,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let a,s=`getPricesWithMarketDataByAddresses-${`${Pt(e)}-${r}-${n}`}`;if(a=b(this,q)?.get?.(s),a)return a;try{a=await Rt(i=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:i}));}catch(i){console.error(i),a=void 0;}return b(this,q)?.set?.(s,a),a}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:a=!1}){if(a){let o=await new Ce(b(this,te),b(this,re)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0});return this.transformSimplePriceResponse(o,[n])}return simpleTokenPrice(b(this,me),{assetPlatformId:e,tokenAddresses:r,currencies:[n],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:n=!1,vol24:a=!1,change24:o=!1,lastUpdated:s=!1,useCoingeckoProxy:i=!1,shouldThrow:c=!0}){if(i){let l=await new Ce(b(this,te),b(this,re)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:a,include_24hr_change:o,include_last_updated_at:s});return this.transformSimplePriceResponse(l,r)}return simplePrice(b(this,me),{coinIds:e,currencies:r,marketCap:n,vol24:a,change24:o,lastUpdated:s,shouldThrow:c})}};q=new WeakMap,te=new WeakMap,re=new WeakMap,me=new WeakMap;var Mn="https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json",Ln="https://latest.currency-api.pages.dev/v1/currencies/usd.min.json",qt=object({date:string(),usd:record(number())}),je=async()=>{try{return await U([Mn],qt)}catch{return await U([Ln],qt)}};var St=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),ze=(t,e)=>({label:t,value:e,type:DetailItemType.LINK}),de=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e});var Ye=(t,e)=>({label:t,type:DetailItemType.NETWORK,value:e});var xt=({name:t,version:e})=>{switch(t){case AppName.CORE_MOBILE_IOS:case AppName.CORE_MOBILE_ANDROID:case AppName.CORE_WEB:case AppName.CORE_EXTENSION:case AppName.EXPLORER:return {"x-application-name":t,"x-application-version":e};case AppName.OTHER:return}};var zt=process.env.GLACIER_API_KEY;var we=()=>zt;var $n={rltoken:we()},ne,Ke,Je,Kt,Xe,Jt,_e=class extends FetchHttpRequest{constructor(r){super(r);c(this,Je);c(this,Xe);c(this,ne,0);c(this,Ke,B.exponential());}request(r){let n={...$n,...r.query||{}},a={...r,query:Object.keys(n).length>0?n:void 0},o=()=>super.request(a);return b(this,ne)>0?e(this,Xe,Jt).call(this,o):e(this,Je,Kt).call(this,o)}};ne=new WeakMap,Ke=new WeakMap,Je=new WeakSet,Kt=function(r){let n=r();return new CancelablePromise((a,o,s)=>{s(()=>n.cancel()),n.then(i=>{d(this,ne,0),a(i);}).catch(i=>{if(i instanceof ApiError){let c=i.status===429,l=i.status>=500&&i.status<600;d(this,ne,b(this,ne)+Number(c||l));}o(i);});})},Xe=new WeakSet,Jt=function(r){let n=b(this,Ke).call(this,b(this,ne));return new CancelablePromise((a,o,s)=>{let i=setTimeout(()=>{let c=r();s(()=>{c.cancel(),clearTimeout(i);}),c.then(a).catch(o);},n);})};var F=(t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}});var Xt={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider/index.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:[],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["personal_sign","eth_sendTransaction","eth_sendTransactionBatch","eth_*","web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"],nonRestrictedMethods:["eth_requestAccounts","eth_decrypt","eth_getEncryptionPublicKey","eth_subscribe","eth_unsubscribe","eth_blockNumber","eth_call","eth_chainId","eth_coinbase","eth_estimateGas","eth_feeHistory","eth_gasPrice","eth_getBalance","eth_getBlockByHash","eth_getBlockByNumber","eth_getBlockTransactionCountByHash","eth_getBlockTransactionCountByNumber","eth_getCode","eth_getFilterChanges","eth_getFilterLogs","eth_getLogs","eth_getProof","eth_getStorageAt","eth_getTransactionByBlockHashAndIndex","eth_getTransactionByBlockNumberAndIndex","eth_getTransactionByHash","eth_getTransactionCount","eth_getTransactionReceipt","eth_getUncleCountByBlockHash","eth_getUncleCountByBlockNumber","eth_newBlockFilter","eth_newFilter","eth_newPendingTransactionFilter","eth_syncing","eth_uninstallFilter","net_version","net_peerCount","net_listening","web3_sha3","web3_clientVersion"]}},manifestVersion:"0.1"};var Zt="DUMMY_API_KEY";var Hn={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},jn={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},er=t=>{switch(t){case Environment.PRODUCTION:return Hn;case Environment.DEV:return jn}};var Ze=({accountIndex:t,derivationPathType:e})=>{if(t<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");switch(e){case"bip44":return {[NetworkVMType.EVM]:`m/44'/60'/0'/0/${t}`};case"ledger_live":return {[NetworkVMType.EVM]:`m/44'/60'/${t}'/0/0`};default:throw rpcErrors.invalidParams(`Unsupported derivation path type: ${e}`)}};var nr=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var ar=async t=>{let{secretId:e,approvalController:r}=t,n=nr(t)?Ze(t).EVM:void 0,a=await r.requestPublicKey({curve:"secp256k1",secretId:e,derivationPath:n});return {[NetworkVMType.EVM]:computeAddress(`0x${a}`)}};var N=async t=>{let{chainId:e,chainName:r,rpcUrl:n,multiContractAddress:a,pollingInterval:o=2e3}=t,s=new JsonRpcBatchInternal({maxCalls:40,multiContractAddress:a},Xn(n),new Network(r,e));return s.pollingInterval=o,s},Jn=["glacier-api.avax.network","proxy-api.avax.network"];function Xn(t){let e=new URL(t),r=we();if(r&&Jn.includes(e.hostname)){let n=e.searchParams;return n.set("token",r),e.search=n.toString(),e.toString()}return t}var fe=z$1.object({from:z$1.string().length(42),to:z$1.string().length(42).optional(),data:z$1.string().optional(),value:z$1.string().startsWith("0x").optional(),gas:z$1.string().startsWith("0x").optional(),gasPrice:z$1.string().startsWith("0x").optional(),maxFeePerGas:z$1.string().startsWith("0x").optional(),maxPriorityFeePerGas:z$1.string().startsWith("0x").optional(),nonce:z$1.string().optional(),chainId:z$1.string().optional().or(z$1.number().optional()),accessList:z$1.array(z$1.object({address:z$1.string().startsWith("0x"),storageKeys:z$1.array(z$1.string())})).optional()});var or=z$1.tuple([fe,fe]).rest(fe).refine(t=>It(t,"chainId"),{message:'All transactions must use the same "chainId"'}).refine(t=>It(t,"from"),{message:'All transactions must use the same "from" address'}).refine(t=>ta(t,"nonce")||ea(t,"nonce"),{message:'Each transaction needs a different "nonce". Make them different, or leave them empty for all transactions.'}),Zn=z$1.object({skipIntermediateTxs:z$1.boolean().optional()}),Qn=z$1.union([or,z$1.object({transactions:or,options:Zn.optional()})]);function ea(t,e){return !It(t,e)}function ta(t,e){return t.every(r=>r[e]===void 0||r[e]==="")}function It(t,e){return new Set(t.map(n=>n[e])).size===1}var sr=t=>{let e=Qn.safeParse(t);return e.success?Array.isArray(e.data)?{success:!0,data:{transactions:e.data,options:{}}}:{success:!0,data:{transactions:e.data.transactions,options:e.data.options??{}}}:e};var Qe=async({from:t,provider:e})=>e.getTransactionCount(t);var ir=async(t,e)=>{if(t[0].nonce)return;let r=await Qe({from:t[0].from,provider:e});return Promise.all(t.map(async(n,a)=>{n.nonce=String(r+a);}))};var cr=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER],ae=(s=>(s.TOTAL_SUPPLY="totalSupply",s.BALANCE_OF="balanceOf",s.TRANSFER="transfer",s.TRANSFER_FROM="transferFrom",s.APPROVE="approve",s.ALLOWANCE="allowance",s))(ae||{});var et=t=>{if(t.data)try{let r=new Interface(gr.abi).parseTransaction({data:t.data,value:t.value}),n=r?.name??r?.fragment?.name;return n&&aa(n)?n:void 0}catch{return}};function aa(t){return Object.values(ae).includes(t)}var tt=(t,e,r,{isSimulationSuccessful:n,balanceChange:a,tokenApprovals:o,alert:s})=>{let{dappInfo:i}=t,c=et(r),l="Do you approve this transaction?";c==="approve"&&(l="Do you approve this spend limit?");let p=[de("Account",r.from),Ye("Network",{name:e.chainName,logoUri:e.logoUri}),ze("Website",i)];r.to&&p.push(de("Contract",r.to));let u={title:l,details:[{title:"Transaction Details",items:p}],networkFeeSelector:!0,alert:s,balanceChange:a,tokenApprovals:o,isSimulationSuccessful:n},f={type:RpcMethod.ETH_SEND_TRANSACTION,account:r.from,data:{type:2,nonce:Number(r.nonce),gasLimit:Number(r.gas),maxFeePerGas:r.maxFeePerGas,maxPriorityFeePerGas:r.maxPriorityFeePerGas,to:r.to,from:r.from,data:r.data,value:r.value,chainId:r.chainId??e.chainId,accessList:r.accessList}};return {displayData:u,signingData:f}};var rt=async(t,e,r)=>{if("txHash"in e)return e.txHash;let n=()=>t.send("eth_sendRawTransaction",[e.signedData]);return r?.shouldRetry?ee({operation:()=>n(),isSuccess:()=>!0,maxRetries:6,backoffPolicy:B.linearThenExponential(4,1e3)}):n()};function ye(t,e,r="tx"){return `${t}/${r}/${e}`}var Be=async({explorerUrl:t,provider:e,txHash:r,onTransactionPending:n,onTransactionConfirmed:a,onTransactionReverted:o,request:s})=>{try{let i=ye(t,r);if(n({txHash:r,request:s,explorerLink:i}),(await ee({operation:async()=>e.getTransactionReceipt(r),isSuccess:p=>!!p,backoffPolicy:B.linearThenExponential(15,750),maxRetries:20}))?.status===1)return a({txHash:r,explorerLink:i,request:s}),!0}catch(i){console.error(i);}return o({txHash:r,request:s}),!1};var nt=new Map,lr=(t,e,r)=>(nt.set(t,{signingRequests:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:a},o)=>{let s=nt.get(t);if(!s)throw rpcErrors.resourceNotFound();let{signingRequests:i}=s,l={signingRequests:i.map((p,u)=>{if(o===void 0||o===u){let{signingData:f}=p;return {signingData:{...f,data:{...f.data,maxFeePerGas:n??f.data.maxFeePerGas,maxPriorityFeePerGas:a??f.data.maxPriorityFeePerGas}},displayData:p.displayData}}return p}),displayData:r};return nt.set(t,l),l},cleanup:()=>nt.delete(t)});function oe(t){return !("type"in t)}function at(t){return t.type===TokenType.ERC20}function pr(t){return typeof t.to=="string"}function mr(t){return "requestBatchApproval"in t&&typeof t.requestBatchApproval=="function"}function ca(t){return typeof t=="object"&&t!==null&&"ins"in t&&"outs"in t&&Array.isArray(t.ins)&&Array.isArray(t.outs)}function la(t){return typeof t=="object"&&t!==null&&"approvals"in t&&"isEditable"in t&&Array.isArray(t.approvals)}function Ct(t){return ca(t)?t.ins.length===0&&t.outs.length===0:la(t)?t.approvals.length===0:!1}var dr=async({chainId:t,params:e,domain:r,withGasEstimation:n,blockaid:a})=>{let o=["validation","simulation"];return n&&o.push("gas_estimation"),a.evm.transactionBulk.scan({chain:t.toString(),options:o,data:e,metadata:r&&r.length>0?{domain:r}:{non_dapp:!0}})},ur=async({chainId:t,params:e,domain:r,blockaid:n})=>n.evm.transaction.scan({account_address:e.from,chain:t.toString(),options:["validation","simulation"],data:{from:e.from,to:e.to,data:e.data,value:e.value,gas:e.gas,gas_price:e.gasPrice},metadata:r&&r.length>0?{domain:r}:{non_dapp:!0}}),fr=async({chainId:t,accountAddress:e,data:r,domain:n,blockaid:a})=>a.evm.jsonRpc.scan({chain:t.toString(),options:["validation","simulation"],account_address:e,data:r,metadata:n&&n.length>0?{domain:n}:{non_dapp:!0}});var Tr=async(t,e,r)=>{if(!t.data)return {tokenApprovals:void 0,balanceChange:void 0};try{let n=new ethers.Contract(t.to,gr.abi,r),a=await Promise.all([n.name?.(),n.symbol?.(),n.decimals?.()]),o=yr(a[0]),s=yr(a[1]),i=parseInt(a[2]),c={type:TokenType.ERC20,name:o,chainId:e,symbol:s,decimals:i,address:t.to,contractType:"ERC-20"},l=new ethers.Interface(gr.abi),p=l.getFunction(t.data.slice(0,10)),u=l.decodeFunctionData(t.data.slice(0,10),t.data);if(p?.name==="transfer")return {balanceChange:{outs:[{items:[{displayValue:new TokenUnit(u.amount,c.decimals,c.symbol).toDisplay(),usdPrice:void 0}],token:c}],ins:[]}};if(p?.name==="approve")return {tokenApprovals:{isEditable:!0,approvals:[{token:c,spenderAddress:u.spender,value:u.amount}]}}}catch(n){console.error("parseErc20Tx error",n);}return {tokenApprovals:void 0,balanceChange:void 0}};var Y={[AlertType.WARNING]:{type:AlertType.WARNING,details:{title:"Suspicious transaction",description:"Use caution, this transaction might be malicious."}},[AlertType.DANGER]:{type:AlertType.DANGER,details:{title:"Scam transaction",description:"This transaction has been flagged as malicious, I understand the risk.",body:["This transaction is malicious","do not proceed"],actionTitles:{reject:"Reject Transaction",proceed:"Proceed Anyway"}}}};var vr=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,provider:a,blockaid:o})=>{let s;try{s=await ur({chainId:n,params:r,domain:e,blockaid:o});}catch(i){console.error("simulateTransaction error",i);}return wt({rpcMethod:t,params:r,chainId:n,provider:a,simulationResult:s})},wt=async({rpcMethod:t,params:e,chainId:r,provider:n,simulationResult:a})=>{let o,s,i,c=!1,l;if(a){let{validation:p,simulation:u,gas_estimation:f}=a;!p||p.result_type==="Error"||p.result_type==="Warning"?o=Y[AlertType.WARNING]:p.result_type==="Malicious"&&(o=Y[AlertType.DANGER]),u?.status==="Success"&&(c=!0,i=br(t,u.account_summary),s=Er(u.account_summary.assets_diffs)),f?.status==="Success"&&(l=Number(f.estimate));}if(!c&&pr(e)){let p=await Tr(e,r,n);s=p.balanceChange,i=p.tokenApprovals;}return {alert:o,balanceChange:s,tokenApprovals:i,isSimulationSuccessful:c,estimatedGasLimit:l}},ga=t=>t.trace_type==="ExposureTrace",Ta=(t,e)=>`${t.toLowerCase()}.${e.toLowerCase()}`,ka=t=>t===void 0||t.length===0?{}:t.reduce((e,r)=>ga(r)?{[Ta(r.spender,r.asset.address)]:r}:e,{}),br=(t,e)=>{let{traces:r}=e,n=ka(r),a=Object.entries(n).map(([s,i])=>{let c=Pr(i.asset);if(!c)return;let l={token:c,spenderAddress:i.spender,logoUri:c.logoUri};if(i.type==="ERC20ExposureTrace"){let{exposed:{raw_value:p,value:u,usd_price:f}}=i;if(!u||u<=0)return;l.value=p,l.usdPrice=`${f}`;}if(i.type==="ERC721ExposureTrace")if(!i.exposed)l.value=`0x${MaxUint256.toString(16)}`;else {let{usd_price:p,amount:u}=i.exposed;l.value=`${u}`,l.usdPrice=`${p}`;}return l}).filter(Boolean);return a.length===0?void 0:{isEditable:a.length===1&&a[0]?.token.type===TokenType.ERC20&&t===RpcMethod.ETH_SEND_TRANSACTION,approvals:a}},Er=t=>{let e=kr(t,"in"),r=kr(t,"out");if(!(e.length===0&&r.length===0))return {ins:e,outs:r}},kr=(t,e)=>t.filter(r=>r[e].length>0).sort((r,n)=>r[e].length-n[e].length).map(r=>{let n=r.asset,a="address"in n?Pr(n):va(n);if(!a)return;let o=r[e].map(s=>{let i;if("value"in s&&s.value)if("decimals"in a){let u=numberToBN(s.value,a.decimals);i=balanceToDisplayValue(u,a.decimals);}else isHexString(s.value)&&(i=parseInt(s.value,16).toString());else "type"in a&&a.type===TokenType.ERC721&&(i="1");if(!i)return;let c="logo_url"in s?s.logo_url:void 0,l="token_id"in s?s.token_id:void 0;return {displayValue:i,usdPrice:s.usd_price,...c!==void 0&&{logoUri:c},...l!==void 0&&{tokenId:l}}}).filter(s=>s!==void 0);return {token:a,items:o}}).filter(r=>r!==void 0),Pr=t=>{let e;return t.type==="ERC20"?e={type:TokenType.ERC20,address:t.address,decimals:t.decimals,name:t.name??t.symbol??"",symbol:t.symbol??"",logoUri:t.logo_url}:t.type==="ERC1155"?e={type:TokenType.ERC1155,address:t.address,logoUri:t.logo_url,name:t.name,symbol:t.symbol}:t.type==="ERC721"?e={type:TokenType.ERC721,address:t.address,logoUri:t.logo_url,name:t.name,symbol:t.symbol}:t.type==="NONERC"&&(e={type:TokenType.NONERC,address:t.address,logoUri:t.logo_url,name:t.name,symbol:t.symbol}),e},va=t=>({name:t.name??"",symbol:t.symbol??"",decimals:t.decimals,description:"",logoUri:t.logo_url}),Rr=async({request:t,dAppUrl:e,accountAddress:r,chainId:n,data:a,blockaid:o})=>{let s,i,c;try{let{validation:l,simulation:p}=await fr({chainId:n,accountAddress:r,data:a,domain:e,blockaid:o});!l||l.result_type==="Error"||l.result_type==="Warning"?s=Y[AlertType.WARNING]:l.result_type==="Malicious"&&(s=Y[AlertType.DANGER]),p?.status==="Success"&&(c=br(t.method,p.account_summary),i=Er(p.account_summary.assets_diffs));}catch(l){console.error("processJsonRpcSimulation error",l),s=Y[AlertType.WARNING];}return {alert:s,balanceChange:i,tokenApprovals:c}};var xr=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,provider:a,populateMissingGas:o,blockaid:s})=>{let i;try{i=await dr({chainId:n,params:r,domain:e,withGasEstimation:o,blockaid:s});}catch(d){return console.error("simulateTransactionBatch error",d),{isSimulationSuccessful:!1,alert:Y[AlertType.WARNING],scans:[]}}let c=await Promise.all(i.map(async(d,y)=>{let v=r[y],P=await wt({chainId:n,params:r[y],provider:a,rpcMethod:t,simulationResult:d});return o&&!v.gas&&P.estimatedGasLimit&&(v.gas=`0x${P.estimatedGasLimit.toString(16)}`),{transaction:v,...P}})),l=c.every(d=>d.isSimulationSuccessful),p=ba(c),u=Pa(c),f=Ea(c);return {isSimulationSuccessful:l,alert:p,balanceChange:u,tokenApprovals:f,scans:c.map(d=>(d.tokenApprovals&&(d.tokenApprovals.isEditable=!1),d))}},ba=t=>{let e={[AlertType.INFO]:0,[AlertType.WARNING]:1,[AlertType.DANGER]:2};return t.reduce((r,{alert:n})=>n&&(!r||e[n.type]>e[r.type])?n:r,void 0)},Ea=t=>{let e=t.reduce((r,{tokenApprovals:n})=>(n&&n.approvals.forEach(a=>{let o=r.approvals.find(s=>a.token.address===s.token.address&&a.spenderAddress===s.spenderAddress);if(!o){r.approvals.push({...a});return}o.value=a.value,o.usdPrice=a.usdPrice;}),r),{approvals:[],isEditable:!1});return Ra(e,t),Ct(e)?void 0:e},Pa=t=>{let e=t.reduce((r,{balanceChange:n})=>(n&&(n.ins.forEach(a=>{let o=Sr(r.ins,a);o?o.items.push(...a.items):r.ins.push(a);}),n.outs.forEach(a=>{let o=Sr(r.outs,a);o?o.items.push(...a.items):r.outs.push({...a});})),r),{ins:[],outs:[]});return Ct(e)?void 0:e},Sr=(t,e)=>t.find(r=>oe(r.token)&&oe(e.token)?r.token.symbol===e.token.symbol:!oe(r.token)&&!oe(e.token)?r.token.address===e.token.address:!1),Ra=(t,e)=>{for(let r of t.approvals)for(let n of e)if(!(!n.isSimulationSuccessful||!n.balanceChange||!n.balanceChange.outs.some(o=>!oe(o.token)&&!oe(r.token)&&o.token.address===r.token.address)))if(!n.tokenApprovals)t.approvals=t.approvals.filter(o=>o.spenderAddress!==r.spenderAddress&&r.token.address!==o.token.address);else {let o=n.tokenApprovals.approvals.find(s=>s.spenderAddress===r.spenderAddress&&s.token.address===r.token.address);if(!o)continue;r.usdPrice=o.usdPrice,r.value=o.value;}};var Ir=async({request:t,network:e,approvalController:r,blockaid:n})=>{let{params:a}=t,{data:o,success:s,error:i}=sr(a);if(!s)return console.error("invalid params",i),{error:rpcErrors.invalidParams(F("Transaction params are invalid",i))};let{transactions:c,options:l={}}=o,{skipIntermediateTxs:p=!1}=l,u=await N({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});try{await ir(c,u);}catch(C){return console.error("Unable to calculate nonce",C),{error:rpcErrors.internal(F("Unable to calculate nonce",C))}}let f=c.every(C=>Number(C.gas)>0),{alert:d,balanceChange:y,isSimulationSuccessful:v,tokenApprovals:P,scans:b}=await xr({rpcMethod:t.method,chainId:e.chainId,params:c,dAppUrl:t.dappInfo.url,provider:u,populateMissingGas:!f,blockaid:n});if(!b.every(({transaction:C})=>Number(C.gas)>0))return console.error("Gas limit is missing in some transactions"),{error:rpcErrors.internal({message:"Gas limit is missing in some transactions"})};let x={title:"Do you approve these transactions?",details:[{title:"Transaction Details",items:[de("Account",c[0].from),Ye("Network",{name:e.chainName,logoUri:e.logoUri}),ze("Website",t.dappInfo)]}],isSimulationSuccessful:v,balanceChange:y,alert:d,tokenApprovals:P,networkFeeSelector:!0},g=b.map(C=>tt(t,e,C.transaction,C)),{cleanup:k,updateTx:G}=lr(t.requestId,g,x),W=await r.requestBatchApproval({request:t,signingRequests:g,displayData:x,updateTx:G});if(k(),"error"in W)return {error:W.error};if(W.result.length!==c.length)return {error:rpcErrors.internal({message:`Invalid number of signatures. Expected ${c.length}, got ${W.result.length}`})};let Ae=[];for(let[C,An]of W.result.entries()){let Wt=C===W.result.length-1,Et=await rt(u,An);if(Wt&&Be({explorerUrl:e.explorerUrl??"",provider:u,txHash:Et,onTransactionPending:r.onTransactionPending,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,request:t}),!Wt&&!p&&!await Be({explorerUrl:e.explorerUrl??"",provider:u,txHash:Et,onTransactionPending:r.onTransactionPending,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,request:t}))return {error:rpcErrors.internal({message:`Transaction ${C+1} failed! Batch execution stopped`})};Ae.push(Et);}return {result:Ae}};function Ar(t,e,r){return new ethers.Contract(t,gr.abi).interface.encodeFunctionData("approve",[e,r])}var it=new Map,Cr=(t,e,r)=>(it.set(t,{signingData:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:a,approvalLimit:o,gasLimit:s})=>{let i=it.get(t);if(!i)throw rpcErrors.resourceNotFound();let{signingData:c,displayData:l}=i,p={...c,data:{...c.data,gasLimit:s??c.data.gasLimit,maxFeePerGas:n??c.data.maxFeePerGas,maxPriorityFeePerGas:a??c.data.maxPriorityFeePerGas}},u={...l};if(typeof o=="string"){if(!o.startsWith("0x"))throw rpcErrors.invalidInput("Expected approvalLimit to be a hexadecimal number (0x-prefixed)");let d=l.tokenApprovals;Ia(d),Aa(c.data.data);let y=d.approvals[0];p.data.data=Ar(y.token.address,y.spenderAddress,o),u.tokenApprovals={approvals:[{...y,value:o}],isEditable:!0};}let f={signingData:p,displayData:u};return it.set(t,f),f},cleanup:()=>it.delete(t)});function Ia(t){if(!t||!t.isEditable||t.approvals.length!==1)throw rpcErrors.invalidInput("Cannot edit the token approval for this request. Please start a new request instead.")}function Aa(t){if((!t||t==="0x"?null:et({data:t??void 0}))!=="approve")throw rpcErrors.invalidInput("Cannot change invoked method for requests in progress. Please start a new request instead.")}var wr=async({transactionParams:{from:t,to:e,data:r,value:n,accessList:a},provider:o})=>{let s=await o.getTransactionCount(t);return Number(await o.estimateGas({from:t,to:e,nonce:s,data:r,value:n,accessList:a}))};var wa=z$1.tuple([fe]),_r=t=>wa.safeParse(t);var Nr=async({request:t,network:e,approvalController:r,blockaid:n})=>{let{params:a}=t,{data:o,error:s,success:i}=_r(a);if(!i)return console.error("invalid params",s),{error:rpcErrors.invalidParams(F("Transaction params are invalid",s))};let[c]=o,l=await N({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});if(!c.gas||Number(c.gas)<0)try{let S=await wr({transactionParams:{from:c.from,to:c.to,data:c.data,value:c.value,accessList:c.accessList},provider:l});c.gas="0x"+S.toString(16);}catch(S){return {error:rpcErrors.internal(F("Unable to calculate gas limit",S))}}if(!c.nonce)try{let S=await Qe({from:c.from,provider:l});c.nonce=String(S);}catch(S){return {error:rpcErrors.internal(F("Unable to calculate nonce",S))}}let p=await vr({rpcMethod:t.method,chainId:e.chainId,params:c,dAppUrl:t.dappInfo.url,provider:l,blockaid:n}),{displayData:u,signingData:f}=tt(t,e,c,p),{updateTx:d,cleanup:y}=Cr(t.requestId,f,u),v=await r.requestApproval({request:t,displayData:u,signingData:f,updateTx:d});if(y(),"error"in v)return {error:v.error};let P,b=t.context?.shouldRetry===!0;try{P=await rt(l,v,{shouldRetry:b});}catch(S){return {error:rpcErrors.internal(F("Unable to get transaction hash",S))}}return Be({explorerUrl:e.explorerUrl??"",provider:l,txHash:P,onTransactionPending:r.onTransactionPending,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,request:t}),{result:P}};var _t=t=>{let e="";e+=`Domain
17
17
  `;for(let r in t.domain)e+=` ${r}: ${se(String(t.domain[r]))}
18
18
  `;e+=`
19
19
  Message