@avalabs/evm-module 1.2.1 → 1.3.0
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.cjs +13 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.js
CHANGED
|
@@ -4,16 +4,17 @@ import { rpcErrors } from '@metamask/rpc-errors';
|
|
|
4
4
|
import { JsonRpcBatchInternal, getEvmAddressFromPubKey, getAddressFromXPub } from '@avalabs/core-wallets-sdk';
|
|
5
5
|
import { Network, toUtf8String, isHexString, TypedDataEncoder, Interface, ethers } from 'ethers';
|
|
6
6
|
import { TokenUnit, numberToBN, balanceToDisplayValue, ipfsResolver } from '@avalabs/core-utils-sdk';
|
|
7
|
+
import { ChainId } from '@avalabs/core-chains-sdk';
|
|
7
8
|
import { getNormalTxs, getErc20Txs } from '@avalabs/core-etherscan-sdk';
|
|
8
|
-
import
|
|
9
|
-
import
|
|
9
|
+
import pn from 'lodash.startcase';
|
|
10
|
+
import jt from '@openzeppelin/contracts/build/contracts/ERC20.json';
|
|
10
11
|
import Qe from '@blockaid/client';
|
|
11
|
-
import
|
|
12
|
+
import $t from 'xss';
|
|
12
13
|
import { z as z$1, object, string, record, number } from 'zod';
|
|
13
14
|
import { Glacier, Erc1155Token, Erc721Token } from '@avalabs/glacier-sdk';
|
|
14
15
|
import { getBasicCoingeckoHttp, VsCurrencyType, simpleTokenPrice, simplePrice } from '@avalabs/core-coingecko-sdk';
|
|
15
16
|
|
|
16
|
-
async function Re({chainId:t,proxyApiUrl:e}){let r=await fetch(`${e}/tokens?evmChainId=${t}`);if(!r.ok)throw rpcErrors.internal(`Failed to fetch tokens for chainId ${t}`);return r.json()}var zr=process.env.GLACIER_API_KEY,x=async t=>{let{chainId:e,chainName:r,rpcUrl:n,multiContractAddress:s,pollingInterval:a=2e3}=t,o=new JsonRpcBatchInternal({maxCalls:40,multiContractAddress:s},Xr(n,zr),new Network(r,e));return o.pollingInterval=a,o},Kr=["glacier-api.avax.network","proxy-api.avax.network"];function Xr(t,e){let r=new URL(t);if(e&&Kr.includes(r.hostname)){let n=r.searchParams;return n.set("token",e),r.search=n.toString(),r.toString()}return t}var Je={LOW:1n,MEDIUM:4n,HIGH:6n},Ye=500000000n;async function ft({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n,caipId:s,proxyApiUrl:a}){let o=await x({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n});if(!a)throw rpcErrors.internal("Proxy API URL is needed");let c=await o.getBlock("latest",!1);if(!c)throw rpcErrors.internal("There is no block");let i=c.baseFeePerGas;if(!i)throw rpcErrors.internal("Pre-EIP-1559 networks are not supported");let l=await Zr(a,s),p=new TokenUnit(l,0,""),m=new TokenUnit(i,0,""),u=BigInt("1000000000"),d=m.mul(p).add(u).toSubUnit(),h=Ye*Je.LOW,y=Ye*Je.MEDIUM,v=Ye*Je.HIGH;return {baseFee:d,low:{maxFeePerGas:d+h,maxPriorityFeePerGas:h},medium:{maxFeePerGas:d+y,maxPriorityFeePerGas:y},high:{maxFeePerGas:d+v,maxPriorityFeePerGas:v},isFixedFee:!1,displayDecimals:9}}async function Zr(t,e){if(!e)return 1.5;try{let n=await fetch(`${t}/gas/multiplier`);if(!n.ok)throw new Error(n.statusText);let s=await n.json();return s[e]??s.default}catch{return 1.5}}function j(t,e,r="tx"){return `${t}/${r}/${e}`}var ht=({tx:t,networkToken:e,chainId:r,explorerUrl:n,address:s})=>{let a=t.from.toLowerCase()===s.toLowerCase(),o=parseInt(t.timeStamp)*1e3,c=e.decimals,l=new TokenUnit(t.value,e.decimals,e.symbol).toDisplay(),p=a?TransactionType.SEND:TransactionType.RECEIVE,{from:m,to:u,gasPrice:d,gasUsed:h,hash:y}=t,v=j(n,y);return {isIncoming:!a,isOutgoing:a,isContractCall:tn(t),timestamp:o,hash:y,isSender:a,from:m,to:u,tokens:[{decimal:c.toString(),name:e.name,symbol:e.symbol,amount:l,type:TokenType.NATIVE}],gasUsed:h,gasPrice:d,chainId:r.toString(),txType:p,explorerLink:v}};function tn(t){return t.input!=="0x"}function Tt({tx:t,address:e,explorerUrl:r,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),a=parseInt(t.timeStamp)*1e3,c=new TokenUnit(t.value,Number(t.tokenDecimal),t.tokenSymbol).toDisplay(),{from:i,to:l,gasPrice:p,gasUsed:m,hash:u,tokenDecimal:d,tokenName:h,tokenSymbol:y}=t,v=s?TransactionType.SEND:TransactionType.RECEIVE,E=j(r,u);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:a,hash:u,isSender:s,from:i,to:l,tokens:[{decimal:d,name:h,symbol:y,type:TokenType.ERC20,amount:c}],gasUsed:m,gasPrice:p,chainId:n.toString(),txType:v,explorerLink:E}}var kt=async({isTestnet:t,networkToken:e,explorerUrl:r,chainId:n,address:s,nextPageToken:a,offset:o})=>{let c=a?JSON.parse(a):void 0,i=c?.page||1,l=c?.queries||["normal","erc20"],p=(l.includes("normal")?await getNormalTxs(s,!t,{page:i,offset:o}):[]).map(y=>ht({tx:y,chainId:n,networkToken:e,explorerUrl:r,address:s})),m=(l.includes("erc20")?await getErc20Txs(s,!t,void 0,{page:i,offset:o}):[]).map(y=>Tt({tx:y,address:s,explorerUrl:r,chainId:n})),u=m.map(y=>y.hash),d=p.filter(y=>!u.includes(y.hash)),h={queries:[],page:i+1};return p.length&&h.queries.push("normal"),m.length&&h.queries.push("erc20"),{transactions:[...d,...m],nextPageToken:h.queries.length?JSON.stringify(h):""}};var vt=t=>t===1||t===5||t===4||t===11155111;var Rt=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s,a)=>{let o=!e&&!r&&!n,c=cn(t.method?.methodName),i=s.toLowerCase(),l=c.toLowerCase().includes("swap"),p=o&&t.from.address.toLowerCase()===i,m=o&&t.to.address.toLowerCase()===i,u=c==="Market Buy Orders With Eth"||c==="Buy NFT",d=c==="Approve",h=c.toLowerCase().includes("transfer"),y=c.toLowerCase().includes("airdrop"),v=c.toLowerCase().includes("unwrap"),E=c==="Fill Order",T=!!a[0]&&bt(a[0].type)&&a[0].from?.address.toLowerCase()===i,k=!!a[0]&&bt(a[0].type)&&a[0].to?.address.toLowerCase()===i;return l?TransactionType.SWAP:p?TransactionType.SEND:m?TransactionType.RECEIVE:u?TransactionType.NFT_BUY:d?TransactionType.APPROVE:T?TransactionType.NFT_SEND:k?TransactionType.NFT_RECEIVE:h?TransactionType.TRANSFER:y?TransactionType.AIRDROP:v?TransactionType.UNWRAP:E?TransactionType.FILL_ORDER:TransactionType.UNKNOWN};function bt(t){return t===TokenType.ERC721||t===TokenType.ERC1155}var cn=(t="")=>t.includes("(")?sn(t.split("(",1)[0]):t;var St=(t,{nativeTransaction:e,erc20Transfers:r,erc721Transfers:n},s)=>{let a=t===TransactionType.TRANSFER,o=t===TransactionType.SEND,c=t===TransactionType.RECEIVE,i=e?.from?.address,l=e?.to?.address;a&&r&&r[0]&&(i=r[0].from.address,l=r[0].to.address),a&&n&&n[0]&&(i=n[0].from.address,l=n[0].to.address);let p=o||a&&i.toLowerCase()===s.toLowerCase(),m=c||a&&l.toLowerCase()===s.toLowerCase();return {isOutgoing:p,isIncoming:m,isSender:i===s,from:i,to:l}};async function It(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var pn="https://ipfs.io";function q(t,e=pn){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}async function mn(t,e=5e3){let r=new AbortController;return setTimeout(()=>r.abort(),e),fetch(t,{signal:r.signal})}async function Pt(t){let e={};if(t)if(t.startsWith("data:application/json;base64,")){let r=t.substring(29);try{let n=Buffer.from(r,"base64").toString();e=JSON.parse(n);}catch{e={};}}else e=await mn(q(t)).then(r=>r.json()).catch(()=>({}));else return {};return e}var dn="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function xt(t,e="256"){let r=q(t);return `${dn}/width=${e},fit/${r}`}var Ct=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s)=>{let a=[];if(t.value!=="0"){let o=s.decimals,i=new TokenUnit(t.value,s.decimals,s.symbol).toDisplay();a.push({decimal:o.toString(),name:s.name,symbol:s.symbol,amount:i,from:t.from,to:t.to,type:TokenType.NATIVE});}return e?.forEach(o=>{let c=o.erc20Token.decimals,l=new TokenUnit(o.value,c,o.erc20Token.symbol).toDisplay();a.push({decimal:c.toString(),name:o.erc20Token.name,symbol:o.erc20Token.symbol,amount:l,from:o.from,to:o.to,imageUri:o.erc20Token.logoUri,type:TokenType.ERC20});}),r&&await Promise.allSettled(r.map(async o=>{let c=o.erc721Token,i=await wt(c.tokenUri,c.metadata.imageUri);a.push({name:o.erc721Token.name,symbol:o.erc721Token.symbol,amount:"1",imageUri:i,from:o.from,to:o.to,collectableTokenId:o.erc721Token.tokenId,type:TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async o=>{let c=o.erc1155Token,i=await wt(c.tokenUri,c.metadata.imageUri);a.push({name:o.erc1155Token.metadata.name??"",symbol:o.erc1155Token.metadata.symbol??"",amount:o.value,imageUri:i,from:o.from,to:o.to,collectableTokenId:o.erc1155Token.tokenId,type:TokenType.ERC1155});})),a},wt=async(t,e)=>{if(e)return e.startsWith("ipfs://")?q(e):e;{let[r,n]=await It(Pt(t));return n?"":r.image?xt(r.image):""}};var Nt=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER],H=(o=>(o.TOTAL_SUPPLY="totalSupply",o.BALANCE_OF="balanceOf",o.TRANSFER="transfer",o.TRANSFER_FROM="transferFrom",o.APPROVE="approve",o.ALLOWANCE="allowance",o))(H||{});var _t=async({transactions:t,explorerUrl:e,networkToken:r,chainId:n,address:s})=>{let a=await Ct(t,r),o=Rt(t,s,a),{isOutgoing:c,isIncoming:i,isSender:l,from:p,to:m}=St(o,t,s),{blockTimestamp:u,txHash:d,gasPrice:h,gasUsed:y}=t.nativeTransaction,v=j(e,d);return {isContractCall:!Nt.includes(o),isIncoming:i,isOutgoing:c,isSender:l,timestamp:u*1e3,hash:d,from:p,to:m,tokens:a,gasPrice:h,gasUsed:y,chainId:n.toString(),txType:o,explorerLink:v}};var Bt=async({chainId:t,explorerUrl:e,networkToken:r,address:n,nextPageToken:s,offset:a,glacierService:o})=>{try{let c=await o.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:a});return {transactions:(await Promise.all(c.transactions.filter(p=>p.nativeTransaction.txStatus==="1").map(p=>_t({transactions:p,explorerUrl:e,networkToken:r,chainId:t,address:n}).then(m=>m)))).filter(p=>p.tokens.find(m=>Number(m.amount)!==0)),nextPageToken:c.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var Dt=async({chainId:t,isTestnet:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:a,offset:o,glacierService:c})=>vt(t)?kt({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o}):c.isHealthy()?Bt({networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o,glacierService:c}):{transactions:[],nextPageToken:""};var Ut={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 Ie=async({from:t,provider:e})=>e.getTransactionCount(t);var Pe=t=>{if(t.data)try{let r=new Interface(Wt.abi).parseTransaction({data:t.data,value:t.value}),n=r?.name??r?.fragment?.name;return n&&hn(n)?n:void 0}catch{return}};function hn(t){return Object.values(H).includes(t)}function Gt(t,e,r){return new ethers.Contract(t,Wt.abi).interface.encodeFunctionData("approve",[e,r])}var xe=new Map,Ft=(t,e,r)=>(xe.set(t,{signingData:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:s,approvalLimit:a})=>{let o=xe.get(t);if(!o)throw rpcErrors.resourceNotFound();let{signingData:c,displayData:i}=o,l={...c,data:{...c.data,maxFeePerGas:n??c.data.maxFeePerGas,maxPriorityFeePerGas:s??c.data.maxPriorityFeePerGas}},p={...i};if(typeof a=="string"){if(!a.startsWith("0x"))throw rpcErrors.invalidInput("Expected approvalLimit to be a hexadecimal number (0x-prefixed)");let u=i.tokenApprovals;kn(u),vn(c.data.data);let d=u.approvals[0];l.data.data=Gt(d.token.address,d.spenderAddress,a),p.tokenApprovals={approvals:[{...d,value:a}],isEditable:!0};}let m={signingData:l,displayData:p};return xe.set(t,m),m},cleanup:()=>xe.delete(t)});function kn(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 vn(t){if((!t||t==="0x"?null:Pe({data:t??void 0}))!=="approve")throw rpcErrors.invalidInput("Cannot change invoked method for requests in progress. Please start a new request instead.")}var Mt=async({transactionParams:{from:t,to:e,data:r,value:n},provider:s})=>{let a=await s.getTransactionCount(t);return Number(await s.estimateGas({from:t,to:e,nonce:a,data:r,value:n}))};var Xe=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),Ce=(t,e)=>({label:t,value:e,type:DetailItemType.LINK}),J=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e});var Ze=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});var Ne=(t,e,r,{isSimulationSuccessful:n,balanceChange:s,tokenApprovals:a,alert:o})=>{let{dappInfo:c}=t,i=Pe(r),l="Approve Transaction";i==="approve"&&(l="Token Spend Approval");let p=[Ce("Website",c),J("From",r.from)];r.to&&p.push(J("To",r.to)),i&&p.push(Xe("Type",i)),r.data&&p.push(Ze("Data",r.data));let m={title:l,network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:[{title:"Transaction Details",items:p}],networkFeeSelector:!0,alert:o,balanceChange:s,tokenApprovals:a,isSimulationSuccessful:n},u={type:RpcMethod.ETH_SEND_TRANSACTION,account:r.from,data:{type:2,nonce:Number(r.nonce),gasLimit:Number(r.gas),to:r.to,from:r.from,data:r.data,value:r.value,chainId:r.chainId??e.chainId}};return {displayData:m,signingData:u}};var et="DUMMY_API_KEY",Vt=async({proxyApiUrl:t,chainId:e,params:r,domain:n,withGasEstimation:s})=>{let a=new Qe({baseURL:t+"/proxy/blockaid/",apiKey:et}),o=["validation","simulation"];return s&&o.push("gas_estimation"),a.evm.transactionBulk.scan({chain:e.toString(),options:o,data:r,metadata:n&&n.length>0?{domain:n}:{non_dapp:!0}})},Lt=async({proxyApiUrl:t,chainId:e,params:r,domain:n})=>new Qe({baseURL:t+"/proxy/blockaid/",apiKey:et}).evm.transaction.scan({account_address:r.from,chain:e.toString(),options:["validation","simulation"],data:{from:r.from,to:r.to,data:r.data,value:r.value,gas:r.gas,gas_price:r.gasPrice},metadata:n&&n.length>0?{domain:n}:{non_dapp:!0}}),Ht=async({proxyApiUrl:t,chainId:e,accountAddress:r,data:n,domain:s})=>new Qe({baseURL:t+"/proxy/blockaid/",apiKey:et}).evm.jsonRpc.scan({chain:e.toString(),options:["validation","simulation"],account_address:r,data:n,metadata:s&&s.length>0?{domain:s}:{non_dapp:!0}});var jt=async(t,e,r)=>{if(!t.data)return {tokenApprovals:void 0,balanceChange:void 0};try{let n=new ethers.Contract(t.to,Wt.abi,r),s=await Promise.all([n.name?.(),n.symbol?.(),n.decimals?.()]),a=Ot(s[0]),o=Ot(s[1]),c=parseInt(s[2]),i={type:TokenType.ERC20,name:a,chainId:e,symbol:o,decimals:c,address:t.to,contractType:"ERC-20"},l=new ethers.Interface(Wt.abi),p=l.getFunction(t.data.slice(0,10)),m=l.decodeFunctionData(t.data.slice(0,10),t.data);if(p?.name==="transfer")return {balanceChange:{outs:[{items:[{displayValue:new TokenUnit(m.amount,i.decimals,i.symbol).toDisplay(),usdPrice:void 0}],token:i}],ins:[]}};if(p?.name==="approve")return {tokenApprovals:{isEditable:!0,approvals:[{token:i,spenderAddress:m.spender,value:m.amount}]}}}catch(n){console.error("parseErc20Tx error",n);}return {tokenApprovals:void 0,balanceChange:void 0}};function O(t){return !("type"in t)}function _e(t){return t.type===TokenType.ERC20}function qt(t){return typeof t.to=="string"}function Jt(t){return "requestBatchApproval"in t&&typeof t.requestBatchApproval=="function"}function In(t){return typeof t=="object"&&t!==null&&"ins"in t&&"outs"in t&&Array.isArray(t.ins)&&Array.isArray(t.outs)}function Pn(t){return typeof t=="object"&&t!==null&&"approvals"in t&&"isEditable"in t&&Array.isArray(t.approvals)}function tt(t){return In(t)?t.ins.length===0&&t.outs.length===0:Pn(t)?t.approvals.length===0:!1}var U={[AlertType.WARNING]:{type:AlertType.WARNING,details:{title:"Suspicious Transaction",description:"Use caution, this transaction may be malicious."}},[AlertType.DANGER]:{type:AlertType.DANGER,details:{title:"Scam Transaction",description:"This transaction is malicious, do not proceed.",actionTitles:{reject:"Reject Transaction",proceed:"Proceed Anyway"}}}};var zt=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,provider:s,proxyApiUrl:a})=>{let o;try{o=await Lt({proxyApiUrl:a,chainId:n,params:r,domain:e});}catch(c){console.error("simulateTransaction error",c);}return rt({rpcMethod:t,params:r,chainId:n,provider:s,simulationResult:o})},rt=async({rpcMethod:t,params:e,chainId:r,provider:n,simulationResult:s})=>{let a,o,c,i=!1,l;if(s){let{validation:p,simulation:m,gas_estimation:u}=s;!p||p.result_type==="Error"||p.result_type==="Warning"?a=U[AlertType.WARNING]:p.result_type==="Malicious"&&(a=U[AlertType.DANGER]),m?.status==="Success"&&(i=!0,c=Kt(t,m.account_summary.exposures),o=Xt(m.account_summary.assets_diffs)),u?.status==="Success"&&(l=Number(u.estimate));}if(!i&&qt(e)){let p=await jt(e,r,n);o=p.balanceChange,c=p.tokenApprovals;}return {alert:a,balanceChange:o,tokenApprovals:c,isSimulationSuccessful:i,estimatedGasLimit:l}},Kt=(t,e)=>{let r=[];for(let s of e){let a=Zt(s.asset);if(a)for(let[o,c]of Object.entries(s.spenders))if(c.exposure.length===0)r.push({token:a,spenderAddress:o,logoUri:a.logoUri});else for(let i of c.exposure)"raw_value"in i?r.push({token:a,spenderAddress:o,value:i.raw_value,usdPrice:i.usd_price,logoUri:a.logoUri}):r.push({token:a,spenderAddress:o,logoUri:i.logo_url,usdPrice:i.usd_price});}return r.length===0?void 0:{isEditable:r.length===1&&r[0]?.token.type===TokenType.ERC20&&t===RpcMethod.ETH_SEND_TRANSACTION,approvals:r}},Xt=t=>{let e=Yt(t,"in"),r=Yt(t,"out");if(!(e.length===0&&r.length===0))return {ins:e,outs:r}},Yt=(t,e)=>t.filter(r=>r[e].length>0).sort((r,n)=>r[e].length-n[e].length).map(r=>{let n=r.asset,s="address"in n?Zt(n):Nn(n);if(!s)return;let a=r[e].map(o=>{let c;if("value"in o&&o.value)if("decimals"in s){let i=numberToBN(o.value,s.decimals);c=balanceToDisplayValue(i,s.decimals);}else isHexString(o.value)&&(c=parseInt(o.value,16).toString());else "type"in s&&s.type===TokenType.ERC721&&(c="1");return c?{displayValue:c,usdPrice:o.usd_price}:void 0}).filter(o=>o!==void 0);return {token:s,items:a}}).filter(r=>r!==void 0),Zt=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},Nn=t=>({name:t.name??"",symbol:t.symbol??"",decimals:t.decimals,description:"",logoUri:t.logo_url}),Qt=async({request:t,dAppUrl:e,accountAddress:r,chainId:n,data:s,proxyApiUrl:a})=>{let o,c,i;try{let{validation:l,simulation:p}=await Ht({proxyApiUrl:a,chainId:n,accountAddress:r,data:s,domain:e});!l||l.result_type==="Error"||l.result_type==="Warning"?o=U[AlertType.WARNING]:l.result_type==="Malicious"&&(o=U[AlertType.DANGER]),p?.status==="Success"&&(i=Kt(t.method,p.account_summary.exposures),c=Xt(p.account_summary.assets_diffs));}catch(l){console.error("processJsonRpcSimulation error",l),o=U[AlertType.WARNING];}return {alert:o,balanceChange:c,tokenApprovals:i}};var z=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())});var Bn=z$1.tuple([z]),er=t=>Bn.safeParse(t);var De=async({provider:t,txHash:e,onTransactionConfirmed:r,onTransactionReverted:n,requestId:s})=>{try{if((await t.waitForTransaction(e))?.status===1)return r(e,s),!0}catch(a){console.error(a);}return n(e,s),!1};var Ue=async(t,e)=>"txHash"in e?e.txHash:await t.send("eth_sendRawTransaction",[e.signedData]);var tr=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:a,error:o,success:c}=er(s);if(!c)return console.error("invalid params",o),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:o}})};let[i]=a,l=await x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});if(!i.gas||Number(i.gas)<0)try{let E=await Mt({transactionParams:{from:i.from,to:i.to,data:i.data,value:i.value},provider:l});i.gas="0x"+E.toString(16);}catch{return {error:rpcErrors.internal("Unable to calculate gas limit")}}if(!i.nonce)try{let E=await Ie({from:i.from,provider:l});i.nonce=String(E);}catch{return {error:rpcErrors.internal("Unable to calculate nonce")}}let p=await zt({rpcMethod:t.method,proxyApiUrl:n,chainId:e.chainId,params:i,dAppUrl:t.dappInfo.url,provider:l}),{displayData:m,signingData:u}=Ne(t,e,i,p),{updateTx:d,cleanup:h}=Ft(t.requestId,u,m),y=await r.requestApproval({request:t,displayData:m,signingData:u,updateTx:d});if(h(),"error"in y)return {error:y.error};let v;try{v=await Ue(l,y);}catch(E){return {error:rpcErrors.internal({message:"Unable to get transaction hash",data:{cause:E}})}}return De({provider:l,txHash:v,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,requestId:t.requestId}),{result:v}};async function rr(t,e){let r=t.map(async(a,o)=>({index:o,result:await e(a)})),s=(await Promise.allSettled(r)).filter(a=>a.status==="fulfilled").map(a=>a).find(a=>a.value.result);return s?t[s.value.index]:void 0}function K(t,e){return t.then(r=>({id:e,status:"fulfilled",value:r})).catch(r=>({id:e,status:"rejected",reason:r}))}async function X(t){return await Promise.allSettled(t).then(e=>e.reduce((r,n)=>{if(n.status==="fulfilled"){let s=n.value;s.status==="fulfilled"?r[s.id]=s.value:r[s.id]={error:s.reason};}return r},{}))}var nt=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=me.exponential()})=>{let s=0,a=0,o;for(;a<r;){a>0&&await Dn(s);try{let i=await t(a);if(e(i))return i}catch(i){o=i;}s=n(a),a++;}let c=o?`Max retry exceeded. ${o}`:"Max retry exceeded.";throw new Error(c)},me=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function Dn(t){return new Promise(e=>setTimeout(e,t))}var at=t=>nt({operation:e=>t(e>0),maxRetries:2,backoffPolicy:me.constant(1),isSuccess:e=>e?.status?.error_code!==429});function nr(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function ot(t){let e,r=0;for(e=0;e<t.length;e++){let n=nr(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function Z(t,e){let r=await fetch(...t);if(!r.ok)throw new Error(`Request failed with status ${r.status}`);let n=await r.json();return e.parse(n)}var de=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return Z([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}simplePriceByContractAddresses(e){let{id:r,...n}=e,s=new URLSearchParams(n);return Z([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${s}`,{method:"POST",headers:{"Content-Type":"application/json"}}],SimplePriceResponseSchema)}};var ar=getBasicCoingeckoHttp(),G,Q,ee=class{constructor({storage:e,proxyApiUrl:r}){c(this,G,void 0);c(this,Q,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(s=>{let a=e[s];n[s]={},r.forEach(o=>{n[s]={[o]:{price:a?.[o],change24:a?.[`${o}_24h_change`],vol24:a?.[`${o}_24h_vol`],marketCap:a?.[`${o}_market_cap`]}};});}),n});d(this,G,e),d(this,Q,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,a=`getSimplePrice-${e?`${ot(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b(this,G)?.get?.(a),n)return n;try{n=await at(o=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:o}));}catch{n=void 0;}return b(this,G)?.set?.(a,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,o=`getPricesWithMarketDataByAddresses-${`${ot(e)}-${r}-${n}`}`;if(s=b(this,G)?.get?.(o),s)return s;try{s=await at(c=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:c}));}catch{s=void 0;}return b(this,G)?.set?.(o,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:s=!1}){return s?new de(b(this,Q)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}):simpleTokenPrice(ar,{assetPlatformId:e,tokenAddresses:r,currencies:[n],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:n=!1,vol24:s=!1,change24:a=!1,lastUpdated:o=!1,useCoingeckoProxy:c=!1,shouldThrow:i=!0}){if(c){let l=await new de(b(this,Q)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:s,include_24hr_change:a,include_last_updated_at:o});return this.transformSimplePriceResponse(l,r)}return simplePrice(ar,{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:a,lastUpdated:o,shouldThrow:i})}};G=new WeakMap,Q=new WeakMap;var Wn="https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json",jn="https://latest.currency-api.pages.dev/v1/currencies/usd.min.json",or=object({date:string(),usd:record(number())}),Fe=async()=>{try{return await Z([Wn],or)}catch{return await Z([jn],or)}};var st=({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 P,re,$,fe,Me=class{constructor({network:e,storage:r,proxyApiUrl:n,customTokens:s}){c(this,P,void 0);c(this,re,void 0);c(this,$,void 0);c(this,fe,void 0);d(this,P,e),d(this,re,r),d(this,$,n),d(this,fe,s);}async isNetworkSupported(){return !0}async getNativeBalance({chainId:e,address:r,currency:n}){let s=await x({chainId:e,chainName:b(this,P).chainName,rpcUrl:b(this,P).rpcUrl,multiContractAddress:b(this,P).utilityAddresses?.multicall}),a=b(this,P).pricingProviders?.coingecko.nativeTokenId,o=b(this,P).networkToken,c=new ee({storage:b(this,re),proxyApiUrl:b(this,$)}),i=a?await c.getSimplePrice({coinIds:[a],currencies:[n]}):{},l=i?.[a??""]?.[n]?.price??void 0,p=i?.[a??""]?.[n]?.marketCap??void 0,m=i?.[a??""]?.[n]?.vol24??void 0,u=i?.[a??""]?.[n]?.change24??void 0,d=await s.getBalance(r),h=new TokenUnit(d,o.decimals,o.symbol),y=l!==void 0?h.mul(l):void 0;return {...o,coingeckoId:a??"",type:TokenType.NATIVE,balance:d,balanceDisplayValue:h.toDisplay(),balanceInCurrency:y?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:y?.toDisplay({fixedDp:2}),priceInCurrency:l,marketCap:p,vol24:m,change24:u}}async listErc20Balances({chainId:e,address:r,currency:n}){let s=await x({chainId:e,chainName:b(this,P).chainName,rpcUrl:b(this,P).rpcUrl,multiContractAddress:b(this,P).utilityAddresses?.multicall}),a=b(this,P).pricingProviders?.coingecko.assetPlatformId,o=b(this,P).pricingProviders?.coingecko.nativeTokenId,c=await Re({chainId:Number(e),proxyApiUrl:b(this,$)}),i=c.map(E=>E.address),l=[...c,...b(this,fe)].filter(_e),p=async E=>{let S=await new ethers.Contract(E.address,Wt.abi,s).balanceOf?.(r)||0n;return {...E,balance:S}},m=l.map(E=>K(p(E),E.address)),u=await X(m),d=new ee({storage:b(this,re),proxyApiUrl:b(this,$)}),h=a&&await d.getPricesByAddresses(i,a,n)||{},y=Object.keys(u),v={};for(let E=0;E<y.length;E++){let T=y[E];if(T===void 0)continue;let k=u[T];if(k===void 0||"error"in k){v[T]={error:`rpcService:getTokenWithBalance failed: ${k?.error??"unknown error"}`};continue}let S=h?.[o??""]?.[n]?.price??void 0,Ee=h?.[o??""]?.[n]?.marketCap??void 0,I=h?.[o??""]?.[n]?.vol24??void 0,je=h?.[o??""]?.[n]?.change24??void 0,be=new TokenUnit(k.balance,k.decimals,k.symbol),le=S!==void 0?be.mul(S):void 0;v[k.address.toLowerCase()]={...k,type:TokenType.ERC20,balance:k.balance,balanceDisplayValue:be.toDisplay(),balanceInCurrency:le?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:le?.toDisplay({fixedDp:2}),priceInCurrency:S,marketCap:Ee,change24:je,vol24:I,reputation:null};}return v}async listNftBalances(){return {}}};P=new WeakMap,re=new WeakMap,$=new WeakMap,fe=new WeakMap;var cr=async({addresses:t,currency:e,network:r,proxyApiUrl:n,tokenTypes:s=[TokenType.NATIVE,TokenType.ERC20,TokenType.ERC721,TokenType.ERC1155],customTokens:a=[],storage:o,balanceServices:c=[]})=>{let i=r.chainId,l=[...c,new Me({network:r,storage:o,proxyApiUrl:n,customTokens:a})],p=await rr(l,u=>u.isNetworkSupported(r.chainId)),m={};if(p){let u=[],d=[],h=[];t.forEach(T=>{s.includes(TokenType.NATIVE)&&u.push(K(p.getNativeBalance({address:T,currency:e.toUpperCase(),chainId:i}),T)),s.includes(TokenType.ERC20)&&d.push(K(p.listErc20Balances({customTokens:a.filter(_e),currency:e.toUpperCase(),chainId:i,address:T,pageSize:100}),T)),(s.includes(TokenType.ERC721)||s.includes(TokenType.ERC1155))&&h.push(K(p.listNftBalances({chainId:i,address:T}),T));});let y=await X(u),v=await X(d),E=await X(h);Object.keys(y).forEach(T=>{let k=y[T];if(!k||"error"in k){m[T]={error:`getNativeBalance failed: ${k?.error??"unknown error"}`};return}let S=k.symbol;m[T]={[S]:k};}),Object.keys(v).forEach(T=>{let k=v[T];!k||"error"in k&&typeof k.error!="string"?m[T]={...m[T],error:"listErc20Balances failed: unknown error"}:"error"in k&&typeof k.error=="string"?m[T]={...m[T],error:`listErc20Balances failed: ${k.error}`}:m[T]={...m[T],...k};}),Object.keys(E).forEach(T=>{let k=E[T];!k||"error"in k&&typeof k.error!="string"?m[T]={...m[T],error:"listNftBalances failed: unknown error"}:"error"in k&&typeof k.error=="string"?m[T]={...m[T],error:`listNftBalances failed: ${k.error}`}:m[T]={...m[T],...k};});}else t.forEach(u=>{m[u]={error:"unsupported network"};});return m};var Yn={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},zn={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},pr=t=>{switch(t){case Environment.PRODUCTION:return Yn;case Environment.DEV:return zn}};var Xn="https://ipfs.io";function mr(t,e=Xn){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}var Zn="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function dr(t,e="256"){let r=mr(t);return `${Zn}/width=${e},fit/${r}`}var B=class extends Error{constructor(){super(...arguments);a(this,"message","Glacier is unhealthy. Try again later.");}},Ve=class{constructor({glacierApiUrl:e,headers:r}){a(this,"glacierSdk");a(this,"isGlacierHealthy",!0);a(this,"supportedChainIds",[]);a(this,"isHealthy",()=>this.isGlacierHealthy);this.glacierSdk=new Glacier({BASE:e,HEADERS:r}),this.getSupportedChainIds().catch(()=>{});}setGlacierToUnhealthy(){this.isGlacierHealthy=!1,setTimeout(()=>{this.isGlacierHealthy=!0;},5*60*1e3);}async isNetworkSupported(e){return (await this.getSupportedChainIds()).some(n=>n===e.toString())}async getSupportedChainIds(){if(this.supportedChainIds.length)return this.supportedChainIds;try{let e=await this.glacierSdk.evmChains.supportedChains({});return this.supportedChainIds=e.chains.map(r=>r.chainId),this.supportedChainIds}catch{return []}}async reindexNft({address:e,chainId:r,tokenId:n}){try{await this.glacierSdk.nfTs.reindexNft({address:e,chainId:r,tokenId:n});}catch(s){throw s instanceof B&&this.setGlacierToUnhealthy(),s}}async getTokenDetails({address:e,chainId:r,tokenId:n}){try{return this.glacierSdk.nfTs.getTokenDetails({address:e,chainId:r,tokenId:n})}catch(s){throw s instanceof B&&this.setGlacierToUnhealthy(),s}}async getNativeBalance({chainId:e,address:r,currency:n,coingeckoId:s}){try{let o=(await this.glacierSdk.evmBalances.getNativeBalance({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase()})).nativeTokenBalance,c=new TokenUnit(o.balance,o.decimals,o.symbol),i=o.price?.value,l=i!==void 0?c.mul(i):void 0;return {name:o.name,symbol:o.symbol,decimals:o.decimals,type:TokenType.NATIVE,logoUri:o.logoUri,balance:c.toSubUnit(),balanceDisplayValue:c.toDisplay(),balanceInCurrency:l?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:l?.toDisplay({fixedDp:2}),priceInCurrency:i,coingeckoId:s??""}}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}}async listErc721Balances({chainId:e,address:r}){let n,s=[];do try{let a=await this.glacierSdk.evmBalances.listErc721Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...a.erc721TokenBalances),n=a.nextPageToken;}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}while(n);return s}async listErc1155Balances({chainId:e,address:r}){let n,s=[];do try{let a=await this.glacierSdk.evmBalances.listErc1155Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...a.erc1155TokenBalances),n=a.nextPageToken;}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}while(n);return s}async listNftBalances({chainId:e,address:r}){let s=(await Promise.allSettled([this.listErc721Balances({chainId:e.toString(),address:r}),this.listErc1155Balances({chainId:e.toString(),address:r})])).filter(a=>a.status==="fulfilled").flatMap(a=>a.value.map(o=>[`${o.address}-${o.tokenId}`,{address:o.address,description:o.metadata.description??"",logoUri:o.metadata.imageUri??"",logoSmall:dr(o.metadata.imageUri??""),name:o.metadata.name??"",symbol:o.metadata.symbol??"",tokenId:o.tokenId,tokenUri:o.tokenUri,collectionName:"Unkown",balance:o.ercType===Erc1155Token.ercType.ERC_1155?BigInt(o.balance):1,balanceDisplayValue:o.ercType===Erc1155Token.ercType.ERC_1155?o.balance:"1",type:o.ercType===Erc721Token.ercType.ERC_721?TokenType.ERC721:TokenType.ERC1155,metadata:{description:o.metadata.description,lastUpdatedTimestamp:o.metadata.metadataLastUpdatedTimestamp,properties:o.ercType===Erc721Token.ercType.ERC_721?o.metadata.attributes:o.metadata.properties}}]));return Object.fromEntries(s)}async listErc20Balances({chainId:e,address:r,currency:n,customTokens:s}){try{let a=[],o;do{let c=await this.glacierSdk.evmBalances.listErc20Balances({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase(),pageSize:100,pageToken:o});a.push(...ra(c.erc20TokenBalances,Number(e))),o=c.nextPageToken;}while(o);return [...ta(s),...a].reduce((c,i)=>({...c,[i.address.toLowerCase()]:i}),{})}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}}async listTransactions({chainId:e,address:r,pageToken:n,pageSize:s}){try{return this.glacierSdk.evmTransactions.listTransactions({chainId:e,address:r,pageToken:n,pageSize:s})}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}}},ta=t=>t.map(e=>({...e,decimals:e.decimals??18,type:TokenType.ERC20,balance:0n,balanceInCurrency:0,balanceDisplayValue:"0",balanceCurrencyDisplayValue:"0",priceInCurrency:0,marketCap:0,change24:0,vol24:0,reputation:null})),ra=(t,e)=>t.map(r=>{let n=new TokenUnit(r.balance,r.decimals,r.symbol),s=n.toDisplay(),a=r.balanceValue?.value.toString(),o=r.price?.value,c=o!==void 0?n.mul(o).toDisplay({fixedDp:2,asNumber:!0}):void 0;return {chainId:e,address:r.address,name:r.name,symbol:r.symbol,decimals:r.decimals,logoUri:r.logoUri,balance:n.toSubUnit(),balanceCurrencyDisplayValue:a,balanceDisplayValue:s,balanceInCurrency:c,priceInCurrency:o,reputation:r.tokenReputation,type:TokenType.ERC20}});var it=t=>{let e="";e+=`Domain
|
|
17
|
+
async function Re({chainId:t,proxyApiUrl:e}){let r=await fetch(`${e}/tokens?evmChainId=${t}`);if(!r.ok)throw rpcErrors.internal(`Failed to fetch tokens for chainId ${t}`);return r.json()}var Kr=process.env.GLACIER_API_KEY,x=async t=>{let{chainId:e,chainName:r,rpcUrl:n,multiContractAddress:s,pollingInterval:a=2e3}=t,o=new JsonRpcBatchInternal({maxCalls:40,multiContractAddress:s},Zr(n,Kr),new Network(r,e));return o.pollingInterval=a,o},Xr=["glacier-api.avax.network","proxy-api.avax.network"];function Zr(t,e){let r=new URL(t);if(e&&Xr.includes(r.hostname)){let n=r.searchParams;return n.set("token",e),r.search=n.toString(),r.toString()}return t}var Je={LOW:1n,MEDIUM:4n,HIGH:6n},Ye=500000000n,Qr=t=>t===ChainId.AVALANCHE_TESTNET_ID||t===ChainId.AVALANCHE_MAINNET_ID;async function yt({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n,caipId:s,proxyApiUrl:a}){let o=await x({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n});if(!a)throw rpcErrors.internal("Proxy API URL is needed");if(Qr(t))try{let E=await en(o);return {...E,baseFee:E.medium.maxFeePerGas,displayDecimals:9,isFixedFee:!1}}catch{console.error("eth_suggestPriceOptions call failed, falling back to legacy fee fetching");}let c=await o.getBlock("latest",!1);if(!c)throw rpcErrors.internal("There is no block");let i=c.baseFeePerGas;if(!i)throw rpcErrors.internal("Pre-EIP-1559 networks are not supported");let l=await tn(a,s),p=new TokenUnit(l,0,""),m=new TokenUnit(i,0,""),u=BigInt("1000000000"),d=m.mul(p).add(u).toSubUnit(),g=Ye*Je.LOW,y=Ye*Je.MEDIUM,v=Ye*Je.HIGH;return {baseFee:d,low:{maxFeePerGas:d+g,maxPriorityFeePerGas:g},medium:{maxFeePerGas:d+y,maxPriorityFeePerGas:y},high:{maxFeePerGas:d+v,maxPriorityFeePerGas:v},isFixedFee:!1,displayDecimals:9}}async function en(t){let e=await t.send("eth_suggestPriceOptions",[]);return {low:{maxFeePerGas:BigInt(e.slow.maxFeePerGas),maxPriorityFeePerGas:BigInt(e.slow.maxPriorityFeePerGas)},medium:{maxFeePerGas:BigInt(e.normal.maxFeePerGas),maxPriorityFeePerGas:BigInt(e.normal.maxPriorityFeePerGas)},high:{maxFeePerGas:BigInt(e.fast.maxFeePerGas),maxPriorityFeePerGas:BigInt(e.fast.maxPriorityFeePerGas)}}}async function tn(t,e){if(!e)return 1.5;try{let n=await fetch(`${t}/gas/multiplier`);if(!n.ok)throw new Error(n.statusText);let s=await n.json();return s[e]??s.default}catch{return 1.5}}function j(t,e,r="tx"){return `${t}/${r}/${e}`}var ht=({tx:t,networkToken:e,chainId:r,explorerUrl:n,address:s})=>{let a=t.from.toLowerCase()===s.toLowerCase(),o=parseInt(t.timeStamp)*1e3,c=e.decimals,l=new TokenUnit(t.value,e.decimals,e.symbol).toDisplay(),p=a?TransactionType.SEND:TransactionType.RECEIVE,{from:m,to:u,gasPrice:d,gasUsed:g,hash:y}=t,v=j(n,y);return {isIncoming:!a,isOutgoing:a,isContractCall:an(t),timestamp:o,hash:y,isSender:a,from:m,to:u,tokens:[{decimal:c.toString(),name:e.name,symbol:e.symbol,amount:l,type:TokenType.NATIVE}],gasUsed:g,gasPrice:d,chainId:r.toString(),txType:p,explorerLink:v}};function an(t){return t.input!=="0x"}function kt({tx:t,address:e,explorerUrl:r,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),a=parseInt(t.timeStamp)*1e3,c=new TokenUnit(t.value,Number(t.tokenDecimal),t.tokenSymbol).toDisplay(),{from:i,to:l,gasPrice:p,gasUsed:m,hash:u,tokenDecimal:d,tokenName:g,tokenSymbol:y}=t,v=s?TransactionType.SEND:TransactionType.RECEIVE,E=j(r,u);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:a,hash:u,isSender:s,from:i,to:l,tokens:[{decimal:d,name:g,symbol:y,type:TokenType.ERC20,amount:c}],gasUsed:m,gasPrice:p,chainId:n.toString(),txType:v,explorerLink:E}}var Et=async({isTestnet:t,networkToken:e,explorerUrl:r,chainId:n,address:s,nextPageToken:a,offset:o})=>{let c=a?JSON.parse(a):void 0,i=c?.page||1,l=c?.queries||["normal","erc20"],p=(l.includes("normal")?await getNormalTxs(s,!t,{page:i,offset:o}):[]).map(y=>ht({tx:y,chainId:n,networkToken:e,explorerUrl:r,address:s})),m=(l.includes("erc20")?await getErc20Txs(s,!t,void 0,{page:i,offset:o}):[]).map(y=>kt({tx:y,address:s,explorerUrl:r,chainId:n})),u=m.map(y=>y.hash),d=p.filter(y=>!u.includes(y.hash)),g={queries:[],page:i+1};return p.length&&g.queries.push("normal"),m.length&&g.queries.push("erc20"),{transactions:[...d,...m],nextPageToken:g.queries.length?JSON.stringify(g):""}};var vt=t=>t===1||t===5||t===4||t===11155111;var Pt=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s,a)=>{let o=!e&&!r&&!n,c=mn(t.method?.methodName),i=s.toLowerCase(),l=c.toLowerCase().includes("swap"),p=o&&t.from.address.toLowerCase()===i,m=o&&t.to.address.toLowerCase()===i,u=c==="Market Buy Orders With Eth"||c==="Buy NFT",d=c==="Approve",g=c.toLowerCase().includes("transfer"),y=c.toLowerCase().includes("airdrop"),v=c.toLowerCase().includes("unwrap"),E=c==="Fill Order",T=!!a[0]&&Rt(a[0].type)&&a[0].from?.address.toLowerCase()===i,k=!!a[0]&&Rt(a[0].type)&&a[0].to?.address.toLowerCase()===i;return l?TransactionType.SWAP:p?TransactionType.SEND:m?TransactionType.RECEIVE:u?TransactionType.NFT_BUY:d?TransactionType.APPROVE:T?TransactionType.NFT_SEND:k?TransactionType.NFT_RECEIVE:g?TransactionType.TRANSFER:y?TransactionType.AIRDROP:v?TransactionType.UNWRAP:E?TransactionType.FILL_ORDER:TransactionType.UNKNOWN};function Rt(t){return t===TokenType.ERC721||t===TokenType.ERC1155}var mn=(t="")=>t.includes("(")?pn(t.split("(",1)[0]):t;var St=(t,{nativeTransaction:e,erc20Transfers:r,erc721Transfers:n},s)=>{let a=t===TransactionType.TRANSFER,o=t===TransactionType.SEND,c=t===TransactionType.RECEIVE,i=e?.from?.address,l=e?.to?.address;a&&r&&r[0]&&(i=r[0].from.address,l=r[0].to.address),a&&n&&n[0]&&(i=n[0].from.address,l=n[0].to.address);let p=o||a&&i.toLowerCase()===s.toLowerCase(),m=c||a&&l.toLowerCase()===s.toLowerCase();return {isOutgoing:p,isIncoming:m,isSender:i===s,from:i,to:l}};async function It(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var un="https://ipfs.io";function q(t,e=un){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}async function fn(t,e=5e3){let r=new AbortController;return setTimeout(()=>r.abort(),e),fetch(t,{signal:r.signal})}async function xt(t){let e={};if(t)if(t.startsWith("data:application/json;base64,")){let r=t.substring(29);try{let n=Buffer.from(r,"base64").toString();e=JSON.parse(n);}catch{e={};}}else e=await fn(q(t)).then(r=>r.json()).catch(()=>({}));else return {};return e}var yn="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function At(t,e="256"){let r=q(t);return `${yn}/width=${e},fit/${r}`}var Nt=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s)=>{let a=[];if(t.value!=="0"){let o=s.decimals,i=new TokenUnit(t.value,s.decimals,s.symbol).toDisplay();a.push({decimal:o.toString(),name:s.name,symbol:s.symbol,amount:i,from:t.from,to:t.to,type:TokenType.NATIVE});}return e?.forEach(o=>{let c=o.erc20Token.decimals,l=new TokenUnit(o.value,c,o.erc20Token.symbol).toDisplay();a.push({decimal:c.toString(),name:o.erc20Token.name,symbol:o.erc20Token.symbol,amount:l,from:o.from,to:o.to,imageUri:o.erc20Token.logoUri,type:TokenType.ERC20});}),r&&await Promise.allSettled(r.map(async o=>{let c=o.erc721Token,i=await Ct(c.tokenUri,c.metadata.imageUri);a.push({name:o.erc721Token.name,symbol:o.erc721Token.symbol,amount:"1",imageUri:i,from:o.from,to:o.to,collectableTokenId:o.erc721Token.tokenId,type:TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async o=>{let c=o.erc1155Token,i=await Ct(c.tokenUri,c.metadata.imageUri);a.push({name:o.erc1155Token.metadata.name??"",symbol:o.erc1155Token.metadata.symbol??"",amount:o.value,imageUri:i,from:o.from,to:o.to,collectableTokenId:o.erc1155Token.tokenId,type:TokenType.ERC1155});})),a},Ct=async(t,e)=>{if(e)return e.startsWith("ipfs://")?q(e):e;{let[r,n]=await It(xt(t));return n?"":r.image?At(r.image):""}};var _t=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER],H=(o=>(o.TOTAL_SUPPLY="totalSupply",o.BALANCE_OF="balanceOf",o.TRANSFER="transfer",o.TRANSFER_FROM="transferFrom",o.APPROVE="approve",o.ALLOWANCE="allowance",o))(H||{});var Bt=async({transactions:t,explorerUrl:e,networkToken:r,chainId:n,address:s})=>{let a=await Nt(t,r),o=Pt(t,s,a),{isOutgoing:c,isIncoming:i,isSender:l,from:p,to:m}=St(o,t,s),{blockTimestamp:u,txHash:d,gasPrice:g,gasUsed:y}=t.nativeTransaction,v=j(e,d);return {isContractCall:!_t.includes(o),isIncoming:i,isOutgoing:c,isSender:l,timestamp:u*1e3,hash:d,from:p,to:m,tokens:a,gasPrice:g,gasUsed:y,chainId:n.toString(),txType:o,explorerLink:v}};var Dt=async({chainId:t,explorerUrl:e,networkToken:r,address:n,nextPageToken:s,offset:a,glacierService:o})=>{try{let c=await o.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:a});return {transactions:(await Promise.all(c.transactions.filter(p=>p.nativeTransaction.txStatus==="1").map(p=>Bt({transactions:p,explorerUrl:e,networkToken:r,chainId:t,address:n}).then(m=>m)))).filter(p=>p.tokens.find(m=>Number(m.amount)!==0)),nextPageToken:c.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var Ut=async({chainId:t,isTestnet:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:a,offset:o,glacierService:c})=>vt(t)?Et({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o}):c.isHealthy()?Dt({networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o,glacierService:c}):{transactions:[],nextPageToken:""};var Gt={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 Se=async({from:t,provider:e})=>e.getTransactionCount(t);var Ie=t=>{if(t.data)try{let r=new Interface(jt.abi).parseTransaction({data:t.data,value:t.value}),n=r?.name??r?.fragment?.name;return n&&kn(n)?n:void 0}catch{return}};function kn(t){return Object.values(H).includes(t)}function Ft(t,e,r){return new ethers.Contract(t,jt.abi).interface.encodeFunctionData("approve",[e,r])}var xe=new Map,Mt=(t,e,r)=>(xe.set(t,{signingData:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:s,approvalLimit:a})=>{let o=xe.get(t);if(!o)throw rpcErrors.resourceNotFound();let{signingData:c,displayData:i}=o,l={...c,data:{...c.data,maxFeePerGas:n??c.data.maxFeePerGas,maxPriorityFeePerGas:s??c.data.maxPriorityFeePerGas}},p={...i};if(typeof a=="string"){if(!a.startsWith("0x"))throw rpcErrors.invalidInput("Expected approvalLimit to be a hexadecimal number (0x-prefixed)");let u=i.tokenApprovals;bn(u),Rn(c.data.data);let d=u.approvals[0];l.data.data=Ft(d.token.address,d.spenderAddress,a),p.tokenApprovals={approvals:[{...d,value:a}],isEditable:!0};}let m={signingData:l,displayData:p};return xe.set(t,m),m},cleanup:()=>xe.delete(t)});function bn(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 Rn(t){if((!t||t==="0x"?null:Ie({data:t??void 0}))!=="approve")throw rpcErrors.invalidInput("Cannot change invoked method for requests in progress. Please start a new request instead.")}var Vt=async({transactionParams:{from:t,to:e,data:r,value:n},provider:s})=>{let a=await s.getTransactionCount(t);return Number(await s.estimateGas({from:t,to:e,nonce:a,data:r,value:n}))};var Xe=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),Ce=(t,e)=>({label:t,value:e,type:DetailItemType.LINK}),J=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e});var Ze=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});var Ne=(t,e,r,{isSimulationSuccessful:n,balanceChange:s,tokenApprovals:a,alert:o})=>{let{dappInfo:c}=t,i=Ie(r),l="Approve Transaction";i==="approve"&&(l="Token Spend Approval");let p=[Ce("Website",c),J("From",r.from)];r.to&&p.push(J("To",r.to)),i&&p.push(Xe("Type",i)),r.data&&p.push(Ze("Data",r.data));let m={title:l,network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:[{title:"Transaction Details",items:p}],networkFeeSelector:!0,alert:o,balanceChange:s,tokenApprovals:a,isSimulationSuccessful:n},u={type:RpcMethod.ETH_SEND_TRANSACTION,account:r.from,data:{type:2,nonce:Number(r.nonce),gasLimit:Number(r.gas),to:r.to,from:r.from,data:r.data,value:r.value,chainId:r.chainId??e.chainId}};return {displayData:m,signingData:u}};var et="DUMMY_API_KEY",Lt=async({proxyApiUrl:t,chainId:e,params:r,domain:n,withGasEstimation:s})=>{let a=new Qe({baseURL:t+"/proxy/blockaid/",apiKey:et}),o=["validation","simulation"];return s&&o.push("gas_estimation"),a.evm.transactionBulk.scan({chain:e.toString(),options:o,data:r,metadata:n&&n.length>0?{domain:n}:{non_dapp:!0}})},Ht=async({proxyApiUrl:t,chainId:e,params:r,domain:n})=>new Qe({baseURL:t+"/proxy/blockaid/",apiKey:et}).evm.transaction.scan({account_address:r.from,chain:e.toString(),options:["validation","simulation"],data:{from:r.from,to:r.to,data:r.data,value:r.value,gas:r.gas,gas_price:r.gasPrice},metadata:n&&n.length>0?{domain:n}:{non_dapp:!0}}),Ot=async({proxyApiUrl:t,chainId:e,accountAddress:r,data:n,domain:s})=>new Qe({baseURL:t+"/proxy/blockaid/",apiKey:et}).evm.jsonRpc.scan({chain:e.toString(),options:["validation","simulation"],account_address:r,data:n,metadata:s&&s.length>0?{domain:s}:{non_dapp:!0}});var qt=async(t,e,r)=>{if(!t.data)return {tokenApprovals:void 0,balanceChange:void 0};try{let n=new ethers.Contract(t.to,jt.abi,r),s=await Promise.all([n.name?.(),n.symbol?.(),n.decimals?.()]),a=$t(s[0]),o=$t(s[1]),c=parseInt(s[2]),i={type:TokenType.ERC20,name:a,chainId:e,symbol:o,decimals:c,address:t.to,contractType:"ERC-20"},l=new ethers.Interface(jt.abi),p=l.getFunction(t.data.slice(0,10)),m=l.decodeFunctionData(t.data.slice(0,10),t.data);if(p?.name==="transfer")return {balanceChange:{outs:[{items:[{displayValue:new TokenUnit(m.amount,i.decimals,i.symbol).toDisplay(),usdPrice:void 0}],token:i}],ins:[]}};if(p?.name==="approve")return {tokenApprovals:{isEditable:!0,approvals:[{token:i,spenderAddress:m.spender,value:m.amount}]}}}catch(n){console.error("parseErc20Tx error",n);}return {tokenApprovals:void 0,balanceChange:void 0}};function O(t){return !("type"in t)}function _e(t){return t.type===TokenType.ERC20}function Jt(t){return typeof t.to=="string"}function Yt(t){return "requestBatchApproval"in t&&typeof t.requestBatchApproval=="function"}function An(t){return typeof t=="object"&&t!==null&&"ins"in t&&"outs"in t&&Array.isArray(t.ins)&&Array.isArray(t.outs)}function wn(t){return typeof t=="object"&&t!==null&&"approvals"in t&&"isEditable"in t&&Array.isArray(t.approvals)}function tt(t){return An(t)?t.ins.length===0&&t.outs.length===0:wn(t)?t.approvals.length===0:!1}var U={[AlertType.WARNING]:{type:AlertType.WARNING,details:{title:"Suspicious Transaction",description:"Use caution, this transaction may be malicious."}},[AlertType.DANGER]:{type:AlertType.DANGER,details:{title:"Scam Transaction",description:"This transaction is malicious, do not proceed.",actionTitles:{reject:"Reject Transaction",proceed:"Proceed Anyway"}}}};var Kt=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,provider:s,proxyApiUrl:a})=>{let o;try{o=await Ht({proxyApiUrl:a,chainId:n,params:r,domain:e});}catch(c){console.error("simulateTransaction error",c);}return rt({rpcMethod:t,params:r,chainId:n,provider:s,simulationResult:o})},rt=async({rpcMethod:t,params:e,chainId:r,provider:n,simulationResult:s})=>{let a,o,c,i=!1,l;if(s){let{validation:p,simulation:m,gas_estimation:u}=s;!p||p.result_type==="Error"||p.result_type==="Warning"?a=U[AlertType.WARNING]:p.result_type==="Malicious"&&(a=U[AlertType.DANGER]),m?.status==="Success"&&(i=!0,c=Xt(t,m.account_summary.exposures),o=Zt(m.account_summary.assets_diffs)),u?.status==="Success"&&(l=Number(u.estimate));}if(!i&&Jt(e)){let p=await qt(e,r,n);o=p.balanceChange,c=p.tokenApprovals;}return {alert:a,balanceChange:o,tokenApprovals:c,isSimulationSuccessful:i,estimatedGasLimit:l}},Xt=(t,e)=>{let r=[];for(let s of e){let a=Qt(s.asset);if(a)for(let[o,c]of Object.entries(s.spenders))if(c.exposure.length===0)r.push({token:a,spenderAddress:o,logoUri:a.logoUri});else for(let i of c.exposure)"raw_value"in i?r.push({token:a,spenderAddress:o,value:i.raw_value,usdPrice:i.usd_price,logoUri:a.logoUri}):r.push({token:a,spenderAddress:o,logoUri:i.logo_url,usdPrice:i.usd_price});}return r.length===0?void 0:{isEditable:r.length===1&&r[0]?.token.type===TokenType.ERC20&&t===RpcMethod.ETH_SEND_TRANSACTION,approvals:r}},Zt=t=>{let e=zt(t,"in"),r=zt(t,"out");if(!(e.length===0&&r.length===0))return {ins:e,outs:r}},zt=(t,e)=>t.filter(r=>r[e].length>0).sort((r,n)=>r[e].length-n[e].length).map(r=>{let n=r.asset,s="address"in n?Qt(n):Dn(n);if(!s)return;let a=r[e].map(o=>{let c;if("value"in o&&o.value)if("decimals"in s){let i=numberToBN(o.value,s.decimals);c=balanceToDisplayValue(i,s.decimals);}else isHexString(o.value)&&(c=parseInt(o.value,16).toString());else "type"in s&&s.type===TokenType.ERC721&&(c="1");return c?{displayValue:c,usdPrice:o.usd_price}:void 0}).filter(o=>o!==void 0);return {token:s,items:a}}).filter(r=>r!==void 0),Qt=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},Dn=t=>({name:t.name??"",symbol:t.symbol??"",decimals:t.decimals,description:"",logoUri:t.logo_url}),er=async({request:t,dAppUrl:e,accountAddress:r,chainId:n,data:s,proxyApiUrl:a})=>{let o,c,i;try{let{validation:l,simulation:p}=await Ot({proxyApiUrl:a,chainId:n,accountAddress:r,data:s,domain:e});!l||l.result_type==="Error"||l.result_type==="Warning"?o=U[AlertType.WARNING]:l.result_type==="Malicious"&&(o=U[AlertType.DANGER]),p?.status==="Success"&&(i=Xt(t.method,p.account_summary.exposures),c=Zt(p.account_summary.assets_diffs));}catch(l){console.error("processJsonRpcSimulation error",l),o=U[AlertType.WARNING];}return {alert:o,balanceChange:c,tokenApprovals:i}};var z=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())});var Gn=z$1.tuple([z]),tr=t=>Gn.safeParse(t);var De=async({provider:t,txHash:e,onTransactionConfirmed:r,onTransactionReverted:n,requestId:s})=>{try{if((await t.waitForTransaction(e))?.status===1)return r(e,s),!0}catch(a){console.error(a);}return n(e,s),!1};var Ue=async(t,e)=>"txHash"in e?e.txHash:await t.send("eth_sendRawTransaction",[e.signedData]);var rr=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:a,error:o,success:c}=tr(s);if(!c)return console.error("invalid params",o),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:o}})};let[i]=a,l=await x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});if(!i.gas||Number(i.gas)<0)try{let E=await Vt({transactionParams:{from:i.from,to:i.to,data:i.data,value:i.value},provider:l});i.gas="0x"+E.toString(16);}catch{return {error:rpcErrors.internal("Unable to calculate gas limit")}}if(!i.nonce)try{let E=await Se({from:i.from,provider:l});i.nonce=String(E);}catch{return {error:rpcErrors.internal("Unable to calculate nonce")}}let p=await Kt({rpcMethod:t.method,proxyApiUrl:n,chainId:e.chainId,params:i,dAppUrl:t.dappInfo.url,provider:l}),{displayData:m,signingData:u}=Ne(t,e,i,p),{updateTx:d,cleanup:g}=Mt(t.requestId,u,m),y=await r.requestApproval({request:t,displayData:m,signingData:u,updateTx:d});if(g(),"error"in y)return {error:y.error};let v;try{v=await Ue(l,y);}catch(E){return {error:rpcErrors.internal({message:"Unable to get transaction hash",data:{cause:E}})}}return De({provider:l,txHash:v,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,requestId:t.requestId}),{result:v}};async function nr(t,e){let r=t.map(async(a,o)=>({index:o,result:await e(a)})),s=(await Promise.allSettled(r)).filter(a=>a.status==="fulfilled").map(a=>a).find(a=>a.value.result);return s?t[s.value.index]:void 0}function K(t,e){return t.then(r=>({id:e,status:"fulfilled",value:r})).catch(r=>({id:e,status:"rejected",reason:r}))}async function X(t){return await Promise.allSettled(t).then(e=>e.reduce((r,n)=>{if(n.status==="fulfilled"){let s=n.value;s.status==="fulfilled"?r[s.id]=s.value:r[s.id]={error:s.reason};}return r},{}))}var nt=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=me.exponential()})=>{let s=0,a=0,o;for(;a<r;){a>0&&await Fn(s);try{let i=await t(a);if(e(i))return i}catch(i){o=i;}s=n(a),a++;}let c=o?`Max retry exceeded. ${o}`:"Max retry exceeded.";throw new Error(c)},me=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function Fn(t){return new Promise(e=>setTimeout(e,t))}var at=t=>nt({operation:e=>t(e>0),maxRetries:2,backoffPolicy:me.constant(1),isSuccess:e=>e?.status?.error_code!==429});function ar(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function ot(t){let e,r=0;for(e=0;e<t.length;e++){let n=ar(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function Z(t,e){let r=await fetch(...t);if(!r.ok)throw new Error(`Request failed with status ${r.status}`);let n=await r.json();return e.parse(n)}var de=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return Z([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}simplePriceByContractAddresses(e){let{id:r,...n}=e,s=new URLSearchParams(n);return Z([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${s}`,{method:"POST",headers:{"Content-Type":"application/json"}}],SimplePriceResponseSchema)}};var or=getBasicCoingeckoHttp(),G,Q,ee=class{constructor({storage:e,proxyApiUrl:r}){c(this,G,void 0);c(this,Q,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(s=>{let a=e[s];n[s]={},r.forEach(o=>{n[s]={[o]:{price:a?.[o],change24:a?.[`${o}_24h_change`],vol24:a?.[`${o}_24h_vol`],marketCap:a?.[`${o}_market_cap`]}};});}),n});d(this,G,e),d(this,Q,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,a=`getSimplePrice-${e?`${ot(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b(this,G)?.get?.(a),n)return n;try{n=await at(o=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:o}));}catch{n=void 0;}return b(this,G)?.set?.(a,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,o=`getPricesWithMarketDataByAddresses-${`${ot(e)}-${r}-${n}`}`;if(s=b(this,G)?.get?.(o),s)return s;try{s=await at(c=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:c}));}catch{s=void 0;}return b(this,G)?.set?.(o,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:s=!1}){return s?new de(b(this,Q)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}):simpleTokenPrice(or,{assetPlatformId:e,tokenAddresses:r,currencies:[n],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:n=!1,vol24:s=!1,change24:a=!1,lastUpdated:o=!1,useCoingeckoProxy:c=!1,shouldThrow:i=!0}){if(c){let l=await new de(b(this,Q)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:s,include_24hr_change:a,include_last_updated_at:o});return this.transformSimplePriceResponse(l,r)}return simplePrice(or,{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:a,lastUpdated:o,shouldThrow:i})}};G=new WeakMap,Q=new WeakMap;var Jn="https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json",Yn="https://latest.currency-api.pages.dev/v1/currencies/usd.min.json",sr=object({date:string(),usd:record(number())}),Fe=async()=>{try{return await Z([Jn],sr)}catch{return await Z([Yn],sr)}};var st=({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 I,re,$,fe,Me=class{constructor({network:e,storage:r,proxyApiUrl:n,customTokens:s}){c(this,I,void 0);c(this,re,void 0);c(this,$,void 0);c(this,fe,void 0);d(this,I,e),d(this,re,r),d(this,$,n),d(this,fe,s);}async isNetworkSupported(){return !0}async getNativeBalance({chainId:e,address:r,currency:n}){let s=await x({chainId:e,chainName:b(this,I).chainName,rpcUrl:b(this,I).rpcUrl,multiContractAddress:b(this,I).utilityAddresses?.multicall}),a=b(this,I).pricingProviders?.coingecko.nativeTokenId,o=b(this,I).networkToken,c=new ee({storage:b(this,re),proxyApiUrl:b(this,$)}),i=a?await c.getSimplePrice({coinIds:[a],currencies:[n]}):{},l=i?.[a??""]?.[n]?.price??void 0,p=i?.[a??""]?.[n]?.marketCap??void 0,m=i?.[a??""]?.[n]?.vol24??void 0,u=i?.[a??""]?.[n]?.change24??void 0,d=await s.getBalance(r),g=new TokenUnit(d,o.decimals,o.symbol),y=l!==void 0?g.mul(l):void 0;return {...o,coingeckoId:a??"",type:TokenType.NATIVE,balance:d,balanceDisplayValue:g.toDisplay(),balanceInCurrency:y?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:y?.toDisplay({fixedDp:2}),priceInCurrency:l,marketCap:p,vol24:m,change24:u}}async listErc20Balances({chainId:e,address:r,currency:n}){let s=await x({chainId:e,chainName:b(this,I).chainName,rpcUrl:b(this,I).rpcUrl,multiContractAddress:b(this,I).utilityAddresses?.multicall}),a=b(this,I).pricingProviders?.coingecko.assetPlatformId,o=b(this,I).pricingProviders?.coingecko.nativeTokenId,c=await Re({chainId:Number(e),proxyApiUrl:b(this,$)}),i=c.map(E=>E.address),l=[...c,...b(this,fe)].filter(_e),p=async E=>{let P=await new ethers.Contract(E.address,jt.abi,s).balanceOf?.(r)||0n;return {...E,balance:P}},m=l.map(E=>K(p(E),E.address)),u=await X(m),d=new ee({storage:b(this,re),proxyApiUrl:b(this,$)}),g=a&&await d.getPricesByAddresses(i,a,n)||{},y=Object.keys(u),v={};for(let E=0;E<y.length;E++){let T=y[E];if(T===void 0)continue;let k=u[T];if(k===void 0||"error"in k){v[T]={error:`rpcService:getTokenWithBalance failed: ${k?.error??"unknown error"}`};continue}let P=g?.[o??""]?.[n]?.price??void 0,ve=g?.[o??""]?.[n]?.marketCap??void 0,S=g?.[o??""]?.[n]?.vol24??void 0,je=g?.[o??""]?.[n]?.change24??void 0,be=new TokenUnit(k.balance,k.decimals,k.symbol),le=P!==void 0?be.mul(P):void 0;v[k.address.toLowerCase()]={...k,type:TokenType.ERC20,balance:k.balance,balanceDisplayValue:be.toDisplay(),balanceInCurrency:le?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:le?.toDisplay({fixedDp:2}),priceInCurrency:P,marketCap:ve,change24:je,vol24:S,reputation:null};}return v}async listNftBalances(){return {}}};I=new WeakMap,re=new WeakMap,$=new WeakMap,fe=new WeakMap;var lr=async({addresses:t,currency:e,network:r,proxyApiUrl:n,tokenTypes:s=[TokenType.NATIVE,TokenType.ERC20,TokenType.ERC721,TokenType.ERC1155],customTokens:a=[],storage:o,balanceServices:c=[]})=>{let i=r.chainId,l=[...c,new Me({network:r,storage:o,proxyApiUrl:n,customTokens:a})],p=await nr(l,u=>u.isNetworkSupported(r.chainId)),m={};if(p){let u=[],d=[],g=[];t.forEach(T=>{s.includes(TokenType.NATIVE)&&u.push(K(p.getNativeBalance({address:T,currency:e.toUpperCase(),chainId:i}),T)),s.includes(TokenType.ERC20)&&d.push(K(p.listErc20Balances({customTokens:a.filter(_e),currency:e.toUpperCase(),chainId:i,address:T,pageSize:100}),T)),(s.includes(TokenType.ERC721)||s.includes(TokenType.ERC1155))&&g.push(K(p.listNftBalances({chainId:i,address:T}),T));});let y=await X(u),v=await X(d),E=await X(g);Object.keys(y).forEach(T=>{let k=y[T];if(!k||"error"in k){m[T]={error:`getNativeBalance failed: ${k?.error??"unknown error"}`};return}let P=k.symbol;m[T]={[P]:k};}),Object.keys(v).forEach(T=>{let k=v[T];!k||"error"in k&&typeof k.error!="string"?m[T]={...m[T],error:"listErc20Balances failed: unknown error"}:"error"in k&&typeof k.error=="string"?m[T]={...m[T],error:`listErc20Balances failed: ${k.error}`}:m[T]={...m[T],...k};}),Object.keys(E).forEach(T=>{let k=E[T];!k||"error"in k&&typeof k.error!="string"?m[T]={...m[T],error:"listNftBalances failed: unknown error"}:"error"in k&&typeof k.error=="string"?m[T]={...m[T],error:`listNftBalances failed: ${k.error}`}:m[T]={...m[T],...k};});}else t.forEach(u=>{m[u]={error:"unsupported network"};});return m};var Xn={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},Zn={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},mr=t=>{switch(t){case Environment.PRODUCTION:return Xn;case Environment.DEV:return Zn}};var ea="https://ipfs.io";function dr(t,e=ea){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}var ta="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function ur(t,e="256"){let r=dr(t);return `${ta}/width=${e},fit/${r}`}var B=class extends Error{constructor(){super(...arguments);a(this,"message","Glacier is unhealthy. Try again later.");}},Ve=class{constructor({glacierApiUrl:e,headers:r}){a(this,"glacierSdk");a(this,"isGlacierHealthy",!0);a(this,"supportedChainIds",[]);a(this,"isHealthy",()=>this.isGlacierHealthy);this.glacierSdk=new Glacier({BASE:e,HEADERS:r}),this.getSupportedChainIds().catch(()=>{});}setGlacierToUnhealthy(){this.isGlacierHealthy=!1,setTimeout(()=>{this.isGlacierHealthy=!0;},5*60*1e3);}async isNetworkSupported(e){return (await this.getSupportedChainIds()).some(n=>n===e.toString())}async getSupportedChainIds(){if(this.supportedChainIds.length)return this.supportedChainIds;try{let e=await this.glacierSdk.evmChains.supportedChains({});return this.supportedChainIds=e.chains.map(r=>r.chainId),this.supportedChainIds}catch{return []}}async reindexNft({address:e,chainId:r,tokenId:n}){try{await this.glacierSdk.nfTs.reindexNft({address:e,chainId:r,tokenId:n});}catch(s){throw s instanceof B&&this.setGlacierToUnhealthy(),s}}async getTokenDetails({address:e,chainId:r,tokenId:n}){try{return this.glacierSdk.nfTs.getTokenDetails({address:e,chainId:r,tokenId:n})}catch(s){throw s instanceof B&&this.setGlacierToUnhealthy(),s}}async getNativeBalance({chainId:e,address:r,currency:n,coingeckoId:s}){try{let o=(await this.glacierSdk.evmBalances.getNativeBalance({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase()})).nativeTokenBalance,c=new TokenUnit(o.balance,o.decimals,o.symbol),i=o.price?.value,l=i!==void 0?c.mul(i):void 0;return {name:o.name,symbol:o.symbol,decimals:o.decimals,type:TokenType.NATIVE,logoUri:o.logoUri,balance:c.toSubUnit(),balanceDisplayValue:c.toDisplay(),balanceInCurrency:l?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:l?.toDisplay({fixedDp:2}),priceInCurrency:i,coingeckoId:s??""}}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}}async listErc721Balances({chainId:e,address:r}){let n,s=[];do try{let a=await this.glacierSdk.evmBalances.listErc721Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...a.erc721TokenBalances),n=a.nextPageToken;}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}while(n);return s}async listErc1155Balances({chainId:e,address:r}){let n,s=[];do try{let a=await this.glacierSdk.evmBalances.listErc1155Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...a.erc1155TokenBalances),n=a.nextPageToken;}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}while(n);return s}async listNftBalances({chainId:e,address:r}){let s=(await Promise.allSettled([this.listErc721Balances({chainId:e.toString(),address:r}),this.listErc1155Balances({chainId:e.toString(),address:r})])).filter(a=>a.status==="fulfilled").flatMap(a=>a.value.map(o=>[`${o.address}-${o.tokenId}`,{address:o.address,description:o.metadata.description??"",logoUri:o.metadata.imageUri??"",logoSmall:ur(o.metadata.imageUri??""),name:o.metadata.name??"",symbol:o.metadata.symbol??"",tokenId:o.tokenId,tokenUri:o.tokenUri,collectionName:"Unkown",balance:o.ercType===Erc1155Token.ercType.ERC_1155?BigInt(o.balance):1,balanceDisplayValue:o.ercType===Erc1155Token.ercType.ERC_1155?o.balance:"1",type:o.ercType===Erc721Token.ercType.ERC_721?TokenType.ERC721:TokenType.ERC1155,metadata:{description:o.metadata.description,lastUpdatedTimestamp:o.metadata.metadataLastUpdatedTimestamp,properties:o.ercType===Erc721Token.ercType.ERC_721?o.metadata.attributes:o.metadata.properties}}]));return Object.fromEntries(s)}async listErc20Balances({chainId:e,address:r,currency:n,customTokens:s}){try{let a=[],o;do{let c=await this.glacierSdk.evmBalances.listErc20Balances({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase(),pageSize:100,pageToken:o});a.push(...oa(c.erc20TokenBalances,Number(e))),o=c.nextPageToken;}while(o);return [...aa(s),...a].reduce((c,i)=>({...c,[i.address.toLowerCase()]:i}),{})}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}}async listTransactions({chainId:e,address:r,pageToken:n,pageSize:s}){try{return this.glacierSdk.evmTransactions.listTransactions({chainId:e,address:r,pageToken:n,pageSize:s})}catch(a){throw a instanceof B&&this.setGlacierToUnhealthy(),a}}},aa=t=>t.map(e=>({...e,decimals:e.decimals??18,type:TokenType.ERC20,balance:0n,balanceInCurrency:0,balanceDisplayValue:"0",balanceCurrencyDisplayValue:"0",priceInCurrency:0,marketCap:0,change24:0,vol24:0,reputation:null})),oa=(t,e)=>t.map(r=>{let n=new TokenUnit(r.balance,r.decimals,r.symbol),s=n.toDisplay(),a=r.balanceValue?.value.toString(),o=r.price?.value,c=o!==void 0?n.mul(o).toDisplay({fixedDp:2,asNumber:!0}):void 0;return {chainId:e,address:r.address,name:r.name,symbol:r.symbol,decimals:r.decimals,logoUri:r.logoUri,balance:n.toSubUnit(),balanceCurrencyDisplayValue:a,balanceDisplayValue:s,balanceInCurrency:c,priceInCurrency:o,reputation:r.tokenReputation,type:TokenType.ERC20}});var it=t=>{let e="";e+=`Domain
|
|
17
18
|
`;for(let r in t.domain)e+=` ${r}: ${W(String(t.domain[r]))}
|
|
18
19
|
`;e+=`
|
|
19
20
|
Message
|
|
@@ -30,8 +31,8 @@ Message
|
|
|
30
31
|
`;return e},hr=t=>{let e="";return t.forEach(r=>{e+=`${r.name}:
|
|
31
32
|
`,e+=`${W(String(r.value))}
|
|
32
33
|
|
|
33
|
-
`;}),e},W=t=>{let e={0:"\u{1D7EC}",1:"\u{1D7ED}",2:"\u{1D7EE}",3:"\u{1D7EF}",4:"\u{1D7F0}",5:"\u{1D7F1}",6:"\u{1D7F2}",7:"\u{1D7F3}",8:"\u{1D7F4}",9:"\u{1D7F5}",a:"\u{1D5EE}",b:"\u{1D5EF}",c:"\u{1D5F0}",d:"\u{1D5F1}",e:"\u{1D5F2}",f:"\u{1D5F3}",g:"\u{1D5F4}",h:"\u{1D5F5}",i:"\u{1D5F6}",j:"\u{1D5F7}",k:"\u{1D5F8}",l:"\u{1D5F9}",m:"\u{1D5FA}",n:"\u{1D5FB}",o:"\u{1D5FC}",p:"\u{1D5FD}",q:"\u{1D5FE}",r:"\u{1D5FF}",s:"\u{1D600}",t:"\u{1D601}",u:"\u{1D602}",v:"\u{1D603}",w:"\u{1D604}",x:"\u{1D605}",y:"\u{1D606}",z:"\u{1D607}",A:"\u{1D5D4}",B:"\u{1D5D5}",C:"\u{1D5D6}",D:"\u{1D5D7}",E:"\u{1D5D8}",F:"\u{1D5D9}",G:"\u{1D5DA}",H:"\u{1D5DB}",I:"\u{1D5DC}",J:"\u{1D5DD}",K:"\u{1D5DE}",L:"\u{1D5DF}",M:"\u{1D5E0}",N:"\u{1D5E1}",O:"\u{1D5E2}",P:"\u{1D5E3}",Q:"\u{1D5E4}",R:"\u{1D5E5}",S:"\u{1D5E6}",T:"\u{1D5E7}",U:"\u{1D5E8}",V:"\u{1D5E9}",W:"\u{1D5EA}",X:"\u{1D5EB}",Y:"\u{1D5EC}",Z:"\u{1D5ED}"};return t.split("").map(r=>e[r]||r).join("")};var he=z$1.string().describe("message"),N=z$1.string().describe("address");var Tr=z$1.object({method:z$1.literal(RpcMethod.ETH_SIGN),params:z$1.tuple([N,he])});var kr=z$1.object({name:z$1.string(),type:z$1.string()}),ne=z$1.object({types:z$1.object({EIP712Domain:z$1.array(kr)}).catchall(z$1.array(kr)),primaryType:z$1.string(),domain:z$1.record(z$1.any()),message:z$1.record(z$1.any())}),lt=z$1.array(z$1.object({type:z$1.string(),name:z$1.string(),value:z$1.union([z$1.string(),z$1.number(),z$1.boolean(),z$1.object({}).passthrough(),z$1.array(z$1.unknown()),z$1.null()])})).nonempty(),pt=ne.or(lt),vr=z$1.union([z$1.string().describe("data string"),ne]),Er=z$1.union([z$1.string().describe("data string"),pt]),br=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA),params:z$1.tuple([N,Er])}),Rr=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA_V1),params:z$1.tuple([N,Er])}),Sr=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA_V3),params:z$1.tuple([N,vr])}),Ir=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA_V4),params:z$1.tuple([N,vr])});var Pr=z$1.object({method:z$1.literal(RpcMethod.PERSONAL_SIGN),params:z$1.union([z$1.tuple([he,N]),z$1.tuple([he,N,z$1.string().optional().describe("password")])])});var oa=z$1.discriminatedUnion("method",[Pr,Tr,br,Rr,Sr,Ir]).transform((t,e)=>{let{method:r,params:n}=t;switch(r){case RpcMethod.PERSONAL_SIGN:return {data:n[0],address:n[1],method:r};case RpcMethod.ETH_SIGN:return {data:n[1],address:n[0],method:r};case RpcMethod.SIGN_TYPED_DATA:case RpcMethod.SIGN_TYPED_DATA_V1:{let s=n[0],a=n[1];if(typeof a!="string")return {data:a,address:s,method:r};try{let o=JSON.parse(a);return {data:pt.parse(o),address:s,method:r}}catch{return e.addIssue({code:z$1.ZodIssueCode.custom,message:"param is not a valid json"}),z$1.NEVER}}case RpcMethod.SIGN_TYPED_DATA_V3:case RpcMethod.SIGN_TYPED_DATA_V4:{let s=n[0],a=n[1];if(typeof a!="string")return {data:a,address:s,method:r};try{let o=JSON.parse(a);return {data:ne.parse(o),address:s,method:r}}catch{return e.addIssue({code:z$1.ZodIssueCode.custom,message:"param is not a valid json"}),z$1.NEVER}}}});function xr(t){return oa.safeParse(t)}var Ar=t=>lt.safeParse(t).success,Ac=t=>ne.safeParse(t).success;var wr=t=>{try{let{EIP712Domain:e,...r}=t.types;return TypedDataEncoder.getPayload(t.domain,r,t.message),{isValid:!0}}catch(e){return {isValid:!1,error:e}}};var Cr=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let s=xr({method:t.method,params:t.params});if(!s.success)return console.error("invalid params",s.error),{success:!1,error:rpcErrors.invalidParams({message:"Params are invalid",data:{cause:s.error}})};let{method:a,data:o,address:c}=s.data,i;(a===RpcMethod.SIGN_TYPED_DATA_V3||a===RpcMethod.SIGN_TYPED_DATA_V4)&&(i=wr(o));let l,p,m,u;if(i&&!i.isValid&&(u={type:AlertType.INFO,details:{title:"Warning: Verify Message Content",description:"This message contains non-standard elements.",detailedDescription:i.error.toString()}}),a===RpcMethod.ETH_SIGN)l={type:a,account:c,data:o},p=o,m="Signing this message can be dangerous. This signature could potentially perform any operation on your account's behalf, including granting complete control of your account and all of its assets to the requesting site. Only sign this message if you know what you're doing or completely trust the requesting site";else if(a===RpcMethod.PERSONAL_SIGN)l={type:a,account:c,data:o},p=toUtf8String(o);else if(a===RpcMethod.SIGN_TYPED_DATA||a===RpcMethod.SIGN_TYPED_DATA_V1)l={type:a,account:c,data:o},p=Ar(o)?hr(o):it(o);else if(a===RpcMethod.SIGN_TYPED_DATA_V3||a===RpcMethod.SIGN_TYPED_DATA_V4){l={type:a,account:c,data:o};let{types:v,primaryType:E,...T}=o;p=it(T);}if(!l||!p)return {success:!1,error:rpcErrors.internal("Unable to generate signing data")};let d=await Qt({request:t,proxyApiUrl:n,accountAddress:c,chainId:e.chainId,data:{method:a,params:t.params},dAppUrl:t.dappInfo.url}),h={title:"Sign Message",dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} requests you to sign the following message`,logoUri:t.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},account:c,details:[{title:"Message",items:[p]}],disclaimer:m,alert:d?.alert??u,balanceChange:d?.balanceChange,tokenApprovals:d?.tokenApprovals},y=await r.requestApproval({request:t,displayData:h,signingData:l});return "error"in y?{error:y.error}:"signedData"in y?{result:y.signedData}:{error:rpcErrors.internal("No signed data returned")}};var Nr=async(t,e)=>{try{return {result:await(await x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3})).send(t.method,t.params)}}catch(r){let n=r.info?.error?.message||r.error?.message||r.message;return {error:rpcErrors.internal(n)}}};var Br=async({accountIndex:t,xpub:e,walletType:r})=>{switch(r){case WalletType.Mnemonic:case WalletType.Ledger:case WalletType.Keystone:return {[NetworkVMType.EVM]:getAddressFromXPub(e,t)};case WalletType.LedgerLive:case WalletType.Seedless:{let n=Buffer.from(e,"hex");return {[NetworkVMType.EVM]:getEvmAddressFromPubKey(n)}}default:throw rpcErrors.invalidParams(`Unsupported wallet type: ${r}`)}};var se,He=class{constructor(e){this.baseUrl=e;c(this,se,[]);}async isNetworkSupported(e){return (await this.getChainList()).map(s=>s.community_id).some(s=>s===e)}async getChainInfo({chainId:e}){return (await this.getChainList()).find(n=>n.id===e)}async getTokenBalance({chainId:e,address:r,tokenId:n}){let s=await fetch(`${this.baseUrl}/v1/user/token?id=${r}&chain_id=${e}&token_id=${n}`);if(s.ok)return await s.json();throw new Error(`${s.status}:${s.statusText}`)}async getTokensBalanceOnChain({chainId:e,address:r}){let n=await fetch(`${this.baseUrl}/v1/user/all_token_list?id=${r}&chain_ids=${e}`);if(n.ok)return await n.json();throw new Error(`${n.status}:${n.statusText}`)}async getTokenList({chainId:e,address:r}){let n=await fetch(`${this.baseUrl}/v1/user/token_list?id=${r}&chain_id=${e}`);if(n.ok)return await n.json();throw new Error(`${n.status}:${n.statusText}`)}async getChainList(){if(b(this,se).length===0){let e=await fetch(`${this.baseUrl}/v1/chain/list`);if(e.ok)d(this,se,await e.json());else throw new Error(`${e.status}:${e.statusText}`)}return b(this,se)}};se=new WeakMap;var C,Oe=class{constructor({proxyApiUrl:e}){c(this,C,void 0);d(this,C,new He(`${e}/proxy/debank`));}async isNetworkSupported(e){return b(this,C).isNetworkSupported(e)}async getNativeBalance({chainId:e,address:r,currency:n}){if(!isHexString(r))throw rpcErrors.invalidParams("getNativeBalance: not valid address: "+r);let a=(await b(this,C).getChainList()).find(v=>v.community_id===e)?.id;if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let o=await b(this,C).getChainInfo({chainId:a});if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let c=o.native_token_id,i=await b(this,C).getTokenBalance({address:r,chainId:a,tokenId:c}),l=new TokenUnit(i.raw_amount,i.decimals,i.symbol),p=l.toDisplay(),u=(await Fe()).usd[n.toLowerCase()],d=u?u*i.price:void 0,h=d?l.mul(d).toDisplay({fixedDp:2}):void 0,y=d?l.mul(d).toDisplay({fixedDp:2,asNumber:!0}):void 0;return {name:i.name,symbol:i.symbol,decimals:i.decimals,type:TokenType.NATIVE,logoUri:i.logo_url,balance:l.toSubUnit(),balanceDisplayValue:p,balanceInCurrency:y,balanceCurrencyDisplayValue:h,priceInCurrency:d}}async listErc20Balances({chainId:e,address:r,currency:n}){if(!isHexString(r))throw rpcErrors.invalidParams("listErc20Balances: not valid address");let a=(await b(this,C).getChainList()).find(l=>l.community_id===e)?.id;if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let o=await b(this,C).getChainInfo({chainId:a});if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let c=await b(this,C).getTokensBalanceOnChain({chainId:a,address:r}),i={};for(let l of c){if(l.id===o.native_token_id)continue;let p=new TokenUnit(l.raw_amount,l.decimals,l.symbol),m=p.toDisplay(),d=(await Fe()).usd[n.toLowerCase()],h=d?d*l.price:void 0,y=h?p.mul(h).toDisplay({fixedDp:2}):void 0,v=h?p.mul(h).toDisplay({fixedDp:2,asNumber:!0}):void 0;i[l.id]={chainId:o.community_id,address:l.id,name:l.name,symbol:l.symbol,decimals:l.decimals,logoUri:l.logo_url,balance:p.toSubUnit(),balanceCurrencyDisplayValue:y,balanceDisplayValue:m,balanceInCurrency:v,priceInCurrency:h,type:TokenType.ERC20,reputation:null};}return i}async listNftBalances(){return {}}};C=new WeakMap;var fa=z$1.tuple([z,z]).rest(z).refine(t=>dt(t,"chainId"),{message:'All transactions must use the same "chainId"'}).refine(t=>dt(t,"from"),{message:'All transactions must use the same "from" address'}).refine(t=>ha(t,"nonce")||ya(t,"nonce"),{message:'Each transaction needs a different "nonce". Make them different, or leave them empty for all transactions.'});function ya(t,e){return !dt(t,e)}function ha(t,e){return t.every(r=>r[e]===void 0||r[e]==="")}function dt(t,e){return new Set(t.map(n=>n[e])).size===1}var Fr=t=>fa.safeParse(t);var Mr=async(t,e)=>{if(t[0].nonce)return;let r=await Ie({from:t[0].from,provider:e});return Promise.all(t.map(async(n,s)=>{n.nonce=String(r+s);}))};var $e=new Map,Vr=(t,e,r)=>($e.set(t,{signingRequests:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:s},a)=>{let o=$e.get(t);if(!o)throw rpcErrors.resourceNotFound();let{signingRequests:c}=o,l={signingRequests:c.map((p,m)=>{if(a===void 0||a===m){let{signingData:u}=p;return {signingData:{...u,data:{...u.data,maxFeePerGas:n??u.data.maxFeePerGas,maxPriorityFeePerGas:s??u.data.maxPriorityFeePerGas}},displayData:p.displayData}}return p}),displayData:r};return $e.set(t,l),l},cleanup:()=>$e.delete(t)});var Hr=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,proxyApiUrl:s,provider:a,populateMissingGas:o})=>{let c;try{c=await Vt({proxyApiUrl:s,chainId:n,params:r,domain:e,withGasEstimation:o});}catch(d){return console.error("simulateTransactionBatch error",d),{isSimulationSuccessful:!1,alert:U[AlertType.WARNING],scans:[]}}let i=await Promise.all(c.map(async(d,h)=>{let y=r[h],v=await rt({chainId:n,params:r[h],provider:a,rpcMethod:t,simulationResult:d});return o&&!y.gas&&v.estimatedGasLimit&&(y.gas=`0x${v.estimatedGasLimit.toString(16)}`),{transaction:y,...v}})),l=i.every(d=>d.isSimulationSuccessful),p=Ta(i),m=va(i),u=ka(i);return {isSimulationSuccessful:l,alert:p,balanceChange:m,tokenApprovals:u,scans:i.map(d=>(d.tokenApprovals&&(d.tokenApprovals.isEditable=!1),d))}},Ta=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)},ka=t=>{let e=t.reduce((r,{tokenApprovals:n})=>(n&&n.approvals.forEach(s=>{let a=r.approvals.find(o=>s.token.address===o.token.address&&s.spenderAddress===o.spenderAddress);if(!a){r.approvals.push({...s});return}a.value=s.value,a.usdPrice=s.usdPrice;}),r),{approvals:[],isEditable:!1});return Ea(e,t),tt(e)?void 0:e},va=t=>{let e=t.reduce((r,{balanceChange:n})=>(n&&(n.ins.forEach(s=>{let a=Lr(r.ins,s);a?a.items.push(...s.items):r.ins.push(s);}),n.outs.forEach(s=>{let a=Lr(r.outs,s);a?a.items.push(...s.items):r.outs.push({...s});})),r),{ins:[],outs:[]});return tt(e)?void 0:e},Lr=(t,e)=>t.find(r=>O(r.token)&&O(e.token)?r.token.symbol===e.token.symbol:!O(r.token)&&!O(e.token)?r.token.address===e.token.address:!1),Ea=(t,e)=>{for(let r of t.approvals)for(let n of e)if(!(!n.isSimulationSuccessful||!n.balanceChange||!n.balanceChange.outs.some(a=>!O(a.token)&&!O(r.token)&&a.token.address===r.token.address)))if(!n.tokenApprovals)t.approvals=t.approvals.filter(a=>a.spenderAddress!==r.spenderAddress&&r.token.address!==a.token.address);else {let a=n.tokenApprovals.approvals.find(o=>o.spenderAddress===r.spenderAddress&&o.token.address===r.token.address);if(!a)continue;r.usdPrice=a.usdPrice,r.value=a.value;}};var Or=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:a,success:o,error:c}=Fr(s);if(!o)return console.error("invalid params",c),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:c}})};let i=await x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});try{await Mr(a,i);}catch(I){return console.error("Unable to calculate nonce",I),{error:rpcErrors.internal({message:"Unable to calculate nonce",data:{originalError:I}})}}let l=a.every(I=>Number(I.gas)>0),{alert:p,balanceChange:m,isSimulationSuccessful:u,tokenApprovals:d,scans:h}=await Hr({rpcMethod:t.method,proxyApiUrl:n,chainId:e.chainId,params:a,dAppUrl:t.dappInfo.url,provider:i,populateMissingGas:!l});if(!h.every(({transaction:I})=>Number(I.gas)>0))return console.error("Gas limit is missing in some transactions"),{error:rpcErrors.internal({message:"Gas limit is missing in some transactions"})};let v={title:"Approve Transaction Batch",details:[{title:"Transaction Details",items:[Ce("Website",t.dappInfo),J("From",a[0].from)]}],network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},isSimulationSuccessful:u,balanceChange:m,alert:p,tokenApprovals:d,networkFeeSelector:!0},E=h.map(I=>Ne(t,e,I.transaction,I)),{cleanup:T,updateTx:k}=Vr(t.requestId,E,v),S=await r.requestBatchApproval({request:t,signingRequests:E,displayData:v,updateTx:k});if(T(),"error"in S)return {error:S.error};if(S.result.length!==a.length)return {error:rpcErrors.internal({message:`Invalid number of signatures. Expected ${a.length}, got ${S.result.length}`})};let Ee=[];for(let[I,je]of S.result.entries()){let be=I===S.result.length-1,le=await Ue(i,je),jr=De({provider:i,txHash:le,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,requestId:t.requestId});if(!be&&!await jr)return {error:rpcErrors.internal({message:`Transaction ${I+1} failed! Batch execution stopped`})};Ee.push(le);}return {result:Ee}};var ce,ve,_,L,Wr=class{constructor({approvalController:e,environment:r,appInfo:n}){c(this,ce,void 0);c(this,ve,void 0);c(this,_,void 0);c(this,L,void 0);let{glacierApiUrl:s,proxyApiUrl:a}=pr(r);d(this,ce,new Ve({glacierApiUrl:s,headers:st(n)})),d(this,ve,new Oe({proxyApiUrl:a})),d(this,_,a),d(this,L,e);}getProvider(e){return x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3})}getAddress({accountIndex:e,xpub:r,walletType:n}){return Br({accountIndex:e,xpub:r,walletType:n})}getBalances({addresses:e,network:r,currency:n,customTokens:s,storage:a,tokenTypes:o}){return cr({addresses:e,currency:n,network:r,proxyApiUrl:b(this,_),customTokens:s,balanceServices:[b(this,ce),b(this,ve)],storage:a,tokenTypes:o})}getManifest(){let e=parseManifest(Ut);return e.success?e.data:void 0}getNetworkFee(e){let{chainId:r,chainName:n,rpcUrl:s,utilityAddresses:a,caipId:o}=e;return ft({chainId:r,chainName:n,rpcUrl:s,multiContractAddress:a?.multicall,caipId:o,proxyApiUrl:b(this,_)})}getTransactionHistory(e){let{network:r,address:n,nextPageToken:s,offset:a}=e,{chainId:o,isTestnet:c,networkToken:i,explorerUrl:l=""}=r;return Dt({chainId:o,isTestnet:c,networkToken:i,explorerUrl:l,address:n,nextPageToken:s,offset:a,glacierService:b(this,ce)})}getTokens(e){let{chainId:r}=e;return Re({chainId:r,proxyApiUrl:b(this,_)})}async onRpcRequest(e,r){switch(e.method){case RpcMethod.ETH_SEND_TRANSACTION:return tr({request:e,network:r,approvalController:b(this,L),proxyApiUrl:b(this,_)});case RpcMethod.ETH_SEND_TRANSACTION_BATCH:return Jt(b(this,L))?Or({request:e,network:r,approvalController:b(this,L),proxyApiUrl:b(this,_)}):{error:rpcErrors.methodNotSupported(`Method ${e.method} requires BatchApprovalController`)};case RpcMethod.PERSONAL_SIGN:case RpcMethod.ETH_SIGN:case RpcMethod.SIGN_TYPED_DATA:case RpcMethod.SIGN_TYPED_DATA_V1:case RpcMethod.SIGN_TYPED_DATA_V3:case RpcMethod.SIGN_TYPED_DATA_V4:return Cr({request:e,network:r,approvalController:b(this,L),proxyApiUrl:b(this,_)});default:return Ra(e.method)?Nr(e,r):{error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};ce=new WeakMap,ve=new WeakMap,_=new WeakMap,L=new WeakMap;var Ra=t=>t.startsWith("eth_")||["web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"].includes(t);
|
|
34
|
+
`;}),e},W=t=>{let e={0:"\u{1D7EC}",1:"\u{1D7ED}",2:"\u{1D7EE}",3:"\u{1D7EF}",4:"\u{1D7F0}",5:"\u{1D7F1}",6:"\u{1D7F2}",7:"\u{1D7F3}",8:"\u{1D7F4}",9:"\u{1D7F5}",a:"\u{1D5EE}",b:"\u{1D5EF}",c:"\u{1D5F0}",d:"\u{1D5F1}",e:"\u{1D5F2}",f:"\u{1D5F3}",g:"\u{1D5F4}",h:"\u{1D5F5}",i:"\u{1D5F6}",j:"\u{1D5F7}",k:"\u{1D5F8}",l:"\u{1D5F9}",m:"\u{1D5FA}",n:"\u{1D5FB}",o:"\u{1D5FC}",p:"\u{1D5FD}",q:"\u{1D5FE}",r:"\u{1D5FF}",s:"\u{1D600}",t:"\u{1D601}",u:"\u{1D602}",v:"\u{1D603}",w:"\u{1D604}",x:"\u{1D605}",y:"\u{1D606}",z:"\u{1D607}",A:"\u{1D5D4}",B:"\u{1D5D5}",C:"\u{1D5D6}",D:"\u{1D5D7}",E:"\u{1D5D8}",F:"\u{1D5D9}",G:"\u{1D5DA}",H:"\u{1D5DB}",I:"\u{1D5DC}",J:"\u{1D5DD}",K:"\u{1D5DE}",L:"\u{1D5DF}",M:"\u{1D5E0}",N:"\u{1D5E1}",O:"\u{1D5E2}",P:"\u{1D5E3}",Q:"\u{1D5E4}",R:"\u{1D5E5}",S:"\u{1D5E6}",T:"\u{1D5E7}",U:"\u{1D5E8}",V:"\u{1D5E9}",W:"\u{1D5EA}",X:"\u{1D5EB}",Y:"\u{1D5EC}",Z:"\u{1D5ED}"};return t.split("").map(r=>e[r]||r).join("")};var ge=z$1.string().describe("message"),N=z$1.string().describe("address");var kr=z$1.object({method:z$1.literal(RpcMethod.ETH_SIGN),params:z$1.tuple([N,ge])});var Er=z$1.object({name:z$1.string(),type:z$1.string()}),ne=z$1.object({types:z$1.object({EIP712Domain:z$1.array(Er)}).catchall(z$1.array(Er)),primaryType:z$1.string(),domain:z$1.record(z$1.any()),message:z$1.record(z$1.any())}),lt=z$1.array(z$1.object({type:z$1.string(),name:z$1.string(),value:z$1.union([z$1.string(),z$1.number(),z$1.boolean(),z$1.object({}).passthrough(),z$1.array(z$1.unknown()),z$1.null()])})).nonempty(),pt=ne.or(lt),vr=z$1.union([z$1.string().describe("data string"),ne]),br=z$1.union([z$1.string().describe("data string"),pt]),Rr=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA),params:z$1.tuple([N,br])}),Pr=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA_V1),params:z$1.tuple([N,br])}),Sr=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA_V3),params:z$1.tuple([N,vr])}),Ir=z$1.object({method:z$1.literal(RpcMethod.SIGN_TYPED_DATA_V4),params:z$1.tuple([N,vr])});var xr=z$1.object({method:z$1.literal(RpcMethod.PERSONAL_SIGN),params:z$1.union([z$1.tuple([ge,N]),z$1.tuple([ge,N,z$1.string().optional().describe("password")])])});var ca=z$1.discriminatedUnion("method",[xr,kr,Rr,Pr,Sr,Ir]).transform((t,e)=>{let{method:r,params:n}=t;switch(r){case RpcMethod.PERSONAL_SIGN:return {data:n[0],address:n[1],method:r};case RpcMethod.ETH_SIGN:return {data:n[1],address:n[0],method:r};case RpcMethod.SIGN_TYPED_DATA:case RpcMethod.SIGN_TYPED_DATA_V1:{let s=n[0],a=n[1];if(typeof a!="string")return {data:a,address:s,method:r};try{let o=JSON.parse(a);return {data:pt.parse(o),address:s,method:r}}catch{return e.addIssue({code:z$1.ZodIssueCode.custom,message:"param is not a valid json"}),z$1.NEVER}}case RpcMethod.SIGN_TYPED_DATA_V3:case RpcMethod.SIGN_TYPED_DATA_V4:{let s=n[0],a=n[1];if(typeof a!="string")return {data:a,address:s,method:r};try{let o=JSON.parse(a);return {data:ne.parse(o),address:s,method:r}}catch{return e.addIssue({code:z$1.ZodIssueCode.custom,message:"param is not a valid json"}),z$1.NEVER}}}});function Ar(t){return ca.safeParse(t)}var wr=t=>lt.safeParse(t).success,_c=t=>ne.safeParse(t).success;var Cr=t=>{try{let{EIP712Domain:e,...r}=t.types;return TypedDataEncoder.getPayload(t.domain,r,t.message),{isValid:!0}}catch(e){return {isValid:!1,error:e}}};var Nr=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let s=Ar({method:t.method,params:t.params});if(!s.success)return console.error("invalid params",s.error),{success:!1,error:rpcErrors.invalidParams({message:"Params are invalid",data:{cause:s.error}})};let{method:a,data:o,address:c}=s.data,i;(a===RpcMethod.SIGN_TYPED_DATA_V3||a===RpcMethod.SIGN_TYPED_DATA_V4)&&(i=Cr(o));let l,p,m,u;if(i&&!i.isValid&&(u={type:AlertType.INFO,details:{title:"Warning: Verify Message Content",description:"This message contains non-standard elements.",detailedDescription:i.error.toString()}}),a===RpcMethod.ETH_SIGN)l={type:a,account:c,data:o},p=o,m="Signing this message can be dangerous. This signature could potentially perform any operation on your account's behalf, including granting complete control of your account and all of its assets to the requesting site. Only sign this message if you know what you're doing or completely trust the requesting site";else if(a===RpcMethod.PERSONAL_SIGN)l={type:a,account:c,data:o},p=toUtf8String(o);else if(a===RpcMethod.SIGN_TYPED_DATA||a===RpcMethod.SIGN_TYPED_DATA_V1)l={type:a,account:c,data:o},p=wr(o)?hr(o):it(o);else if(a===RpcMethod.SIGN_TYPED_DATA_V3||a===RpcMethod.SIGN_TYPED_DATA_V4){l={type:a,account:c,data:o};let{types:v,primaryType:E,...T}=o;p=it(T);}if(!l||!p)return {success:!1,error:rpcErrors.internal("Unable to generate signing data")};let d=await er({request:t,proxyApiUrl:n,accountAddress:c,chainId:e.chainId,data:{method:a,params:t.params},dAppUrl:t.dappInfo.url}),g={title:"Sign Message",dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} requests you to sign the following message`,logoUri:t.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},account:c,details:[{title:"Message",items:[p]}],disclaimer:m,alert:d?.alert??u,balanceChange:d?.balanceChange,tokenApprovals:d?.tokenApprovals},y=await r.requestApproval({request:t,displayData:g,signingData:l});return "error"in y?{error:y.error}:"signedData"in y?{result:y.signedData}:{error:rpcErrors.internal("No signed data returned")}};var _r=async(t,e)=>{try{return {result:await(await x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3})).send(t.method,t.params)}}catch(r){let n=r.info?.error?.message||r.error?.message||r.message;return {error:rpcErrors.internal(n)}}};var Dr=async({accountIndex:t,xpub:e,walletType:r})=>{switch(r){case WalletType.Mnemonic:case WalletType.Ledger:case WalletType.Keystone:return {[NetworkVMType.EVM]:getAddressFromXPub(e,t)};case WalletType.LedgerLive:case WalletType.Seedless:{let n=Buffer.from(e,"hex");return {[NetworkVMType.EVM]:getEvmAddressFromPubKey(n)}}default:throw rpcErrors.invalidParams(`Unsupported wallet type: ${r}`)}};var se,He=class{constructor(e){this.baseUrl=e;c(this,se,[]);}async isNetworkSupported(e){return (await this.getChainList()).map(s=>s.community_id).some(s=>s===e)}async getChainInfo({chainId:e}){return (await this.getChainList()).find(n=>n.id===e)}async getTokenBalance({chainId:e,address:r,tokenId:n}){let s=await fetch(`${this.baseUrl}/v1/user/token?id=${r}&chain_id=${e}&token_id=${n}`);if(s.ok)return await s.json();throw new Error(`${s.status}:${s.statusText}`)}async getTokensBalanceOnChain({chainId:e,address:r}){let n=await fetch(`${this.baseUrl}/v1/user/all_token_list?id=${r}&chain_ids=${e}`);if(n.ok)return await n.json();throw new Error(`${n.status}:${n.statusText}`)}async getTokenList({chainId:e,address:r}){let n=await fetch(`${this.baseUrl}/v1/user/token_list?id=${r}&chain_id=${e}`);if(n.ok)return await n.json();throw new Error(`${n.status}:${n.statusText}`)}async getChainList(){if(b(this,se).length===0){let e=await fetch(`${this.baseUrl}/v1/chain/list`);if(e.ok)d(this,se,await e.json());else throw new Error(`${e.status}:${e.statusText}`)}return b(this,se)}};se=new WeakMap;var C,Oe=class{constructor({proxyApiUrl:e}){c(this,C,void 0);d(this,C,new He(`${e}/proxy/debank`));}async isNetworkSupported(e){return b(this,C).isNetworkSupported(e)}async getNativeBalance({chainId:e,address:r,currency:n}){if(!isHexString(r))throw rpcErrors.invalidParams("getNativeBalance: not valid address: "+r);let a=(await b(this,C).getChainList()).find(v=>v.community_id===e)?.id;if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let o=await b(this,C).getChainInfo({chainId:a});if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let c=o.native_token_id,i=await b(this,C).getTokenBalance({address:r,chainId:a,tokenId:c}),l=new TokenUnit(i.raw_amount,i.decimals,i.symbol),p=l.toDisplay(),u=(await Fe()).usd[n.toLowerCase()],d=u?u*i.price:void 0,g=d?l.mul(d).toDisplay({fixedDp:2}):void 0,y=d?l.mul(d).toDisplay({fixedDp:2,asNumber:!0}):void 0;return {name:i.name,symbol:i.symbol,decimals:i.decimals,type:TokenType.NATIVE,logoUri:i.logo_url,balance:l.toSubUnit(),balanceDisplayValue:p,balanceInCurrency:y,balanceCurrencyDisplayValue:g,priceInCurrency:d}}async listErc20Balances({chainId:e,address:r,currency:n}){if(!isHexString(r))throw rpcErrors.invalidParams("listErc20Balances: not valid address");let a=(await b(this,C).getChainList()).find(l=>l.community_id===e)?.id;if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let o=await b(this,C).getChainInfo({chainId:a});if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let c=await b(this,C).getTokensBalanceOnChain({chainId:a,address:r}),i={};for(let l of c){if(l.id===o.native_token_id)continue;let p=new TokenUnit(l.raw_amount,l.decimals,l.symbol),m=p.toDisplay(),d=(await Fe()).usd[n.toLowerCase()],g=d?d*l.price:void 0,y=g?p.mul(g).toDisplay({fixedDp:2}):void 0,v=g?p.mul(g).toDisplay({fixedDp:2,asNumber:!0}):void 0;i[l.id]={chainId:o.community_id,address:l.id,name:l.name,symbol:l.symbol,decimals:l.decimals,logoUri:l.logo_url,balance:p.toSubUnit(),balanceCurrencyDisplayValue:y,balanceDisplayValue:m,balanceInCurrency:v,priceInCurrency:g,type:TokenType.ERC20,reputation:null};}return i}async listNftBalances(){return {}}};C=new WeakMap;var ha=z$1.tuple([z,z]).rest(z).refine(t=>dt(t,"chainId"),{message:'All transactions must use the same "chainId"'}).refine(t=>dt(t,"from"),{message:'All transactions must use the same "from" address'}).refine(t=>ka(t,"nonce")||Ta(t,"nonce"),{message:'Each transaction needs a different "nonce". Make them different, or leave them empty for all transactions.'});function Ta(t,e){return !dt(t,e)}function ka(t,e){return t.every(r=>r[e]===void 0||r[e]==="")}function dt(t,e){return new Set(t.map(n=>n[e])).size===1}var Mr=t=>ha.safeParse(t);var Vr=async(t,e)=>{if(t[0].nonce)return;let r=await Se({from:t[0].from,provider:e});return Promise.all(t.map(async(n,s)=>{n.nonce=String(r+s);}))};var $e=new Map,Lr=(t,e,r)=>($e.set(t,{signingRequests:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:s},a)=>{let o=$e.get(t);if(!o)throw rpcErrors.resourceNotFound();let{signingRequests:c}=o,l={signingRequests:c.map((p,m)=>{if(a===void 0||a===m){let{signingData:u}=p;return {signingData:{...u,data:{...u.data,maxFeePerGas:n??u.data.maxFeePerGas,maxPriorityFeePerGas:s??u.data.maxPriorityFeePerGas}},displayData:p.displayData}}return p}),displayData:r};return $e.set(t,l),l},cleanup:()=>$e.delete(t)});var Or=async({rpcMethod:t,dAppUrl:e,params:r,chainId:n,proxyApiUrl:s,provider:a,populateMissingGas:o})=>{let c;try{c=await Lt({proxyApiUrl:s,chainId:n,params:r,domain:e,withGasEstimation:o});}catch(d){return console.error("simulateTransactionBatch error",d),{isSimulationSuccessful:!1,alert:U[AlertType.WARNING],scans:[]}}let i=await Promise.all(c.map(async(d,g)=>{let y=r[g],v=await rt({chainId:n,params:r[g],provider:a,rpcMethod:t,simulationResult:d});return o&&!y.gas&&v.estimatedGasLimit&&(y.gas=`0x${v.estimatedGasLimit.toString(16)}`),{transaction:y,...v}})),l=i.every(d=>d.isSimulationSuccessful),p=va(i),m=Ra(i),u=ba(i);return {isSimulationSuccessful:l,alert:p,balanceChange:m,tokenApprovals:u,scans:i.map(d=>(d.tokenApprovals&&(d.tokenApprovals.isEditable=!1),d))}},va=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)},ba=t=>{let e=t.reduce((r,{tokenApprovals:n})=>(n&&n.approvals.forEach(s=>{let a=r.approvals.find(o=>s.token.address===o.token.address&&s.spenderAddress===o.spenderAddress);if(!a){r.approvals.push({...s});return}a.value=s.value,a.usdPrice=s.usdPrice;}),r),{approvals:[],isEditable:!1});return Pa(e,t),tt(e)?void 0:e},Ra=t=>{let e=t.reduce((r,{balanceChange:n})=>(n&&(n.ins.forEach(s=>{let a=Hr(r.ins,s);a?a.items.push(...s.items):r.ins.push(s);}),n.outs.forEach(s=>{let a=Hr(r.outs,s);a?a.items.push(...s.items):r.outs.push({...s});})),r),{ins:[],outs:[]});return tt(e)?void 0:e},Hr=(t,e)=>t.find(r=>O(r.token)&&O(e.token)?r.token.symbol===e.token.symbol:!O(r.token)&&!O(e.token)?r.token.address===e.token.address:!1),Pa=(t,e)=>{for(let r of t.approvals)for(let n of e)if(!(!n.isSimulationSuccessful||!n.balanceChange||!n.balanceChange.outs.some(a=>!O(a.token)&&!O(r.token)&&a.token.address===r.token.address)))if(!n.tokenApprovals)t.approvals=t.approvals.filter(a=>a.spenderAddress!==r.spenderAddress&&r.token.address!==a.token.address);else {let a=n.tokenApprovals.approvals.find(o=>o.spenderAddress===r.spenderAddress&&o.token.address===r.token.address);if(!a)continue;r.usdPrice=a.usdPrice,r.value=a.value;}};var $r=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:a,success:o,error:c}=Mr(s);if(!o)return console.error("invalid params",c),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:c}})};let i=await x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});try{await Vr(a,i);}catch(S){return console.error("Unable to calculate nonce",S),{error:rpcErrors.internal({message:"Unable to calculate nonce",data:{originalError:S}})}}let l=a.every(S=>Number(S.gas)>0),{alert:p,balanceChange:m,isSimulationSuccessful:u,tokenApprovals:d,scans:g}=await Or({rpcMethod:t.method,proxyApiUrl:n,chainId:e.chainId,params:a,dAppUrl:t.dappInfo.url,provider:i,populateMissingGas:!l});if(!g.every(({transaction:S})=>Number(S.gas)>0))return console.error("Gas limit is missing in some transactions"),{error:rpcErrors.internal({message:"Gas limit is missing in some transactions"})};let v={title:"Approve Transaction Batch",details:[{title:"Transaction Details",items:[Ce("Website",t.dappInfo),J("From",a[0].from)]}],network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},isSimulationSuccessful:u,balanceChange:m,alert:p,tokenApprovals:d,networkFeeSelector:!0},E=g.map(S=>Ne(t,e,S.transaction,S)),{cleanup:T,updateTx:k}=Lr(t.requestId,E,v),P=await r.requestBatchApproval({request:t,signingRequests:E,displayData:v,updateTx:k});if(T(),"error"in P)return {error:P.error};if(P.result.length!==a.length)return {error:rpcErrors.internal({message:`Invalid number of signatures. Expected ${a.length}, got ${P.result.length}`})};let ve=[];for(let[S,je]of P.result.entries()){let be=S===P.result.length-1,le=await Ue(i,je),qr=De({provider:i,txHash:le,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,requestId:t.requestId});if(!be&&!await qr)return {error:rpcErrors.internal({message:`Transaction ${S+1} failed! Batch execution stopped`})};ve.push(le);}return {result:ve}};var ce,Ee,_,L,jr=class{constructor({approvalController:e,environment:r,appInfo:n}){c(this,ce,void 0);c(this,Ee,void 0);c(this,_,void 0);c(this,L,void 0);let{glacierApiUrl:s,proxyApiUrl:a}=mr(r);d(this,ce,new Ve({glacierApiUrl:s,headers:st(n)})),d(this,Ee,new Oe({proxyApiUrl:a})),d(this,_,a),d(this,L,e);}getProvider(e){return x({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3})}getAddress({accountIndex:e,xpub:r,walletType:n}){return Dr({accountIndex:e,xpub:r,walletType:n})}getBalances({addresses:e,network:r,currency:n,customTokens:s,storage:a,tokenTypes:o}){return lr({addresses:e,currency:n,network:r,proxyApiUrl:b(this,_),customTokens:s,balanceServices:[b(this,ce),b(this,Ee)],storage:a,tokenTypes:o})}getManifest(){let e=parseManifest(Gt);return e.success?e.data:void 0}getNetworkFee(e){let{chainId:r,chainName:n,rpcUrl:s,utilityAddresses:a,caipId:o}=e;return yt({chainId:r,chainName:n,rpcUrl:s,multiContractAddress:a?.multicall,caipId:o,proxyApiUrl:b(this,_)})}getTransactionHistory(e){let{network:r,address:n,nextPageToken:s,offset:a}=e,{chainId:o,isTestnet:c,networkToken:i,explorerUrl:l=""}=r;return Ut({chainId:o,isTestnet:c,networkToken:i,explorerUrl:l,address:n,nextPageToken:s,offset:a,glacierService:b(this,ce)})}getTokens(e){let{chainId:r}=e;return Re({chainId:r,proxyApiUrl:b(this,_)})}async onRpcRequest(e,r){switch(e.method){case RpcMethod.ETH_SEND_TRANSACTION:return rr({request:e,network:r,approvalController:b(this,L),proxyApiUrl:b(this,_)});case RpcMethod.ETH_SEND_TRANSACTION_BATCH:return Yt(b(this,L))?$r({request:e,network:r,approvalController:b(this,L),proxyApiUrl:b(this,_)}):{error:rpcErrors.methodNotSupported(`Method ${e.method} requires BatchApprovalController`)};case RpcMethod.PERSONAL_SIGN:case RpcMethod.ETH_SIGN:case RpcMethod.SIGN_TYPED_DATA:case RpcMethod.SIGN_TYPED_DATA_V1:case RpcMethod.SIGN_TYPED_DATA_V3:case RpcMethod.SIGN_TYPED_DATA_V4:return Nr({request:e,network:r,approvalController:b(this,L),proxyApiUrl:b(this,_)});default:return Ia(e.method)?_r(e,r):{error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};ce=new WeakMap,Ee=new WeakMap,_=new WeakMap,L=new WeakMap;var Ia=t=>t.startsWith("eth_")||["web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"].includes(t);
|
|
34
35
|
|
|
35
|
-
export { H as ERC20TransactionType,
|
|
36
|
+
export { H as ERC20TransactionType, jr as EvmModule, _t as NonContractCallTypes, K as addIdToPromise, _c as isTypedData, wr as isTypedDataV1, X as settleAllIdPromises };
|
|
36
37
|
//# sourceMappingURL=out.js.map
|
|
37
38
|
//# sourceMappingURL=index.js.map
|