@avalabs/svm-module 1.9.4 → 1.9.6

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.d.cts CHANGED
@@ -59,14 +59,14 @@ declare class SvmModule implements Module {
59
59
  onRpcRequest(request: RpcRequest, network: Network): Promise<{
60
60
  error: _avalabs_vm_module_types.RpcError;
61
61
  result?: undefined;
62
+ } | {
63
+ result: string;
64
+ error?: undefined;
62
65
  } | {
63
66
  error: _metamask_rpc_errors.JsonRpcError<{
64
67
  cause: unknown;
65
68
  }>;
66
69
  result?: undefined;
67
- } | {
68
- result: string;
69
- error?: undefined;
70
70
  }>;
71
71
  }
72
72
 
package/dist/index.d.ts CHANGED
@@ -59,14 +59,14 @@ declare class SvmModule implements Module {
59
59
  onRpcRequest(request: RpcRequest, network: Network): Promise<{
60
60
  error: _avalabs_vm_module_types.RpcError;
61
61
  result?: undefined;
62
+ } | {
63
+ result: string;
64
+ error?: undefined;
62
65
  } | {
63
66
  error: _metamask_rpc_errors.JsonRpcError<{
64
67
  cause: unknown;
65
68
  }>;
66
69
  result?: undefined;
67
- } | {
68
- result: string;
69
- error?: undefined;
70
70
  }>;
71
71
  }
72
72
 
package/dist/index.js CHANGED
@@ -2,17 +2,17 @@ import { c, d, b as b$1, a, e } from './chunk-7VP42LRT.js';
2
2
  import { TokenType, AlertType, parseManifest, RpcMethod, Environment, NetworkVMType, TransactionType, RawSimplePriceResponseSchema, DetailItemType } from '@avalabs/vm-module-types';
3
3
  import { rpcErrors } from '@metamask/rpc-errors';
4
4
  import { getBasicCoingeckoHttp, VsCurrencyType, simpleTokenPrice, simplePrice } from '@avalabs/core-coingecko-sdk';
5
- import { object, string, record, number, z as z$1 } from 'zod';
5
+ import { object, string, record, number, z } from 'zod';
6
6
  import { base64, base58, hex } from '@scure/base';
7
7
  import { getSolanaProvider, deserializeTransactionMessage } from '@avalabs/core-wallets-sdk';
8
8
  import { TokenUnit } from '@avalabs/core-utils-sdk';
9
- import { getCompiledTransactionMessageDecoder, address, isInstructionForProgram, isInstructionWithAccounts, isInstructionWithData } from '@solana/kit';
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 ur from '@blockaid/client';
12
+ import Tr from '@blockaid/client';
13
13
 
