@avalabs/svm-module 1.9.12 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,10 +9,10 @@ import { TokenUnit } from '@avalabs/core-utils-sdk';
9
9
  import { getCompiledTransactionMessageDecoder, address, signature, isInstructionForProgram, isInstructionWithAccounts, isInstructionWithData } from '@solana/kit';
10
10
  import { SYSTEM_PROGRAM_ADDRESS, identifySystemInstruction, SystemInstruction, parseTransferSolInstruction } from '@solana-program/system';
11
11
  import { identifyTokenInstruction, TokenInstruction, parseTransferCheckedInstruction, parseTransferInstruction } from '@solana-program/token';
12
- import Mr from '@blockaid/client';
12
+ import Or from '@blockaid/client';
13
13
 
14
- var ie=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:o=L.exponential()})=>{let a=0,n=0,i;for(;n<r;){n>0&&await wt(a);try{let c=await t(n);if(e(c))return c}catch(c){i=c;}a=o(n),n++;}let s=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(s)},L=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}static linearThenExponential(e,r){return o=>{if(o<e)return (o+1)*r;let a=o-e+1,n=e*r,i=2*r*(Math.pow(2,a)-1);return n+i}}};function wt(t){return new Promise(e=>setTimeout(e,t))}var ce=t=>ie({operation:e=>t(e>0),maxRetries:2,backoffPolicy:L.constant(1),isSuccess:e=>e?.status?.error_code!==429});function ve(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function pe(t){let e,r=0;for(e=0;e<t.length;e++){let o=ve(t[e]??"");r=r+65027/o;}return (""+r).slice(0,16)}async function w(t,e){let r=await fetch(...t);if(!r.ok)throw new Error(`Request failed with status ${r.status}`);let o=await r.json();return e.parse(o)}var G=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return w([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}simplePriceByContractAddresses(e){let{id:r,...o}=e,a=new URLSearchParams(o);return w([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${a}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}};var Ie=getBasicCoingeckoHttp(),C,U,$=class{constructor({storage:e,proxyApiUrl:r}){c(this,C,void 0);c(this,U,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let o={};return Object.keys(e).forEach(a=>{let n=e[a];o[a]={},r.forEach(i=>{o[a]={[i]:{price:n?.[i],change24:n?.[`${i}_24h_change`],vol24:n?.[`${i}_24h_vol`],marketCap:n?.[`${i}_market_cap`]}};});}),o});d(this,C,e),d(this,U,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let o,n=`getSimplePrice-${e?`${pe(e)}-${r.toString()}`:`${r.toString()}`}`;if(o=b$1(this,C)?.get?.(n),o)return o;try{o=await ce(i=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{o=void 0;}return b$1(this,C)?.set?.(n,o),o}async getPricesByAddresses(e,r,o=VsCurrencyType.USD){let a,i=`getPricesWithMarketDataByAddresses-${`${pe(e)}-${r}-${o}`}`;if(a=b$1(this,C)?.get?.(i),a)return a;try{a=await ce(s=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:o,useCoingeckoProxy:s}));}catch(s){console.error(s),a=void 0;}return b$1(this,C)?.set?.(i,a),a}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:o=VsCurrencyType.USD,useCoingeckoProxy:a=!1}){if(a){let n=await new G(b$1(this,U)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[o],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0});return this.transformSimplePriceResponse(n,[o])}return simpleTokenPrice(Ie,{assetPlatformId:e,tokenAddresses:r,currencies:[o],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:o=!1,vol24:a=!1,change24:n=!1,lastUpdated:i=!1,useCoingeckoProxy:s=!1,shouldThrow:c=!0}){if(s){let l=await new G(b$1(this,U)).simplePrice({ids:e,vs_currencies:r,include_market_cap:o,include_24hr_vol:a,include_24hr_change:n,include_last_updated_at:i});return this.transformSimplePriceResponse(l,r)}return simplePrice(Ie,{coinIds:e,currencies:r,marketCap:o,vol24:a,change24:n,lastUpdated:i,shouldThrow:c})}};C=new WeakMap,U=new WeakMap;object({date:string(),usd:record(number())});var le=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e});var S=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e}),me=(t,e)=>({label:t,type:DetailItemType.ADDRESS_LIST,value:e});var K=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});process.env.GLACIER_API_KEY;var we={name:"SVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"],namespaces:["solana"]},cointype:"501",permissions:{rpc:{dapps:!0,methods:["solana_signTransaction","solana_signAndSendTransaction","solana_signMessage"],nonRestrictedMethods:[]}},manifestVersion:"0.1"};var Mt={proxyApiUrl:"https://proxy-api.avax.network"},Ft={proxyApiUrl:"https://proxy-api-dev.avax.network"},De=t=>{switch(t){case Environment.PRODUCTION:return Mt;case Environment.DEV:return Ft}};var _e=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var H=({accountIndex:t})=>{if(t<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");return {[NetworkVMType.SVM]:`m/44'/501'/${t}'/0'`}};var Ee=async t=>{let{approvalController:e,secretId:r}=t,o=_e(t)?H(t).SVM:void 0,a=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:o});return {[NetworkVMType.SVM]:base58.encode(hex.decode(a))}};var Ce="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Be="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Le="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",Ue="/proxy/nownodes/sol",Me="https://api.devnet.solana.com";var Fe="DUMMY_API_KEY";var I=({isTestnet:t,proxyApiUrl:e})=>getSolanaProvider({isTestnet:t,rpcUrl:t?Me:e+Ue});var ue=1e6,b={high:150*ue,medium:75*ue,low:2*ue},Wt=t=>(t.length===0?[b.low,b.low]:t.length===1?[t[0],b.low]:t).slice().sort((r,o)=>r-o);async function Oe(t,e){let a=await(await I({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(a.length===0||a.every(h=>h.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(b.high),maxPriorityFeePerGas:BigInt(b.high)},medium:{maxFeePerGas:BigInt(b.medium),maxPriorityFeePerGas:BigInt(b.medium)},low:{maxFeePerGas:BigInt(b.low),maxPriorityFeePerGas:BigInt(b.low)},baseFee:BigInt(b.low),displayDecimals:9,isFixedFee:!1};let i=Wt(a.map(h=>Number(h.prioritizationFee))),s=i.at(0),c=i.at(-1),l=Math.floor(i.length/2),m=i.length%2===1?i[l]:(i[l-1]+i[l])/2,p=BigInt(Math.ceil(c*1.05)),d=BigInt(Math.ceil(m*1.05)),u=BigInt(Math.ceil(s*1.05));return {high:{maxFeePerGas:p,maxPriorityFeePerGas:p},medium:{maxFeePerGas:d,maxPriorityFeePerGas:d},low:{maxFeePerGas:u,maxPriorityFeePerGas:u},baseFee:u,displayDecimals:9,isFixedFee:!1}}var qt=z.object({address:z.string(),name:z.string(),symbol:z.string(),contractType:z.literal(TokenType.SPL),caip2Id:z.string().startsWith("solana:"),decimals:z.number(),chainId:z.number().optional(),logoUri:z.string().optional(),color:z.string().optional()}),Ve=z.array(qt);async function Ge({caip2Id:t,proxyApiUrl:e}){try{return (await w([`${e}/solana-tokens?caip2Id=${t}`],Ve)).map(o=>({...o,type:o.contractType}))}catch(r){throw console.error("getTokens() failed for",t,r),rpcErrors.internal(`Failed to fetch tokens for caip2Id "${t}"`)}}var M=t=>t.status==="fulfilled";var ze=z.object({nativeBalance:z.object({lamports:z.string(),solana:z.string()}),nfts:z.array(z.object({associatedTokenAddress:z.string(),mint:z.string(),name:z.string(),symbol:z.string()})),tokens:z.array(z.object({associatedTokenAddress:z.string(),mint:z.string(),amountRaw:z.string(),amount:z.string(),decimals:z.number(),name:z.string(),symbol:z.string(),logo:z.string().optional().nullable()}))});var W,J,$e,X=class{constructor({proxyApiUrl:e}){c(this,J);c(this,W,void 0);d(this,W,`${e}/proxy/moralis`);}async getPortfolio({address:e$1,network:r}){try{let o=e(this,J,$e).call(this,`/account/${r}/${e$1}/portfolio`),a=await w([o],ze);return {address:e$1,portfolio:a}}catch(o){console.error("getPortfolio() failed:",o);let a=o instanceof Error?o.message:"unknown error";return {address:e$1,error:`getPortfolio() failed: ${a}`}}}};W=new WeakMap,J=new WeakSet,$e=function(e){return `${b$1(this,W)}${e}`};var F=t=>{switch(t.caipId){case Ce:return "mainnet";case Be:return "devnet";case Le:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}};var qe=async({addresses:t,proxyApiUrl:e,currency:r,network:o,tokenService:a})=>{let n=new X({proxyApiUrl:e}),i=o.pricingProviders?.coingecko.nativeTokenId??"",s=o.pricingProviders?.coingecko.assetPlatformId??"",c=r.toLowerCase(),l=F(o),m=await Promise.all(t.map(y=>n.getPortfolio({address:y,network:l}))),p=new Set(m.flatMap(y=>"portfolio"in y?y.portfolio.tokens.map(({mint:T})=>T):[])),d=await Promise.allSettled([i?await a.getSimplePrice({coinIds:[i],currencies:[c]}):Promise.resolve(void 0),s?await a.getPricesByAddresses(Array.from(p),s,c):Promise.resolve(void 0)]),[u,h]=d.map(y=>M(y)?y.value:void 0);return m.reduce((y,T)=>{if("error"in T)return {...y,[T.address]:{error:T.error}};let k=new TokenUnit(T.portfolio.nativeBalance.lamports,9,"SOL"),g=je(i,c,u),_=g.priceInCurrency!==void 0?k.mul(g.priceInCurrency):void 0,E={type:TokenType.NATIVE,name:o.networkToken.name,symbol:o.networkToken.symbol,decimals:o.networkToken.decimals,balance:k.toSubUnit(),balanceDisplayValue:k.toString(),balanceInCurrency:_?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:_?.toDisplay({fixedDp:2}),logoUri:o.networkToken.logoUri??"",coingeckoId:i,...g},B=T.portfolio.tokens.reduce((re,{amountRaw:oe,symbol:Pe,decimals:Se,mint:ne,name:Rt,logo:It})=>{let ae=new TokenUnit(oe,Se,Pe),se=je(ne,c,h),ke=se.priceInCurrency!==void 0?ae.mul(se.priceInCurrency):void 0,bt={type:TokenType.SPL,address:ne,name:Rt,symbol:Pe,decimals:Se,balance:ae.toSubUnit(),balanceDisplayValue:ae.toString(),balanceInCurrency:ke?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:ke?.toDisplay({fixedDp:2}),logoUri:It??void 0,reputation:null,...se};return {...re,[ne]:bt}},{});return {...y,[T.address]:{[o.networkToken.symbol]:E,...B}}},{})},je=(t,e,r)=>({priceInCurrency:r?.[t??""]?.[e]?.price??void 0,marketCap:r?.[t??""]?.[e]?.marketCap??void 0,vol24:r?.[t??""]?.[e]?.vol24??void 0,change24:r?.[t??""]?.[e]?.change24??void 0});var fe=t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),Xe=(t,e,r,o)=>{let a=r.preTokenBalances.reduce((s,{owner:c,mint:l,amount:m})=>({...s,[`${c}-${l}`]:m}),{}),n=r.postTokenBalances.reduce((s,{owner:c,mint:l,amount:m,decimals:p})=>{let d=`${c}-${l}`,u=a[d]??0n,h=m-u;if(h<=0n)return s;let y=Object.keys(a).find(g=>{let[_,E]=g.split("-"),B=r.postTokenBalances.find(({owner:re,mint:oe})=>re===_&&oe===l);return E===l&&B&&a[g]>B.amount});if(!y)return s;let T=o.tokens?.filter(g=>"contractType"in g).find(g=>g.address===l)??{contractType:TokenType.SPL,decimals:p,address:l,symbol:"Unknown",name:"Unknown"},k={...T,type:T.contractType,from:{...T,address:y.split("-")[0]},to:{...T,address:c},amount:new TokenUnit(h,p,"").toDisplay()};return [...s,k]},[]),i=Yt(t,e,r,o);return i&&n.push(i),n},Yt=(t,e,{paidFee:r,preBalances:o,postBalances:a},n)=>{let i=t[e],s=o[e],c=a[e],l=c!==s?c-s+r:0,m=a.map((y,T)=>y-o[T]);if(!l)return null;let p=l>0,d=new TokenUnit(Math.abs(l),n.networkToken.decimals,""),u=m.reduce(({index:y,change:T},k,g)=>k>T?{index:g,change:k}:{index:y,change:T},{index:0,change:m[0]}),h=p?0:u.index;return {amount:d.toDisplay(),from:{address:p?t[h]:i},to:{address:p?i:t[h]},name:n.networkToken.name,symbol:n.networkToken.symbol,type:TokenType.NATIVE}};function Je(t){return e=>!!e[t]}var Ze=async({isTestnet:t,address:e,proxyApiUrl:r})=>{let o=I({isTestnet:t,proxyApiUrl:r}),n=(await o.getSignaturesForAddress(address(e),{limit:25}).send()).map(s=>s.signature);return (await Promise.allSettled(n.map(async s=>({txHash:s.toString(),tx:await o.getTransaction(s,{encoding:"json",maxSupportedTransactionVersion:0}).send()})))).filter(M).map(s=>s.value).filter(Je("tx"))};var Qe=(t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""};async function et({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await Ze({isTestnet:!!t.isTestnet,address:e,proxyApiUrl:r})).map(({txHash:n,tx:i})=>{if(!i.meta)return null;let{meta:s,transaction:{message:c}}=i,l=c.accountKeys.map(u=>u.toString()),m=l.indexOf(e),p=m<c.header.numRequiredSignatures,d=Xe(l,m,{paidFee:p?Number(s.fee):0,preBalances:s.preBalances.map(Number),postBalances:s.postBalances.map(Number),preTokenBalances:(s.preTokenBalances??[]).map(fe),postTokenBalances:(s.postTokenBalances??[]).map(fe)},t);return {hash:n,txType:Zt(d,e),gasUsed:String(i.meta.computeUnitsConsumed??"0"),tokens:d,from:d[0]?.from?.address??l[0],to:d[0]?.to?.address??(p?"":e),isOutgoing:p,isIncoming:!p,isSender:p,timestamp:Number(i.blockTime)*1e3,isContractCall:!1,gasPrice:String(Number(i.meta.fee)/Number(i.meta.computeUnitsConsumed)),chainId:String(t.chainId),explorerLink:Qe(n,t.explorerUrl)}}).filter(n=>n!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}var Zt=(t,e)=>t.every(n=>n.from?.address===e)?TransactionType.SEND:t.every(n=>n.to?.address===e)?TransactionType.RECEIVE:t.some(n=>n.from?.address===e)&&t.some(n=>n.to?.address===e)?TransactionType.SWAP:TransactionType.UNKNOWN;var tt=t=>{if(t?.type==="InstructionError")switch(t.code){case"ResultWithNegativeLamports":return {type:AlertType.WARNING,details:{title:"This transaction will likely be reverted",description:"Your account does not have enough SOL to perform the operation"}}}return {type:AlertType.WARNING,details:{title:"Transaction simulation has failed",description:"It is possible that this transaction will fail. Please proceed with caution."}}},ye={[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"}}}};function rt(t){return t.ins.length===0&&t.outs.length===0}function ot(t){return t!=null}var nt=(t,e,r,o)=>{if(!isInstructionForProgram(t,SYSTEM_PROGRAM_ADDRESS)||!isInstructionWithAccounts(t)||!isInstructionWithData(t))return null;try{if(identifySystemInstruction(t)!==SystemInstruction.TransferSol)return null;let{accounts:n,data:i}=parseTransferSolInstruction({...t,data:Uint8Array.from(t.data)}),c=n.source.address===r===!0?"outs":"ins";return e[c].push({token:{...o,address:""},items:[{displayValue:new TokenUnit(i.amount,o.decimals,"").toString(),usdPrice:void 0}]}),{title:"Transfer SOL",items:[S("From",n.source.address),S("To",n.destination.address)]}}catch{return null}};var ur=async(t,e)=>{try{let r=await t.getAccountInfo(e,{encoding:"jsonParsed"}).send();if(Array.isArray(r.value?.data))return null;let o=r.value?.data.parsed.info;return typeof o?.mint=="string"?o.mint:null}catch{return null}},at=async(t,e,r,o,a)=>{if(!a?.length||!isInstructionWithAccounts(e)||!isInstructionWithData(e))return null;try{let n=identifyTokenInstruction(e);if(n!==TokenInstruction.Transfer&&n!==TokenInstruction.TransferChecked)return null;let i=n===TokenInstruction.TransferChecked?parseTransferCheckedInstruction:parseTransferInstruction,{accounts:s,data:c}=i({...e,data:Uint8Array.from(e.data)}),l=await ur(t,s.source.address);if(!l)return null;let m=a.find(h=>h.address.toLowerCase()===l.toLowerCase());if(!m)return null;let d=(s.source.address===o||s.authority.address===o)===!0?"outs":"ins",u="decimals"in c?c.decimals:m.decimals;return r[d].push({token:m,items:[{displayValue:new TokenUnit(c.amount,u,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${m.symbol}`,items:[S("From",s.source.address),S("To",s.destination.address)]}}catch{return null}};var st=async(t,e,r,o)=>{let a=await deserializeTransactionMessage(t,o),n={ins:[],outs:[]},i=await Promise.allSettled(a.instructions.map(async s=>nt(s,n,e,r.networkToken)??await at(o,s,n,e,r.tokens)??null)).then(s=>s.filter(M).map(c=>c.value).filter(ot));return {balanceChange:n,details:i}};var ct=(t,e,r)=>{let o=e.account_summary.account_assets_diff??[],a={},n={},i=Object.keys(e.assets_diff??{}).filter(s=>s!==t);return o.forEach(({asset:s,in:c,out:l})=>{let m=Tr(s,r);if(!m)return;let p="address"in m?m.address:m.symbol;c&&(a[p]||(a[p]={token:m,items:[]}),a[p].items.push({displayValue:String(c.value),usdPrice:typeof c.usd_price=="number"?String(c.usd_price):void 0})),l&&(n[p]||(n[p]={token:m,items:[]}),n[p].items.push({displayValue:String(l.value),usdPrice:typeof l.usd_price=="number"?String(l.usd_price):void 0}));}),{balanceChange:{ins:Object.values(a),outs:Object.values(n)},otherAffectedAddresses:i}},yr=t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),gr=(t,e)=>({type:TokenType.SPL,address:t.address,caip2Id:e.caipId??"",contractType:TokenType.SPL,decimals:t.decimals,name:t.name,symbol:t.symbol,logoUri:t.logo||void 0}),Tr=(t,e)=>t.type==="TOKEN"?gr(t,e):t.type==="SOL"||t.type==="ETH"?yr(t):null;var pt=async({params:t,dAppUrl:e,blockaid:r})=>{try{return await r.solana.message.scan({chain:t.chain,options:["simulation","validation"],encoding:"base64",metadata:{url:e},transactions:[t.transactionBase64],account_address:base64.encode(base58.decode(t.account))})}catch(o){return console.error("solana.message.scan() error",o),null}};var Q=async({simulationParams:t,network:e,provider:r})=>{let{params:o}=t,a=await pt(t),{simulation:n,validation:i}=a?.result??{},s={title:"Transaction Details",items:[K("Raw Data",t.params.transactionBase64)]},c=[s],l=!1,m,p;if(!i||i.result_type==="Warning"?p=ye[AlertType.WARNING]:i.result_type==="Malicious"?p=ye[AlertType.DANGER]:a?.error_details&&(p=tt(a.error_details)),n){let{balanceChange:d,otherAffectedAddresses:u}=ct(o.account,n,e);if(m=d,u.length>0){let h=n.account_summary.account_assets_diff,y=h?.filter(g=>g.out&&g.out.raw_value>0)??[],T=h?.filter(g=>g.in&&g.in.raw_value>0)??[];y.length>0&&T.length>0?(s.items.push(S("Account",o.account)),s.items.push(me("Interacting with",u))):(s.items.push(S(u.length===1?"From":"Account",o.account)),s.items.push(u.length===1?S("To",u[0]):me("Interacting with",u)));}else s.items.push(S("Account",o.account));l=!0;}else {let{balanceChange:d,details:u}=await st(o.transactionBase64,o.account,e,r);m=d,c.push(...u);}return {isSimulationSuccessful:l,details:c,alert:p,balanceChange:m}};var Sr="https://explorer.solana.com";function mt(t,e,r="tx"){try{let o=t.explorerUrl?new URL(t.explorerUrl):new URL(Sr);return o.pathname+=`${r}/${e}`,o.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}var Te=400,Ar=15,dt=async({provider:t,txHash:e,approvalController:r,request:o,network:a,commitment:n="confirmed",maxRetries:i=Ar})=>{let s=0,c=null,l=mt(a,e,"tx");for(;s<i;)try{let m=await t.getSignatureStatuses([signature(e)],{searchTransactionHistory:!0}).send();if(!m?.value?.[0]){await new Promise(u=>setTimeout(u,Te)),s++;continue}let{confirmationStatus:p,err:d}=m.value[0];if(d)return console.error("[waitForTransactionConfirmation] Transaction failed:",d),r.onTransactionReverted({txHash:e,request:o}),!1;if(p&&p!==c&&(c=p,p==="processed"&&r.onTransactionPending({txHash:e,request:o}),n==="processed"&&p==="processed"||n==="confirmed"&&["confirmed","finalized"].includes(p)||n==="finalized"&&p==="finalized"))return r.onTransactionConfirmed({txHash:e,request:o,explorerLink:l}),!0;await new Promise(u=>setTimeout(u,Te)),s++;}catch(m){if(m instanceof Error&&m.message.includes("Transaction failed"))return console.error("[waitForTransactionConfirmation] Transaction explicitly failed"),r.onTransactionReverted({txHash:e,request:o}),!1;await new Promise(p=>setTimeout(p,Te)),s++;}return c==="confirmed"||c==="finalized"?(r.onTransactionConfirmed({txHash:e,request:o,explorerLink:l}),!0):(r.onTransactionReverted({txHash:e,request:o}),!1)};var xr=z.object({account:z.string(),serializedTx:z.string().base64(),sendOptions:z.object({preflightCommitment:z.enum(["processed","confirmed","finalized"]).optional(),maxRetries:z.bigint().optional(),minContextSlot:z.bigint().optional(),skipPreflight:z.boolean().optional()}).optional()}),vr=z.tuple([xr]),ut=t=>vr.safeParse(t);var yt=async({request:t,network:e,approvalController:r,proxyApiUrl:o,blockaid:a})=>{let{params:n}=t,{data:i,success:s,error:c}=ut(n);if(!s)return console.error("invalid params",c),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:c}})};let[{account:l,serializedTx:m,sendOptions:p}]=i,d=I({isTestnet:!!e.isTestnet,proxyApiUrl:o}),{details:u,isSimulationSuccessful:h,alert:y,balanceChange:T}=await Q({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:l,chain:F(e),transactionBase64:m},blockaid:a},network:e,provider:d}),k={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:u,alert:y,balanceChange:T,networkFeeSelector:!1,isSimulationSuccessful:h},g={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:l,data:m},_=await r.requestApproval({request:t,displayData:k,signingData:g});if("error"in _)return {error:_.error};let E;try{return E=await Ir(d,_,p),await r.onTransactionPending({txHash:E,request:t}),dt({provider:d,txHash:E,approvalController:r,request:t,network:e,commitment:p?.preflightCommitment}),{result:E}}catch(B){return console.error(B),{error:rpcErrors.internal({message:"Transaction failed",data:{cause:B}})}}},Ir=async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send();var br=z.object({account:z.string(),serializedTx:z.string().base64()}),wr=z.tuple([br]),gt=t=>wr.safeParse(t);var ht=async({request:t,network:e,approvalController:r,proxyApiUrl:o,blockaid:a})=>{let{params:n}=t,{data:i,success:s,error:c}=gt(n);if(!s)return console.error("invalid params",c),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:c}})};let[{account:l,serializedTx:m}]=i,p=I({isTestnet:!!e.isTestnet,proxyApiUrl:o}),{details:d,isSimulationSuccessful:u,alert:h,balanceChange:y}=await Q({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:l,chain:F(e),transactionBase64:m},blockaid:a},network:e,provider:p}),T={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:d,alert:h,balanceChange:y&&rt(y)?void 0:y,networkFeeSelector:!1,isSimulationSuccessful:u},k={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:l,data:m},g=await r.requestApproval({request:t,displayData:T,signingData:k});return "error"in g?{error:g.error}:"signedData"in g?{result:g.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}};var Pt=t=>{try{let e=base64.decode(t);return getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}};var Er=z.object({account:z.string(),serializedMessage:z.string().base64()}).refine(({serializedMessage:t})=>!Pt(t),{message:"Cannot use signMessage() calls for signing transactions"}),Cr=z.tuple([Er]),St=t=>Cr.safeParse(t);var At=async({request:t,network:e,approvalController:r})=>{let{params:o}=t,{data:a,success:n,error:i}=St(o);if(!n)return console.error("invalid params",i),{error:rpcErrors.invalidParams({message:"Message signing params are invalid",data:{cause:i}})};let[{account:s,serializedMessage:c}]=a,l=new TextDecoder,m={title:"Sign Message",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} is requesting to sign the following message`,logoUri:t.dappInfo.icon},details:[{title:"Message Details",items:[S("Account",s),le("Message",l.decode(base64.decode(c))),K("Raw Message (Base-64)",c)]}],networkFeeSelector:!1},p={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:s,data:c},d=await r.requestApproval({request:t,displayData:m,signingData:p});return "error"in d?{error:d.error}:"signedData"in d?{result:d.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}};var A,D,j,V,vt=class{constructor({approvalController:e,environment:r,appInfo:o,runtime:a}){c(this,A,void 0);c(this,D,void 0);c(this,j,void 0);c(this,V,void 0);let{proxyApiUrl:n}=De(r);d(this,j,o),d(this,A,n),d(this,D,e),b$1(this,A),b$1(this,D),b$1(this,j),d(this,V,new Mr({baseURL:n+"/proxy/blockaid/",apiKey:Fe,httpAgent:a?.httpAgent,fetch:a?.fetch}));}async getProvider(e){return I({isTestnet:!!e.isTestnet,proxyApiUrl:b$1(this,A)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return H(e)}deriveAddress(e){return Ee({...e,approvalController:b$1(this,D)})}getBalances(e){let r=new $({storage:e.storage,proxyApiUrl:b$1(this,A)});return qe({...e,tokenService:r,proxyApiUrl:b$1(this,A)})}getManifest(){let e=parseManifest(we);return e.success?e.data:void 0}getNetworkFee(e){return Oe(e,b$1(this,A))}getTransactionHistory(e){return et({network:e.network,address:e.address,proxyApiUrl:b$1(this,A)})}getTokens(e){return e.caipId?Ge({caip2Id:e.caipId,proxyApiUrl:b$1(this,A)}):Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}async onRpcRequest(e,r){switch(e.method){case RpcMethod.SOLANA_SIGN_TRANSACTION:return ht({approvalController:b$1(this,D),proxyApiUrl:b$1(this,A),network:r,request:e,blockaid:b$1(this,V)});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return yt({approvalController:b$1(this,D),proxyApiUrl:b$1(this,A),network:r,request:e,blockaid:b$1(this,V)});case RpcMethod.SOLANA_SIGN_MESSAGE:return At({approvalController:b$1(this,D),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};A=new WeakMap,D=new WeakMap,j=new WeakMap,V=new WeakMap;
14
+ var ge=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=j.exponential()})=>{let a=0,o=0,i;for(;o<r;){o>0&&await Dt(a);try{let s=await t(o);if(e(s))return s}catch(s){i=s;}a=n(o),o++;}let c=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(c)},j=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}static linearThenExponential(e,r){return n=>{if(n<e)return (n+1)*r;let a=n-e+1,o=e*r,i=2*r*(Math.pow(2,a)-1);return o+i}}};function Dt(t){return new Promise(e=>setTimeout(e,t))}var ye=t=>ge({operation:e=>t(e>0),maxRetries:2,backoffPolicy:j.constant(1),isSuccess:e=>e?.status?.error_code!==429});function De(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function Te(t){let e,r=0;for(e=0;e<t.length;e++){let n=De(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function M(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 Q=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return M([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}simplePriceByContractAddresses(e){let{id:r,...n}=e,a=new URLSearchParams(n);return M([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${a}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}};var Ee=getBasicCoingeckoHttp(),G,q,te=class{constructor({storage:e,proxyApiUrl:r}){c(this,G,void 0);c(this,q,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(a=>{let o=e[a];n[a]={},r.forEach(i=>{n[a]={[i]:{price:o?.[i],change24:o?.[`${i}_24h_change`],vol24:o?.[`${i}_24h_vol`],marketCap:o?.[`${i}_market_cap`]}};});}),n});d(this,G,e),d(this,q,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,o=`getSimplePrice-${e?`${Te(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b$1(this,G)?.get?.(o),n)return n;try{n=await ye(i=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{n=void 0;}return b$1(this,G)?.set?.(o,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let a,i=`getPricesWithMarketDataByAddresses-${`${Te(e)}-${r}-${n}`}`;if(a=b$1(this,G)?.get?.(i),a)return a;try{a=await ye(c=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:c}));}catch(c){console.error(c),a=void 0;}return b$1(this,G)?.set?.(i,a),a}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:a=!1}){if(a){let o=await new Q(b$1(this,q)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0});return this.transformSimplePriceResponse(o,[n])}return simpleTokenPrice(Ee,{assetPlatformId:e,tokenAddresses:r,currencies:[n],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:n=!1,vol24:a=!1,change24:o=!1,lastUpdated:i=!1,useCoingeckoProxy:c=!1,shouldThrow:s=!0}){if(c){let m=await new Q(b$1(this,q)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:a,include_24hr_change:o,include_last_updated_at:i});return this.transformSimplePriceResponse(m,r)}return simplePrice(Ee,{coinIds:e,currencies:r,marketCap:n,vol24:a,change24:o,lastUpdated:i,shouldThrow:s})}};G=new WeakMap,q=new WeakMap;object({date:string(),usd:record(number())});var he=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e});var b=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e}),Se=(t,e)=>({label:t,type:DetailItemType.ADDRESS_LIST,value:e});var re=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});process.env.GLACIER_API_KEY;var Be={name:"SVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"],namespaces:["solana"]},cointype:"501",permissions:{rpc:{dapps:!0,methods:["solana_signTransaction","solana_signAndSendTransaction","solana_signMessage"],nonRestrictedMethods:[]}},manifestVersion:"0.1"};var Ft={proxyApiUrl:"https://proxy-api.avax.network"},Vt={proxyApiUrl:"https://proxy-api-dev.avax.network"},Ue=t=>{switch(t){case Environment.PRODUCTION:return Ft;case Environment.DEV:return Vt}};var Me=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var ie=({accountIndex:t})=>{if(t<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");return {[NetworkVMType.SVM]:`m/44'/501'/${t}'/0'`}};var Oe=async t=>{let{approvalController:e,secretId:r}=t,n=Me(t)?ie(t).SVM:void 0,a=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:n});return {[NetworkVMType.SVM]:base58.encode(hex.decode(a))}};var Fe="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Ve="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Ge="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",$e="/proxy/nownodes/sol",ze="https://api.devnet.solana.com";var Ke="DUMMY_API_KEY";var L=({isTestnet:t,proxyApiUrl:e})=>getSolanaProvider({isTestnet:t,rpcUrl:t?ze:e+$e});var ke=1e6,U={high:150*ke,medium:75*ke,low:2*ke},qt=t=>(t.length===0?[U.low,U.low]:t.length===1?[t[0],U.low]:t).slice().sort((r,n)=>r-n);async function We(t,e){let a=await(await L({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(a.length===0||a.every(h=>h.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(U.high),maxPriorityFeePerGas:BigInt(U.high)},medium:{maxFeePerGas:BigInt(U.medium),maxPriorityFeePerGas:BigInt(U.medium)},low:{maxFeePerGas:BigInt(U.low),maxPriorityFeePerGas:BigInt(U.low)},baseFee:BigInt(U.low),displayDecimals:9,isFixedFee:!1};let i=qt(a.map(h=>Number(h.prioritizationFee))),c=i.at(0),s=i.at(-1),m=Math.floor(i.length/2),p=i.length%2===1?i[m]:(i[m-1]+i[m])/2,l=BigInt(Math.ceil(s*1.05)),d=BigInt(Math.ceil(p*1.05)),u=BigInt(Math.ceil(c*1.05));return {high:{maxFeePerGas:l,maxPriorityFeePerGas:l},medium:{maxFeePerGas:d,maxPriorityFeePerGas:d},low:{maxFeePerGas:u,maxPriorityFeePerGas:u},baseFee:u,displayDecimals:9,isFixedFee:!1}}var Yt=z.object({address:z.string(),name:z.string(),symbol:z.string(),contractType:z.literal(TokenType.SPL),caip2Id:z.string().startsWith("solana:"),decimals:z.number(),chainId:z.number().optional(),logoUri:z.string().optional(),color:z.string().optional()}),je=z.array(Yt);async function qe({caip2Id:t,proxyApiUrl:e}){try{return (await M([`${e}/solana-tokens?caip2Id=${t}`],je)).map(n=>({...n,type:n.contractType}))}catch(r){throw console.error("getTokens() failed for",t,r),rpcErrors.internal(`Failed to fetch tokens for caip2Id "${t}"`)}}var W=t=>t.status==="fulfilled";var He=z.object({nativeBalance:z.object({lamports:z.string(),solana:z.string()}),nfts:z.array(z.object({associatedTokenAddress:z.string(),mint:z.string(),name:z.string(),symbol:z.string()})),tokens:z.array(z.object({associatedTokenAddress:z.string(),mint:z.string(),amountRaw:z.string(),amount:z.string(),decimals:z.number(),name:z.string(),symbol:z.string(),logo:z.string().optional().nullable()}))});var ne,pe,Ye,H=class{constructor({proxyApiUrl:e}){c(this,pe);c(this,ne,void 0);d(this,ne,`${e}/proxy/moralis`);}async getPortfolio({address:e$1,network:r}){try{let n=e(this,pe,Ye).call(this,`/account/${r}/${e$1}/portfolio`),a=await M([n],He);return {address:e$1,portfolio:a}}catch(n){console.error("getPortfolio() failed:",n);let a=n instanceof Error?n.message:"unknown error";return {address:e$1,error:`getPortfolio() failed: ${a}`}}}};ne=new WeakMap,pe=new WeakSet,Ye=function(e){return `${b$1(this,ne)}${e}`};var $=t=>{switch(t.caipId){case Fe:return "mainnet";case Ve:return "devnet";case Ge:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}};var Qe=async({addresses:t,proxyApiUrl:e,currency:r,network:n,tokenService:a})=>{let o=new H({proxyApiUrl:e}),i=n.pricingProviders?.coingecko.nativeTokenId??"",c=n.pricingProviders?.coingecko.assetPlatformId??"",s=r.toLowerCase(),m=$(n),p=await Promise.all(t.map(f=>o.getPortfolio({address:f,network:m}))),l=new Set(p.flatMap(f=>"portfolio"in f?f.portfolio.tokens.map(({mint:g})=>g):[])),d=await Promise.allSettled([i?await a.getSimplePrice({coinIds:[i],currencies:[s]}):Promise.resolve(void 0),c?await a.getPricesByAddresses(Array.from(l),c,s):Promise.resolve(void 0)]),[u,h]=d.map(f=>W(f)?f.value:void 0);return p.reduce((f,g)=>{if("error"in g)return {...f,[g.address]:{error:g.error}};let P=new TokenUnit(g.portfolio.nativeBalance.lamports,9,"SOL"),y=Ze(i,s,u),A=y.priceInCurrency!==void 0?P.mul(y.priceInCurrency):void 0,D={type:TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:P.toSubUnit(),balanceDisplayValue:P.toString(),balanceInCurrency:A?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:A?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:i,...y},x=g.portfolio.tokens.reduce((R,{amountRaw:S,symbol:k,decimals:I,mint:w,name:_,logo:V})=>{let ae=new TokenUnit(S,I,k),Z=Ze(w,s,h),z=Z.priceInCurrency!==void 0?ae.mul(Z.priceInCurrency):void 0,K={type:TokenType.SPL,address:w,name:_,symbol:k,decimals:I,balance:ae.toSubUnit(),balanceDisplayValue:ae.toString(),balanceInCurrency:z?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:z?.toDisplay({fixedDp:2}),logoUri:V??void 0,reputation:null,...Z};return {...R,[w]:K}},{});return {...f,[g.address]:{[n.networkToken.symbol]:D,...x}}},{})},Ze=(t,e,r)=>({priceInCurrency:r?.[t??""]?.[e]?.price??void 0,marketCap:r?.[t??""]?.[e]?.marketCap??void 0,vol24:r?.[t??""]?.[e]?.vol24??void 0,change24:r?.[t??""]?.[e]?.change24??void 0});var Ae=t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),et=(t,e,r,n)=>{let a=e!==-1?t[e]:r.preTokenBalances.find(s=>!t.includes(s.owner))?.owner||r.postTokenBalances.find(s=>!t.includes(s.owner))?.owner,o=r.preTokenBalances.reduce((s,{owner:m,mint:p,amount:l})=>({...s,[`${m}-${p}`]:l}),{}),i=r.postTokenBalances.reduce((s,{owner:m,mint:p,amount:l,decimals:d})=>{let u=`${m}-${p}`,h=o[u]??0n,f=l-h;if(f===0n)return s;let g=f>0n&&m===a,P=f<0n&&m===a;if(g){let y=Object.keys(o).find(x=>{let[R,S]=x.split("-");if(S!==p||R===a)return !1;let k=o[x],I=r.postTokenBalances.find(({owner:_,mint:V})=>_===R&&V===p);return !I||I.amount<k});if(!y)return s;let A=n.tokens?.filter(x=>"contractType"in x).find(x=>x.address===p)??{contractType:TokenType.SPL,decimals:d,address:p,symbol:"Unknown",name:"Unknown"},D={...A,type:A.contractType,from:{...A,address:y.split("-")[0]},to:{...A,address:m},amount:new TokenUnit(f,d,"").toDisplay()};return [...s,D]}else if(P){let y=r.postTokenBalances.find(({owner:x,mint:R})=>R===p&&x!==a&&(o[`${x}-${p}`]??0n)<(r.postTokenBalances.find(S=>S.owner===x&&S.mint===p)?.amount??0n));if(!y)return s;let A=n.tokens?.filter(x=>"contractType"in x).find(x=>x.address===p)??{contractType:TokenType.SPL,decimals:d,address:p,symbol:"Unknown",name:"Unknown"},D={...A,type:A.contractType,from:{...A,address:a},to:{...A,address:y.owner},amount:new TokenUnit(-f,d,"").toDisplay()};return [...s,D]}return s},[]),c=Jt(t,e,r,n,i,a);return c&&i.push(c),i},Jt=(t,e,{paidFee:r,preBalances:n,postBalances:a},o,i=[],c)=>{if(e===-1){if(i.length>0&&c&&i.some(S=>S.to?.address===c)){let S=t.findIndex(k=>k===c);if(S!==-1){let k=n[S],w=a[S]-k;if(w<=0){let _=Math.abs(w)+r;if(_>r){let V=new TokenUnit(_,o.networkToken.decimals,""),Z=a.map((z,K)=>z-n[K]).reduce((z,K,we)=>we!==S&&K>z.amount&&K>0?{index:we,amount:K}:z,{index:0,amount:0});return {amount:V.toDisplay(),from:{address:c},to:{address:t[Z.index]},name:o.networkToken.name,symbol:o.networkToken.symbol,type:TokenType.NATIVE}}}}}return null}let s=t[e],m=n[e],l=a[e]-m,d=a.map((R,S)=>R-n[S]),u=i.length>0,h=l!==0?l+r:0,f=h>0,g=0,P=!1;if(u&&e===0&&c){let R=i.some(k=>k.to?.address===c),S=i.some(k=>k.from?.address===c);R&&!S&&(f=!1,P=!0,g=a.map((w,_)=>w-n[_]).reduce((w,_,V)=>V!==e&&_>w.amount&&_>0?{index:V,amount:_}:w,{index:0,amount:0}).index);}if(u&&l<0){let R=d.reduce((S,k,I)=>I!==e&&k>S.amount?{index:I,amount:k}:S,{index:0,amount:0});R.amount>r*2&&!P&&(h=R.amount,f=!0,g=R.index);}else u&&l<=0&&i.some(S=>S.to?.address===s)&&(h=Math.abs(l)+r,f=!1,g=d.reduce((k,I,w)=>w!==e&&I>k.amount&&I>0?{index:w,amount:I}:k,{index:0,amount:0}).index);if(!h)return null;let y=new TokenUnit(Math.abs(h),o.networkToken.decimals,"");if(!u){let R=d.reduce(({index:S,change:k},I,w)=>I>k?{index:w,change:I}:{index:S,change:k},{index:0,change:d[0]});g=f?0:R.index;}let A=t[g],D=f?A||s:c||s,x=f?c||s:A||c||s;return {amount:y.toDisplay(),from:{address:D},to:{address:x},name:o.networkToken.name,symbol:o.networkToken.symbol,type:TokenType.NATIVE}};function tt(t){return e=>!!e[t]}var nt=async({network:t,address:e,proxyApiUrl:r})=>{let n=L({isTestnet:!!t.isTestnet,proxyApiUrl:r}),o=(await n.getSignaturesForAddress(address(e),{limit:25}).send()).map(s=>s.signature),i=o;try{let s=new H({proxyApiUrl:r}),m=$(t),p=await s.getPortfolio({address:e,network:m});if("portfolio"in p){let l=p.portfolio.tokens.map(P=>P.associatedTokenAddress),d=p.portfolio.nfts.map(P=>P.associatedTokenAddress),h=[...l,...d].map(async P=>{try{return (await n.getSignaturesForAddress(address(P),{limit:25}).send()).map(A=>A.signature)}catch(y){return console.error("Failed to get signatures for ATA:",P,y),[]}}),g=(await Promise.allSettled(h)).filter(W).map(P=>P.value).flat();i=Array.from(new Set([...o,...g]));}}catch(s){console.error("ATA discovery failed with error:",s);}return (await Promise.allSettled(i.map(async s=>({txHash:s.toString(),tx:await n.getTransaction(s,{encoding:"json",maxSupportedTransactionVersion:0}).send()})))).filter(W).map(s=>s.value).filter(tt("tx"))};var ot=(t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""};async function at({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await nt({network:t,address:e,proxyApiUrl:r})).map(({txHash:o,tx:i})=>{if(!i.meta)return null;let{meta:c,transaction:{message:s}}=i,m=s.accountKeys.map(f=>f.toString()),p=m.indexOf(e),l=p!==-1;!l&&c.preTokenBalances&&(c.preTokenBalances.some(g=>g.owner===e)||(c.postTokenBalances??[]).some(g=>g.owner===e))&&(l=!0,p=-1);let d=p!==-1&&p<s.header.numRequiredSignatures,u=et(m,p,{paidFee:d?Number(c.fee):0,preBalances:c.preBalances.map(Number),postBalances:c.postBalances.map(Number),preTokenBalances:(c.preTokenBalances??[]).map(Ae),postTokenBalances:(c.postTokenBalances??[]).map(Ae)},t),h=Qt(u,e);return {hash:o,txType:h,gasUsed:String(i.meta.computeUnitsConsumed??"0"),tokens:u,from:u[0]?.from?.address??m[0],to:u[0]?.to?.address??(d?"":e),isOutgoing:d,isIncoming:!d,isSender:d,timestamp:Number(i.blockTime)*1e3,isContractCall:!1,gasPrice:String(Number(i.meta.fee)/Number(i.meta.computeUnitsConsumed)),chainId:String(t.chainId),explorerLink:ot(o,t.explorerUrl)}}).filter(o=>o!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}var Qt=(t,e)=>{if(t.length===0)return TransactionType.UNKNOWN;let r=t.filter(o=>o.from?.address===e||o.to?.address===e);if(r.length===0)return TransactionType.UNKNOWN;let n=r.some(o=>o.from?.address===e),a=r.some(o=>o.to?.address===e);return n&&a?TransactionType.SWAP:n?TransactionType.SEND:a?TransactionType.RECEIVE:TransactionType.UNKNOWN};var st=t=>{if(t?.type==="InstructionError")switch(t.code){case"ResultWithNegativeLamports":return {type:AlertType.WARNING,details:{title:"This transaction will likely be reverted",description:"Your account does not have enough SOL to perform the operation"}}}return {type:AlertType.WARNING,details:{title:"Transaction simulation has failed",description:"It is possible that this transaction will fail. Please proceed with caution."}}},xe={[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"}}}};function it(t){return t.ins.length===0&&t.outs.length===0}function ct(t){return t!=null}var pt=(t,e,r,n)=>{if(!isInstructionForProgram(t,SYSTEM_PROGRAM_ADDRESS)||!isInstructionWithAccounts(t)||!isInstructionWithData(t))return null;try{if(identifySystemInstruction(t)!==SystemInstruction.TransferSol)return null;let{accounts:o,data:i}=parseTransferSolInstruction({...t,data:Uint8Array.from(t.data)}),s=o.source.address===r===!0?"outs":"ins";return e[s].push({token:{...n,address:""},items:[{displayValue:new TokenUnit(i.amount,n.decimals,"").toString(),usdPrice:void 0}]}),{title:"Transfer SOL",items:[b("From",o.source.address),b("To",o.destination.address)]}}catch{return null}};var fr=async(t,e)=>{try{let r=await t.getAccountInfo(e,{encoding:"jsonParsed"}).send();if(Array.isArray(r.value?.data))return null;let n=r.value?.data.parsed.info;return typeof n?.mint=="string"?n.mint:null}catch{return null}},lt=async(t,e,r,n,a)=>{if(!a?.length||!isInstructionWithAccounts(e)||!isInstructionWithData(e))return null;try{let o=identifyTokenInstruction(e);if(o!==TokenInstruction.Transfer&&o!==TokenInstruction.TransferChecked)return null;let i=o===TokenInstruction.TransferChecked?parseTransferCheckedInstruction:parseTransferInstruction,{accounts:c,data:s}=i({...e,data:Uint8Array.from(e.data)}),m=await fr(t,c.source.address);if(!m)return null;let p=a.find(h=>h.address.toLowerCase()===m.toLowerCase());if(!p)return null;let d=(c.source.address===n||c.authority.address===n)===!0?"outs":"ins",u="decimals"in s?s.decimals:p.decimals;return r[d].push({token:p,items:[{displayValue:new TokenUnit(s.amount,u,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${p.symbol}`,items:[b("From",c.source.address),b("To",c.destination.address)]}}catch{return null}};var mt=async(t,e,r,n)=>{let a=await deserializeTransactionMessage(t,n),o={ins:[],outs:[]},i=await Promise.allSettled(a.instructions.map(async c=>pt(c,o,e,r.networkToken)??await lt(n,c,o,e,r.tokens)??null)).then(c=>c.filter(W).map(s=>s.value).filter(ct));return {balanceChange:o,details:i}};var ut=(t,e,r)=>{let n=e.account_summary.account_assets_diff??[],a={},o={},i=Object.keys(e.assets_diff??{}).filter(c=>c!==t);return n.forEach(({asset:c,in:s,out:m})=>{let p=hr(c,r);if(!p)return;let l="address"in p?p.address:p.symbol;s&&(a[l]||(a[l]={token:p,items:[]}),a[l].items.push({displayValue:String(s.value),usdPrice:typeof s.usd_price=="number"?String(s.usd_price):void 0})),m&&(o[l]||(o[l]={token:p,items:[]}),o[l].items.push({displayValue:String(m.value),usdPrice:typeof m.usd_price=="number"?String(m.usd_price):void 0}));}),{balanceChange:{ins:Object.values(a),outs:Object.values(o)},otherAffectedAddresses:i}},yr=t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),Tr=(t,e)=>({type:TokenType.SPL,address:t.address,caip2Id:e.caipId??"",contractType:TokenType.SPL,decimals:t.decimals,name:t.name,symbol:t.symbol,logoUri:t.logo||void 0}),hr=(t,e)=>t.type==="TOKEN"?Tr(t,e):t.type==="SOL"||t.type==="ETH"?yr(t):null;var ft=async({params:t,dAppUrl:e,blockaid:r})=>{try{return await r.solana.message.scan({chain:t.chain,options:["simulation","validation"],encoding:"base64",metadata:{url:e},transactions:[t.transactionBase64],account_address:base64.encode(base58.decode(t.account))})}catch(n){return console.error("solana.message.scan() error",n),null}};var de=async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,a=await ft(t),{simulation:o,validation:i}=a?.result??{},c={title:"Transaction Details",items:[re("Raw Data",t.params.transactionBase64)]},s=[c],m=!1,p,l;if(!i||i.result_type==="Warning"?l=xe[AlertType.WARNING]:i.result_type==="Malicious"?l=xe[AlertType.DANGER]:a?.error_details&&(l=st(a.error_details)),o){let{balanceChange:d,otherAffectedAddresses:u}=ut(n.account,o,e);if(p=d,u.length>0){let h=o.account_summary.account_assets_diff,f=h?.filter(y=>y.out&&y.out.raw_value>0)??[],g=h?.filter(y=>y.in&&y.in.raw_value>0)??[];f.length>0&&g.length>0?(c.items.push(b("Account",n.account)),c.items.push(Se("Interacting with",u))):(c.items.push(b(u.length===1?"From":"Account",n.account)),c.items.push(u.length===1?b("To",u[0]):Se("Interacting with",u)));}else c.items.push(b("Account",n.account));m=!0;}else {let{balanceChange:d,details:u}=await mt(n.transactionBase64,n.account,e,r);p=d,s.push(...u);}return {isSimulationSuccessful:m,details:s,alert:l,balanceChange:p}};var kr="https://explorer.solana.com";function yt(t,e,r="tx"){try{let n=t.explorerUrl?new URL(t.explorerUrl):new URL(kr);return n.pathname+=`${r}/${e}`,n.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}var Re=400,xr=15,Tt=async({provider:t,txHash:e,approvalController:r,request:n,network:a,commitment:o="confirmed",maxRetries:i=xr})=>{let c=0,s=null,m=yt(a,e,"tx");for(;c<i;)try{let p=await t.getSignatureStatuses([signature(e)],{searchTransactionHistory:!0}).send();if(!p?.value?.[0]){await new Promise(u=>setTimeout(u,Re)),c++;continue}let{confirmationStatus:l,err:d}=p.value[0];if(d)return console.error("[waitForTransactionConfirmation] Transaction failed:",d),r.onTransactionReverted({txHash:e,request:n}),!1;if(l&&l!==s&&(s=l,l==="processed"&&r.onTransactionPending({txHash:e,request:n}),o==="processed"&&l==="processed"||o==="confirmed"&&["confirmed","finalized"].includes(l)||o==="finalized"&&l==="finalized"))return r.onTransactionConfirmed({txHash:e,request:n,explorerLink:m}),!0;await new Promise(u=>setTimeout(u,Re)),c++;}catch(p){if(p instanceof Error&&p.message.includes("Transaction failed"))return console.error("[waitForTransactionConfirmation] Transaction explicitly failed"),r.onTransactionReverted({txHash:e,request:n}),!1;await new Promise(l=>setTimeout(l,Re)),c++;}return s==="confirmed"||s==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:m}),!0):(r.onTransactionReverted({txHash:e,request:n}),!1)};var vr=z.object({account:z.string(),serializedTx:z.string().base64(),sendOptions:z.object({preflightCommitment:z.enum(["processed","confirmed","finalized"]).optional(),maxRetries:z.bigint().optional(),minContextSlot:z.bigint().optional(),skipPreflight:z.boolean().optional()}).optional()}),Rr=z.tuple([vr]),ht=t=>Rr.safeParse(t);var Pt=async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:a})=>{let{params:o}=t,{data:i,success:c,error:s}=ht(o);if(!c)return console.error("invalid params",s),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:s}})};let[{account:m,serializedTx:p,sendOptions:l}]=i,d=L({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:u,isSimulationSuccessful:h,alert:f,balanceChange:g}=await de({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:m,chain:$(e),transactionBase64:p},blockaid:a},network:e,provider:d}),P={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:u,alert:f,balanceChange:g,networkFeeSelector:!1,isSimulationSuccessful:h},y={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:m,data:p},A=await r.requestApproval({request:t,displayData:P,signingData:y});if("error"in A)return {error:A.error};let D;try{return D=await wr(d,A,l),await r.onTransactionPending({txHash:D,request:t}),Tt({provider:d,txHash:D,approvalController:r,request:t,network:e,commitment:l?.preflightCommitment}),{result:D}}catch(x){return console.error(x),{error:rpcErrors.internal({message:"Transaction failed",data:{cause:x}})}}},wr=async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send();var br=z.object({account:z.string(),serializedTx:z.string().base64()}),Nr=z.tuple([br]),kt=t=>Nr.safeParse(t);var xt=async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:a})=>{let{params:o}=t,{data:i,success:c,error:s}=kt(o);if(!c)return console.error("invalid params",s),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:s}})};let[{account:m,serializedTx:p}]=i,l=L({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:d,isSimulationSuccessful:u,alert:h,balanceChange:f}=await de({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:m,chain:$(e),transactionBase64:p},blockaid:a},network:e,provider:l}),g={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:d,alert:h,balanceChange:f&&it(f)?void 0:f,networkFeeSelector:!1,isSimulationSuccessful:u},P={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:m,data:p},y=await r.requestApproval({request:t,displayData:g,signingData:P});return "error"in y?{error:y.error}:"signedData"in y?{result:y.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}};var vt=t=>{try{let e=base64.decode(t);return getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}};var Cr=z.object({account:z.string(),serializedMessage:z.string().base64()}).refine(({serializedMessage:t})=>!vt(t),{message:"Cannot use signMessage() calls for signing transactions"}),Br=z.tuple([Cr]),Rt=t=>Br.safeParse(t);var wt=async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:a,success:o,error:i}=Rt(n);if(!o)return console.error("invalid params",i),{error:rpcErrors.invalidParams({message:"Message signing params are invalid",data:{cause:i}})};let[{account:c,serializedMessage:s}]=a,m=new TextDecoder,p={title:"Sign Message",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} is requesting to sign the following message`,logoUri:t.dappInfo.icon},details:[{title:"Message Details",items:[b("Account",c),he("Message",m.decode(base64.decode(s))),re("Raw Message (Base-64)",s)]}],networkFeeSelector:!1},l={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:c,data:s},d=await r.requestApproval({request:t,displayData:p,signingData:l});return "error"in d?{error:d.error}:"signedData"in d?{result:d.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}};var N,F,oe,J,Nt=class{constructor({approvalController:e,environment:r,appInfo:n,runtime:a}){c(this,N,void 0);c(this,F,void 0);c(this,oe,void 0);c(this,J,void 0);let{proxyApiUrl:o}=Ue(r);d(this,oe,n),d(this,N,o),d(this,F,e),b$1(this,N),b$1(this,F),b$1(this,oe),d(this,J,new Or({baseURL:o+"/proxy/blockaid/",apiKey:Ke,httpAgent:a?.httpAgent,fetch:a?.fetch}));}async getProvider(e){return L({isTestnet:!!e.isTestnet,proxyApiUrl:b$1(this,N)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return ie(e)}deriveAddress(e){return Oe({...e,approvalController:b$1(this,F)})}getBalances(e){let r=new te({storage:e.storage,proxyApiUrl:b$1(this,N)});return Qe({...e,tokenService:r,proxyApiUrl:b$1(this,N)})}getManifest(){let e=parseManifest(Be);return e.success?e.data:void 0}getNetworkFee(e){return We(e,b$1(this,N))}getTransactionHistory(e){return at({network:e.network,address:e.address,proxyApiUrl:b$1(this,N)})}getTokens(e){return e.caipId?qe({caip2Id:e.caipId,proxyApiUrl:b$1(this,N)}):Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}async onRpcRequest(e,r){switch(e.method){case RpcMethod.SOLANA_SIGN_TRANSACTION:return xt({approvalController:b$1(this,F),proxyApiUrl:b$1(this,N),network:r,request:e,blockaid:b$1(this,J)});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return Pt({approvalController:b$1(this,F),proxyApiUrl:b$1(this,N),network:r,request:e,blockaid:b$1(this,J)});case RpcMethod.SOLANA_SIGN_MESSAGE:return wt({approvalController:b$1(this,F),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};N=new WeakMap,F=new WeakMap,oe=new WeakMap,J=new WeakMap;
15
15
 
16
- export { vt as SvmModule };
16
+ export { Nt as SvmModule };
17
17
  //# sourceMappingURL=out.js.map
18
18
  //# sourceMappingURL=index.js.map