@avalabs/evm-module 0.11.1 → 0.11.4
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 +10 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.d.cts
CHANGED
|
@@ -31,7 +31,7 @@ declare class EvmModule implements Module {
|
|
|
31
31
|
declare const NonContractCallTypes: TransactionType[];
|
|
32
32
|
type TransactionParams = {
|
|
33
33
|
from: string;
|
|
34
|
-
to
|
|
34
|
+
to?: string;
|
|
35
35
|
data?: string;
|
|
36
36
|
value?: string;
|
|
37
37
|
gas?: string;
|
|
@@ -41,6 +41,7 @@ type TransactionParams = {
|
|
|
41
41
|
nonce?: string;
|
|
42
42
|
chainId?: string;
|
|
43
43
|
};
|
|
44
|
+
type RequiredBy<T, K extends keyof T> = T & Required<Pick<T, K>>;
|
|
44
45
|
declare enum ERC20TransactionType {
|
|
45
46
|
TOTAL_SUPPLY = "totalSupply",
|
|
46
47
|
BALANCE_OF = "balanceOf",
|
|
@@ -86,4 +87,4 @@ declare function addIdToPromise<T>(promise: Promise<T>, id: string): Promise<IdP
|
|
|
86
87
|
*/
|
|
87
88
|
declare function settleAllIdPromises<T>(promises: Promise<IdPromise<T>>[]): Promise<Record<Id, T | Error>>;
|
|
88
89
|
|
|
89
|
-
export { ERC20TransactionType, EvmModule, IdPromise, NonContractCallTypes, TransactionParams, addIdToPromise, isTypedData, isTypedDataV1, settleAllIdPromises };
|
|
90
|
+
export { ERC20TransactionType, EvmModule, IdPromise, NonContractCallTypes, RequiredBy, TransactionParams, addIdToPromise, isTypedData, isTypedDataV1, settleAllIdPromises };
|
package/dist/index.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ declare class EvmModule implements Module {
|
|
|
31
31
|
declare const NonContractCallTypes: TransactionType[];
|
|
32
32
|
type TransactionParams = {
|
|
33
33
|
from: string;
|
|
34
|
-
to
|
|
34
|
+
to?: string;
|
|
35
35
|
data?: string;
|
|
36
36
|
value?: string;
|
|
37
37
|
gas?: string;
|
|
@@ -41,6 +41,7 @@ type TransactionParams = {
|
|
|
41
41
|
nonce?: string;
|
|
42
42
|
chainId?: string;
|
|
43
43
|
};
|
|
44
|
+
type RequiredBy<T, K extends keyof T> = T & Required<Pick<T, K>>;
|
|
44
45
|
declare enum ERC20TransactionType {
|
|
45
46
|
TOTAL_SUPPLY = "totalSupply",
|
|
46
47
|
BALANCE_OF = "balanceOf",
|
|
@@ -86,4 +87,4 @@ declare function addIdToPromise<T>(promise: Promise<T>, id: string): Promise<IdP
|
|
|
86
87
|
*/
|
|
87
88
|
declare function settleAllIdPromises<T>(promises: Promise<IdPromise<T>>[]): Promise<Record<Id, T | Error>>;
|
|
88
89
|
|
|
89
|
-
export { ERC20TransactionType, EvmModule, IdPromise, NonContractCallTypes, TransactionParams, addIdToPromise, isTypedData, isTypedDataV1, settleAllIdPromises };
|
|
90
|
+
export { ERC20TransactionType, EvmModule, IdPromise, NonContractCallTypes, RequiredBy, TransactionParams, addIdToPromise, isTypedData, isTypedDataV1, settleAllIdPromises };
|
package/dist/index.js
CHANGED
|
@@ -5,15 +5,15 @@ import { JsonRpcBatchInternal, getEvmAddressFromPubKey, getAddressFromXPub } fro
|
|
|
5
5
|
import { Network, toUtf8String, isHexString, Interface, TypedDataEncoder, ethers } from 'ethers';
|
|
6
6
|
import { TokenUnit, numberToBN, balanceToDisplayValue, ipfsResolver } from '@avalabs/core-utils-sdk';
|
|
7
7
|
import { getNormalTxs, getErc20Txs } from '@avalabs/core-etherscan-sdk';
|
|
8
|
-
import
|
|
8
|
+
import Mr from 'lodash.startcase';
|
|
9
9
|
import { z, object, string, record, number } from 'zod';
|
|
10
10
|
import vt from '@blockaid/client';
|
|
11
11
|
import Pt from 'xss';
|
|
12
|
-
import
|
|
12
|
+
import wt from '@openzeppelin/contracts/build/contracts/ERC20.json';
|
|
13
13
|
import { getBasicCoingeckoHttp, VsCurrencyType, simpleTokenPrice, simplePrice } from '@avalabs/core-coingecko-sdk';
|
|
14
14
|
import { Glacier, Erc1155Token, Erc721Token } from '@avalabs/glacier-sdk';
|
|
15
15
|
|
|
16
|
-
async function Te({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 Pr=process.env.GLACIER_API_KEY,x=async t=>{let{chainId:e,chainName:r,rpcUrl:n,multiContractAddress:s,pollingInterval:o=2e3}=t,a=new JsonRpcBatchInternal({maxCalls:40,multiContractAddress:s},xr(n,Pr),new Network(r,e));return a.pollingInterval=o,a},wr=["glacier-api.avax.network","proxy-api.avax.network"];function xr(t,e){let r=new URL(t);if(e&&wr.includes(r.hostname)){let n=r.searchParams;return n.set("token",e),r.search=n.toString(),r.toString()}return t}var _e={LOW:1n,MEDIUM:4n,HIGH:6n},Be=500000000n;async function Xe({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n,caipId:s,proxyApiUrl:o}){let a=await x({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n});if(!o)throw rpcErrors.internal("Proxy API URL is needed");let i=await a.getBlock("latest",!1);if(!i)throw rpcErrors.internal("There is no block");let c=i.baseFeePerGas;if(!c)throw rpcErrors.internal("Pre-EIP-1559 networks are not supported");let l=await Cr(o,s),p=new TokenUnit(l,0,""),m=new TokenUnit(c,0,""),h=BigInt("1000000000"),u=m.mul(p).add(h).toSubUnit(),y=Be*_e.LOW,g=Be*_e.MEDIUM,E=Be*_e.HIGH;return {baseFee:u,low:{maxFeePerGas:u+y,maxPriorityFeePerGas:y},medium:{maxFeePerGas:u+g,maxPriorityFeePerGas:g},high:{maxFeePerGas:u+E,maxPriorityFeePerGas:E},isFixedFee:!1,displayDecimals:9}}async function Cr(t,e){if(!e)return 1.5;try{let n=await fetch(t);if(!n.ok)throw new Error(n.statusText);let s=await n.json();return s[e]??s.default}catch{return 1.5}}function $(t,e,r="tx"){return `${t}/${r}/${e}`}var Qe=({tx:t,networkToken:e,chainId:r,explorerUrl:n,address:s})=>{let o=t.from.toLowerCase()===s.toLowerCase(),a=parseInt(t.timeStamp)*1e3,i=e.decimals,l=new TokenUnit(t.value,e.decimals,e.symbol).toDisplay(),p=o?TransactionType.SEND:TransactionType.RECEIVE,{from:m,to:h,gasPrice:u,gasUsed:y,hash:g}=t,E=$(n,g);return {isIncoming:!o,isOutgoing:o,isContractCall:Dr(t),timestamp:a,hash:g,isSender:o,from:m,to:h,tokens:[{decimal:i.toString(),name:e.name,symbol:e.symbol,amount:l,type:TokenType.NATIVE}],gasUsed:y,gasPrice:u,chainId:r.toString(),txType:p,explorerLink:E}};function Dr(t){return t.input!=="0x"}function tt({tx:t,address:e,explorerUrl:r,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),o=parseInt(t.timeStamp)*1e3,i=new TokenUnit(t.value,Number(t.tokenDecimal),t.tokenSymbol).toDisplay(),{from:c,to:l,gasPrice:p,gasUsed:m,hash:h,tokenDecimal:u,tokenName:y,tokenSymbol:g}=t,E=s?TransactionType.SEND:TransactionType.RECEIVE,b=$(r,h);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:o,hash:h,isSender:s,from:c,to:l,tokens:[{decimal:u,name:y,symbol:g,type:TokenType.ERC20,amount:i}],gasUsed:m,gasPrice:p,chainId:n.toString(),txType:E,explorerLink:b}}var rt=async({isTestnet:t,networkToken:e,explorerUrl:r,chainId:n,address:s,nextPageToken:o,offset:a})=>{let i=o?JSON.parse(o):void 0,c=i?.page||1,l=i?.queries||["normal","erc20"],p=(l.includes("normal")?await getNormalTxs(s,!t,{page:c,offset:a}):[]).map(g=>Qe({tx:g,chainId:n,networkToken:e,explorerUrl:r,address:s})),m=(l.includes("erc20")?await getErc20Txs(s,!t,void 0,{page:c,offset:a}):[]).map(g=>tt({tx:g,address:s,explorerUrl:r,chainId:n})),h=m.map(g=>g.hash),u=p.filter(g=>!h.includes(g.hash)),y={queries:[],page:c+1};return p.length&&y.queries.push("normal"),m.length&&y.queries.push("erc20"),{transactions:[...u,...m],nextPageToken:y.queries.length?JSON.stringify(y):""}};var nt=t=>t===1||t===5||t===4||t===11155111;var st=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s,o)=>{let a=!e&&!r&&!n,i=Mr(t.method?.methodName),c=s.toLowerCase(),l=i.toLowerCase().includes("swap"),p=a&&t.from.address.toLowerCase()===c,m=a&&t.to.address.toLowerCase()===c,h=i==="Market Buy Orders With Eth"||i==="Buy NFT",u=i==="Approve",y=i.toLowerCase().includes("transfer"),g=i.toLowerCase().includes("airdrop"),E=i.toLowerCase().includes("unwrap"),b=i==="Fill Order",T=!!o[0]&&ot(o[0].type)&&o[0].from?.address.toLowerCase()===c,k=!!o[0]&&ot(o[0].type)&&o[0].to?.address.toLowerCase()===c;return l?TransactionType.SWAP:p?TransactionType.SEND:m?TransactionType.RECEIVE:h?TransactionType.NFT_BUY:u?TransactionType.APPROVE:T?TransactionType.NFT_SEND:k?TransactionType.NFT_RECEIVE:y?TransactionType.TRANSFER:g?TransactionType.AIRDROP:E?TransactionType.UNWRAP:b?TransactionType.FILL_ORDER:TransactionType.UNKNOWN};function ot(t){return t===TokenType.ERC721||t===TokenType.ERC1155}var Mr=(t="")=>t.includes("(")?Gr(t.split("(",1)[0]):t;var it=(t,{nativeTransaction:e,erc20Transfers:r,erc721Transfers:n},s)=>{let o=t===TransactionType.TRANSFER,a=t===TransactionType.SEND,i=t===TransactionType.RECEIVE,c=e?.from?.address,l=e?.to?.address;o&&r&&r[0]&&(c=r[0].from.address,l=r[0].to.address),o&&n&&n[0]&&(c=n[0].from.address,l=n[0].to.address);let p=a||o&&c.toLowerCase()===s.toLowerCase(),m=i||o&&l.toLowerCase()===s.toLowerCase();return {isOutgoing:p,isIncoming:m,isSender:c===s,from:c,to:l}};async function ct(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var Lr="https://ipfs.io";function H(t,e=Lr){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}async function Or(t,e=5e3){let r=new AbortController;return setTimeout(()=>r.abort(),e),fetch(t,{signal:r.signal})}async function lt(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 Or(H(t)).then(r=>r.json()).catch(()=>({}));else return {};return e}var Wr="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function pt(t,e="256"){let r=H(t);return `${Wr}/width=${e},fit/${r}`}var ut=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s)=>{let o=[];if(t.value!=="0"){let a=s.decimals,c=new TokenUnit(t.value,s.decimals,s.symbol).toDisplay();o.push({decimal:a.toString(),name:s.name,symbol:s.symbol,amount:c,from:t.from,to:t.to,type:TokenType.NATIVE});}return e?.forEach(a=>{let i=a.erc20Token.decimals,l=new TokenUnit(a.value,i,a.erc20Token.symbol).toDisplay();o.push({decimal:i.toString(),name:a.erc20Token.name,symbol:a.erc20Token.symbol,amount:l,from:a.from,to:a.to,imageUri:a.erc20Token.logoUri,type:TokenType.ERC20});}),r&&await Promise.allSettled(r.map(async a=>{let i=a.erc721Token,c=await dt(i.tokenUri,i.metadata.imageUri);o.push({name:a.erc721Token.name,symbol:a.erc721Token.symbol,amount:"1",imageUri:c,from:a.from,to:a.to,collectableTokenId:a.erc721Token.tokenId,type:TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async a=>{let i=a.erc1155Token,c=await dt(i.tokenUri,i.metadata.imageUri);o.push({name:a.erc1155Token.metadata.name??"",symbol:a.erc1155Token.metadata.symbol??"",amount:a.value,imageUri:c,from:a.from,to:a.to,collectableTokenId:a.erc1155Token.tokenId,type:TokenType.ERC1155});})),o},dt=async(t,e)=>{if(e)return e.startsWith("ipfs://")?H(e):e;{let[r,n]=await ct(lt(t));return n?"":r.image?pt(r.image):""}};var gt=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER],F=(a=>(a.TOTAL_SUPPLY="totalSupply",a.BALANCE_OF="balanceOf",a.TRANSFER="transfer",a.TRANSFER_FROM="transferFrom",a.APPROVE="approve",a.ALLOWANCE="allowance",a))(F||{});var ft=async({transactions:t,explorerUrl:e,networkToken:r,chainId:n,address:s})=>{let o=await ut(t,r),a=st(t,s,o),{isOutgoing:i,isIncoming:c,isSender:l,from:p,to:m}=it(a,t,s),{blockTimestamp:h,txHash:u,gasPrice:y,gasUsed:g}=t.nativeTransaction,E=$(e,u);return {isContractCall:!gt.includes(a),isIncoming:c,isOutgoing:i,isSender:l,timestamp:h*1e3,hash:u,from:p,to:m,tokens:o,gasPrice:y,gasUsed:g,chainId:n.toString(),txType:a,explorerLink:E}};var yt=async({chainId:t,explorerUrl:e,networkToken:r,address:n,nextPageToken:s,offset:o,glacierService:a})=>{try{let i=await a.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:o});return {transactions:(await Promise.all(i.transactions.filter(p=>p.nativeTransaction.txStatus==="1").map(p=>ft({transactions:p,explorerUrl:e,networkToken:r,chainId:t,address:n}).then(m=>m)))).filter(p=>p.tokens.find(m=>Number(m.amount)!==0)),nextPageToken:i.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var ht=async({chainId:t,isTestnet:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:o,offset:a,glacierService:i})=>nt(t)?rt({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:o,offset:a}):i.isHealthy()?yt({networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:o,offset:a,glacierService:i}):{transactions:[],nextPageToken:""};var Tt={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["eip155:*"],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["personal_sign","eth_sendTransaction","eth_*","web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"]}},manifestVersion:"0.0"};var Hr=z.object({from:z.string().length(42),to:z.string().length(42),data:z.string().optional(),value:z.string().startsWith("0x").optional(),gas:z.string().startsWith("0x").optional(),gasPrice:z.string().startsWith("0x").optional(),maxFeePerGas:z.string().startsWith("0x").optional(),maxPriorityFeePerGas:z.string().startsWith("0x").optional(),nonce:z.string().optional(),chainId:z.string().optional()}),jr=z.array(Hr).length(1),kt=t=>jr.safeParse(t);var Et=async({transactionParams:{from:t,to:e,data:r,value:n},provider:s})=>{let o=await s.getTransactionCount(t);return Number(await s.estimateGas({from:t,to:e,nonce:o,data:r,value:n}))};var bt=async({from:t,provider:e})=>e.getTransactionCount(t);var It="DUMMY_API_KEY",Rt=async({proxyApiUrl:t,chainId:e,params:r,domain:n})=>new vt({baseURL:t+"/proxy/blockaid/",apiKey:It}).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}}),St=async({proxyApiUrl:t,chainId:e,accountAddress:r,data:n,domain:s})=>new vt({baseURL:t+"/proxy/blockaid/",apiKey:It}).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 Ct=async(t,e,r)=>{if(!t.data)return {tokenApprovals:void 0,balanceChange:void 0};try{let n=new ethers.Contract(t.to,xt.abi,r),s=await Promise.all([n.name?.(),n.symbol?.(),n.decimals?.()]),o=Pt(s[0]),a=Pt(s[1]),i=parseInt(s[2]),c={type:TokenType.ERC20,name:o,chainId:e,symbol:a,decimals:i,address:t.to,contractType:"ERC-20"},l=new ethers.Interface(xt.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,c.decimals,c.symbol).toDisplay(),usdPrice:void 0}],token:c}],ins:[]}};if(p?.name==="approve")return {tokenApprovals:{isEditable:!0,approvals:[{token:c,spenderAddress:m.spender,value:m.amount}]}}}catch(n){console.error("parseErc20Tx error",n);}return {tokenApprovals:void 0,balanceChange:void 0}};var At=async({request:t,dAppUrl:e,params:r,chainId:n,proxyApiUrl:s,provider:o})=>{let a,i,c,l=!1;try{let{validation:p,simulation:m}=await Rt({proxyApiUrl:s,chainId:n,params:r,domain:e});!p||p.result_type==="Error"||p.result_type==="Warning"?a=ie[AlertType.WARNING]:p.result_type==="Malicious"&&(a=ie[AlertType.DANGER]),m?.status==="Success"&&(l=!0,c=Dt(t,m.account_summary.exposures),i=_t(m.account_summary.assets_diffs));}catch(p){console.error("processTransactionSimulation error",p);}if(!l&&r.to){let p=await Ct(r,n,o);i=p.balanceChange,c=p.tokenApprovals;}return {alert:a,balanceChange:i,tokenApprovals:c,isSimulationSuccessful:l}},Dt=(t,e)=>{let r=[];for(let s of e){let o=Bt(s.asset);if(o)for(let[a,i]of Object.entries(s.spenders))if(i.exposure.length===0)r.push({token:o,spenderAddress:a,logoUri:o.logoUri});else for(let c of i.exposure)"raw_value"in c?r.push({token:o,spenderAddress:a,value:c.raw_value,usdPrice:c.usd_price,logoUri:o.logoUri}):r.push({token:o,spenderAddress:a,logoUri:c.logo_url,usdPrice:c.usd_price});}return r.length===0?void 0:{isEditable:r.length===1&&r[0]?.token.type===TokenType.ERC20&&t.method===RpcMethod.ETH_SEND_TRANSACTION,approvals:r}},_t=t=>{let e=Nt(t,"in"),r=Nt(t,"out");if(!(e.length===0&&r.length===0))return {ins:e,outs:r}},Nt=(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?Bt(n):Zr(n);if(!s)return;let o=r[e].map(a=>{let i;if("value"in a&&a.value)if("decimals"in s){let c=numberToBN(a.value,s.decimals);i=balanceToDisplayValue(c,s.decimals);}else isHexString(a.value)&&(i=parseInt(a.value,16).toString());else "type"in s&&s.type===TokenType.ERC721&&(i="1");return i?{displayValue:i,usdPrice:a.usd_price}:void 0}).filter(a=>a!==void 0);return {token:s,items:o}}).filter(r=>r!==void 0),Bt=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},Zr=t=>({name:t.name??"",symbol:t.symbol??"",decimals:t.decimals,description:"",logoUri:t.logo_url}),Ut=async({request:t,dAppUrl:e,accountAddress:r,chainId:n,data:s,proxyApiUrl:o})=>{let a,i,c;try{let{validation:l,simulation:p}=await St({proxyApiUrl:o,chainId:n,accountAddress:r,data:s,domain:e});!l||l.result_type==="Error"||l.result_type==="Warning"?a=ie[AlertType.WARNING]:l.result_type==="Malicious"&&(a=ie[AlertType.DANGER]),p?.status==="Success"&&(c=Dt(t,p.account_summary.exposures),i=_t(p.account_summary.assets_diffs));}catch(l){console.error("processJsonRpcSimulation error",l),a=ie[AlertType.WARNING];}return {alert:a,balanceChange:i,tokenApprovals:c}},ie={[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 Ee=t=>{if(t.data)try{let r=new Interface(xt.abi).parseTransaction({data:t.data,value:t.value}),n=r?.name??r?.fragment?.name;return n&&tn(n)?n:void 0}catch{return}};function tn(t){return Object.values(F).includes(t)}var Ge=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=ce.exponential()})=>{let s=0,o=0,a;for(;o<r;){o>0&&await rn(s);try{let c=await t(o);if(e(c))return c}catch(c){a=c;}s=n(o),o++;}let i=a?`Max retry exceeded. ${a}`:"Max retry exceeded.";throw new Error(i)},ce=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function rn(t){return new Promise(e=>setTimeout(e,t))}var Me=t=>Ge({operation:e=>t(e>0),maxRetries:2,backoffPolicy:ce.constant(1),isSuccess:e=>e?.status?.error_code!==429});function Vt(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function Fe(t){let e,r=0;for(e=0;e<t.length;e++){let n=Vt(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function Y(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 le=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return Y([`${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 Y([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${s}`,{method:"POST",headers:{"Content-Type":"application/json"}}],SimplePriceResponseSchema)}};var Gt=getBasicCoingeckoHttp(),V,J,q=class{constructor({storage:e,proxyApiUrl:r}){c(this,V,void 0);c(this,J,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(s=>{let o=e[s];n[s]={},r.forEach(a=>{n[s]={[a]:{price:o?.[a],change24:o?.[`${a}_24h_change`],vol24:o?.[`${a}_24h_vol`],marketCap:o?.[`${a}_market_cap`]}};});}),n});d(this,V,e),d(this,J,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,o=`getSimplePrice-${e?`${Fe(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b(this,V)?.get?.(o),n)return n;try{n=await Me(a=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:a}));}catch{n=void 0;}return b(this,V)?.set?.(o,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,a=`getPricesWithMarketDataByAddresses-${`${Fe(e)}-${r}-${n}`}`;if(s=b(this,V)?.get?.(a),s)return s;try{s=await Me(i=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:i}));}catch{s=void 0;}return b(this,V)?.set?.(a,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:s=!1}){return s?new le(b(this,J)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}):simpleTokenPrice(Gt,{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:o=!1,lastUpdated:a=!1,useCoingeckoProxy:i=!1,shouldThrow:c=!0}){if(i){let l=await new le(b(this,J)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:s,include_24hr_change:o,include_last_updated_at:a});return this.transformSimplePriceResponse(l,r)}return simplePrice(Gt,{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:o,lastUpdated:a,shouldThrow:c})}};V=new WeakMap,J=new WeakMap;var un="https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json",gn="https://latest.currency-api.pages.dev/v1/currencies/usd.min.json",Mt=object({date:string(),usd:record(number())}),be=async()=>{try{return await Y([un],Mt)}catch{return await Y([gn],Mt)}};var Le=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),Ft=(t,e)=>({label:t,value:e,type:DetailItemType.LINK}),Ie=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e});var Oe=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});var We=({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}};function Lt(t,e,r){return new ethers.Contract(t,xt.abi).interface.encodeFunctionData("approve",[e,r])}var Re=new Map,Ot=(t,e,r)=>(Re.set(t,{signingData:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:s,approvalLimit:o})=>{let a=Re.get(t);if(!a)throw rpcErrors.resourceNotFound();let{signingData:i,displayData:c}=a,l={...i,data:{...i.data,maxFeePerGas:n??i.data.maxFeePerGas,maxPriorityFeePerGas:s??i.data.maxPriorityFeePerGas}},p={...c};if(typeof o=="string"){if(!o.startsWith("0x"))throw rpcErrors.invalidInput("Expected approvalLimit to be a hexadecimal number (0x-prefixed)");let h=c.tokenApprovals;hn(h),Tn(i.data.data);let u=h.approvals[0];l.data.data=Lt(u.token.address,u.spenderAddress,o),p.tokenApprovals={approvals:[{...u,value:o}],isEditable:!0};}let m={signingData:l,displayData:p};return Re.set(t,m),m},cleanup:()=>Re.delete(t)});function hn(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 Tn(t){if((!t||t==="0x"?null:Ee({data:t??void 0}))!=="approve")throw rpcErrors.invalidInput("Cannot change invoked method for requests in progress. Please start a new request instead.")}var Wt=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{dappInfo:s,params:o}=t,a=kt(o);if(!a.success)return console.error("invalid params",a.error),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a.error}})};let i=a.data[0];if(!i)return {error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a.error}})};let c=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 A=await Et({transactionParams:{from:i.from,to:i.to,data:i.data,value:i.value},provider:c});i.gas="0x"+A.toString(16);}catch{return {error:rpcErrors.internal("Unable to calculate gas limit")}}if(!i.nonce)try{let A=await bt({from:i.from,provider:c});i.nonce=String(A);}catch{return {error:rpcErrors.internal("Unable to calculate nonce")}}let l=Ee(i),{alert:p,balanceChange:m,tokenApprovals:h,isSimulationSuccessful:u}=await At({request:t,proxyApiUrl:n,chainId:e.chainId,params:i,dAppUrl:t.dappInfo.url,provider:c}),y="Approve Transaction";l==="approve"&&(y="Token Spend Approval");let g=[Ft("Website",s),Ie("From",i.from),Ie("To",i.to)];l&&g.push(Le("Type",l)),i.data&&g.push(Oe("Data",i.data));let E={title:y,network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:[{title:"Transaction Details",items:g}],networkFeeSelector:!0,alert:p,balanceChange:m,tokenApprovals:h,isSimulationSuccessful:u},b={type:RpcMethod.ETH_SEND_TRANSACTION,account:i.from,data:{type:2,nonce:Number(i.nonce),gasLimit:Number(i.gas),to:i.to,from:i.from,data:i.data,value:i.value,chainId:i.chainId??e.chainId}},{updateTx:T,cleanup:k}=Ot(t.requestId,b,E),w=await r.requestApproval({request:t,displayData:E,signingData:b,updateTx:T});if(k(),"error"in w)return {error:w.error};let se;try{se=await En(c,w);}catch(A){return {error:rpcErrors.internal({message:"Unable to get transaction hash",data:{cause:A}})}}return bn({provider:c,txHash:se,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,requestId:t.requestId}),{result:se}},En=async(t,e)=>"txHash"in e?e.txHash:await t.send("eth_sendRawTransaction",[e.signedData]),bn=async({provider:t,txHash:e,onTransactionConfirmed:r,onTransactionReverted:n,requestId:s})=>{try{(await t.waitForTransaction(e))?.status===1?r(e,s):n(e,s);}catch(o){console.error(o),n(e,s);}};async function $t(t,e){let r=t.map(async(o,a)=>({index:a,result:await e(o)})),s=(await Promise.allSettled(r)).filter(o=>o.status==="fulfilled").map(o=>o).find(o=>o.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},{}))}function Pe(t){return t.type===TokenType.ERC20}var R,Z,L,de,we=class{constructor({network:e,storage:r,proxyApiUrl:n,customTokens:s}){c(this,R,void 0);c(this,Z,void 0);c(this,L,void 0);c(this,de,void 0);d(this,R,e),d(this,Z,r),d(this,L,n),d(this,de,s);}async isNetworkSupported(){return !0}async getNativeBalance({chainId:e,address:r,currency:n}){let s=await x({chainId:e,chainName:b(this,R).chainName,rpcUrl:b(this,R).rpcUrl,multiContractAddress:b(this,R).utilityAddresses?.multicall}),o=b(this,R).pricingProviders?.coingecko.nativeTokenId,a=b(this,R).networkToken,i=new q({storage:b(this,Z),proxyApiUrl:b(this,L)}),c=o?await i.getSimplePrice({coinIds:[o],currencies:[n]}):{},l=c?.[o??""]?.[n]?.price??void 0,p=c?.[o??""]?.[n]?.marketCap??void 0,m=c?.[o??""]?.[n]?.vol24??void 0,h=c?.[o??""]?.[n]?.change24??void 0,u=await s.getBalance(r),y=new TokenUnit(u,a.decimals,a.symbol),g=l!==void 0?y.mul(l):void 0;return {...a,coingeckoId:o??"",type:TokenType.NATIVE,balance:u,balanceDisplayValue:y.toDisplay(),balanceInCurrency:g?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:g?.toDisplay({fixedDp:2}),priceInCurrency:l,marketCap:p,vol24:m,change24:h}}async listErc20Balances({chainId:e,address:r,currency:n}){let s=await x({chainId:e,chainName:b(this,R).chainName,rpcUrl:b(this,R).rpcUrl,multiContractAddress:b(this,R).utilityAddresses?.multicall}),o=b(this,R).pricingProviders?.coingecko.assetPlatformId,a=b(this,R).pricingProviders?.coingecko.nativeTokenId,i=await Te({chainId:Number(e),proxyApiUrl:b(this,L)}),c=i.map(b=>b.address),l=[...i,...b(this,de)].filter(Pe),p=async b=>{let w=await new ethers.Contract(b.address,xt.abi,s).balanceOf?.(r)||0n;return {...b,balance:w}},m=l.map(b=>K(p(b),b.address)),h=await X(m),u=new q({storage:b(this,Z),proxyApiUrl:b(this,L)}),y=o&&await u.getPricesByAddresses(c,o,n)||{},g=Object.keys(h),E={};for(let b=0;b<g.length;b++){let T=g[b];if(T===void 0)continue;let k=h[T];if(k===void 0||"error"in k){E[T]={error:`rpcService:getTokenWithBalance failed: ${k?.error??"unknown error"}`};continue}let w=y?.[a??""]?.[n]?.price??void 0,se=y?.[a??""]?.[n]?.marketCap??void 0,A=y?.[a??""]?.[n]?.vol24??void 0,vr=y?.[a??""]?.[n]?.change24??void 0,qe=new TokenUnit(k.balance,k.decimals,k.symbol),ze=w!==void 0?qe.mul(w):void 0;E[k.address.toLowerCase()]={...k,type:TokenType.ERC20,balance:k.balance,balanceDisplayValue:qe.toDisplay(),balanceInCurrency:ze?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:ze?.toDisplay({fixedDp:2}),priceInCurrency:w,marketCap:se,change24:vr,vol24:A};}return E}async listNftBalances(){return {}}};R=new WeakMap,Z=new WeakMap,L=new WeakMap,de=new WeakMap;var Yt=async({addresses:t,currency:e,network:r,proxyApiUrl:n,tokenTypes:s=[TokenType.NATIVE,TokenType.ERC20,TokenType.ERC721,TokenType.ERC1155],customTokens:o=[],storage:a,balanceServices:i=[]})=>{let c=r.chainId,l=[...i,new we({network:r,storage:a,proxyApiUrl:n,customTokens:o})],p=await $t(l,h=>h.isNetworkSupported(r.chainId)),m={};if(p){let h=[],u=[],y=[];t.forEach(T=>{s.includes(TokenType.NATIVE)&&h.push(K(p.getNativeBalance({address:T,currency:e.toUpperCase(),chainId:c}),T)),s.includes(TokenType.ERC20)&&u.push(K(p.listErc20Balances({customTokens:o.filter(Pe),currency:e.toUpperCase(),chainId:c,address:T,pageSize:100}),T)),(s.includes(TokenType.ERC721)||s.includes(TokenType.ERC1155))&&y.push(K(p.listNftBalances({chainId:c,address:T}),T));});let g=await X(h),E=await X(u),b=await X(y);Object.keys(g).forEach(T=>{let k=g[T];if(!k||"error"in k){m[T]={error:`getNativeBalance failed: ${k?.error??"unknown error"}`};return}let w=k.symbol;m[T]={[w]:k};}),Object.keys(E).forEach(T=>{let k=E[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(b).forEach(T=>{let k=b[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(h=>{m[h]={error:"unsupported network"};});return m};var Sn={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},Pn={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},qt=t=>{switch(t){case Environment.PRODUCTION:return Sn;case Environment.DEV:return Pn}};var xn="https://ipfs.io";function zt(t,e=xn){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}var Cn="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function Kt(t,e="256"){let r=zt(t);return `${Cn}/width=${e},fit/${r}`}var _=class extends Error{constructor(){super(...arguments);a(this,"message","Glacier is unhealthy. Try again later.");}},xe=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 _&&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 _&&this.setGlacierToUnhealthy(),s}}async getNativeBalance({chainId:e,address:r,currency:n,coingeckoId:s}){try{let a=(await this.glacierSdk.evmBalances.getNativeBalance({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase()})).nativeTokenBalance,i=new TokenUnit(a.balance,a.decimals,a.symbol),c=a.price?.value,l=c!==void 0?i.mul(c):void 0;return {name:a.name,symbol:a.symbol,decimals:a.decimals,type:TokenType.NATIVE,logoUri:a.logoUri,balance:i.toSubUnit(),balanceDisplayValue:i.toDisplay(),balanceInCurrency:l?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:l?.toDisplay({fixedDp:2}),priceInCurrency:c,coingeckoId:s??""}}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}}async listErc721Balances({chainId:e,address:r}){let n,s=[];do try{let o=await this.glacierSdk.evmBalances.listErc721Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...o.erc721TokenBalances),n=o.nextPageToken;}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}while(n);return s}async listErc1155Balances({chainId:e,address:r}){let n,s=[];do try{let o=await this.glacierSdk.evmBalances.listErc1155Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...o.erc1155TokenBalances),n=o.nextPageToken;}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}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(o=>o.status==="fulfilled").flatMap(o=>o.value.map(a=>[`${a.address}-${a.tokenId}`,{address:a.address,description:a.metadata.description??"",logoUri:a.metadata.imageUri??"",logoSmall:Kt(a.metadata.imageUri??""),name:a.metadata.name??"",symbol:a.metadata.symbol??"",tokenId:a.tokenId,tokenUri:a.tokenUri,collectionName:"Unkown",balance:a.ercType===Erc1155Token.ercType.ERC_1155?BigInt(a.balance):1,balanceDisplayValue:a.ercType===Erc1155Token.ercType.ERC_1155?a.balance:"1",type:a.ercType===Erc721Token.ercType.ERC_721?TokenType.ERC721:TokenType.ERC1155,metadata:{description:a.metadata.description,lastUpdatedTimestamp:a.metadata.metadataLastUpdatedTimestamp,properties:a.ercType===Erc721Token.ercType.ERC_721?a.metadata.attributes:a.metadata.properties}}]));return Object.fromEntries(s)}async listErc20Balances({chainId:e,address:r,currency:n,customTokens:s}){try{let o=[],a;do{let i=await this.glacierSdk.evmBalances.listErc20Balances({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase(),pageSize:100,pageToken:a});o.push(..._n(i.erc20TokenBalances,Number(e))),a=i.nextPageToken;}while(a);return [...Dn(s),...o].reduce((i,c)=>({...i,[c.address.toLowerCase()]:c}),{})}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}}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(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}}},Dn=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})),_n=(t,e)=>t.map(r=>{let n=new TokenUnit(r.balance,r.decimals,r.symbol),s=n.toDisplay(),o=r.balanceValue?.value.toString(),a=r.price?.value,i=a!==void 0?n.mul(a).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:o,balanceDisplayValue:s,balanceInCurrency:i,priceInCurrency:a,type:TokenType.ERC20}});var $e=t=>{let e="";e+=`Domain
|
|
16
|
+
async function Te({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 xr=process.env.GLACIER_API_KEY,w=async t=>{let{chainId:e,chainName:r,rpcUrl:n,multiContractAddress:s,pollingInterval:o=2e3}=t,a=new JsonRpcBatchInternal({maxCalls:40,multiContractAddress:s},Cr(n,xr),new Network(r,e));return a.pollingInterval=o,a},wr=["glacier-api.avax.network","proxy-api.avax.network"];function Cr(t,e){let r=new URL(t);if(e&&wr.includes(r.hostname)){let n=r.searchParams;return n.set("token",e),r.search=n.toString(),r.toString()}return t}var _e={LOW:1n,MEDIUM:4n,HIGH:6n},Be=500000000n;async function Xe({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n,caipId:s,proxyApiUrl:o}){let a=await w({chainId:t,chainName:e,rpcUrl:r,multiContractAddress:n});if(!o)throw rpcErrors.internal("Proxy API URL is needed");let i=await a.getBlock("latest",!1);if(!i)throw rpcErrors.internal("There is no block");let c=i.baseFeePerGas;if(!c)throw rpcErrors.internal("Pre-EIP-1559 networks are not supported");let l=await Nr(o,s),p=new TokenUnit(l,0,""),m=new TokenUnit(c,0,""),h=BigInt("1000000000"),u=m.mul(p).add(h).toSubUnit(),f=Be*_e.LOW,g=Be*_e.MEDIUM,E=Be*_e.HIGH;return {baseFee:u,low:{maxFeePerGas:u+f,maxPriorityFeePerGas:f},medium:{maxFeePerGas:u+g,maxPriorityFeePerGas:g},high:{maxFeePerGas:u+E,maxPriorityFeePerGas:E},isFixedFee:!1,displayDecimals:9}}async function Nr(t,e){if(!e)return 1.5;try{let n=await fetch(t);if(!n.ok)throw new Error(n.statusText);let s=await n.json();return s[e]??s.default}catch{return 1.5}}function $(t,e,r="tx"){return `${t}/${r}/${e}`}var Qe=({tx:t,networkToken:e,chainId:r,explorerUrl:n,address:s})=>{let o=t.from.toLowerCase()===s.toLowerCase(),a=parseInt(t.timeStamp)*1e3,i=e.decimals,l=new TokenUnit(t.value,e.decimals,e.symbol).toDisplay(),p=o?TransactionType.SEND:TransactionType.RECEIVE,{from:m,to:h,gasPrice:u,gasUsed:f,hash:g}=t,E=$(n,g);return {isIncoming:!o,isOutgoing:o,isContractCall:_r(t),timestamp:a,hash:g,isSender:o,from:m,to:h,tokens:[{decimal:i.toString(),name:e.name,symbol:e.symbol,amount:l,type:TokenType.NATIVE}],gasUsed:f,gasPrice:u,chainId:r.toString(),txType:p,explorerLink:E}};function _r(t){return t.input!=="0x"}function tt({tx:t,address:e,explorerUrl:r,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),o=parseInt(t.timeStamp)*1e3,i=new TokenUnit(t.value,Number(t.tokenDecimal),t.tokenSymbol).toDisplay(),{from:c,to:l,gasPrice:p,gasUsed:m,hash:h,tokenDecimal:u,tokenName:f,tokenSymbol:g}=t,E=s?TransactionType.SEND:TransactionType.RECEIVE,b=$(r,h);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:o,hash:h,isSender:s,from:c,to:l,tokens:[{decimal:u,name:f,symbol:g,type:TokenType.ERC20,amount:i}],gasUsed:m,gasPrice:p,chainId:n.toString(),txType:E,explorerLink:b}}var rt=async({isTestnet:t,networkToken:e,explorerUrl:r,chainId:n,address:s,nextPageToken:o,offset:a})=>{let i=o?JSON.parse(o):void 0,c=i?.page||1,l=i?.queries||["normal","erc20"],p=(l.includes("normal")?await getNormalTxs(s,!t,{page:c,offset:a}):[]).map(g=>Qe({tx:g,chainId:n,networkToken:e,explorerUrl:r,address:s})),m=(l.includes("erc20")?await getErc20Txs(s,!t,void 0,{page:c,offset:a}):[]).map(g=>tt({tx:g,address:s,explorerUrl:r,chainId:n})),h=m.map(g=>g.hash),u=p.filter(g=>!h.includes(g.hash)),f={queries:[],page:c+1};return p.length&&f.queries.push("normal"),m.length&&f.queries.push("erc20"),{transactions:[...u,...m],nextPageToken:f.queries.length?JSON.stringify(f):""}};var nt=t=>t===1||t===5||t===4||t===11155111;var st=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s,o)=>{let a=!e&&!r&&!n,i=Fr(t.method?.methodName),c=s.toLowerCase(),l=i.toLowerCase().includes("swap"),p=a&&t.from.address.toLowerCase()===c,m=a&&t.to.address.toLowerCase()===c,h=i==="Market Buy Orders With Eth"||i==="Buy NFT",u=i==="Approve",f=i.toLowerCase().includes("transfer"),g=i.toLowerCase().includes("airdrop"),E=i.toLowerCase().includes("unwrap"),b=i==="Fill Order",T=!!o[0]&&ot(o[0].type)&&o[0].from?.address.toLowerCase()===c,k=!!o[0]&&ot(o[0].type)&&o[0].to?.address.toLowerCase()===c;return l?TransactionType.SWAP:p?TransactionType.SEND:m?TransactionType.RECEIVE:h?TransactionType.NFT_BUY:u?TransactionType.APPROVE:T?TransactionType.NFT_SEND:k?TransactionType.NFT_RECEIVE:f?TransactionType.TRANSFER:g?TransactionType.AIRDROP:E?TransactionType.UNWRAP:b?TransactionType.FILL_ORDER:TransactionType.UNKNOWN};function ot(t){return t===TokenType.ERC721||t===TokenType.ERC1155}var Fr=(t="")=>t.includes("(")?Mr(t.split("(",1)[0]):t;var it=(t,{nativeTransaction:e,erc20Transfers:r,erc721Transfers:n},s)=>{let o=t===TransactionType.TRANSFER,a=t===TransactionType.SEND,i=t===TransactionType.RECEIVE,c=e?.from?.address,l=e?.to?.address;o&&r&&r[0]&&(c=r[0].from.address,l=r[0].to.address),o&&n&&n[0]&&(c=n[0].from.address,l=n[0].to.address);let p=a||o&&c.toLowerCase()===s.toLowerCase(),m=i||o&&l.toLowerCase()===s.toLowerCase();return {isOutgoing:p,isIncoming:m,isSender:c===s,from:c,to:l}};async function ct(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var Or="https://ipfs.io";function H(t,e=Or){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}async function Wr(t,e=5e3){let r=new AbortController;return setTimeout(()=>r.abort(),e),fetch(t,{signal:r.signal})}async function lt(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 Wr(H(t)).then(r=>r.json()).catch(()=>({}));else return {};return e}var $r="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function pt(t,e="256"){let r=H(t);return `${$r}/width=${e},fit/${r}`}var ut=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s)=>{let o=[];if(t.value!=="0"){let a=s.decimals,c=new TokenUnit(t.value,s.decimals,s.symbol).toDisplay();o.push({decimal:a.toString(),name:s.name,symbol:s.symbol,amount:c,from:t.from,to:t.to,type:TokenType.NATIVE});}return e?.forEach(a=>{let i=a.erc20Token.decimals,l=new TokenUnit(a.value,i,a.erc20Token.symbol).toDisplay();o.push({decimal:i.toString(),name:a.erc20Token.name,symbol:a.erc20Token.symbol,amount:l,from:a.from,to:a.to,imageUri:a.erc20Token.logoUri,type:TokenType.ERC20});}),r&&await Promise.allSettled(r.map(async a=>{let i=a.erc721Token,c=await dt(i.tokenUri,i.metadata.imageUri);o.push({name:a.erc721Token.name,symbol:a.erc721Token.symbol,amount:"1",imageUri:c,from:a.from,to:a.to,collectableTokenId:a.erc721Token.tokenId,type:TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async a=>{let i=a.erc1155Token,c=await dt(i.tokenUri,i.metadata.imageUri);o.push({name:a.erc1155Token.metadata.name??"",symbol:a.erc1155Token.metadata.symbol??"",amount:a.value,imageUri:c,from:a.from,to:a.to,collectableTokenId:a.erc1155Token.tokenId,type:TokenType.ERC1155});})),o},dt=async(t,e)=>{if(e)return e.startsWith("ipfs://")?H(e):e;{let[r,n]=await ct(lt(t));return n?"":r.image?pt(r.image):""}};var gt=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER],F=(a=>(a.TOTAL_SUPPLY="totalSupply",a.BALANCE_OF="balanceOf",a.TRANSFER="transfer",a.TRANSFER_FROM="transferFrom",a.APPROVE="approve",a.ALLOWANCE="allowance",a))(F||{});var yt=async({transactions:t,explorerUrl:e,networkToken:r,chainId:n,address:s})=>{let o=await ut(t,r),a=st(t,s,o),{isOutgoing:i,isIncoming:c,isSender:l,from:p,to:m}=it(a,t,s),{blockTimestamp:h,txHash:u,gasPrice:f,gasUsed:g}=t.nativeTransaction,E=$(e,u);return {isContractCall:!gt.includes(a),isIncoming:c,isOutgoing:i,isSender:l,timestamp:h*1e3,hash:u,from:p,to:m,tokens:o,gasPrice:f,gasUsed:g,chainId:n.toString(),txType:a,explorerLink:E}};var ft=async({chainId:t,explorerUrl:e,networkToken:r,address:n,nextPageToken:s,offset:o,glacierService:a})=>{try{let i=await a.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:o});return {transactions:(await Promise.all(i.transactions.filter(p=>p.nativeTransaction.txStatus==="1").map(p=>yt({transactions:p,explorerUrl:e,networkToken:r,chainId:t,address:n}).then(m=>m)))).filter(p=>p.tokens.find(m=>Number(m.amount)!==0)),nextPageToken:i.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var ht=async({chainId:t,isTestnet:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:o,offset:a,glacierService:i})=>nt(t)?rt({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:o,offset:a}):i.isHealthy()?ft({networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:o,offset:a,glacierService:i}):{transactions:[],nextPageToken:""};var Tt={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["eip155:*"],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["personal_sign","eth_sendTransaction","eth_*","web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"]}},manifestVersion:"0.0"};var jr=z.object({from:z.string().length(42),to:z.string().length(42).optional(),data:z.string().optional(),value:z.string().startsWith("0x").optional(),gas:z.string().startsWith("0x").optional(),gasPrice:z.string().startsWith("0x").optional(),maxFeePerGas:z.string().startsWith("0x").optional(),maxPriorityFeePerGas:z.string().startsWith("0x").optional(),nonce:z.string().optional(),chainId:z.string().optional()}),Yr=z.array(jr).length(1),kt=t=>Yr.safeParse(t);var Et=async({transactionParams:{from:t,to:e,data:r,value:n},provider:s})=>{let o=await s.getTransactionCount(t);return Number(await s.estimateGas({from:t,to:e,nonce:o,data:r,value:n}))};var bt=async({from:t,provider:e})=>e.getTransactionCount(t);var Rt="DUMMY_API_KEY",It=async({proxyApiUrl:t,chainId:e,params:r,domain:n})=>new vt({baseURL:t+"/proxy/blockaid/",apiKey:Rt}).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}}),St=async({proxyApiUrl:t,chainId:e,accountAddress:r,data:n,domain:s})=>new vt({baseURL:t+"/proxy/blockaid/",apiKey:Rt}).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 Ct=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?.()]),o=Pt(s[0]),a=Pt(s[1]),i=parseInt(s[2]),c={type:TokenType.ERC20,name:o,chainId:e,symbol:a,decimals:i,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,c.decimals,c.symbol).toDisplay(),usdPrice:void 0}],token:c}],ins:[]}};if(p?.name==="approve")return {tokenApprovals:{isEditable:!0,approvals:[{token:c,spenderAddress:m.spender,value:m.amount}]}}}catch(n){console.error("parseErc20Tx error",n);}return {tokenApprovals:void 0,balanceChange:void 0}};function Ee(t){return t.type===TokenType.ERC20}function Nt(t){return typeof t.to=="string"}var Dt=async({request:t,dAppUrl:e,params:r,chainId:n,proxyApiUrl:s,provider:o})=>{let a,i,c,l=!1;try{let{validation:p,simulation:m}=await It({proxyApiUrl:s,chainId:n,params:r,domain:e});!p||p.result_type==="Error"||p.result_type==="Warning"?a=ie[AlertType.WARNING]:p.result_type==="Malicious"&&(a=ie[AlertType.DANGER]),m?.status==="Success"&&(l=!0,c=_t(t,m.account_summary.exposures),i=Bt(m.account_summary.assets_diffs));}catch(p){console.error("processTransactionSimulation error",p);}if(!l&&Nt(r)){let p=await Ct(r,n,o);i=p.balanceChange,c=p.tokenApprovals;}return {alert:a,balanceChange:i,tokenApprovals:c,isSimulationSuccessful:l}},_t=(t,e)=>{let r=[];for(let s of e){let o=Ut(s.asset);if(o)for(let[a,i]of Object.entries(s.spenders))if(i.exposure.length===0)r.push({token:o,spenderAddress:a,logoUri:o.logoUri});else for(let c of i.exposure)"raw_value"in c?r.push({token:o,spenderAddress:a,value:c.raw_value,usdPrice:c.usd_price,logoUri:o.logoUri}):r.push({token:o,spenderAddress:a,logoUri:c.logo_url,usdPrice:c.usd_price});}return r.length===0?void 0:{isEditable:r.length===1&&r[0]?.token.type===TokenType.ERC20&&t.method===RpcMethod.ETH_SEND_TRANSACTION,approvals:r}},Bt=t=>{let e=At(t,"in"),r=At(t,"out");if(!(e.length===0&&r.length===0))return {ins:e,outs:r}},At=(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?Ut(n):en(n);if(!s)return;let o=r[e].map(a=>{let i;if("value"in a&&a.value)if("decimals"in s){let c=numberToBN(a.value,s.decimals);i=balanceToDisplayValue(c,s.decimals);}else isHexString(a.value)&&(i=parseInt(a.value,16).toString());else "type"in s&&s.type===TokenType.ERC721&&(i="1");return i?{displayValue:i,usdPrice:a.usd_price}:void 0}).filter(a=>a!==void 0);return {token:s,items:o}}).filter(r=>r!==void 0),Ut=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},en=t=>({name:t.name??"",symbol:t.symbol??"",decimals:t.decimals,description:"",logoUri:t.logo_url}),Vt=async({request:t,dAppUrl:e,accountAddress:r,chainId:n,data:s,proxyApiUrl:o})=>{let a,i,c;try{let{validation:l,simulation:p}=await St({proxyApiUrl:o,chainId:n,accountAddress:r,data:s,domain:e});!l||l.result_type==="Error"||l.result_type==="Warning"?a=ie[AlertType.WARNING]:l.result_type==="Malicious"&&(a=ie[AlertType.DANGER]),p?.status==="Success"&&(c=_t(t,p.account_summary.exposures),i=Bt(p.account_summary.assets_diffs));}catch(l){console.error("processJsonRpcSimulation error",l),a=ie[AlertType.WARNING];}return {alert:a,balanceChange:i,tokenApprovals:c}},ie={[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 be=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&&nn(n)?n:void 0}catch{return}};function nn(t){return Object.values(F).includes(t)}var Ge=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=ce.exponential()})=>{let s=0,o=0,a;for(;o<r;){o>0&&await an(s);try{let c=await t(o);if(e(c))return c}catch(c){a=c;}s=n(o),o++;}let i=a?`Max retry exceeded. ${a}`:"Max retry exceeded.";throw new Error(i)},ce=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function an(t){return new Promise(e=>setTimeout(e,t))}var Me=t=>Ge({operation:e=>t(e>0),maxRetries:2,backoffPolicy:ce.constant(1),isSuccess:e=>e?.status?.error_code!==429});function Gt(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function Fe(t){let e,r=0;for(e=0;e<t.length;e++){let n=Gt(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function Y(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 le=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return Y([`${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 Y([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${s}`,{method:"POST",headers:{"Content-Type":"application/json"}}],SimplePriceResponseSchema)}};var Mt=getBasicCoingeckoHttp(),V,q,J=class{constructor({storage:e,proxyApiUrl:r}){c(this,V,void 0);c(this,q,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(s=>{let o=e[s];n[s]={},r.forEach(a=>{n[s]={[a]:{price:o?.[a],change24:o?.[`${a}_24h_change`],vol24:o?.[`${a}_24h_vol`],marketCap:o?.[`${a}_market_cap`]}};});}),n});d(this,V,e),d(this,q,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,o=`getSimplePrice-${e?`${Fe(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b(this,V)?.get?.(o),n)return n;try{n=await Me(a=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:a}));}catch{n=void 0;}return b(this,V)?.set?.(o,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,a=`getPricesWithMarketDataByAddresses-${`${Fe(e)}-${r}-${n}`}`;if(s=b(this,V)?.get?.(a),s)return s;try{s=await Me(i=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:i}));}catch{s=void 0;}return b(this,V)?.set?.(a,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:s=!1}){return s?new le(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(Mt,{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:o=!1,lastUpdated:a=!1,useCoingeckoProxy:i=!1,shouldThrow:c=!0}){if(i){let l=await new le(b(this,q)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:s,include_24hr_change:o,include_last_updated_at:a});return this.transformSimplePriceResponse(l,r)}return simplePrice(Mt,{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:o,lastUpdated:a,shouldThrow:c})}};V=new WeakMap,q=new WeakMap;var yn="https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json",fn="https://latest.currency-api.pages.dev/v1/currencies/usd.min.json",Ft=object({date:string(),usd:record(number())}),ve=async()=>{try{return await Y([yn],Ft)}catch{return await Y([fn],Ft)}};var Le=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),Lt=(t,e)=>({label:t,value:e,type:DetailItemType.LINK}),Ie=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e});var Oe=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});var We=({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}};function Ot(t,e,r){return new ethers.Contract(t,wt.abi).interface.encodeFunctionData("approve",[e,r])}var Se=new Map,Wt=(t,e,r)=>(Se.set(t,{signingData:e,displayData:r}),{updateTx:({maxFeeRate:n,maxTipRate:s,approvalLimit:o})=>{let a=Se.get(t);if(!a)throw rpcErrors.resourceNotFound();let{signingData:i,displayData:c}=a,l={...i,data:{...i.data,maxFeePerGas:n??i.data.maxFeePerGas,maxPriorityFeePerGas:s??i.data.maxPriorityFeePerGas}},p={...c};if(typeof o=="string"){if(!o.startsWith("0x"))throw rpcErrors.invalidInput("Expected approvalLimit to be a hexadecimal number (0x-prefixed)");let h=c.tokenApprovals;kn(h),En(i.data.data);let u=h.approvals[0];l.data.data=Ot(u.token.address,u.spenderAddress,o),p.tokenApprovals={approvals:[{...u,value:o}],isEditable:!0};}let m={signingData:l,displayData:p};return Se.set(t,m),m},cleanup:()=>Se.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 En(t){if((!t||t==="0x"?null:be({data:t??void 0}))!=="approve")throw rpcErrors.invalidInput("Cannot change invoked method for requests in progress. Please start a new request instead.")}var $t=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{dappInfo:s,params:o}=t,a=kt(o);if(!a.success)return console.error("invalid params",a.error),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a.error}})};let i=a.data[0];if(!i)return {error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a.error}})};let c=await w({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3});if(!i.gas||Number(i.gas)<0)try{let A=await Et({transactionParams:{from:i.from,to:i.to,data:i.data,value:i.value},provider:c});i.gas="0x"+A.toString(16);}catch{return {error:rpcErrors.internal("Unable to calculate gas limit")}}if(!i.nonce)try{let A=await bt({from:i.from,provider:c});i.nonce=String(A);}catch{return {error:rpcErrors.internal("Unable to calculate nonce")}}let l=be(i),{alert:p,balanceChange:m,tokenApprovals:h,isSimulationSuccessful:u}=await Dt({request:t,proxyApiUrl:n,chainId:e.chainId,params:i,dAppUrl:t.dappInfo.url,provider:c}),f="Approve Transaction";l==="approve"&&(f="Token Spend Approval");let g=[Lt("Website",s),Ie("From",i.from)];i.to&&g.push(Ie("To",i.to)),l&&g.push(Le("Type",l)),i.data&&g.push(Oe("Data",i.data));let E={title:f,network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:[{title:"Transaction Details",items:g}],networkFeeSelector:!0,alert:p,balanceChange:m,tokenApprovals:h,isSimulationSuccessful:u},b={type:RpcMethod.ETH_SEND_TRANSACTION,account:i.from,data:{type:2,nonce:Number(i.nonce),gasLimit:Number(i.gas),to:i.to,from:i.from,data:i.data,value:i.value,chainId:i.chainId??e.chainId}},{updateTx:T,cleanup:k}=Wt(t.requestId,b,E),x=await r.requestApproval({request:t,displayData:E,signingData:b,updateTx:T});if(k(),"error"in x)return {error:x.error};let se;try{se=await vn(c,x);}catch(A){return {error:rpcErrors.internal({message:"Unable to get transaction hash",data:{cause:A}})}}return Rn({provider:c,txHash:se,onTransactionConfirmed:r.onTransactionConfirmed,onTransactionReverted:r.onTransactionReverted,requestId:t.requestId}),{result:se}},vn=async(t,e)=>"txHash"in e?e.txHash:await t.send("eth_sendRawTransaction",[e.signedData]),Rn=async({provider:t,txHash:e,onTransactionConfirmed:r,onTransactionReverted:n,requestId:s})=>{try{(await t.waitForTransaction(e))?.status===1?r(e,s):n(e,s);}catch(o){console.error(o),n(e,s);}};async function Ht(t,e){let r=t.map(async(o,a)=>({index:a,result:await e(o)})),s=(await Promise.allSettled(r)).filter(o=>o.status==="fulfilled").map(o=>o).find(o=>o.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 I,Z,L,de,xe=class{constructor({network:e,storage:r,proxyApiUrl:n,customTokens:s}){c(this,I,void 0);c(this,Z,void 0);c(this,L,void 0);c(this,de,void 0);d(this,I,e),d(this,Z,r),d(this,L,n),d(this,de,s);}async isNetworkSupported(){return !0}async getNativeBalance({chainId:e,address:r,currency:n}){let s=await w({chainId:e,chainName:b(this,I).chainName,rpcUrl:b(this,I).rpcUrl,multiContractAddress:b(this,I).utilityAddresses?.multicall}),o=b(this,I).pricingProviders?.coingecko.nativeTokenId,a=b(this,I).networkToken,i=new J({storage:b(this,Z),proxyApiUrl:b(this,L)}),c=o?await i.getSimplePrice({coinIds:[o],currencies:[n]}):{},l=c?.[o??""]?.[n]?.price??void 0,p=c?.[o??""]?.[n]?.marketCap??void 0,m=c?.[o??""]?.[n]?.vol24??void 0,h=c?.[o??""]?.[n]?.change24??void 0,u=await s.getBalance(r),f=new TokenUnit(u,a.decimals,a.symbol),g=l!==void 0?f.mul(l):void 0;return {...a,coingeckoId:o??"",type:TokenType.NATIVE,balance:u,balanceDisplayValue:f.toDisplay(),balanceInCurrency:g?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:g?.toDisplay({fixedDp:2}),priceInCurrency:l,marketCap:p,vol24:m,change24:h}}async listErc20Balances({chainId:e,address:r,currency:n}){let s=await w({chainId:e,chainName:b(this,I).chainName,rpcUrl:b(this,I).rpcUrl,multiContractAddress:b(this,I).utilityAddresses?.multicall}),o=b(this,I).pricingProviders?.coingecko.assetPlatformId,a=b(this,I).pricingProviders?.coingecko.nativeTokenId,i=await Te({chainId:Number(e),proxyApiUrl:b(this,L)}),c=i.map(b=>b.address),l=[...i,...b(this,de)].filter(Ee),p=async b=>{let x=await new ethers.Contract(b.address,wt.abi,s).balanceOf?.(r)||0n;return {...b,balance:x}},m=l.map(b=>K(p(b),b.address)),h=await X(m),u=new J({storage:b(this,Z),proxyApiUrl:b(this,L)}),f=o&&await u.getPricesByAddresses(c,o,n)||{},g=Object.keys(h),E={};for(let b=0;b<g.length;b++){let T=g[b];if(T===void 0)continue;let k=h[T];if(k===void 0||"error"in k){E[T]={error:`rpcService:getTokenWithBalance failed: ${k?.error??"unknown error"}`};continue}let x=f?.[a??""]?.[n]?.price??void 0,se=f?.[a??""]?.[n]?.marketCap??void 0,A=f?.[a??""]?.[n]?.vol24??void 0,Rr=f?.[a??""]?.[n]?.change24??void 0,Je=new TokenUnit(k.balance,k.decimals,k.symbol),ze=x!==void 0?Je.mul(x):void 0;E[k.address.toLowerCase()]={...k,type:TokenType.ERC20,balance:k.balance,balanceDisplayValue:Je.toDisplay(),balanceInCurrency:ze?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:ze?.toDisplay({fixedDp:2}),priceInCurrency:x,marketCap:se,change24:Rr,vol24:A};}return E}async listNftBalances(){return {}}};I=new WeakMap,Z=new WeakMap,L=new WeakMap,de=new WeakMap;var qt=async({addresses:t,currency:e,network:r,proxyApiUrl:n,tokenTypes:s=[TokenType.NATIVE,TokenType.ERC20,TokenType.ERC721,TokenType.ERC1155],customTokens:o=[],storage:a,balanceServices:i=[]})=>{let c=r.chainId,l=[...i,new xe({network:r,storage:a,proxyApiUrl:n,customTokens:o})],p=await Ht(l,h=>h.isNetworkSupported(r.chainId)),m={};if(p){let h=[],u=[],f=[];t.forEach(T=>{s.includes(TokenType.NATIVE)&&h.push(K(p.getNativeBalance({address:T,currency:e.toUpperCase(),chainId:c}),T)),s.includes(TokenType.ERC20)&&u.push(K(p.listErc20Balances({customTokens:o.filter(Ee),currency:e.toUpperCase(),chainId:c,address:T,pageSize:100}),T)),(s.includes(TokenType.ERC721)||s.includes(TokenType.ERC1155))&&f.push(K(p.listNftBalances({chainId:c,address:T}),T));});let g=await X(h),E=await X(u),b=await X(f);Object.keys(g).forEach(T=>{let k=g[T];if(!k||"error"in k){m[T]={error:`getNativeBalance failed: ${k?.error??"unknown error"}`};return}let x=k.symbol;m[T]={[x]:k};}),Object.keys(E).forEach(T=>{let k=E[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(b).forEach(T=>{let k=b[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(h=>{m[h]={error:"unsupported network"};});return m};var Pn={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},xn={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},zt=t=>{switch(t){case Environment.PRODUCTION:return Pn;case Environment.DEV:return xn}};var Cn="https://ipfs.io";function Kt(t,e=Cn){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}var Nn="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function Xt(t,e="256"){let r=Kt(t);return `${Nn}/width=${e},fit/${r}`}var _=class extends Error{constructor(){super(...arguments);a(this,"message","Glacier is unhealthy. Try again later.");}},we=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 _&&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 _&&this.setGlacierToUnhealthy(),s}}async getNativeBalance({chainId:e,address:r,currency:n,coingeckoId:s}){try{let a=(await this.glacierSdk.evmBalances.getNativeBalance({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase()})).nativeTokenBalance,i=new TokenUnit(a.balance,a.decimals,a.symbol),c=a.price?.value,l=c!==void 0?i.mul(c):void 0;return {name:a.name,symbol:a.symbol,decimals:a.decimals,type:TokenType.NATIVE,logoUri:a.logoUri,balance:i.toSubUnit(),balanceDisplayValue:i.toDisplay(),balanceInCurrency:l?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:l?.toDisplay({fixedDp:2}),priceInCurrency:c,coingeckoId:s??""}}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}}async listErc721Balances({chainId:e,address:r}){let n,s=[];do try{let o=await this.glacierSdk.evmBalances.listErc721Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...o.erc721TokenBalances),n=o.nextPageToken;}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}while(n);return s}async listErc1155Balances({chainId:e,address:r}){let n,s=[];do try{let o=await this.glacierSdk.evmBalances.listErc1155Balances({chainId:e,address:r,pageSize:100,pageToken:n});s.push(...o.erc1155TokenBalances),n=o.nextPageToken;}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}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(o=>o.status==="fulfilled").flatMap(o=>o.value.map(a=>[`${a.address}-${a.tokenId}`,{address:a.address,description:a.metadata.description??"",logoUri:a.metadata.imageUri??"",logoSmall:Xt(a.metadata.imageUri??""),name:a.metadata.name??"",symbol:a.metadata.symbol??"",tokenId:a.tokenId,tokenUri:a.tokenUri,collectionName:"Unkown",balance:a.ercType===Erc1155Token.ercType.ERC_1155?BigInt(a.balance):1,balanceDisplayValue:a.ercType===Erc1155Token.ercType.ERC_1155?a.balance:"1",type:a.ercType===Erc721Token.ercType.ERC_721?TokenType.ERC721:TokenType.ERC1155,metadata:{description:a.metadata.description,lastUpdatedTimestamp:a.metadata.metadataLastUpdatedTimestamp,properties:a.ercType===Erc721Token.ercType.ERC_721?a.metadata.attributes:a.metadata.properties}}]));return Object.fromEntries(s)}async listErc20Balances({chainId:e,address:r,currency:n,customTokens:s}){try{let o=[],a;do{let i=await this.glacierSdk.evmBalances.listErc20Balances({chainId:e.toString(),address:r,currency:n.toLocaleLowerCase(),pageSize:100,pageToken:a});o.push(...Bn(i.erc20TokenBalances,Number(e))),a=i.nextPageToken;}while(a);return [..._n(s),...o].reduce((i,c)=>({...i,[c.address.toLowerCase()]:c}),{})}catch(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}}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(o){throw o instanceof _&&this.setGlacierToUnhealthy(),o}}},_n=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})),Bn=(t,e)=>t.map(r=>{let n=new TokenUnit(r.balance,r.decimals,r.symbol),s=n.toDisplay(),o=r.balanceValue?.value.toString(),a=r.price?.value,i=a!==void 0?n.mul(a).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:o,balanceDisplayValue:s,balanceInCurrency:i,priceInCurrency:a,type:TokenType.ERC20}});var $e=t=>{let e="";e+=`Domain
|
|
17
17
|
`;for(let r in t.domain)e+=` ${r}: ${O(String(t.domain[r]))}
|
|
18
18
|
`;e+=`
|
|
19
19
|
Message
|
|
@@ -27,11 +27,11 @@ Message
|
|
|
27
27
|
`,n[o].forEach((a,i)=>{e+=` ${i}: ${O(a)}
|
|
28
28
|
`;})):e+=` ${o}: ${O(String(n[o]))}
|
|
29
29
|
`;})):e+=` ${r}: ${O(String(t.message[r]))}
|
|
30
|
-
`;return e},
|
|
30
|
+
`;return e},tr=t=>{let e="";return t.forEach(r=>{e+=`${r.name}:
|
|
31
31
|
`,e+=`${O(String(r.value))}
|
|
32
32
|
|
|
33
|
-
`;}),e},O=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.string().describe("message"),N=z.string().describe("address");var rr=z.object({method:z.literal(RpcMethod.ETH_SIGN),params:z.tuple([N,ge])});var nr=z.object({name:z.string(),type:z.string()}),Q=z.object({types:z.object({EIP712Domain:z.array(nr)}).catchall(z.array(nr)),primaryType:z.string(),domain:z.record(z.any()),message:z.record(z.any())}),je=z.array(z.object({type:z.string(),name:z.string(),value:z.union([z.string(),z.number(),z.boolean(),z.object({}).passthrough(),z.array(z.unknown()),z.null()])})).nonempty(),Ye=Q.or(je),ar=z.union([z.string().describe("data string"),Q]),or=z.union([z.string().describe("data string"),Ye]),sr=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA),params:z.tuple([N,or])}),ir=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA_V1),params:z.tuple([N,or])}),cr=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA_V3),params:z.tuple([N,ar])}),lr=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA_V4),params:z.tuple([N,ar])});var pr=z.object({method:z.literal(RpcMethod.PERSONAL_SIGN),params:z.union([z.tuple([ge,N]),z.tuple([ge,N,z.string().optional().describe("password")])])});var Vn=z.discriminatedUnion("method",[pr,rr,sr,ir,cr,lr]).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],o=n[1];if(typeof o!="string")return {data:o,address:s,method:r};try{let a=JSON.parse(o);return {data:Ye.parse(a),address:s,method:r}}catch{return e.addIssue({code:z.ZodIssueCode.custom,message:"param is not a valid json"}),z.NEVER}}case RpcMethod.SIGN_TYPED_DATA_V3:case RpcMethod.SIGN_TYPED_DATA_V4:{let s=n[0],o=n[1];if(typeof o!="string")return {data:o,address:s,method:r};try{let a=JSON.parse(o);return {data:Q.parse(a),address:s,method:r}}catch{return e.addIssue({code:z.ZodIssueCode.custom,message:"param is not a valid json"}),z.NEVER}}}});function mr(t){return Vn.safeParse(t)}var dr=t=>je.safeParse(t).success,Gi=t=>Q.safeParse(t).success;var ur=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 gr=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let s=mr({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:o,data:a,address:i}=s.data,c;(o===RpcMethod.SIGN_TYPED_DATA_V3||o===RpcMethod.SIGN_TYPED_DATA_V4)&&(c=ur(a));let l,p,m,h;if(c&&!c.isValid&&(h={type:AlertType.INFO,details:{title:"Warning: Verify Message Content",description:"This message contains non-standard elements.",detailedDescription:c.error.toString()}}),o===RpcMethod.ETH_SIGN)l={type:o,account:i,data:a},p=a,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(o===RpcMethod.PERSONAL_SIGN)l={type:o,account:i,data:a},p=toUtf8String(a);else if(o===RpcMethod.SIGN_TYPED_DATA||o===RpcMethod.SIGN_TYPED_DATA_V1)l={type:o,account:i,data:a},p=dr(a)?er(a):$e(a);else if(o===RpcMethod.SIGN_TYPED_DATA_V3||o===RpcMethod.SIGN_TYPED_DATA_V4){l={type:o,account:i,data:a};let{types:E,primaryType:b,...T}=a;p=$e(T);}if(!l||!p)return {success:!1,error:rpcErrors.internal("Unable to generate signing data")};let u=await Ut({request:t,proxyApiUrl:n,accountAddress:i,chainId:e.chainId,data:{method:o,params:t.params},dAppUrl:t.dappInfo.url}),y={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:i,details:[{title:"Message",items:[p]}],disclaimer:m,alert:u?.alert??h,balanceChange:u?.balanceChange,tokenApprovals:u?.tokenApprovals},g=await r.requestApproval({request:t,displayData:y,signingData:l});return "error"in g?{error:g.error}:"signedData"in g?{result:g.signedData}:{error:rpcErrors.internal("No signed data returned")}};var fr=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 hr=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 re,Ne=class{constructor(e){this.baseUrl=e;c(this,re,[]);}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,re).length===0){let e=await fetch(`${this.baseUrl}/v1/chain/list`);if(e.ok)d(this,re,await e.json());else throw new Error(`${e.status}:${e.statusText}`)}return b(this,re)}};re=new WeakMap;var C,Ae=class{constructor({proxyApiUrl:e}){c(this,C,void 0);d(this,C,new Ne(`${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 o=(await b(this,C).getChainList()).find(E=>E.community_id===e)?.id;if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let a=await b(this,C).getChainInfo({chainId:o});if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let i=a.native_token_id,c=await b(this,C).getTokenBalance({address:r,chainId:o,tokenId:i}),l=new TokenUnit(c.raw_amount,c.decimals,c.symbol),p=l.toDisplay(),h=(await be()).usd[n.toLowerCase()],u=h?h*c.price:void 0,y=u?l.mul(u).toDisplay({fixedDp:2}):void 0,g=u?l.mul(u).toDisplay({fixedDp:2,asNumber:!0}):void 0;return {name:c.name,symbol:c.symbol,decimals:c.decimals,type:TokenType.NATIVE,logoUri:c.logo_url,balance:l.toSubUnit(),balanceDisplayValue:p,balanceInCurrency:g,balanceCurrencyDisplayValue:y,priceInCurrency:u}}async listErc20Balances({chainId:e,address:r,currency:n}){if(!isHexString(r))throw rpcErrors.invalidParams("listErc20Balances: not valid address");let o=(await b(this,C).getChainList()).find(l=>l.community_id===e)?.id;if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let a=await b(this,C).getChainInfo({chainId:o});if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let i=await b(this,C).getTokensBalanceOnChain({chainId:o,address:r}),c={};for(let l of i){if(l.id===a.native_token_id)continue;let p=new TokenUnit(l.raw_amount,l.decimals,l.symbol),m=p.toDisplay(),u=(await be()).usd[n.toLowerCase()],y=u?u*l.price:void 0,g=y?p.mul(y).toDisplay({fixedDp:2}):void 0,E=y?p.mul(y).toDisplay({fixedDp:2,asNumber:!0}):void 0;c[l.id]={chainId:a.community_id,address:l.id,name:l.name,symbol:l.symbol,decimals:l.decimals,logoUri:l.logo_url,balance:p.toSubUnit(),balanceCurrencyDisplayValue:g,balanceDisplayValue:m,balanceInCurrency:E,priceInCurrency:y,type:TokenType.ERC20};}return c}async listNftBalances(){return {}}};C=new WeakMap;var ae,he,B,oe,br=class{constructor({approvalController:e,environment:r,appInfo:n}){c(this,ae,void 0);c(this,he,void 0);c(this,B,void 0);c(this,oe,void 0);let{glacierApiUrl:s,proxyApiUrl:o}=qt(r);d(this,ae,new xe({glacierApiUrl:s,headers:We(n)})),d(this,he,new Ae({proxyApiUrl:o})),d(this,B,o),d(this,oe,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 hr({accountIndex:e,xpub:r,walletType:n})}getBalances({addresses:e,network:r,currency:n,customTokens:s,storage:o,tokenTypes:a}){return Yt({addresses:e,currency:n,network:r,proxyApiUrl:b(this,B),customTokens:s,balanceServices:[b(this,ae),b(this,he)],storage:o,tokenTypes:a})}getManifest(){let e=parseManifest(Tt);return e.success?e.data:void 0}getNetworkFee(e){let{chainId:r,chainName:n,rpcUrl:s,utilityAddresses:o,caipId:a}=e;return Xe({chainId:r,chainName:n,rpcUrl:s,multiContractAddress:o?.multicall,caipId:a,proxyApiUrl:b(this,B)})}getTransactionHistory(e){let{network:r,address:n,nextPageToken:s,offset:o}=e,{chainId:a,isTestnet:i,networkToken:c,explorerUrl:l=""}=r;return ht({chainId:a,isTestnet:i,networkToken:c,explorerUrl:l,address:n,nextPageToken:s,offset:o,glacierService:b(this,ae)})}getTokens(e){let{chainId:r}=e;return Te({chainId:r,proxyApiUrl:b(this,B)})}async onRpcRequest(e,r){switch(e.method){case RpcMethod.ETH_SEND_TRANSACTION:return Wt({request:e,network:r,approvalController:b(this,oe),proxyApiUrl:b(this,B)});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 gr({request:e,network:r,approvalController:b(this,oe),proxyApiUrl:b(this,B)});default:return Yn(e.method)?fr(e,r):{error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};ae=new WeakMap,he=new WeakMap,B=new WeakMap,oe=new WeakMap;var Yn=t=>t.startsWith("eth_")||["web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"].includes(t);
|
|
33
|
+
`;}),e},O=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.string().describe("message"),N=z.string().describe("address");var nr=z.object({method:z.literal(RpcMethod.ETH_SIGN),params:z.tuple([N,ge])});var ar=z.object({name:z.string(),type:z.string()}),Q=z.object({types:z.object({EIP712Domain:z.array(ar)}).catchall(z.array(ar)),primaryType:z.string(),domain:z.record(z.any()),message:z.record(z.any())}),je=z.array(z.object({type:z.string(),name:z.string(),value:z.union([z.string(),z.number(),z.boolean(),z.object({}).passthrough(),z.array(z.unknown()),z.null()])})).nonempty(),Ye=Q.or(je),or=z.union([z.string().describe("data string"),Q]),sr=z.union([z.string().describe("data string"),Ye]),ir=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA),params:z.tuple([N,sr])}),cr=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA_V1),params:z.tuple([N,sr])}),lr=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA_V3),params:z.tuple([N,or])}),pr=z.object({method:z.literal(RpcMethod.SIGN_TYPED_DATA_V4),params:z.tuple([N,or])});var mr=z.object({method:z.literal(RpcMethod.PERSONAL_SIGN),params:z.union([z.tuple([ge,N]),z.tuple([ge,N,z.string().optional().describe("password")])])});var Gn=z.discriminatedUnion("method",[mr,nr,ir,cr,lr,pr]).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],o=n[1];if(typeof o!="string")return {data:o,address:s,method:r};try{let a=JSON.parse(o);return {data:Ye.parse(a),address:s,method:r}}catch{return e.addIssue({code:z.ZodIssueCode.custom,message:"param is not a valid json"}),z.NEVER}}case RpcMethod.SIGN_TYPED_DATA_V3:case RpcMethod.SIGN_TYPED_DATA_V4:{let s=n[0],o=n[1];if(typeof o!="string")return {data:o,address:s,method:r};try{let a=JSON.parse(o);return {data:Q.parse(a),address:s,method:r}}catch{return e.addIssue({code:z.ZodIssueCode.custom,message:"param is not a valid json"}),z.NEVER}}}});function dr(t){return Gn.safeParse(t)}var ur=t=>je.safeParse(t).success,Fi=t=>Q.safeParse(t).success;var gr=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 yr=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let s=dr({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:o,data:a,address:i}=s.data,c;(o===RpcMethod.SIGN_TYPED_DATA_V3||o===RpcMethod.SIGN_TYPED_DATA_V4)&&(c=gr(a));let l,p,m,h;if(c&&!c.isValid&&(h={type:AlertType.INFO,details:{title:"Warning: Verify Message Content",description:"This message contains non-standard elements.",detailedDescription:c.error.toString()}}),o===RpcMethod.ETH_SIGN)l={type:o,account:i,data:a},p=a,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(o===RpcMethod.PERSONAL_SIGN)l={type:o,account:i,data:a},p=toUtf8String(a);else if(o===RpcMethod.SIGN_TYPED_DATA||o===RpcMethod.SIGN_TYPED_DATA_V1)l={type:o,account:i,data:a},p=ur(a)?tr(a):$e(a);else if(o===RpcMethod.SIGN_TYPED_DATA_V3||o===RpcMethod.SIGN_TYPED_DATA_V4){l={type:o,account:i,data:a};let{types:E,primaryType:b,...T}=a;p=$e(T);}if(!l||!p)return {success:!1,error:rpcErrors.internal("Unable to generate signing data")};let u=await Vt({request:t,proxyApiUrl:n,accountAddress:i,chainId:e.chainId,data:{method:o,params:t.params},dAppUrl:t.dappInfo.url}),f={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:i,details:[{title:"Message",items:[p]}],disclaimer:m,alert:u?.alert??h,balanceChange:u?.balanceChange,tokenApprovals:u?.tokenApprovals},g=await r.requestApproval({request:t,displayData:f,signingData:l});return "error"in g?{error:g.error}:"signedData"in g?{result:g.signedData}:{error:rpcErrors.internal("No signed data returned")}};var fr=async(t,e)=>{try{return {result:await(await w({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 Tr=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 re,Ne=class{constructor(e){this.baseUrl=e;c(this,re,[]);}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,re).length===0){let e=await fetch(`${this.baseUrl}/v1/chain/list`);if(e.ok)d(this,re,await e.json());else throw new Error(`${e.status}:${e.statusText}`)}return b(this,re)}};re=new WeakMap;var C,Ae=class{constructor({proxyApiUrl:e}){c(this,C,void 0);d(this,C,new Ne(`${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 o=(await b(this,C).getChainList()).find(E=>E.community_id===e)?.id;if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let a=await b(this,C).getChainInfo({chainId:o});if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let i=a.native_token_id,c=await b(this,C).getTokenBalance({address:r,chainId:o,tokenId:i}),l=new TokenUnit(c.raw_amount,c.decimals,c.symbol),p=l.toDisplay(),h=(await ve()).usd[n.toLowerCase()],u=h?h*c.price:void 0,f=u?l.mul(u).toDisplay({fixedDp:2}):void 0,g=u?l.mul(u).toDisplay({fixedDp:2,asNumber:!0}):void 0;return {name:c.name,symbol:c.symbol,decimals:c.decimals,type:TokenType.NATIVE,logoUri:c.logo_url,balance:l.toSubUnit(),balanceDisplayValue:p,balanceInCurrency:g,balanceCurrencyDisplayValue:f,priceInCurrency:u}}async listErc20Balances({chainId:e,address:r,currency:n}){if(!isHexString(r))throw rpcErrors.invalidParams("listErc20Balances: not valid address");let o=(await b(this,C).getChainList()).find(l=>l.community_id===e)?.id;if(!o)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let a=await b(this,C).getChainInfo({chainId:o});if(!a)throw rpcErrors.invalidParams("getNativeBalance: not valid chainId: "+e);let i=await b(this,C).getTokensBalanceOnChain({chainId:o,address:r}),c={};for(let l of i){if(l.id===a.native_token_id)continue;let p=new TokenUnit(l.raw_amount,l.decimals,l.symbol),m=p.toDisplay(),u=(await ve()).usd[n.toLowerCase()],f=u?u*l.price:void 0,g=f?p.mul(f).toDisplay({fixedDp:2}):void 0,E=f?p.mul(f).toDisplay({fixedDp:2,asNumber:!0}):void 0;c[l.id]={chainId:a.community_id,address:l.id,name:l.name,symbol:l.symbol,decimals:l.decimals,logoUri:l.logo_url,balance:p.toSubUnit(),balanceCurrencyDisplayValue:g,balanceDisplayValue:m,balanceInCurrency:E,priceInCurrency:f,type:TokenType.ERC20};}return c}async listNftBalances(){return {}}};C=new WeakMap;var ae,he,B,oe,vr=class{constructor({approvalController:e,environment:r,appInfo:n}){c(this,ae,void 0);c(this,he,void 0);c(this,B,void 0);c(this,oe,void 0);let{glacierApiUrl:s,proxyApiUrl:o}=zt(r);d(this,ae,new we({glacierApiUrl:s,headers:We(n)})),d(this,he,new Ae({proxyApiUrl:o})),d(this,B,o),d(this,oe,e);}getProvider(e){return w({chainId:e.chainId,chainName:e.chainName,rpcUrl:e.rpcUrl,multiContractAddress:e.utilityAddresses?.multicall,pollingInterval:1e3})}getAddress({accountIndex:e,xpub:r,walletType:n}){return Tr({accountIndex:e,xpub:r,walletType:n})}getBalances({addresses:e,network:r,currency:n,customTokens:s,storage:o,tokenTypes:a}){return qt({addresses:e,currency:n,network:r,proxyApiUrl:b(this,B),customTokens:s,balanceServices:[b(this,ae),b(this,he)],storage:o,tokenTypes:a})}getManifest(){let e=parseManifest(Tt);return e.success?e.data:void 0}getNetworkFee(e){let{chainId:r,chainName:n,rpcUrl:s,utilityAddresses:o,caipId:a}=e;return Xe({chainId:r,chainName:n,rpcUrl:s,multiContractAddress:o?.multicall,caipId:a,proxyApiUrl:b(this,B)})}getTransactionHistory(e){let{network:r,address:n,nextPageToken:s,offset:o}=e,{chainId:a,isTestnet:i,networkToken:c,explorerUrl:l=""}=r;return ht({chainId:a,isTestnet:i,networkToken:c,explorerUrl:l,address:n,nextPageToken:s,offset:o,glacierService:b(this,ae)})}getTokens(e){let{chainId:r}=e;return Te({chainId:r,proxyApiUrl:b(this,B)})}async onRpcRequest(e,r){switch(e.method){case RpcMethod.ETH_SEND_TRANSACTION:return $t({request:e,network:r,approvalController:b(this,oe),proxyApiUrl:b(this,B)});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 yr({request:e,network:r,approvalController:b(this,oe),proxyApiUrl:b(this,B)});default:return qn(e.method)?fr(e,r):{error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};ae=new WeakMap,he=new WeakMap,B=new WeakMap,oe=new WeakMap;var qn=t=>t.startsWith("eth_")||["web3_clientVersion","web3_sha3","net_version","net_peerCount","net_listening"].includes(t);
|
|
34
34
|
|
|
35
|
-
export { F as ERC20TransactionType,
|
|
35
|
+
export { F as ERC20TransactionType, vr as EvmModule, gt as NonContractCallTypes, K as addIdToPromise, Fi as isTypedData, ur as isTypedDataV1, X as settleAllIdPromises };
|
|
36
36
|
//# sourceMappingURL=out.js.map
|
|
37
37
|
//# sourceMappingURL=index.js.map
|