14
- var ae=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=F.exponential()})=>{let o=0,s=0,i;for(;s<r;){s>0&&await At(o);try{let c=await t(s);if(e(c))return c}catch(c){i=c;}o=n(s),s++;}let a=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(a)},F=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function At(t){return new Promise(e=>setTimeout(e,t))}var ie=t=>ae({operation:e=>t(e>0),maxRetries:2,backoffPolicy:F.constant(1),isSuccess:e=>e?.status?.error_code!==429});function ke(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function ce(t){let e,r=0;for(e=0;e<t.length;e++){let n=ke(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function b(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 O=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return b([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}simplePriceByContractAddresses(e){let{id:r,...n}=e,o=new URLSearchParams(n);return b([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${o}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}};var Ae=getBasicCoingeckoHttp(),_,B,G=class{constructor({storage:e,proxyApiUrl:r}){c(this,_,void 0);c(this,B,void 0);a(this,"transformSimplePriceResponse",(e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(o=>{let s=e[o];n[o]={},r.forEach(i=>{n[o]={[i]:{price:s?.[i],change24:s?.[`${i}_24h_change`],vol24:s?.[`${i}_24h_vol`],marketCap:s?.[`${i}_market_cap`]}};});}),n});d(this,_,e),d(this,B,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,s=`getSimplePrice-${e?`${ce(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b$1(this,_)?.get?.(s),n)return n;try{n=await ie(i=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{n=void 0;}return b$1(this,_)?.set?.(s,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let o,i=`getPricesWithMarketDataByAddresses-${`${ce(e)}-${r}-${n}`}`;if(o=b$1(this,_)?.get?.(i),o)return o;try{o=await ie(a=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:a}));}catch(a){console.error(a),o=void 0;}return b$1(this,_)?.set?.(i,o),o}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:o=!1}){if(o){let s=await new O(b$1(this,B)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0});return this.transformSimplePriceResponse(s,[n])}return simpleTokenPrice(Ae,{assetPlatformId:e,tokenAddresses:r,currencies:[n],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:n=!1,vol24:o=!1,change24:s=!1,lastUpdated:i=!1,useCoingeckoProxy:a=!1,shouldThrow:c=!0}){if(a){let p=await new O(b$1(this,B)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:o,include_24hr_change:s,include_last_updated_at:i});return this.transformSimplePriceResponse(p,r)}return simplePrice(Ae,{coinIds:e,currencies:r,marketCap:n,vol24:o,change24:s,lastUpdated:i,shouldThrow:c})}};_=new WeakMap,B=new WeakMap;object({date:string(),usd:record(number())});var pe=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e});var k=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e}),ve=(t,e)=>({label:t,type:DetailItemType.ADDRESS_LIST,value:e});var z=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});process.env.GLACIER_API_KEY;var Ie={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 Et={proxyApiUrl:"https://proxy-api.avax.network"},Ct={proxyApiUrl:"https://proxy-api-dev.avax.network"},be=t=>{switch(t){case Environment.PRODUCTION:return Et;case Environment.DEV:return Ct}};var De=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var W=({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 we=async t=>{let{approvalController:e,secretId:r}=t,n=De(t)?W(t).SVM:void 0,o=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:n});return {[NetworkVMType.SVM]:base58.encode(hex.decode(o))}};var _e="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Ee="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Ce="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",Be="/proxy/nownodes/sol",Le="https://api.devnet.solana.com";var R=({isTestnet:t,proxyApiUrl:e})=>getSolanaProvider({isTestnet:t,rpcUrl:t?Le:e+Be});var me=1e6,I={high:150*me,medium:75*me,low:2*me},Vt=t=>(t.length===0?[I.low,I.low]:t.length===1?[t[0],I.low]:t).slice().sort((r,n)=>r-n);async function Me(t,e){let o=await(await R({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(o.length===0||o.every(h=>h.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(I.high),maxPriorityFeePerGas:BigInt(I.high)},medium:{maxFeePerGas:BigInt(I.medium),maxPriorityFeePerGas:BigInt(I.medium)},low:{maxFeePerGas:BigInt(I.low),maxPriorityFeePerGas:BigInt(I.low)},baseFee:BigInt(I.low),displayDecimals:9,isFixedFee:!1};let i=Vt(o.map(h=>Number(h.prioritizationFee))),a=i.at(0),c=i.at(-1),p=Math.floor(i.length/2),m=i.length%2===1?i[p]:(i[p-1]+i[p])/2,l=BigInt(Math.ceil(c*1.05)),d=BigInt(Math.ceil(m*1.05)),u=BigInt(Math.ceil(a*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 zt=z$1.object({address:z$1.string(),name:z$1.string(),symbol:z$1.string(),contractType:z$1.literal(TokenType.SPL),caip2Id:z$1.string().startsWith("solana:"),decimals:z$1.number(),chainId:z$1.number().optional(),logoUri:z$1.string().optional(),color:z$1.string().optional()}),Ue=z$1.array(zt);async function Fe({caip2Id:t,proxyApiUrl:e}){try{return (await b([`${e}/solana-tokens?caip2Id=${t}`],Ue)).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 L=t=>t.status==="fulfilled";var Oe=z$1.object({nativeBalance:z$1.object({lamports:z$1.string(),solana:z$1.string()}),nfts:z$1.array(z$1.object({associatedTokenAddress:z$1.string(),mint:z$1.string(),name:z$1.string(),symbol:z$1.string()})),tokens:z$1.array(z$1.object({associatedTokenAddress:z$1.string(),mint:z$1.string(),amountRaw:z$1.string(),amount:z$1.string(),decimals:z$1.number(),name:z$1.string(),symbol:z$1.string(),logo:z$1.string().optional().nullable()}))});var H,X,Ve,Y=class{constructor({proxyApiUrl:e}){c(this,X);c(this,H,void 0);d(this,H,`${e}/proxy/moralis`);}async getPortfolio({address:e$1,network:r}){try{let n=e(this,X,Ve).call(this,`/account/${r}/${e$1}/portfolio`),o=await b([n],Oe);return {address:e$1,portfolio:o}}catch(n){console.error("getPortfolio() failed:",n);let o=n instanceof Error?n.message:"unknown error";return {address:e$1,error:`getPortfolio() failed: ${o}`}}}};H=new WeakMap,X=new WeakSet,Ve=function(e){return `${b$1(this,H)}${e}`};var M=t=>{switch(t.caipId){case _e:return "mainnet";case Ee:return "devnet";case Ce:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}};var $e=async({addresses:t,proxyApiUrl:e,currency:r,network:n,tokenService:o})=>{let s=new Y({proxyApiUrl:e}),i=n.pricingProviders?.coingecko.nativeTokenId??"",a=n.pricingProviders?.coingecko.assetPlatformId??"",c=r.toLowerCase(),p=M(n),m=await Promise.all(t.map(g=>s.getPortfolio({address:g,network:p}))),l=new Set(m.flatMap(g=>"portfolio"in g?g.portfolio.tokens.map(({mint:y})=>y):[])),d=await Promise.allSettled([i?await o.getSimplePrice({coinIds:[i],currencies:[c]}):Promise.resolve(void 0),a?await o.getPricesByAddresses(Array.from(l),a,c):Promise.resolve(void 0)]),[u,h]=d.map(g=>L(g)?g.value:void 0);return m.reduce((g,y)=>{if("error"in y)return {...g,[y.address]:{error:y.error}};let S=new TokenUnit(y.portfolio.nativeBalance.lamports,9,"SOL"),P=He(i,c,u),E=P.priceInCurrency!==void 0?S.mul(P.priceInCurrency):void 0,C={type:TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:S.toSubUnit(),balanceDisplayValue:S.toString(),balanceInCurrency:E?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:E?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:i,...P},q=y.portfolio.tokens.reduce((te,{amountRaw:re,symbol:ge,decimals:Te,mint:ne,name:St,logo:kt})=>{let oe=new TokenUnit(re,Te,ge),se=He(ne,c,h),he=se.priceInCurrency!==void 0?oe.mul(se.priceInCurrency):void 0,xt={type:TokenType.SPL,address:ne,name:St,symbol:ge,decimals:Te,balance:oe.toSubUnit(),balanceDisplayValue:oe.toString(),balanceInCurrency:he?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:he?.toDisplay({fixedDp:2}),logoUri:kt??void 0,reputation:null,...se};return {...te,[ne]:xt}},{});return {...g,[y.address]:{[n.networkToken.symbol]:C,...q}}},{})},He=(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 de=t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),We=(t,e,r,n)=>{let o=r.preTokenBalances.reduce((a,{owner:c,mint:p,amount:m})=>({...a,[`${c}-${p}`]:m}),{}),s=r.postTokenBalances.reduce((a,{owner:c,mint:p,amount:m,decimals:l})=>{let d=`${c}-${p}`,u=o[d]??0n,h=m-u;if(h<=0n)return a;let g=Object.keys(o).find(P=>{let[E,C]=P.split("-"),q=r.postTokenBalances.find(({owner:te,mint:re})=>te===E&&re===p);return C===p&&q&&o[P]>q.amount});if(!g)return a;let y=n.tokens?.filter(P=>"contractType"in P).find(P=>P.address===p)??{contractType:TokenType.SPL,decimals:l,address:p,symbol:"Unknown",name:"Unknown"},S={...y,type:y.contractType,from:{...y,address:g.split("-")[0]},to:{...y,address:c},amount:new TokenUnit(h,l,"").toDisplay()};return [...a,S]},[]),i=$t(t,e,r,n);return i&&s.push(i),s},$t=(t,e,{paidFee:r,preBalances:n,postBalances:o},s)=>{let i=t[e],a=n[e],c=o[e],p=c!==a?c-a+r:0,m=o.map((g,y)=>g-n[y]);if(!p)return null;let l=p>0,d=new TokenUnit(Math.abs(p),s.networkToken.decimals,""),u=m.reduce(({index:g,change:y},S,P)=>S>y?{index:P,change:S}:{index:g,change:y},{index:0,change:m[0]}),h=l?0:u.index;return {amount:d.toDisplay(),from:{address:l?t[h]:i},to:{address:l?i:t[h]},name:s.networkToken.name,symbol:s.networkToken.symbol,type:TokenType.NATIVE}};function Ke(t){return e=>!!e[t]}var Ye=async({isTestnet:t,address:e,proxyApiUrl:r})=>{let n=R({isTestnet:t,proxyApiUrl:r}),s=(await n.getSignaturesForAddress(address(e),{limit:25}).send()).map(a=>a.signature);return (await Promise.allSettled(s.map(async a=>({txHash:a.toString(),tx:await n.getTransaction(a,{encoding:"json",maxSupportedTransactionVersion:0}).send()})))).filter(L).map(a=>a.value).filter(Ke("tx"))};var Xe=(t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""};async function Je({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await Ye({isTestnet:!!t.isTestnet,address:e,proxyApiUrl:r})).map(({txHash:s,tx:i})=>{if(!i.meta)return null;let{meta:a,transaction:{message:c}}=i,p=c.accountKeys.map(u=>u.toString()),m=p.indexOf(e),l=m<c.header.numRequiredSignatures,d=We(p,m,{paidFee:l?Number(a.fee):0,preBalances:a.preBalances.map(Number),postBalances:a.postBalances.map(Number),preTokenBalances:(a.preTokenBalances??[]).map(de),postTokenBalances:(a.postTokenBalances??[]).map(de)},t);return {hash:s,txType:Wt(d,e),gasUsed:String(i.meta.computeUnitsConsumed??"0"),tokens:d,from:d[0]?.from?.address??p[0],to:d[0]?.to?.address??(l?"":e),isOutgoing:l,isIncoming:!l,isSender:l,timestamp:Number(i.blockTime)*1e3,isContractCall:!1,gasPrice:String(Number(i.meta.fee)/Number(i.meta.computeUnitsConsumed)),chainId:String(t.chainId),explorerLink:Xe(s,t.explorerUrl)}}).filter(s=>s!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}var Wt=(t,e)=>t.every(s=>s.from?.address===e)?TransactionType.SEND:t.every(s=>s.to?.address===e)?TransactionType.RECEIVE:t.some(s=>s.from?.address===e)&&t.some(s=>s.to?.address===e)?TransactionType.SWAP:TransactionType.UNKNOWN;var Ze=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."}}},ue={[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 Qe(t){return t.ins.length===0&&t.outs.length===0}function et(t){return t!=null}var tt=(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:s,data:i}=parseTransferSolInstruction({...t,data:Uint8Array.from(t.data)}),c=s.source.address===r===!0?"outs":"ins";return e[c].push({token:{...n,address:""},items:[{displayValue:new TokenUnit(i.amount,n.decimals,"").toString(),usdPrice:void 0}]}),{title:"Transfer SOL",items:[k("From",s.source.address),k("To",s.destination.address)]}}catch{return null}};var cr=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}},rt=async(t,e,r,n,o)=>{if(!o?.length||!isInstructionWithAccounts(e)||!isInstructionWithData(e))return null;try{let s=identifyTokenInstruction(e);if(s!==TokenInstruction.Transfer&&s!==TokenInstruction.TransferChecked)return null;let i=s===TokenInstruction.TransferChecked?parseTransferCheckedInstruction:parseTransferInstruction,{accounts:a,data:c}=i({...e,data:Uint8Array.from(e.data)}),p=await cr(t,a.source.address);if(!p)return null;let m=o.find(h=>h.address.toLowerCase()===p.toLowerCase());if(!m)return null;let d=(a.source.address===n||a.authority.address===n)===!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:[k("From",a.source.address),k("To",a.destination.address)]}}catch{return null}};var nt=async(t,e,r,n)=>{let o=await deserializeTransactionMessage(t,n),s={ins:[],outs:[]},i=await Promise.allSettled(o.instructions.map(async a=>tt(a,s,e,r.networkToken)??await rt(n,a,s,e,r.tokens)??null)).then(a=>a.filter(L).map(c=>c.value).filter(et));return {balanceChange:s,details:i}};var st=(t,e,r)=>{let n=e.account_summary.account_assets_diff??[],o={},s={},i=Object.keys(e.assets_diff??{}).filter(a=>a!==t);return n.forEach(({asset:a,in:c,out:p})=>{let m=dr(a,r);if(!m)return;let l="address"in m?m.address:m.symbol;c&&(o[l]||(o[l]={token:m,items:[]}),o[l].items.push({displayValue:String(c.value),usdPrice:typeof c.usd_price=="number"?String(c.usd_price):void 0})),p&&(s[l]||(s[l]={token:m,items:[]}),s[l].items.push({displayValue:String(p.value),usdPrice:typeof p.usd_price=="number"?String(p.usd_price):void 0}));}),{balanceChange:{ins:Object.values(o),outs:Object.values(s)},otherAffectedAddresses:i}},lr=t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),mr=(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}),dr=(t,e)=>t.type==="TOKEN"?mr(t,e):t.type==="SOL"||t.type==="ETH"?lr(t):null;var gr="DUMMY_API_KEY",at=async({proxyApiUrl:t,params:e,dAppUrl:r})=>{let n=new ur({baseURL:t+"/proxy/blockaid/",apiKey:gr});try{return await n.solana.message.scan({chain:e.chain,options:["simulation","validation"],encoding:"base64",metadata:{url:r},transactions:[e.transactionBase64],account_address:base64.encode(base58.decode(e.account))})}catch(o){return console.error("solana.message.scan() error",o),null}};var Z=async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,o=await at(t),{simulation:s,validation:i}=o?.result??{},a={title:"Transaction Details",items:[z("Raw Data",t.params.transactionBase64)]},c=[a],p=!1,m,l;if(!i||i.result_type==="Warning"?l=ue[AlertType.WARNING]:i.result_type==="Malicious"?l=ue[AlertType.DANGER]:o?.error_details&&(l=Ze(o.error_details)),s){let{balanceChange:d,otherAffectedAddresses:u}=st(n.account,s,e);m=d,u.length>0?(a.items.push(k(u.length===1?"From":"Account",n.account)),a.items.push(u.length===1?k("To",u[0]):ve("Interacting with",u))):a.items.push(k("Account",n.account)),p=!0;}else {let{balanceChange:d,details:u}=await nt(n.transactionBase64,n.account,e,r);m=d,c.push(...u);}return {isSimulationSuccessful:p,details:c,alert:l,balanceChange:m}};var Tr=z$1.object({account:z$1.string(),serializedTx:z$1.string().base64(),sendOptions:z$1.object({preflightCommitment:z$1.enum(["processed","confirmed","finalized"]).optional(),maxRetries:z$1.bigint().optional(),minContextSlot:z$1.bigint().optional(),skipPreflight:z$1.boolean().optional()}).optional()}),hr=z$1.tuple([Tr]),ct=t=>hr.safeParse(t);var lt=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:o}=t,{data:s,success:i,error:a}=ct(o);if(!i)return console.error("invalid params",a),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a}})};let[{account:c,serializedTx:p,sendOptions:m}]=s,l=R({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:d,isSimulationSuccessful:u,alert:h,balanceChange:g}=await Z({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:M(e),transactionBase64:p},proxyApiUrl:n},network:e,provider:l}),y={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:d,alert:h,balanceChange:g,networkFeeSelector:!1,isSimulationSuccessful:u},S={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:c,data:p},P=await r.requestApproval({request:t,displayData:y,signingData:S});if("error"in P)return {error:P.error};let E;try{E=await Sr(l,P,m);}catch(C){return console.error(C),{error:rpcErrors.internal({message:"Unable to get transaction hash",data:{cause:C}})}}return {result:E}},Sr=async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send();var kr=z$1.object({account:z$1.string(),serializedTx:z$1.string().base64()}),xr=z$1.tuple([kr]),mt=t=>xr.safeParse(t);var ut=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:o}=t,{data:s,success:i,error:a}=mt(o);if(!i)return console.error("invalid params",a),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a}})};let[{account:c,serializedTx:p}]=s,m=R({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:l,isSimulationSuccessful:d,alert:u,balanceChange:h}=await Z({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:M(e),transactionBase64:p},proxyApiUrl:n},network:e,provider:m}),g={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:l,alert:u,balanceChange:h&&Qe(h)?void 0:h,networkFeeSelector:!1,isSimulationSuccessful:d},y={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:c,data:p},S=await r.requestApproval({request:t,displayData:g,signingData:y});return "error"in S?{error:S.error}:"signedData"in S?{result:S.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}};var ft=t=>{try{let e=base64.decode(t);return getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}};var Ir=z$1.object({account:z$1.string(),serializedMessage:z$1.string().base64()}).refine(({serializedMessage:t})=>!ft(t),{message:"Cannot use signMessage() calls for signing transactions"}),Nr=z$1.tuple([Ir]),yt=t=>Nr.safeParse(t);var Tt=async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:o,success:s,error:i}=yt(n);if(!s)return console.error("invalid params",i),{error:rpcErrors.invalidParams({message:"Message signing params are invalid",data:{cause:i}})};let[{account:a,serializedMessage:c}]=o,p=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:[k("Account",a),pe("Message",p.decode(base64.decode(c))),z("Raw Message (Base-64)",c)]}],networkFeeSelector:!1},l={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:a,data:c},d=await r.requestApproval({request:t,displayData:m,signingData:l});return "error"in d?{error:d.error}:"signedData"in d?{result:d.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}};var x,w,$,Pt=class{constructor({approvalController:e,environment:r,appInfo:n}){c(this,x,void 0);c(this,w,void 0);c(this,$,void 0);let{proxyApiUrl:o}=be(r);d(this,$,n),d(this,x,o),d(this,w,e),b$1(this,x),b$1(this,w),b$1(this,$);}async getProvider(e){return R({isTestnet:!!e.isTestnet,proxyApiUrl:b$1(this,x)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return W(e)}deriveAddress(e){return we({...e,approvalController:b$1(this,w)})}getBalances(e){let r=new G({storage:e.storage,proxyApiUrl:b$1(this,x)});return $e({...e,tokenService:r,proxyApiUrl:b$1(this,x)})}getManifest(){let e=parseManifest(Ie);return e.success?e.data:void 0}getNetworkFee(e){return Me(e,b$1(this,x))}getTransactionHistory(e){return Je({network:e.network,address:e.address,proxyApiUrl:b$1(this,x)})}getTokens(e){return e.caipId?Fe({caip2Id:e.caipId,proxyApiUrl:b$1(this,x)}):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 ut({approvalController:b$1(this,w),proxyApiUrl:b$1(this,x),network:r,request:e});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return lt({approvalController:b$1(this,w),proxyApiUrl:b$1(this,x),network:r,request:e});case RpcMethod.SOLANA_SIGN_MESSAGE:return Tt({approvalController:b$1(this,w),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};x=new WeakMap,w=new WeakMap,$=new WeakMap;
14
+ var ae=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=F.exponential()})=>{let s=0,o=0,i;for(;o<r;){o>0&&await wt(s);try{let c=await t(o);if(e(c))return c}catch(c){i=c;}s=n(o),o++;}let a=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(a)},F=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function wt(t){return new Promise(e=>setTimeout(e,t))}var ie=t=>ae({operation:e=>t(e>0),maxRetries:2,backoffPolicy:F.constant(1),isSuccess:e=>e?.status?.error_code!==429});function Ae(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function ce(t){let e,r=0;for(e=0;e<t.length;e++){let n=Ae(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function b(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 O=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return b([`${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 b([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${s}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema)}};var Re=getBasicCoingeckoHttp(),E,B,G=class{constructor({storage:e,proxyApiUrl:r}){c(this,E,void 0);c(this,B,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(i=>{n[s]={[i]:{price:o?.[i],change24:o?.[`${i}_24h_change`],vol24:o?.[`${i}_24h_vol`],marketCap:o?.[`${i}_market_cap`]}};});}),n});d(this,E,e),d(this,B,r);}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,o=`getSimplePrice-${e?`${ce(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=b$1(this,E)?.get?.(o),n)return n;try{n=await ie(i=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{n=void 0;}return b$1(this,E)?.set?.(o,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,i=`getPricesWithMarketDataByAddresses-${`${ce(e)}-${r}-${n}`}`;if(s=b$1(this,E)?.get?.(i),s)return s;try{s=await ie(a=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:a}));}catch(a){console.error(a),s=void 0;}return b$1(this,E)?.set?.(i,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:s=!1}){if(s){let o=await new O(b$1(this,B)).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(Re,{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:i=!1,useCoingeckoProxy:a=!1,shouldThrow:c=!0}){if(a){let l=await new O(b$1(this,B)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:s,include_24hr_change:o,include_last_updated_at:i});return this.transformSimplePriceResponse(l,r)}return simplePrice(Re,{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:o,lastUpdated:i,shouldThrow:c})}};E=new WeakMap,B=new WeakMap;object({date:string(),usd:record(number())});var pe=(t,e,r,n)=>({label:t,type:DetailItemType.CURRENCY,value:e,maxDecimals:r,symbol:n}),le=(t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e});var k=(t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e}),Ie=(t,e)=>({label:t,type:DetailItemType.ADDRESS_LIST,value:e});var $=(t,e)=>({label:t,type:DetailItemType.DATA,value:e});process.env.GLACIER_API_KEY;var Ne={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 Ut={proxyApiUrl:"https://proxy-api.avax.network"},Mt={proxyApiUrl:"https://proxy-api-dev.avax.network"},De=t=>{switch(t){case Environment.PRODUCTION:return Ut;case Environment.DEV:return Mt}};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,n=_e(t)?H(t).SVM:void 0,s=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:n});return {[NetworkVMType.SVM]:base58.encode(hex.decode(s))}};var Ce="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Be="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Le="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",Ue="/proxy/nownodes/sol",Me="https://api.devnet.solana.com";var R=({isTestnet:t,proxyApiUrl:e})=>getSolanaProvider({isTestnet:t,rpcUrl:t?Me:e+Ue});var de=1e6,I={high:150*de,medium:75*de,low:2*de},Wt=t=>(t.length===0?[I.low,I.low]:t.length===1?[t[0],I.low]:t).slice().sort((r,n)=>r-n);async function Fe(t,e){let s=await(await R({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(s.length===0||s.every(T=>T.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(I.high),maxPriorityFeePerGas:BigInt(I.high)},medium:{maxFeePerGas:BigInt(I.medium),maxPriorityFeePerGas:BigInt(I.medium)},low:{maxFeePerGas:BigInt(I.low),maxPriorityFeePerGas:BigInt(I.low)},baseFee:BigInt(I.low),displayDecimals:9,isFixedFee:!1};let i=Wt(s.map(T=>Number(T.prioritizationFee))),a=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(a*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()}),Oe=z.array(qt);async function Ve({caip2Id:t,proxyApiUrl:e}){try{return (await b([`${e}/solana-tokens?caip2Id=${t}`],Oe)).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 L=t=>t.status==="fulfilled";var Ge=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,X,ze,Y=class{constructor({proxyApiUrl:e}){c(this,X);c(this,W,void 0);d(this,W,`${e}/proxy/moralis`);}async getPortfolio({address:e$1,network:r}){try{let n=e(this,X,ze).call(this,`/account/${r}/${e$1}/portfolio`),s=await b([n],Ge);return {address:e$1,portfolio:s}}catch(n){console.error("getPortfolio() failed:",n);let s=n instanceof Error?n.message:"unknown error";return {address:e$1,error:`getPortfolio() failed: ${s}`}}}};W=new WeakMap,X=new WeakSet,ze=function(e){return `${b$1(this,W)}${e}`};var U=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:n,tokenService:s})=>{let o=new Y({proxyApiUrl:e}),i=n.pricingProviders?.coingecko.nativeTokenId??"",a=n.pricingProviders?.coingecko.assetPlatformId??"",c=r.toLowerCase(),l=U(n),m=await Promise.all(t.map(y=>o.getPortfolio({address:y,network:l}))),p=new Set(m.flatMap(y=>"portfolio"in y?y.portfolio.tokens.map(({mint:f})=>f):[])),d=await Promise.allSettled([i?await s.getSimplePrice({coinIds:[i],currencies:[c]}):Promise.resolve(void 0),a?await s.getPricesByAddresses(Array.from(p),a,c):Promise.resolve(void 0)]),[u,T]=d.map(y=>L(y)?y.value:void 0);return m.reduce((y,f)=>{if("error"in f)return {...y,[f.address]:{error:f.error}};let S=new TokenUnit(f.portfolio.nativeBalance.lamports,9,"SOL"),P=je(i,c,u),w=P.priceInCurrency!==void 0?S.mul(P.priceInCurrency):void 0,C={type:TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:S.toSubUnit(),balanceDisplayValue:S.toString(),balanceInCurrency:w?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:w?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:i,...P},q=f.portfolio.tokens.reduce((te,{amountRaw:re,symbol:he,decimals:Pe,mint:ne,name:vt,logo:Rt})=>{let oe=new TokenUnit(re,Pe,he),se=je(ne,c,T),Se=se.priceInCurrency!==void 0?oe.mul(se.priceInCurrency):void 0,It={type:TokenType.SPL,address:ne,name:vt,symbol:he,decimals:Pe,balance:oe.toSubUnit(),balanceDisplayValue:oe.toString(),balanceInCurrency:Se?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:Se?.toDisplay({fixedDp:2}),logoUri:Rt??void 0,reputation:null,...se};return {...te,[ne]:It}},{});return {...y,[f.address]:{[n.networkToken.symbol]:C,...q}}},{})},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 ue=t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),Ye=(t,e,r,n)=>{let s=r.preTokenBalances.reduce((a,{owner:c,mint:l,amount:m})=>({...a,[`${c}-${l}`]:m}),{}),o=r.postTokenBalances.reduce((a,{owner:c,mint:l,amount:m,decimals:p})=>{let d=`${c}-${l}`,u=s[d]??0n,T=m-u;if(T<=0n)return a;let y=Object.keys(s).find(P=>{let[w,C]=P.split("-"),q=r.postTokenBalances.find(({owner:te,mint:re})=>te===w&&re===l);return C===l&&q&&s[P]>q.amount});if(!y)return a;let f=n.tokens?.filter(P=>"contractType"in P).find(P=>P.address===l)??{contractType:TokenType.SPL,decimals:p,address:l,symbol:"Unknown",name:"Unknown"},S={...f,type:f.contractType,from:{...f,address:y.split("-")[0]},to:{...f,address:c},amount:new TokenUnit(T,p,"").toDisplay()};return [...a,S]},[]),i=Kt(t,e,r,n);return i&&o.push(i),o},Kt=(t,e,{paidFee:r,preBalances:n,postBalances:s},o)=>{let i=t[e],a=n[e],c=s[e],l=c!==a?c-a+r:0,m=s.map((y,f)=>y-n[f]);if(!l)return null;let p=l>0,d=new TokenUnit(Math.abs(l),o.networkToken.decimals,""),u=m.reduce(({index:y,change:f},S,P)=>S>f?{index:P,change:S}:{index:y,change:f},{index:0,change:m[0]}),T=p?0:u.index;return {amount:d.toDisplay(),from:{address:p?t[T]:i},to:{address:p?i:t[T]},name:o.networkToken.name,symbol:o.networkToken.symbol,type:TokenType.NATIVE}};function Xe(t){return e=>!!e[t]}var Je=async({isTestnet:t,address:e,proxyApiUrl:r})=>{let n=R({isTestnet:t,proxyApiUrl:r}),o=(await n.getSignaturesForAddress(address(e),{limit:25}).send()).map(a=>a.signature);return (await Promise.allSettled(o.map(async a=>({txHash:a.toString(),tx:await n.getTransaction(a,{encoding:"json",maxSupportedTransactionVersion:0}).send()})))).filter(L).map(a=>a.value).filter(Xe("tx"))};var Ze=(t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""};async function Qe({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await Je({isTestnet:!!t.isTestnet,address:e,proxyApiUrl:r})).map(({txHash:o,tx:i})=>{if(!i.meta)return null;let{meta:a,transaction:{message:c}}=i,l=c.accountKeys.map(u=>u.toString()),m=l.indexOf(e),p=m<c.header.numRequiredSignatures,d=Ye(l,m,{paidFee:p?Number(a.fee):0,preBalances:a.preBalances.map(Number),postBalances:a.postBalances.map(Number),preTokenBalances:(a.preTokenBalances??[]).map(ue),postTokenBalances:(a.postTokenBalances??[]).map(ue)},t);return {hash:o,txType:Jt(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:Ze(o,t.explorerUrl)}}).filter(o=>o!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}var Jt=(t,e)=>t.every(o=>o.from?.address===e)?TransactionType.SEND:t.every(o=>o.to?.address===e)?TransactionType.RECEIVE:t.some(o=>o.from?.address===e)&&t.some(o=>o.to?.address===e)?TransactionType.SWAP:TransactionType.UNKNOWN;var et=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."}}},fe={[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 tt(t){return t.ins.length===0&&t.outs.length===0}function rt(t){return t!=null}var nt=(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)}),c=o.source.address===r===!0?"outs":"ins";return e[c].push({token:{...n,address:""},items:[{displayValue:new TokenUnit(i.amount,n.decimals,"").toString(),usdPrice:void 0}]}),{title:"Transfer SOL",items:[k("From",o.source.address),k("To",o.destination.address)]}}catch{return null}};var dr=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}},ot=async(t,e,r,n,s)=>{if(!s?.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:a,data:c}=i({...e,data:Uint8Array.from(e.data)}),l=await dr(t,a.source.address);if(!l)return null;let m=s.find(T=>T.address.toLowerCase()===l.toLowerCase());if(!m)return null;let d=(a.source.address===n||a.authority.address===n)===!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:[k("From",a.source.address),k("To",a.destination.address)]}}catch{return null}};var st=async(t,e,r,n)=>{let s=await deserializeTransactionMessage(t,n),o={ins:[],outs:[]},i=await Promise.allSettled(s.instructions.map(async a=>nt(a,o,e,r.networkToken)??await ot(n,a,o,e,r.tokens)??null)).then(a=>a.filter(L).map(c=>c.value).filter(rt));return {balanceChange:o,details:i}};var it=(t,e,r)=>{let n=e.account_summary.account_assets_diff??[],s={},o={},i=Object.keys(e.assets_diff??{}).filter(a=>a!==t);return n.forEach(({asset:a,in:c,out:l})=>{let m=gr(a,r);if(!m)return;let p="address"in m?m.address:m.symbol;c&&(s[p]||(s[p]={token:m,items:[]}),s[p].items.push({displayValue:String(c.value),usdPrice:typeof c.usd_price=="number"?String(c.usd_price):void 0})),l&&(o[p]||(o[p]={token:m,items:[]}),o[p].items.push({displayValue:String(l.value),usdPrice:typeof l.usd_price=="number"?String(l.usd_price):void 0}));}),{balanceChange:{ins:Object.values(s),outs:Object.values(o)},otherAffectedAddresses:i}},fr=t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),yr=(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}),gr=(t,e)=>t.type==="TOKEN"?yr(t,e):t.type==="SOL"||t.type==="ETH"?fr(t):null;var Sr="DUMMY_API_KEY",ct=async({proxyApiUrl:t,params:e,dAppUrl:r})=>{let n=new Tr({baseURL:t+"/proxy/blockaid/",apiKey:Sr});try{return await n.solana.message.scan({chain:e.chain,options:["simulation","validation"],encoding:"base64",metadata:{url:r},transactions:[e.transactionBase64],account_address:base64.encode(base58.decode(e.account))})}catch(s){return console.error("solana.message.scan() error",s),null}};var Z=async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,s=await ct(t),{simulation:o,validation:i}=s?.result??{},a={title:"Transaction Details",items:[$("Raw Data",t.params.transactionBase64)]},c=[a],l=!1,m,p;if(!i||i.result_type==="Warning"?p=fe[AlertType.WARNING]:i.result_type==="Malicious"?p=fe[AlertType.DANGER]:s?.error_details&&(p=et(s.error_details)),o){let{balanceChange:d,otherAffectedAddresses:u}=it(n.account,o,e);m=d,u.length>0?(a.items.push(k(u.length===1?"From":"Account",n.account)),a.items.push(u.length===1?k("To",u[0]):Ie("Interacting with",u))):a.items.push(k("Account",n.account));let T=o.account_summary.account_assets_diff;if(T&&T.length>0){let y=T.find(f=>f.asset.type==="SOL");if(y&&y.out){let f=y.out.raw_value;f>0&&c.push({title:"Network Fee",items:[pe("Fee Amount",BigInt(f),e.networkToken.decimals,e.networkToken.symbol)]});}}l=!0;}else {let{balanceChange:d,details:u}=await st(n.transactionBase64,n.account,e,r);m=d,c.push(...u);}return {isSimulationSuccessful:l,details:c,alert:p,balanceChange:m}};var kr="https://explorer.solana.com";function lt(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 ge=1e3,Ar=60,mt=async({provider:t,txHash:e,approvalController:r,request:n,network:s,commitment:o="finalized",maxRetries:i=Ar})=>{let a=0,c=null,l=lt(s,e,"tx");for(;a<i;)try{let m=await t.getSignatureStatuses([signature(e)],{searchTransactionHistory:!0}).send();if(!m?.value?.[0]){await new Promise(u=>setTimeout(u,ge)),a++;continue}let{confirmationStatus:p,err:d}=m.value[0];if(d)return console.error("[waitForTransactionConfirmation] Transaction failed:",d),r.onTransactionReverted({txHash:e,request:n}),!1;if(p&&p!==c&&(c=p,p==="processed"&&r.onTransactionPending({txHash:e,request:n}),o==="processed"&&p==="processed"||o==="confirmed"&&["confirmed","finalized"].includes(p)||o==="finalized"&&p==="finalized"))return r.onTransactionConfirmed({txHash:e,request:n,explorerLink:l}),!0;await new Promise(u=>setTimeout(u,ge)),a++;}catch(m){if(m instanceof Error&&m.message.includes("Transaction failed"))return console.error("[waitForTransactionConfirmation] Transaction explicitly failed"),r.onTransactionReverted({txHash:e,request:n}),!1;await new Promise(p=>setTimeout(p,ge)),a++;}return c==="confirmed"||c==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:l}),!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]),dt=t=>Rr.safeParse(t);var ft=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:o,success:i,error:a}=dt(s);if(!i)return console.error("invalid params",a),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a}})};let[{account:c,serializedTx:l,sendOptions:m}]=o,p=R({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:d,isSimulationSuccessful:u,alert:T,balanceChange:y}=await Z({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:U(e),transactionBase64:l},proxyApiUrl:n},network:e,provider:p}),f={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:d,alert:T,balanceChange:y,networkFeeSelector:!1,isSimulationSuccessful:u},S={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:c,data:l},P=await r.requestApproval({request:t,displayData:f,signingData:S});if("error"in P)return {error:P.error};let w;try{return w=await wr(p,P,m),await r.onTransactionPending({txHash:w,request:t}),mt({provider:p,txHash:w,approvalController:r,request:t,network:e,commitment:m?.preflightCommitment}),{result:w}}catch(C){return console.error(C),{error:rpcErrors.internal({message:"Transaction failed",data:{cause:C}})}}},wr=async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send();var Nr=z.object({account:z.string(),serializedTx:z.string().base64()}),br=z.tuple([Nr]),yt=t=>br.safeParse(t);var Tt=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:o,success:i,error:a}=yt(s);if(!i)return console.error("invalid params",a),{error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a}})};let[{account:c,serializedTx:l}]=o,m=R({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:p,isSimulationSuccessful:d,alert:u,balanceChange:T}=await Z({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:U(e),transactionBase64:l},proxyApiUrl:n},network:e,provider:m}),y={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:p,alert:u,balanceChange:T&&tt(T)?void 0:T,networkFeeSelector:!1,isSimulationSuccessful:d},f={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:c,data:l},S=await r.requestApproval({request:t,displayData:y,signingData:f});return "error"in S?{error:S.error}:"signedData"in S?{result:S.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}};var ht=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})=>!ht(t),{message:"Cannot use signMessage() calls for signing transactions"}),Br=z.tuple([Cr]),Pt=t=>Br.safeParse(t);var kt=async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:s,success:o,error:i}=Pt(n);if(!o)return console.error("invalid params",i),{error:rpcErrors.invalidParams({message:"Message signing params are invalid",data:{cause:i}})};let[{account:a,serializedMessage:c}]=s,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:[k("Account",a),le("Message",l.decode(base64.decode(c))),$("Raw Message (Base-64)",c)]}],networkFeeSelector:!1},p={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:a,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 x,_,j,At=class{constructor({approvalController:e,environment:r,appInfo:n}){c(this,x,void 0);c(this,_,void 0);c(this,j,void 0);let{proxyApiUrl:s}=De(r);d(this,j,n),d(this,x,s),d(this,_,e),b$1(this,x),b$1(this,_),b$1(this,j);}async getProvider(e){return R({isTestnet:!!e.isTestnet,proxyApiUrl:b$1(this,x)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return H(e)}deriveAddress(e){return Ee({...e,approvalController:b$1(this,_)})}getBalances(e){let r=new G({storage:e.storage,proxyApiUrl:b$1(this,x)});return qe({...e,tokenService:r,proxyApiUrl:b$1(this,x)})}getManifest(){let e=parseManifest(Ne);return e.success?e.data:void 0}getNetworkFee(e){return Fe(e,b$1(this,x))}getTransactionHistory(e){return Qe({network:e.network,address:e.address,proxyApiUrl:b$1(this,x)})}getTokens(e){return e.caipId?Ve({caip2Id:e.caipId,proxyApiUrl:b$1(this,x)}):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 Tt({approvalController:b$1(this,_),proxyApiUrl:b$1(this,x),network:r,request:e});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return ft({approvalController:b$1(this,_),proxyApiUrl:b$1(this,x),network:r,request:e});case RpcMethod.SOLANA_SIGN_MESSAGE:return kt({approvalController:b$1(this,_),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};x=new WeakMap,_=new WeakMap,j=new WeakMap;
15
15
 
16
- export { Pt as SvmModule };
16
+ export { At as SvmModule };
17
17
  //# sourceMappingURL=out.js.map
18
18
  //# sourceMappingURL=index.js.map