@avalabs/svm-module 4.0.5 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +5 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -2,18 +2,19 @@ import { a, c, d, b, e, f } from './chunk-F6EK5R7B.js';
|
|
|
2
2
|
import { DetailItemType, Environment, NetworkVMType, TokenType, TransactionType, AlertType, RpcMethod, RawSimplePriceResponseSchema, parseManifest } from '@avalabs/vm-module-types';
|
|
3
3
|
import { rpcErrors } from '@metamask/rpc-errors';
|
|
4
4
|
import { VsCurrencyType, getBasicCoingeckoHttp, simpleTokenPrice, simplePrice } from '@avalabs/core-coingecko-sdk';
|
|
5
|
-
import { z
|
|
5
|
+
import { z, object, string, record, number } from 'zod';
|
|
6
6
|
import { base58, hex, base64 } from '@scure/base';
|
|
7
7
|
import { init, deriveAddressesForSvm } from '@avalabs/crypto-sdk';
|
|
8
8
|
import { getSolanaProvider, deserializeTransactionMessage } from '@avalabs/core-wallets-sdk';
|
|
9
|
+
import { SolanaCaip2ChainId } from '@avalabs/core-chains-sdk';
|
|
9
10
|
import { TokenUnit } from '@avalabs/core-utils-sdk';
|
|
10
|
-
import { address, isInstructionForProgram, isInstructionWithAccounts, isInstructionWithData, signature
|
|
11
|
+
import { address, fetchAddressesForLookupTables, getTransactionDecoder, getCompiledTransactionMessageDecoder, isInstructionForProgram, isInstructionWithAccounts, isInstructionWithData, signature } from '@solana/kit';
|
|
11
12
|
import { SYSTEM_PROGRAM_ADDRESS, identifySystemInstruction, SystemInstruction, parseTransferSolInstruction } from '@solana-program/system';
|
|
12
13
|
import { identifyTokenInstruction, TokenInstruction, parseTransferCheckedInstruction, parseTransferInstruction } from '@solana-program/token';
|
|
13
|
-
import
|
|
14
|
+
import Sn from '@blockaid/client';
|
|
14
15
|
|
|
15
|
-
function qe(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}a(qe,"charsum");function be(t){let e,r=0;for(e=0;e<t.length;e++){let n=qe(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}a(be,"arrayHash");var Ie=a(async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=q.exponential()})=>{let s=0,a=0,c;for(;a<r;){a>0&&await zt(s);try{let i=await t(a);if(e(i))return i}catch(i){c=i;}s=n(a),a++;}let p=c?`Max retry exceeded. ${c}`:"Max retry exceeded.";throw new Error(p)},"retry"),we=class we{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 s=n-e+1,a=e*r,c=2*r*(Math.pow(2,s)-1);return a+c}}};a(we,"RetryBackoffPolicy");var q=we;function zt(t){return new Promise(e=>setTimeout(e,t))}a(zt,"delay");var Ne=a(t=>Ie({operation:e=>t(e>0),maxRetries:2,backoffPolicy:q.constant(1),isSuccess:e=>e?.status?.error_code!==429}),"coingeckoRetry");async function U(t,e,r=fetch){let n=await r(...t);if(!n.ok)throw new Error(`Request failed with status ${n.status}`);let s=await n.json();return e.parse(s)}a(U,"fetchAndVerify");var De=class De{constructor(e,r){this.proxyApiUrl=e;this.fetchFn=r;}simplePrice(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}simplePriceByContractAddresses(e){let{id:r,...n}=e,s=new URLSearchParams(n);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${s}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}};a(De,"CoingeckoProxyClient");var se=De;var Wt=z$1.array(z$1.object({internalId:z$1.string(),id:z$1.string(),symbol:z$1.string(),name:z$1.string(),image:z$1.string().optional().nullable(),current_price:z$1.number().optional().nullable(),price_change_percentage_24h:z$1.number().optional().nullable(),market_cap:z$1.number().optional().nullable(),total_volume:z$1.number().optional().nullable(),platforms:z$1.record(z$1.string(),z$1.string())})),Ce=class Ce{constructor(e){this.proxyApiUrl=e;}watchlistToken(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/watchlist/tokens?${r}`,{method:"GET",headers:{"Content-Type":"application/json"}}],Wt)}};a(Ce,"WatchlistProxyClient");var ye=Ce;var K,j,H,Z,_e=class _e{constructor({storage:e$1,proxyApiUrl:r,fetch:n}){d(this,K,void 0);d(this,j,void 0);d(this,H,void 0);d(this,Z,void 0);b(this,"transformSimplePriceResponse",a((e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(s=>{let a=e[s];n[s]={},r.forEach(c=>{n[s]={[c]:{price:a?.[c],change24:a?.[`${c}_24h_change`],vol24:a?.[`${c}_24h_vol`],marketCap:a?.[`${c}_market_cap`]}};});}),n},"transformSimplePriceResponse"));e(this,K,e$1),e(this,j,r),e(this,H,n??globalThis.fetch),e(this,Z,getBasicCoingeckoHttp(void 0,c(this,H)));}async getWatchlistDataForToken({tokenDetails:e,currency:r=VsCurrencyType.USD}){let n=(await new ye(c(this,j)).watchlistToken({tokens:e.symbol,currency:r})).filter(a=>e.isNative?a.internalId===`NATIVE-${e.symbol.toLowerCase()}`:a.platforms[e.caip2Id]===e.address),[s]=n;return s?{priceInCurrency:s.current_price??0,change24:s.price_change_percentage_24h??0,marketCap:s.market_cap??0,vol24:s.total_volume??0}:{priceInCurrency:0,change24:0,marketCap:0,vol24:0}}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,a=`getSimplePrice-${e?`${be(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=c(this,K)?.get?.(a),n)return n;try{n=await Ne(c=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:c}));}catch{n=void 0;}return c(this,K)?.set?.(a,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,c$1=`getPricesWithMarketDataByAddresses-${`${be(e)}-${r}-${n}`}`;if(s=c(this,K)?.get?.(c$1),s)return s;try{s=await Ne(p=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:p}));}catch(p){console.error(p),s=void 0;}return c(this,K)?.set?.(c$1,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:s=!1}){if(s){let a=await new se(c(this,j),c(this,H)).simplePriceByContractAddresses({id:e,contract_addresses:r,vs_currencies:[n],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0});return this.transformSimplePriceResponse(a,[n])}return simpleTokenPrice(c(this,Z),{assetPlatformId:e,tokenAddresses:r,currencies:[n],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD],marketCap:n=!1,vol24:s=!1,change24:a=!1,lastUpdated:c$1=!1,useCoingeckoProxy:p=!1,shouldThrow:i=!0}){if(p){let m=await new se(c(this,j),c(this,H)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:s,include_24hr_change:a,include_last_updated_at:c$1});return this.transformSimplePriceResponse(m,r)}return simplePrice(c(this,Z),{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:a,lastUpdated:c$1,shouldThrow:i})}};K=new WeakMap,j=new WeakMap,H=new WeakMap,Z=new WeakMap,a(_e,"TokenService");var ae=_e;object({date:string(),usd:record(number())});var Ee=a((t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),"textItem");var _=a((t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e}),"addressItem"),Be=a((t,e)=>({label:t,type:DetailItemType.ADDRESS_LIST,value:e}),"addressListItem");var ie=a((t,e)=>({label:t,type:DetailItemType.DATA,value:e}),"dataItem");var He=process.env.GLACIER_API_KEY;var ce=a(()=>He,"getGlacierApiKey");var Qt=["glacier-api.avax.network","proxy-api.avax.network","proxy-api-dev.avax.network","core-proxy-api.avax.network","core-proxy-api.avax-test.network"];function Le(t){let e=new URL(t),r=ce();if(r&&Qt.includes(e.hostname)){let n=e.searchParams;return n.set("token",r),e.search=n.toString(),e.toString()}return t}a(Le,"addGlacierAPIKeyIfNeeded");({rltoken:ce()});var z=a((t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}}),"rpcErrorOpts");var Ye={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 tr={proxyApiUrl:"https://proxy-api.avax.network"},rr={proxyApiUrl:"https://proxy-api-dev.avax.network"},Je=a(t=>{switch(t){case Environment.PRODUCTION:return tr;case Environment.DEV:return rr}},"getEnv");var Ze=a(t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string","hasDerivationDetails");var Q=a(({accountIndex:t})=>{if(t<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");return {[NetworkVMType.SVM]:`m/44'/501'/${t}'/0'`}},"buildDerivationPath");var Qe=a(async t=>{let{approvalController:e,secretId:r}=t,n=Ze(t)?Q(t).SVM:void 0,s=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:n});return {[NetworkVMType.SVM]:base58.encode(hex.decode(s))}},"deriveAddress");var et=a(async t=>{let{approvalController:e,secretId:r,accountIndices:n,derivationPathType:s}=t;if(n.length===0)return [];await init();let a=await Promise.all(n.map(async p=>{let i=Q({accountIndex:p,derivationPathType:s}).SVM,m=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:i});return Uint8Array.from(Buffer.from(m,"hex"))}));return (await deriveAddressesForSvm(a)).map(p=>({[NetworkVMType.SVM]:p}))},"deriveAddresses");var tt="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",rt="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",nt="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",ot="/proxy/nownodes/sol",st="https://api.devnet.solana.com";var at="DUMMY_API_KEY";var M=a(({isTestnet:t,proxyApiUrl:e})=>{let r=t?st:e+ot,n=Le(r);return getSolanaProvider({isTestnet:t,rpcUrl:n})},"getProvider");var Ue=1e6,V={high:150*Ue,medium:75*Ue,low:2*Ue},dr=a(t=>(t.length===0?[V.low,V.low]:t.length===1?[t[0],V.low]:t).slice().sort((r,n)=>r-n),"ensureEnoughData");async function it(t,e){let s=await(await M({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(s.length===0||s.every(y=>y.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(V.high),maxPriorityFeePerGas:BigInt(V.high)},medium:{maxFeePerGas:BigInt(V.medium),maxPriorityFeePerGas:BigInt(V.medium)},low:{maxFeePerGas:BigInt(V.low),maxPriorityFeePerGas:BigInt(V.low)},baseFee:BigInt(V.low),displayDecimals:9,isFixedFee:!1};let c=dr(s.map(y=>Number(y.prioritizationFee))),p=c.at(0),i=c.at(-1),m=Math.floor(c.length/2),l=c.length%2===1?c[m]:(c[m-1]+c[m])/2,d=BigInt(Math.ceil(i*1.05)),u=BigInt(Math.ceil(l*1.05)),g=BigInt(Math.ceil(p*1.05));return {high:{maxFeePerGas:d,maxPriorityFeePerGas:d},medium:{maxFeePerGas:u,maxPriorityFeePerGas:u},low:{maxFeePerGas:g,maxPriorityFeePerGas:g},baseFee:g,displayDecimals:9,isFixedFee:!1}}a(it,"getNetworkFee");var fr=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()}),ct=z$1.array(fr);async function pt({caip2Id:t,proxyApiUrl:e}){try{return (await U([`${e}/solana-tokens?caip2Id=${t}`],ct)).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}"`)}}a(pt,"getTokens");var lt=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 pe,le,Te,mt,Fe=class Fe{constructor(e$1){d(this,Te);d(this,pe,void 0);d(this,le,void 0);e(this,pe,`${e$1.proxyApiUrl}/proxy/moralis`),e(this,le,e$1.fetch??globalThis.fetch);}async getPortfolio({address:e,network:r}){try{let n=f(this,Te,mt).call(this,`/account/${r}/${e}/portfolio`),s=await U([n],lt,c(this,le));return {address:e,portfolio:s}}catch(n){console.error("getPortfolio() failed:",n);let s=n instanceof Error?n.message:"unknown error";return {address:e,error:`getPortfolio() failed: ${s}`}}}};pe=new WeakMap,le=new WeakMap,Te=new WeakSet,mt=a(function(e){return `${c(this,pe)}${e}`},"#buildUrl"),a(Fe,"MoralisService");var ee=Fe;var W=a(t=>{switch(t.caipId){case tt:return "mainnet";case rt:return "devnet";case nt:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}},"getNetworkName");var ft=a(async({addresses:t,proxyApiUrl:e,currency:r,network:n,tokenService:s,fetch:a})=>{let c=new ee({proxyApiUrl:e,fetch:a}),p=n.pricingProviders?.coingecko.nativeTokenId??"",i=n.pricingProviders?.coingecko.assetPlatformId??"",m=r.toLowerCase(),l=W(n),d=await Promise.all(t.map(h=>c.getPortfolio({address:h,network:l}))),u=new Set(d.flatMap(h=>"portfolio"in h?h.portfolio.tokens.map(({mint:T})=>T):[])),g=await(i?s.getPricesByAddresses(Array.from(u),i,m):Promise.resolve(void 0)),y=await s.getWatchlistDataForToken({tokenDetails:{symbol:n.networkToken.symbol,isNative:!0,caip2Id:n.caipId??""},currency:m});return d.reduce((h,T)=>{if("error"in T)return {...h,[T.address]:{error:T.error}};let k=new TokenUnit(T.portfolio.nativeBalance.lamports,9,"SOL"),v=y.priceInCurrency!==void 0?k.mul(y.priceInCurrency):void 0,P={type:TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:k.toSubUnit(),balanceDisplayValue:k.toString(),balanceInCurrency:v?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:v?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:p,...y},E=T.portfolio.tokens.reduce((A,{amountRaw:b,symbol:S,decimals:x,mint:I,name:N,logo:L})=>{let O=new TokenUnit(b,x,S),ue=gr(I,m,g),fe=ue.priceInCurrency!==void 0?O.mul(ue.priceInCurrency):void 0,X={type:TokenType.SPL,address:I,name:N,symbol:S,decimals:x,balance:O.toSubUnit(),balanceDisplayValue:O.toString(),balanceInCurrency:fe?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:fe?.toDisplay({fixedDp:2}),logoUri:L??void 0,reputation:null,...ue};return {...A,[I]:X}},{});return {...h,[T.address]:{[n.networkToken.symbol]:P,...E}}},{})},"getBalances"),gr=a((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}),"getMarketData");var Oe=a(t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),"simplifyTokenBalance"),yt=a((t,e,r,n)=>{let s=e!==-1?t[e]:r.preTokenBalances.find(i=>!t.includes(i.owner))?.owner||r.postTokenBalances.find(i=>!t.includes(i.owner))?.owner,a=r.preTokenBalances.reduce((i,{owner:m,mint:l,amount:d})=>({...i,[`${m}-${l}`]:d}),{}),c=r.postTokenBalances.reduce((i,{owner:m,mint:l,amount:d,decimals:u})=>{let g=`${m}-${l}`,y=a[g]??0n,h=d-y;if(h===0n)return i;let T=h>0n&&m===s,k=h<0n&&m===s;if(T){let v=Object.keys(a).find(A=>{let[b,S]=A.split("-");if(S!==l||b===s)return !1;let x=a[A],I=r.postTokenBalances.find(({owner:L,mint:O})=>L===b&&O===l);return !I||I.amount<x});if(!v)return i;let P=n.tokens?.filter(A=>"contractType"in A).find(A=>A.address===l)??{contractType:TokenType.SPL,decimals:u,address:l,symbol:"Unknown",name:"Unknown"},E={...P,type:P.contractType,from:{...P,address:v.split("-")[0]},to:{...P,address:m},amount:new TokenUnit(h,u,"").toDisplay()};return [...i,E]}else if(k){let v=r.postTokenBalances.find(({owner:A,mint:b})=>b===l&&A!==s&&(a[`${A}-${l}`]??0n)<(r.postTokenBalances.find(S=>S.owner===A&&S.mint===l)?.amount??0n));if(!v)return i;let P=n.tokens?.filter(A=>"contractType"in A).find(A=>A.address===l)??{contractType:TokenType.SPL,decimals:u,address:l,symbol:"Unknown",name:"Unknown"},E={...P,type:P.contractType,from:{...P,address:s},to:{...P,address:v.owner},amount:new TokenUnit(-h,u,"").toDisplay()};return [...i,E]}return i},[]),p=hr(t,e,r,n,c,s);return p&&c.push(p),c},"extractTokenTranfers"),hr=a((t,e,{paidFee:r,preBalances:n,postBalances:s},a,c=[],p)=>{if(e===-1){if(c.length>0&&p&&c.some(S=>S.to?.address===p)){let S=t.findIndex(x=>x===p);if(S!==-1){let x=n[S],N=s[S]-x;if(N<=0){let L=Math.abs(N)+r;if(L>r){let O=new TokenUnit(L,a.networkToken.decimals,""),fe=s.map((X,oe)=>X-n[oe]).reduce((X,oe,ze)=>ze!==S&&oe>X.amount&&oe>0?{index:ze,amount:oe}:X,{index:0,amount:0});return {amount:O.toDisplay(),from:{address:p},to:{address:t[fe.index]},name:a.networkToken.name,symbol:a.networkToken.symbol,type:TokenType.NATIVE}}}}}return null}let i=t[e],m=n[e],d=s[e]-m,u=s.map((b,S)=>b-n[S]),g=c.length>0,y=d!==0?d+r:0,h=y>0,T=0,k=!1;if(g&&e===0&&p){let b=c.some(x=>x.to?.address===p),S=c.some(x=>x.from?.address===p);b&&!S&&(h=!1,k=!0,T=s.map((N,L)=>N-n[L]).reduce((N,L,O)=>O!==e&&L>N.amount&&L>0?{index:O,amount:L}:N,{index:0,amount:0}).index);}if(g&&d<0){let b=u.reduce((S,x,I)=>I!==e&&x>S.amount?{index:I,amount:x}:S,{index:0,amount:0});b.amount>r*2&&!k&&(y=b.amount,h=!0,T=b.index);}else g&&d<=0&&c.some(S=>S.to?.address===i)&&(y=Math.abs(d)+r,h=!1,T=u.reduce((x,I,N)=>N!==e&&I>x.amount&&I>0?{index:N,amount:I}:x,{index:0,amount:0}).index);if(!y)return null;let v=new TokenUnit(Math.abs(y),a.networkToken.decimals,"");if(!g){let b=u.reduce(({index:S,change:x},I,N)=>I>x?{index:N,change:I}:{index:S,change:x},{index:0,change:u[0]});T=h?0:b.index;}let P=t[T],E=h?P||i:p||i,A=h?p||i:P||p||i;return {amount:v.toDisplay(),from:{address:E},to:{address:A},name:a.networkToken.name,symbol:a.networkToken.symbol,type:TokenType.NATIVE}},"extractNativeTransfer");var me=a(t=>t.status==="fulfilled","isFulfilled");function gt(t){return e=>!!e[t]}a(gt,"hasPropertyDefined");var Tt=a(async({network:t,address:e,proxyApiUrl:r})=>{let n=M({isTestnet:!!t.isTestnet,proxyApiUrl:r}),a=(await n.getSignaturesForAddress(address(e),{limit:25}).send()).map(i=>i.signature),c=a;try{let i=new ee({proxyApiUrl:r}),m=W(t),l=await i.getPortfolio({address:e,network:m});if("portfolio"in l){let d=l.portfolio.tokens.map(k=>k.associatedTokenAddress),u=l.portfolio.nfts.map(k=>k.associatedTokenAddress),y=[...d,...u].map(async k=>{try{return (await n.getSignaturesForAddress(address(k),{limit:25}).send()).map(P=>P.signature)}catch(v){return console.error("Failed to get signatures for ATA:",k,v),[]}}),T=(await Promise.allSettled(y)).filter(me).map(k=>k.value).flat();c=Array.from(new Set([...a,...T]));}}catch(i){console.error("ATA discovery failed with error:",i);}return (await Promise.allSettled(c.map(async i=>({txHash:i.toString(),tx:await n.getTransaction(i,{encoding:"json",maxSupportedTransactionVersion:0}).send()})))).filter(me).map(i=>i.value).filter(gt("tx"))},"getWrappedTransactions");var Pt=a((t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""},"getExplorerLink");async function St({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await Tt({network:t,address:e,proxyApiUrl:r})).map(({txHash:a,tx:c})=>{if(!c.meta)return null;let{meta:p,transaction:{message:i}}=c,m=i.accountKeys.map(h=>h.toString()),l=m.indexOf(e),d=l!==-1;!d&&p.preTokenBalances&&(p.preTokenBalances.some(T=>T.owner===e)||(p.postTokenBalances??[]).some(T=>T.owner===e))&&(d=!0,l=-1);let u=l!==-1&&l<i.header.numRequiredSignatures,g=yt(m,l,{paidFee:u?Number(p.fee):0,preBalances:p.preBalances.map(Number),postBalances:p.postBalances.map(Number),preTokenBalances:(p.preTokenBalances??[]).map(Oe),postTokenBalances:(p.postTokenBalances??[]).map(Oe)},t),y=Pr(g,e);return {hash:a,txType:y,gasUsed:String(c.meta.computeUnitsConsumed??"0"),tokens:g,from:g[0]?.from?.address??m[0],to:g[0]?.to?.address??(u?"":e),isOutgoing:u,isIncoming:!u,isSender:u,timestamp:Number(c.blockTime)*1e3,isContractCall:!1,gasPrice:String(Number(c.meta.fee)/Number(c.meta.computeUnitsConsumed)),chainId:String(t.chainId),explorerLink:Pt(a,t.explorerUrl)}}).filter(a=>a!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}a(St,"getTransactionHistory");var Pr=a((t,e)=>{if(t.length===0)return TransactionType.UNKNOWN;let r=t.filter(a=>a.from?.address===e||a.to?.address===e);if(r.length===0)return TransactionType.UNKNOWN;let n=r.some(a=>a.from?.address===e),s=r.some(a=>a.to?.address===e);return n&&s?TransactionType.SWAP:n?TransactionType.SEND:s?TransactionType.RECEIVE:TransactionType.UNKNOWN},"inferTxType");var kt=a(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 t?.type==="TransactionError"&&t.message.toLowerCase().includes("insufficient funds for rent")?{type:AlertType.WARNING,details:{title:"This transaction will likely be reverted",description:"The recipient account needs a minimum balance to exist on Solana (rent). Try increasing the amount you send."}}:{type:AlertType.WARNING,details:{title:"Transaction simulation has failed",description:"It is possible that this transaction will fail. Please proceed with caution."}}},"getAlertForError"),Me={[AlertType.WARNING]:{type:AlertType.WARNING,details:{title:"Suspicious transaction",description:"Use caution, this transaction might be malicious."}},[AlertType.DANGER]:{type:AlertType.DANGER,details:{title:"Scam transaction",description:"This transaction is malicious, do not proceed.",body:["This transaction is malicious","do not proceed"],actionTitles:{reject:"Reject Transaction",proceed:"Proceed Anyway"}}}};function At(t){return t.ins.length===0&&t.outs.length===0}a(At,"isBalanceChangeEmpty");function xt(t){return t!=null}a(xt,"isNotNullish");var vt=a((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:a,data:c}=parseTransferSolInstruction({...t,data:Uint8Array.from(t.data)}),i=a.source.address===r===!0?"outs":"ins";return e[i].push({token:{...n,address:""},items:[{displayValue:new TokenUnit(c.amount,n.decimals,"").toString(),usdPrice:void 0}]}),{title:"Transfer SOL",items:[_("From",a.source.address),_("To",a.destination.address)]}}catch{return null}},"tryToParseSolTransfer");var Br=a(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}},"getTokenMintFromAccountInfo"),Rt=a(async(t,e,r,n,s)=>{if(!s?.length||!isInstructionWithAccounts(e)||!isInstructionWithData(e))return null;try{let a=identifyTokenInstruction(e);if(a!==TokenInstruction.Transfer&&a!==TokenInstruction.TransferChecked)return null;let c=a===TokenInstruction.TransferChecked?parseTransferCheckedInstruction:parseTransferInstruction,{accounts:p,data:i}=c({...e,data:Uint8Array.from(e.data)}),m=await Br(t,p.source.address);if(!m)return null;let l=s.find(y=>y.address.toLowerCase()===m.toLowerCase());if(!l)return null;let u=(p.source.address===n||p.authority.address===n)===!0?"outs":"ins",g="decimals"in i?i.decimals:l.decimals;return r[u].push({token:l,items:[{displayValue:new TokenUnit(i.amount,g,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${l.symbol}`,items:[_("From",p.source.address),_("To",p.destination.address)]}}catch{return null}},"tryToParseSPLTransfer");var bt=a(async(t,e,r,n)=>{let s=await deserializeTransactionMessage(t,n),a={ins:[],outs:[]},c=await Promise.allSettled(s.instructions.map(async p=>vt(p,a,e,r.networkToken)??await Rt(n,p,a,e,r.tokens)??null)).then(p=>p.filter(me).map(i=>i.value).filter(xt));return {balanceChange:a,details:c}},"parseTransaction");var wt=a((t,e,r)=>{let n=e.account_summary.account_assets_diff??[],s={},a={},c=Object.keys(e.assets_diff??{}).filter(p=>p!==t);return n.forEach(({asset:p,in:i,out:m})=>{let l=Or(p,r);if(!l)return;let d="address"in l?l.address:l.symbol;i&&(s[d]||(s[d]={token:l,items:[]}),s[d].items.push({displayValue:String(i.value),usdPrice:typeof i.usd_price=="number"?String(i.usd_price):void 0})),m&&(a[d]||(a[d]={token:l,items:[]}),a[d].items.push({displayValue:String(m.value),usdPrice:typeof m.usd_price=="number"?String(m.usd_price):void 0}));}),{balanceChange:{ins:Object.values(s),outs:Object.values(a)},otherAffectedAddresses:c}},"processBalanceChange"),Ur=a(t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),"convertNativeAssetToToken"),Fr=a((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}),"convertTokenAssetToToken"),Or=a((t,e)=>t.type==="TOKEN"?Fr(t,e):t.type==="SOL"||t.type==="ETH"?Ur(t):null,"convertDiffAssetToToken");var Nt=a(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}},"scanSolanaTransaction");var ke=a(async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,s=await Nt(t),{simulation:a,validation:c}=s?.result??{},p=a?.account_summary?a:void 0,i={title:"Transaction Details",items:[ie("Raw Data",t.params.transactionBase64)]},m=[i],l=!1,d,u;if(!c||c.result_type==="Warning"?u=Me[AlertType.WARNING]:c.result_type==="Malicious"?u=Me[AlertType.DANGER]:s?.error_details&&(u=kt(s.error_details)),p){let{balanceChange:g,otherAffectedAddresses:y}=wt(n.account,p,e);if(d=g,y.length>0){let h=p.account_summary.account_assets_diff,T=h?.filter(P=>P.out&&P.out.raw_value>0)??[],k=h?.filter(P=>P.in&&P.in.raw_value>0)??[];T.length>0&&k.length>0?(i.items.push(_("Account",n.account)),i.items.push(Be("Interacting with",y))):(i.items.push(_(y.length===1?"From":"Account",n.account)),i.items.push(y.length===1?_("To",y[0]):Be("Interacting with",y)));}else i.items.push(_("Account",n.account));l=!0;}else {let{balanceChange:g,details:y}=await bt(n.transactionBase64,n.account,e,r);d=g,m.push(...y);}return {isSimulationSuccessful:l,details:m,alert:u,balanceChange:d}},"explainTransaction");var Gr="https://explorer.solana.com";function Ae(t,e,r="tx"){try{let n=t.explorerUrl?new URL(t.explorerUrl):new URL(Gr);return n.pathname+=`${r}/${e}`,n.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}a(Ae,"getExplorerAddressByNetwork");var Ge=400,Kr=15,Ct=a(async({provider:t,txHash:e,approvalController:r,request:n,network:s,commitment:a="confirmed",maxRetries:c=Kr})=>{let p=0,i=null,m=Ae(s,e,"tx");for(;p<c;)try{let l=await t.getSignatureStatuses([signature(e)],{searchTransactionHistory:!0}).send();if(!l?.value?.[0]){await new Promise(g=>setTimeout(g,Ge)),p++;continue}let{confirmationStatus:d,err:u}=l.value[0];if(u)return console.error("[waitForTransactionConfirmation] Transaction failed:",u),r.onTransactionReverted({txHash:e,request:n}),!1;if(d&&d!==i&&(i=d,d==="processed"&&r.onTransactionPending({txHash:e,request:n,explorerLink:m}),a==="processed"&&d==="processed"||a==="confirmed"&&["confirmed","finalized"].includes(d)||a==="finalized"&&d==="finalized"))return r.onTransactionConfirmed({txHash:e,request:n,explorerLink:m}),!0;await new Promise(g=>setTimeout(g,Ge)),p++;}catch(l){if(l instanceof Error&&l.message.includes("Transaction failed"))return console.error("[waitForTransactionConfirmation] Transaction explicitly failed"),r.onTransactionReverted({txHash:e,request:n}),!1;await new Promise(d=>setTimeout(d,Ge)),p++;}return i==="confirmed"||i==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:m}),!0):(r.onTransactionReverted({txHash:e,request:n}),!1)},"waitForTransactionConfirmation");var zr=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()}),Wr=z$1.tuple([zr]),_t=a(t=>Wr.safeParse(t),"parseRequestParams");var Bt=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:s})=>{let{params:a}=t,{data:c,success:p,error:i}=_t(a);if(!p)return console.error("invalid params",i),{error:rpcErrors.invalidParams(z("Transaction params are invalid",i))};let[{account:m,serializedTx:l,sendOptions:d}]=c,u=M({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:g,isSimulationSuccessful:y,alert:h,balanceChange:T}=await ke({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:m,chain:W(e),transactionBase64:l},blockaid:s},network:e,provider:u}),k={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:g,alert:h,balanceChange:T,networkFeeSelector:!1,isSimulationSuccessful:y},v={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:m,data:l},P=await r.requestApproval({request:t,displayData:k,signingData:v});if("error"in P)return {error:P.error};let E;try{E=await jr(u,P,d);let A=Ae(e,E);return await r.onTransactionPending({txHash:E,request:t,explorerLink:A}),Ct({provider:u,txHash:E,approvalController:r,request:t,network:e,commitment:d?.preflightCommitment}),{result:E}}catch(A){return console.error(A),{error:rpcErrors.internal(z("Transaction failed",A))}}},"signAndSendTransaction"),jr=a(async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send(),"getTxHash");var Hr=z$1.object({account:z$1.string(),serializedTx:z$1.string().base64()}),Yr=z$1.tuple([Hr]),Lt=a(t=>Yr.safeParse(t),"parseRequestParams");var Ft=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:s})=>{let{params:a}=t,{data:c,success:p,error:i}=Lt(a);if(!p)return console.error("invalid params",i),{error:rpcErrors.invalidParams(z("Transaction params are invalid",i))};let[{account:m,serializedTx:l}]=c,d=M({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:u,isSimulationSuccessful:g,alert:y,balanceChange:h}=await ke({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:m,chain:W(e),transactionBase64:l},blockaid:s},network:e,provider:d}),T={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:u,alert:y,balanceChange:h&&At(h)?void 0:h,networkFeeSelector:!1,isSimulationSuccessful:g},k={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:m,data:l},v=await r.requestApproval({request:t,displayData:T,signingData:k});return "error"in v?{error:v.error}:"signedData"in v?{result:v.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signTransaction");var Ot=a(t=>{try{let e=base64.decode(t);return getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}},"isTransactionBytes");var Qr=z$1.object({account:z$1.string(),serializedMessage:z$1.string().base64()}).refine(({serializedMessage:t})=>!Ot(t),{message:"Cannot use signMessage() calls for signing transactions"}),en=z$1.tuple([Qr]),Mt=a(t=>en.safeParse(t),"parseRequestParams");var Gt=a(async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:s,success:a,error:c}=Mt(n);if(!a)return console.error("invalid params",c),{error:rpcErrors.invalidParams(z("Message signing params are invalid",c))};let[{account:p,serializedMessage:i}]=s,m=new TextDecoder,l={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:[_("Account",p),Ee("Message",m.decode(base64.decode(i))),ie("Raw Message (Base-64)",i)]}],networkFeeSelector:!1},d={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:p,data:i},u=await r.requestApproval({request:t,displayData:l,signingData:d});return "error"in u?{error:u.error}:"signedData"in u?{result:u.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signMessage");var B,G,de,re,ne,Ke=class Ke{constructor({approvalController:e$1,environment:r,appInfo:n,runtime:s}){d(this,B,void 0);d(this,G,void 0);d(this,de,void 0);d(this,re,void 0);d(this,ne,void 0);let{proxyApiUrl:a}=Je(r);e(this,de,n),e(this,B,a),e(this,G,e$1),e(this,ne,s),c(this,B),c(this,G),c(this,de),e(this,re,new on({baseURL:a+"/proxy/blockaid/",apiKey:at,httpAgent:s?.httpAgent,fetch:s?.fetch}));}async getProvider(e){return M({isTestnet:!!e.isTestnet,proxyApiUrl:c(this,B)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return Q(e)}deriveAddress(e){return Qe({...e,approvalController:c(this,G)})}deriveAddresses(e){return et({...e,approvalController:c(this,G)})}getBalances(e){let r=new ae({storage:e.storage,proxyApiUrl:c(this,B),fetch:c(this,ne)?.fetch});return ft({...e,tokenService:r,proxyApiUrl:c(this,B),fetch:c(this,ne)?.fetch})}getManifest(){let e=parseManifest(Ye);return e.success?e.data:void 0}getNetworkFee(e){return it(e,c(this,B))}getTransactionHistory(e){return St({network:e.network,address:e.address,proxyApiUrl:c(this,B)})}getTokens(e){return e.caipId?pt({caip2Id:e.caipId,proxyApiUrl:c(this,B)}):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 Ft({approvalController:c(this,G),proxyApiUrl:c(this,B),network:r,request:e,blockaid:c(this,re)});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return Bt({approvalController:c(this,G),proxyApiUrl:c(this,B),network:r,request:e,blockaid:c(this,re)});case RpcMethod.SOLANA_SIGN_MESSAGE:return Gt({approvalController:c(this,G),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};B=new WeakMap,G=new WeakMap,de=new WeakMap,re=new WeakMap,ne=new WeakMap,a(Ke,"SvmModule");var Kt=Ke;
|
|
16
|
+
function Qe(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}a(Qe,"charsum");function Ie(t){let e,r=0;for(e=0;e<t.length;e++){let n=Qe(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}a(Ie,"arrayHash");var Ne=a(async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=q.exponential()})=>{let a=0,s=0,l;for(;s<r;){s>0&&await Yt(a);try{let i=await t(s);if(e(i))return i}catch(i){l=i;}a=n(s),s++;}let c=l?`Max retry exceeded. ${l}`:"Max retry exceeded.";throw new Error(c)},"retry"),De=class De{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,s=e*r,l=2*r*(Math.pow(2,a)-1);return s+l}}};a(De,"RetryBackoffPolicy");var q=De;function Yt(t){return new Promise(e=>setTimeout(e,t))}a(Yt,"delay");var Ce=a(t=>Ne({operation:e=>t(e>0),maxRetries:2,backoffPolicy:q.constant(1),isSuccess:e=>e?.status?.error_code!==429}),"coingeckoRetry");async function U(t,e,r=fetch){let n=await r(...t);if(!n.ok)throw new Error(`Request failed with status ${n.status}`);let a=await n.json();return e.parse(a)}a(U,"fetchAndVerify");var Ee=class Ee{constructor(e,r){this.proxyApiUrl=e;this.fetchFn=r;}simplePrice(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/price?${r}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}simplePriceByContractAddresses(e){let{id:r,...n}=e,a=new URLSearchParams(n);return U([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${a}`,{method:"POST",headers:{"Content-Type":"application/json"}}],RawSimplePriceResponseSchema,this.fetchFn)}};a(Ee,"CoingeckoProxyClient");var se=Ee;var Xt=z.array(z.object({internalId:z.string(),id:z.string(),symbol:z.string(),name:z.string(),image:z.string().optional().nullable(),current_price:z.number().optional().nullable(),price_change_percentage_24h:z.number().optional().nullable(),market_cap:z.number().optional().nullable(),total_volume:z.number().optional().nullable(),platforms:z.record(z.string(),z.string())})),_e=class _e{constructor(e){this.proxyApiUrl=e;}watchlistToken(e){let r=new URLSearchParams(e);return U([`${this.proxyApiUrl}/watchlist/tokens?${r}`,{method:"GET",headers:{"Content-Type":"application/json"}}],Xt)}};a(_e,"WatchlistProxyClient");var ge=_e;var K,j,H,Z,Be=class Be{constructor({storage:e$1,proxyApiUrl:r,fetch:n}){d(this,K,void 0);d(this,j,void 0);d(this,H,void 0);d(this,Z,void 0);b(this,"transformSimplePriceResponse",a((e,r=[VsCurrencyType.USD])=>{let n={};return Object.keys(e).forEach(a=>{let s=e[a];n[a]={},r.forEach(l=>{n[a]={[l]:{price:s?.[l],change24:s?.[`${l}_24h_change`],vol24:s?.[`${l}_24h_vol`],marketCap:s?.[`${l}_market_cap`]}};});}),n},"transformSimplePriceResponse"));e(this,K,e$1),e(this,j,r),e(this,H,n??globalThis.fetch),e(this,Z,getBasicCoingeckoHttp(void 0,c(this,H)));}async getWatchlistDataForToken({tokenDetails:e,currency:r=VsCurrencyType.USD}){let n=(await new ge(c(this,j)).watchlistToken({tokens:e.symbol,currency:r})).filter(s=>e.isNative?s.internalId===`NATIVE-${e.symbol.toLowerCase()}`:s.platforms[e.caip2Id]===e.address),[a]=n;return a?{priceInCurrency:a.current_price??0,change24:a.price_change_percentage_24h??0,marketCap:a.market_cap??0,vol24:a.total_volume??0}:{priceInCurrency:0,change24:0,marketCap:0,vol24:0}}async getSimplePrice({coinIds:e=[],currencies:r=[VsCurrencyType.USD]}){let n,s=`getSimplePrice-${e?`${Ie(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=c(this,K)?.get?.(s),n)return n;try{n=await Ce(l=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:l}));}catch{n=void 0;}return c(this,K)?.set?.(s,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let a,l=`getPricesWithMarketDataByAddresses-${`${Ie(e)}-${r}-${n}`}`;if(a=c(this,K)?.get?.(l),a)return a;try{a=await Ce(c=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:c}));}catch(c){console.error(c),a=void 0;}return c(this,K)?.set?.(l,a),a}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:a=!1}){if(a){let s=await new se(c(this,j),c(this,H)).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(c(this,Z),{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:s=!1,lastUpdated:l=!1,useCoingeckoProxy:c$1=!1,shouldThrow:i=!0}){if(c$1){let d=await new se(c(this,j),c(this,H)).simplePrice({ids:e,vs_currencies:r,include_market_cap:n,include_24hr_vol:a,include_24hr_change:s,include_last_updated_at:l});return this.transformSimplePriceResponse(d,r)}return simplePrice(c(this,Z),{coinIds:e,currencies:r,marketCap:n,vol24:a,change24:s,lastUpdated:l,shouldThrow:i})}};K=new WeakMap,j=new WeakMap,H=new WeakMap,Z=new WeakMap,a(Be,"TokenService");var ie=Be;object({date:string(),usd:record(number())});var Le=a((t,e,r="horizontal")=>({label:t,alignment:r,type:DetailItemType.TEXT,value:e}),"textItem");var E=a((t,e)=>({label:t,type:DetailItemType.ADDRESS,value:e}),"addressItem"),Ue=a((t,e)=>({label:t,type:DetailItemType.ADDRESS_LIST,value:e}),"addressListItem");var ce=a((t,e)=>({label:t,type:DetailItemType.DATA,value:e}),"dataItem");var tt=process.env.GLACIER_API_KEY;var le=a(()=>tt,"getGlacierApiKey");var or=["glacier-api.avax.network","proxy-api.avax.network","proxy-api-dev.avax.network","core-proxy-api.avax.network","core-proxy-api.avax-test.network"];function Me(t){let e=new URL(t),r=le();if(r&&or.includes(e.hostname)){let n=e.searchParams;return n.set("token",r),e.search=n.toString(),e.toString()}return t}a(Me,"addGlacierAPIKeyIfNeeded");({rltoken:le()});var O=a((t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}}),"rpcErrorOpts");var rt={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 sr={proxyApiUrl:"https://proxy-api.avax.network"},ir={proxyApiUrl:"https://proxy-api-dev.avax.network"},ot=a(t=>{switch(t){case Environment.PRODUCTION:return sr;case Environment.DEV:return ir}},"getEnv");var at=a(t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string","hasDerivationDetails");var Q=a(({accountIndex:t})=>{if(t<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");return {[NetworkVMType.SVM]:`m/44'/501'/${t}'/0'`}},"buildDerivationPath");var st=a(async t=>{let{approvalController:e,secretId:r}=t,n=at(t)?Q(t).SVM:void 0,a=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:n});return {[NetworkVMType.SVM]:base58.encode(hex.decode(a))}},"deriveAddress");var it=a(async t=>{let{approvalController:e,secretId:r,accountIndices:n,derivationPathType:a}=t;if(n.length===0)return [];await init();let s=await Promise.all(n.map(async c=>{let i=Q({accountIndex:c,derivationPathType:a}).SVM,d=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:i});return Uint8Array.from(Buffer.from(d,"hex"))}));return (await deriveAddressesForSvm(s)).map(c=>({[NetworkVMType.SVM]:c}))},"deriveAddresses");var ct="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",lt="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",pt="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",Fe="/proxy/nownodes/sol",Oe="https://api.devnet.solana.com",mt="https://api.testnet.solana.com",dt="DUMMY_API_KEY";var hr=a(({caipId:t,isTestnet:e,proxyApiUrl:r})=>{switch(t){case SolanaCaip2ChainId.MAINNET:return r+Fe;case SolanaCaip2ChainId.DEVNET:return Oe;case SolanaCaip2ChainId.TESTNET:return mt;default:if(t)throw new Error(`Unsupported Solana CAIP-2 id: ${t}`);return e?Oe:r+Fe}},"getSolanaRpcUrl"),V=a(({network:t,proxyApiUrl:e})=>{let r=!!t.isTestnet,n=Me(hr({caipId:t.caipId,isTestnet:r,proxyApiUrl:e}));return getSolanaProvider({isTestnet:r,rpcUrl:n})},"getProvider");var Ge=1e6,G={high:150*Ge,medium:75*Ge,low:2*Ge},Tr=a(t=>(t.length===0?[G.low,G.low]:t.length===1?[t[0],G.low]:t).slice().sort((r,n)=>r-n),"ensureEnoughData");async function ut(t,e){let a=await(await V({network:t,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(a.length===0||a.every(g=>g.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(G.high),maxPriorityFeePerGas:BigInt(G.high)},medium:{maxFeePerGas:BigInt(G.medium),maxPriorityFeePerGas:BigInt(G.medium)},low:{maxFeePerGas:BigInt(G.low),maxPriorityFeePerGas:BigInt(G.low)},baseFee:BigInt(G.low),displayDecimals:9,isFixedFee:!1};let l=Tr(a.map(g=>Number(g.prioritizationFee))),c=l.at(0),i=l.at(-1),d=Math.floor(l.length/2),p=l.length%2===1?l[d]:(l[d-1]+l[d])/2,m=BigInt(Math.ceil(i*1.05)),u=BigInt(Math.ceil(p*1.05)),y=BigInt(Math.ceil(c*1.05));return {high:{maxFeePerGas:m,maxPriorityFeePerGas:m},medium:{maxFeePerGas:u,maxPriorityFeePerGas:u},low:{maxFeePerGas:y,maxPriorityFeePerGas:y},baseFee:y,displayDecimals:9,isFixedFee:!1}}a(ut,"getNetworkFee");var Sr=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()}),ft=z.array(Sr);async function yt({caip2Id:t,proxyApiUrl:e}){try{return (await U([`${e}/solana-tokens?caip2Id=${t}`],ft)).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}"`)}}a(yt,"getTokens");var gt=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 pe,me,Pe,ht,$e=class $e{constructor(e$1){d(this,Pe);d(this,pe,void 0);d(this,me,void 0);e(this,pe,`${e$1.proxyApiUrl}/proxy/moralis`),e(this,me,e$1.fetch??globalThis.fetch);}async getPortfolio({address:e,network:r}){try{let n=f(this,Pe,ht).call(this,`/account/${r}/${e}/portfolio`),a=await U([n],gt,c(this,me));return {address:e,portfolio:a}}catch(n){console.error("getPortfolio() failed:",n);let a=n instanceof Error?n.message:"unknown error";return {address:e,error:`getPortfolio() failed: ${a}`}}}};pe=new WeakMap,me=new WeakMap,Pe=new WeakSet,ht=a(function(e){return `${c(this,pe)}${e}`},"#buildUrl"),a($e,"MoralisService");var ee=$e;var W=a(t=>{switch(t.caipId){case ct:return "mainnet";case lt:return "devnet";case pt:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}},"getNetworkName");var St=a(async({addresses:t,proxyApiUrl:e,currency:r,network:n,tokenService:a,fetch:s})=>{let l=new ee({proxyApiUrl:e,fetch:s}),c=n.pricingProviders?.coingecko.nativeTokenId??"",i=n.pricingProviders?.coingecko.assetPlatformId??"",d=r.toLowerCase(),p=W(n),m=await Promise.all(t.map(h=>l.getPortfolio({address:h,network:p}))),u=new Set(m.flatMap(h=>"portfolio"in h?h.portfolio.tokens.map(({mint:T})=>T):[])),y=await(i?a.getPricesByAddresses(Array.from(u),i,d):Promise.resolve(void 0)),g=await a.getWatchlistDataForToken({tokenDetails:{symbol:n.networkToken.symbol,isNative:!0,caip2Id:n.caipId??""},currency:d});return m.reduce((h,T)=>{if("error"in T)return {...h,[T.address]:{error:T.error}};let A=new TokenUnit(T.portfolio.nativeBalance.lamports,9,"SOL"),R=g.priceInCurrency!==void 0?A.mul(g.priceInCurrency):void 0,P={type:TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:A.toSubUnit(),balanceDisplayValue:A.toString(),balanceInCurrency:R?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:R?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:c,...g},L=T.portfolio.tokens.reduce((k,{amountRaw:v,symbol:S,decimals:x,mint:w,name:N,logo:B})=>{let F=new TokenUnit(v,x,S),fe=Ar(w,d,y),ye=fe.priceInCurrency!==void 0?F.mul(fe.priceInCurrency):void 0,X={type:TokenType.SPL,address:w,name:N,symbol:S,decimals:x,balance:F.toSubUnit(),balanceDisplayValue:F.toString(),balanceInCurrency:ye?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:ye?.toDisplay({fixedDp:2}),logoUri:B??void 0,reputation:null,...fe};return {...k,[w]:X}},{});return {...h,[T.address]:{[n.networkToken.symbol]:P,...L}}},{})},"getBalances"),Ar=a((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}),"getMarketData");var ze=a(t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),"simplifyTokenBalance"),kt=a((t,e,r,n)=>{let a=e!==-1?t[e]:r.preTokenBalances.find(i=>!t.includes(i.owner))?.owner||r.postTokenBalances.find(i=>!t.includes(i.owner))?.owner,s=r.preTokenBalances.reduce((i,{owner:d,mint:p,amount:m})=>({...i,[`${d}-${p}`]:m}),{}),l=r.postTokenBalances.reduce((i,{owner:d,mint:p,amount:m,decimals:u})=>{let y=`${d}-${p}`,g=s[y]??0n,h=m-g;if(h===0n)return i;let T=h>0n&&d===a,A=h<0n&&d===a;if(T){let R=Object.keys(s).find(k=>{let[v,S]=k.split("-");if(S!==p||v===a)return !1;let x=s[k],w=r.postTokenBalances.find(({owner:B,mint:F})=>B===v&&F===p);return !w||w.amount<x});if(!R)return i;let P=n.tokens?.filter(k=>"contractType"in k).find(k=>k.address===p)??{contractType:TokenType.SPL,decimals:u,address:p,symbol:"Unknown",name:"Unknown"},L={...P,type:P.contractType,from:{...P,address:R.split("-")[0]},to:{...P,address:d},amount:new TokenUnit(h,u,"").toDisplay()};return [...i,L]}else if(A){let R=r.postTokenBalances.find(({owner:k,mint:v})=>v===p&&k!==a&&(s[`${k}-${p}`]??0n)<(r.postTokenBalances.find(S=>S.owner===k&&S.mint===p)?.amount??0n));if(!R)return i;let P=n.tokens?.filter(k=>"contractType"in k).find(k=>k.address===p)??{contractType:TokenType.SPL,decimals:u,address:p,symbol:"Unknown",name:"Unknown"},L={...P,type:P.contractType,from:{...P,address:a},to:{...P,address:R.owner},amount:new TokenUnit(-h,u,"").toDisplay()};return [...i,L]}return i},[]),c=vr(t,e,r,n,l,a);return c&&l.push(c),l},"extractTokenTranfers"),vr=a((t,e,{paidFee:r,preBalances:n,postBalances:a},s,l=[],c)=>{if(e===-1){if(l.length>0&&c&&l.some(S=>S.to?.address===c)){let S=t.findIndex(x=>x===c);if(S!==-1){let x=n[S],N=a[S]-x;if(N<=0){let B=Math.abs(N)+r;if(B>r){let F=new TokenUnit(B,s.networkToken.decimals,""),ye=a.map((X,ae)=>X-n[ae]).reduce((X,ae,Je)=>Je!==S&&ae>X.amount&&ae>0?{index:Je,amount:ae}:X,{index:0,amount:0});return {amount:F.toDisplay(),from:{address:c},to:{address:t[ye.index]},name:s.networkToken.name,symbol:s.networkToken.symbol,type:TokenType.NATIVE}}}}}return null}let i=t[e],d=n[e],m=a[e]-d,u=a.map((v,S)=>v-n[S]),y=l.length>0,g=m!==0?m+r:0,h=g>0,T=0,A=!1;if(y&&e===0&&c){let v=l.some(x=>x.to?.address===c),S=l.some(x=>x.from?.address===c);v&&!S&&(h=!1,A=!0,T=a.map((N,B)=>N-n[B]).reduce((N,B,F)=>F!==e&&B>N.amount&&B>0?{index:F,amount:B}:N,{index:0,amount:0}).index);}if(y&&m<0){let v=u.reduce((S,x,w)=>w!==e&&x>S.amount?{index:w,amount:x}:S,{index:0,amount:0});v.amount>r*2&&!A&&(g=v.amount,h=!0,T=v.index);}else y&&m<=0&&l.some(S=>S.to?.address===i)&&(g=Math.abs(m)+r,h=!1,T=u.reduce((x,w,N)=>N!==e&&w>x.amount&&w>0?{index:N,amount:w}:x,{index:0,amount:0}).index);if(!g)return null;let R=new TokenUnit(Math.abs(g),s.networkToken.decimals,"");if(!y){let v=u.reduce(({index:S,change:x},w,N)=>w>x?{index:N,change:w}:{index:S,change:x},{index:0,change:u[0]});T=h?0:v.index;}let P=t[T],L=h?P||i:c||i,k=h?c||i:P||c||i;return {amount:R.toDisplay(),from:{address:L},to:{address:k},name:s.networkToken.name,symbol:s.networkToken.symbol,type:TokenType.NATIVE}},"extractNativeTransfer");var de=a(t=>t.status==="fulfilled","isFulfilled");function At(t){return e=>!!e[t]}a(At,"hasPropertyDefined");var xt=a(async({network:t,address:e,proxyApiUrl:r})=>{let n=V({network:t,proxyApiUrl:r}),s=(await n.getSignaturesForAddress(address(e),{limit:25}).send()).map(i=>i.signature),l=s;try{let i=new ee({proxyApiUrl:r}),d=W(t),p=await i.getPortfolio({address:e,network:d});if("portfolio"in p){let m=p.portfolio.tokens.map(A=>A.associatedTokenAddress),u=p.portfolio.nfts.map(A=>A.associatedTokenAddress),g=[...m,...u].map(async A=>{try{return (await n.getSignaturesForAddress(address(A),{limit:25}).send()).map(P=>P.signature)}catch(R){return console.error("Failed to get signatures for ATA:",A,R),[]}}),T=(await Promise.allSettled(g)).filter(de).map(A=>A.value).flat();l=Array.from(new Set([...s,...T]));}}catch(i){console.error("ATA discovery failed with error:",i);}return (await Promise.allSettled(l.map(async i=>({txHash:i.toString(),tx:await n.getTransaction(i,{encoding:"json",maxSupportedTransactionVersion:0}).send()})))).filter(de).map(i=>i.value).filter(At("tx"))},"getWrappedTransactions");var bt=a((t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""},"getExplorerLink");async function Rt({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await xt({network:t,address:e,proxyApiUrl:r})).map(({txHash:s,tx:l})=>{if(!l.meta)return null;let{meta:c,transaction:{message:i}}=l,d=i.accountKeys.map(h=>h.toString()),p=d.indexOf(e),m=p!==-1;!m&&c.preTokenBalances&&(c.preTokenBalances.some(T=>T.owner===e)||(c.postTokenBalances??[]).some(T=>T.owner===e))&&(m=!0,p=-1);let u=p!==-1&&p<i.header.numRequiredSignatures,y=kt(d,p,{paidFee:u?Number(c.fee):0,preBalances:c.preBalances.map(Number),postBalances:c.postBalances.map(Number),preTokenBalances:(c.preTokenBalances??[]).map(ze),postTokenBalances:(c.postTokenBalances??[]).map(ze)},t),g=br(y,e);return {hash:s,txType:g,gasUsed:String(l.meta.computeUnitsConsumed??"0"),tokens:y,from:y[0]?.from?.address??d[0],to:y[0]?.to?.address??(u?"":e),isOutgoing:u,isIncoming:!u,isSender:u,timestamp:Number(l.blockTime)*1e3,isContractCall:!1,gasPrice:String(Number(l.meta.fee)/Number(l.meta.computeUnitsConsumed)),chainId:String(t.chainId),explorerLink:bt(s,t.explorerUrl)}}).filter(s=>s!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}a(Rt,"getTransactionHistory");var br=a((t,e)=>{if(t.length===0)return TransactionType.UNKNOWN;let r=t.filter(s=>s.from?.address===e||s.to?.address===e);if(r.length===0)return TransactionType.UNKNOWN;let n=r.some(s=>s.from?.address===e),a=r.some(s=>s.to?.address===e);return n&&a?TransactionType.SWAP:n?TransactionType.SEND:a?TransactionType.RECEIVE:TransactionType.UNKNOWN},"inferTxType");var Nr="11111111111111111111111111111111",Dr=4,re=a(t=>`Could not verify this transaction belongs to ${t}. Signing it could authorize a transfer on a different Solana cluster.`,"couldNotVerify"),wt=a((t,e)=>`This transaction's ${e} is not valid on ${t}. It may have expired, or it may have been built for a different Solana cluster. Signing it could authorize a transfer on another network.`,"lifetimeNotValid"),Cr=a(t=>{let[e]=t.instructions;if(!e?.data||t.staticAccounts[e.programAddressIndex]!==Nr)return !1;let{data:r}=e;return r.length>=4&&r[0]===Dr&&r[1]===0&&r[2]===0&&r[3]===0},"isDurableNonceTransaction"),Er=a(async(t,e,r)=>{if(e<t.staticAccounts.length)return t.staticAccounts[e]??null;let n="addressTableLookups"in t?t.addressTableLookups??[]:[];if(n.length===0)return null;let a=await fetchAddressesForLookupTables(n.map(c=>c.lookupTableAddress),r),s=n.flatMap(c=>c.writableIndices.map(i=>a[c.lookupTableAddress]?.[i])),l=n.flatMap(c=>c.readableIndices.map(i=>a[c.lookupTableAddress]?.[i]));return [...s,...l][e-t.staticAccounts.length]??null},"resolveAccountAddress"),_r=a((t,e)=>{let r=t.instructions[0]?.accountIndices?.[0];return r===void 0?Promise.resolve(null):Er(t,r,e)},"getDurableNonceAccountAddress"),Br=a(async({nonceAccountAddress:t,nonce:e,provider:r,network:n})=>{try{let s=(await r.getAccountInfo(t,{encoding:"jsonParsed",commitment:"processed"}).send()).value?.data;if(!s)return `This transaction's durable nonce account is unknown on ${n.chainName}. Signing it could authorize a transfer on a different Solana cluster.`;if(Array.isArray(s))return re(n.chainName);let l=s.parsed.info.blockhash;if(typeof l!="string"||l!==e)return wt(n.chainName,"durable nonce")}catch{return re(n.chainName)}return null},"assertDurableNonceBelongsToNetwork"),Ae=a(async({serializedTx:t,provider:e,network:r})=>{let n;try{let a=getTransactionDecoder().decode(Uint8Array.from(Buffer.from(t,"base64")));n=getCompiledTransactionMessageDecoder().decode(a.messageBytes);}catch{return re(r.chainName)}if(Cr(n)){let a;try{a=await _r(n,e);}catch{return re(r.chainName)}return a?Br({nonceAccountAddress:a,nonce:n.lifetimeToken,provider:e,network:r}):re(r.chainName)}try{let{value:a}=await e.isBlockhashValid(n.lifetimeToken,{commitment:"processed"}).send();if(!a)return wt(r.chainName,"blockhash")}catch{return re(r.chainName)}return null},"assertTxBelongsToNetwork");var It=a(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 t?.type==="TransactionError"&&t.message.toLowerCase().includes("insufficient funds for rent")?{type:AlertType.WARNING,details:{title:"This transaction will likely be reverted",description:"The recipient account needs a minimum balance to exist on Solana (rent). Try increasing the amount you send."}}:{type:AlertType.WARNING,details:{title:"Transaction simulation has failed",description:"It is possible that this transaction will fail. Please proceed with caution."}}},"getAlertForError"),Ke={[AlertType.WARNING]:{type:AlertType.WARNING,details:{title:"Suspicious transaction",description:"Use caution, this transaction might be malicious."}},[AlertType.DANGER]:{type:AlertType.DANGER,details:{title:"Scam transaction",description:"This transaction is malicious, do not proceed.",body:["This transaction is malicious","do not proceed"],actionTitles:{reject:"Reject Transaction",proceed:"Proceed Anyway"}}}};function Nt(t){return t.ins.length===0&&t.outs.length===0}a(Nt,"isBalanceChangeEmpty");function Dt(t){return t!=null}a(Dt,"isNotNullish");var Ct=a((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:l}=parseTransferSolInstruction({...t,data:Uint8Array.from(t.data)}),i=s.source.address===r===!0?"outs":"ins";return e[i].push({token:{...n,address:""},items:[{displayValue:new TokenUnit(l.amount,n.decimals,"").toString(),usdPrice:void 0}]}),{title:"Transfer SOL",items:[E("From",s.source.address),E("To",s.destination.address)]}}catch{return null}},"tryToParseSolTransfer");var Yr=a(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}},"getTokenMintFromAccountInfo"),Et=a(async(t,e,r,n,a)=>{if(!a?.length||!isInstructionWithAccounts(e)||!isInstructionWithData(e))return null;try{let s=identifyTokenInstruction(e);if(s!==TokenInstruction.Transfer&&s!==TokenInstruction.TransferChecked)return null;let l=s===TokenInstruction.TransferChecked?parseTransferCheckedInstruction:parseTransferInstruction,{accounts:c,data:i}=l({...e,data:Uint8Array.from(e.data)}),d=await Yr(t,c.source.address);if(!d)return null;let p=a.find(g=>g.address.toLowerCase()===d.toLowerCase());if(!p)return null;let u=(c.source.address===n||c.authority.address===n)===!0?"outs":"ins",y="decimals"in i?i.decimals:p.decimals;return r[u].push({token:p,items:[{displayValue:new TokenUnit(i.amount,y,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${p.symbol}`,items:[E("From",c.source.address),E("To",c.destination.address)]}}catch{return null}},"tryToParseSPLTransfer");var _t=a(async(t,e,r,n)=>{let a=await deserializeTransactionMessage(t,n),s={ins:[],outs:[]},l=await Promise.allSettled(a.instructions.map(async c=>Ct(c,s,e,r.networkToken)??await Et(n,c,s,e,r.tokens)??null)).then(c=>c.filter(de).map(i=>i.value).filter(Dt));return {balanceChange:s,details:l}},"parseTransaction");var Lt=a((t,e,r)=>{let n=e.account_summary.account_assets_diff??[],a={},s={},l=Object.keys(e.assets_diff??{}).filter(c=>c!==t);return n.forEach(({asset:c,in:i,out:d})=>{let p=Qr(c,r);if(!p)return;let m="address"in p?p.address:p.symbol;i&&(a[m]||(a[m]={token:p,items:[]}),a[m].items.push({displayValue:String(i.value),usdPrice:typeof i.usd_price=="number"?String(i.usd_price):void 0})),d&&(s[m]||(s[m]={token:p,items:[]}),s[m].items.push({displayValue:String(d.value),usdPrice:typeof d.usd_price=="number"?String(d.usd_price):void 0}));}),{balanceChange:{ins:Object.values(a),outs:Object.values(s)},otherAffectedAddresses:l}},"processBalanceChange"),Jr=a(t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),"convertNativeAssetToToken"),Zr=a((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}),"convertTokenAssetToToken"),Qr=a((t,e)=>t.type==="TOKEN"?Zr(t,e):t.type==="SOL"||t.type==="ETH"?Jr(t):null,"convertDiffAssetToToken");var Ut=a(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}},"scanSolanaTransaction");var ve=a(async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,a=await Ut(t),{simulation:s,validation:l}=a?.result??{},c=s?.account_summary?s:void 0,i={title:"Transaction Details",items:[ce("Raw Data",t.params.transactionBase64)]},d=[i],p=!1,m,u;if(!l||l.result_type==="Warning"?u=Ke[AlertType.WARNING]:l.result_type==="Malicious"?u=Ke[AlertType.DANGER]:a?.error_details&&(u=It(a.error_details)),c){let{balanceChange:y,otherAffectedAddresses:g}=Lt(n.account,c,e);if(m=y,g.length>0){let h=c.account_summary.account_assets_diff,T=h?.filter(P=>P.out&&P.out.raw_value>0)??[],A=h?.filter(P=>P.in&&P.in.raw_value>0)??[];T.length>0&&A.length>0?(i.items.push(E("Account",n.account)),i.items.push(Ue("Interacting with",g))):(i.items.push(E(g.length===1?"From":"Account",n.account)),i.items.push(g.length===1?E("To",g[0]):Ue("Interacting with",g)));}else i.items.push(E("Account",n.account));p=!0;}else {let{balanceChange:y,details:g}=await _t(n.transactionBase64,n.account,e,r);m=y,d.push(...g);}return {isSimulationSuccessful:p,details:d,alert:u,balanceChange:m}},"explainTransaction");var rn="https://explorer.solana.com";function xe(t,e,r="tx"){try{let n=t.explorerUrl?new URL(t.explorerUrl):new URL(rn);return n.pathname+=`${r}/${e}`,n.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}a(xe,"getExplorerAddressByNetwork");var qe=400,on=15,Ft=a(async({provider:t,txHash:e,approvalController:r,request:n,network:a,commitment:s="confirmed",maxRetries:l=on})=>{let c=0,i=null,d=xe(a,e,"tx");for(;c<l;)try{let p=await t.getSignatureStatuses([signature(e)],{searchTransactionHistory:!0}).send();if(!p?.value?.[0]){await new Promise(y=>setTimeout(y,qe)),c++;continue}let{confirmationStatus:m,err:u}=p.value[0];if(u)return console.error("[waitForTransactionConfirmation] Transaction failed:",u),r.onTransactionReverted({txHash:e,request:n}),!1;if(m&&m!==i&&(i=m,m==="processed"&&r.onTransactionPending({txHash:e,request:n,explorerLink:d}),s==="processed"&&m==="processed"||s==="confirmed"&&["confirmed","finalized"].includes(m)||s==="finalized"&&m==="finalized"))return r.onTransactionConfirmed({txHash:e,request:n,explorerLink:d}),!0;await new Promise(y=>setTimeout(y,qe)),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(m=>setTimeout(m,qe)),c++;}return i==="confirmed"||i==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:d}),!0):(r.onTransactionReverted({txHash:e,request:n}),!1)},"waitForTransactionConfirmation");var an=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()}),sn=z.tuple([an]),Ot=a(t=>sn.safeParse(t),"parseRequestParams");var Vt=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:a})=>{let{params:s}=t,{data:l,success:c,error:i}=Ot(s);if(!c)return console.error("invalid params",i),{error:rpcErrors.invalidParams(O("Transaction params are invalid",i))};let[{account:d,serializedTx:p,sendOptions:m}]=l,u=V({network:e,proxyApiUrl:n}),y=await Ae({serializedTx:p,provider:u,network:e});if(y)return {error:rpcErrors.invalidParams(O(y,null))};let{details:g,isSimulationSuccessful:h,alert:T,balanceChange:A}=await ve({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:d,chain:W(e),transactionBase64:p},blockaid:a},network:e,provider:u}),R={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:g,alert:T,balanceChange:A,networkFeeSelector:!1,isSimulationSuccessful:h},P={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:d,data:p},L=await r.requestApproval({request:t,displayData:R,signingData:P});if("error"in L)return {error:L.error};let k;try{k=await ln(u,L,m);let v=xe(e,k);return await r.onTransactionPending({txHash:k,request:t,explorerLink:v}),Ft({provider:u,txHash:k,approvalController:r,request:t,network:e,commitment:m?.preflightCommitment}),{result:k}}catch(v){return console.error(v),{error:rpcErrors.internal(O("Transaction failed",v))}}},"signAndSendTransaction"),ln=a(async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send(),"getTxHash");var pn=z.object({account:z.string(),serializedTx:z.string().base64()}),mn=z.tuple([pn]),Gt=a(t=>mn.safeParse(t),"parseRequestParams");var $t=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:a})=>{let{params:s}=t,{data:l,success:c,error:i}=Gt(s);if(!c)return console.error("invalid params",i),{error:rpcErrors.invalidParams(O("Transaction params are invalid",i))};let[{account:d,serializedTx:p}]=l,m=V({network:e,proxyApiUrl:n}),u=await Ae({serializedTx:p,provider:m,network:e});if(u)return {error:rpcErrors.invalidParams(O(u,null))};let{details:y,isSimulationSuccessful:g,alert:h,balanceChange:T}=await ve({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:d,chain:W(e),transactionBase64:p},blockaid:a},network:e,provider:m}),A={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:y,alert:h,balanceChange:T&&Nt(T)?void 0:T,networkFeeSelector:!1,isSimulationSuccessful:g},R={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:d,data:p},P=await r.requestApproval({request:t,displayData:A,signingData:R});return "error"in P?{error:P.error}:"signedData"in P?{result:P.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signTransaction");var zt=a(t=>{try{let e=base64.decode(t);return getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}},"isTransactionBytes");var yn=z.object({account:z.string(),serializedMessage:z.string().base64()}).refine(({serializedMessage:t})=>!zt(t),{message:"Cannot use signMessage() calls for signing transactions"}),gn=z.tuple([yn]),Kt=a(t=>gn.safeParse(t),"parseRequestParams");var qt=a(async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:a,success:s,error:l}=Kt(n);if(!s)return console.error("invalid params",l),{error:rpcErrors.invalidParams(O("Message signing params are invalid",l))};let[{account:c,serializedMessage:i}]=a,d=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:[E("Account",c),Le("Message",d.decode(base64.decode(i))),ce("Raw Message (Base-64)",i)]}],networkFeeSelector:!1},m={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:c,data:i},u=await r.requestApproval({request:t,displayData:p,signingData:m});return "error"in u?{error:u.error}:"signedData"in u?{result:u.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signMessage");var _,$,ue,ne,oe,Xe=class Xe{constructor({approvalController:e$1,environment:r,appInfo:n,runtime:a}){d(this,_,void 0);d(this,$,void 0);d(this,ue,void 0);d(this,ne,void 0);d(this,oe,void 0);let{proxyApiUrl:s}=ot(r);e(this,ue,n),e(this,_,s),e(this,$,e$1),e(this,oe,a),c(this,_),c(this,$),c(this,ue),e(this,ne,new Sn({baseURL:s+"/proxy/blockaid/",apiKey:dt,httpAgent:a?.httpAgent,fetch:a?.fetch}));}async getProvider(e){return V({network:e,proxyApiUrl:c(this,_)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return Q(e)}deriveAddress(e){return st({...e,approvalController:c(this,$)})}deriveAddresses(e){return it({...e,approvalController:c(this,$)})}getBalances(e){let r=new ie({storage:e.storage,proxyApiUrl:c(this,_),fetch:c(this,oe)?.fetch});return St({...e,tokenService:r,proxyApiUrl:c(this,_),fetch:c(this,oe)?.fetch})}getManifest(){let e=parseManifest(rt);return e.success?e.data:void 0}getNetworkFee(e){return ut(e,c(this,_))}getTransactionHistory(e){return Rt({network:e.network,address:e.address,proxyApiUrl:c(this,_)})}getTokens(e){return e.caipId?yt({caip2Id:e.caipId,proxyApiUrl:c(this,_)}):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 $t({approvalController:c(this,$),proxyApiUrl:c(this,_),network:r,request:e,blockaid:c(this,ne)});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return Vt({approvalController:c(this,$),proxyApiUrl:c(this,_),network:r,request:e,blockaid:c(this,ne)});case RpcMethod.SOLANA_SIGN_MESSAGE:return qt({approvalController:c(this,$),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};_=new WeakMap,$=new WeakMap,ue=new WeakMap,ne=new WeakMap,oe=new WeakMap,a(Xe,"SvmModule");var Ht=Xe;
|
|
16
17
|
|
|
17
|
-
export {
|
|
18
|
+
export { Ht as SvmModule };
|
|
18
19
|
//# sourceMappingURL=out.js.map
|
|
19
20
|
//# sourceMappingURL=index.js.map
|