@avalabs/svm-module 3.8.1 → 3.9.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.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _metamask_rpc_errors from '@metamask/rpc-errors';
|
|
2
2
|
import * as _avalabs_vm_module_types from '@avalabs/vm-module-types';
|
|
3
|
-
import { Module, ConstructorParams, Network, BuildDerivationPathParams, DeriveAddressParams, GetBalancesParams, NetworkFeeParam, GetTransactionHistory, RpcRequest } from '@avalabs/vm-module-types';
|
|
3
|
+
import { Module, ConstructorParams, Network, BuildDerivationPathParams, DeriveAddressParams, DeriveAddressesParams, GetBalancesParams, NetworkFeeParam, GetTransactionHistory, RpcRequest } from '@avalabs/vm-module-types';
|
|
4
4
|
import { SolanaProvider } from '@avalabs/core-wallets-sdk';
|
|
5
5
|
|
|
6
6
|
declare class SvmModule implements Module {
|
|
@@ -10,6 +10,7 @@ declare class SvmModule implements Module {
|
|
|
10
10
|
getAddress(): Promise<{}>;
|
|
11
11
|
buildDerivationPath(params: BuildDerivationPathParams): Pick<Partial<Record<_avalabs_vm_module_types.NetworkVMType, string>>, _avalabs_vm_module_types.NetworkVMType.SVM>;
|
|
12
12
|
deriveAddress(params: DeriveAddressParams): Promise<Partial<Record<_avalabs_vm_module_types.NetworkVMType, string>>>;
|
|
13
|
+
deriveAddresses(params: DeriveAddressesParams): Promise<_avalabs_vm_module_types.DeriveAddressesResponse>;
|
|
13
14
|
getBalances(params: GetBalancesParams): Promise<{
|
|
14
15
|
[x: string]: _avalabs_vm_module_types.Error | Record<string, _avalabs_vm_module_types.TokenWithBalanceSVM | _avalabs_vm_module_types.TokenWithBalanceSPL | _avalabs_vm_module_types.Error>;
|
|
15
16
|
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _metamask_rpc_errors from '@metamask/rpc-errors';
|
|
2
2
|
import * as _avalabs_vm_module_types from '@avalabs/vm-module-types';
|
|
3
|
-
import { Module, ConstructorParams, Network, BuildDerivationPathParams, DeriveAddressParams, GetBalancesParams, NetworkFeeParam, GetTransactionHistory, RpcRequest } from '@avalabs/vm-module-types';
|
|
3
|
+
import { Module, ConstructorParams, Network, BuildDerivationPathParams, DeriveAddressParams, DeriveAddressesParams, GetBalancesParams, NetworkFeeParam, GetTransactionHistory, RpcRequest } from '@avalabs/vm-module-types';
|
|
4
4
|
import { SolanaProvider } from '@avalabs/core-wallets-sdk';
|
|
5
5
|
|
|
6
6
|
declare class SvmModule implements Module {
|
|
@@ -10,6 +10,7 @@ declare class SvmModule implements Module {
|
|
|
10
10
|
getAddress(): Promise<{}>;
|
|
11
11
|
buildDerivationPath(params: BuildDerivationPathParams): Pick<Partial<Record<_avalabs_vm_module_types.NetworkVMType, string>>, _avalabs_vm_module_types.NetworkVMType.SVM>;
|
|
12
12
|
deriveAddress(params: DeriveAddressParams): Promise<Partial<Record<_avalabs_vm_module_types.NetworkVMType, string>>>;
|
|
13
|
+
deriveAddresses(params: DeriveAddressesParams): Promise<_avalabs_vm_module_types.DeriveAddressesResponse>;
|
|
13
14
|
getBalances(params: GetBalancesParams): Promise<{
|
|
14
15
|
[x: string]: _avalabs_vm_module_types.Error | Record<string, _avalabs_vm_module_types.TokenWithBalanceSVM | _avalabs_vm_module_types.TokenWithBalanceSPL | _avalabs_vm_module_types.Error>;
|
|
15
16
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -4,15 +4,16 @@ import { rpcErrors } from '@metamask/rpc-errors';
|
|
|
4
4
|
import { VsCurrencyType, getBasicCoingeckoHttp, simpleTokenPrice, simplePrice } from '@avalabs/core-coingecko-sdk';
|
|
5
5
|
import { z as z$1, object, string, record, number } from 'zod';
|
|
6
6
|
import { base58, hex, base64 } from '@scure/base';
|
|
7
|
+
import { init, deriveAddressesForSvm } from '@avalabs/crypto-sdk';
|
|
7
8
|
import { getSolanaProvider, deserializeTransactionMessage } from '@avalabs/core-wallets-sdk';
|
|
8
9
|
import { TokenUnit } from '@avalabs/core-utils-sdk';
|
|
9
10
|
import { address, isInstructionForProgram, isInstructionWithAccounts, isInstructionWithData, signature, getCompiledTransactionMessageDecoder } from '@solana/kit';
|
|
10
11
|
import { SYSTEM_PROGRAM_ADDRESS, identifySystemInstruction, SystemInstruction, parseTransferSolInstruction } from '@solana-program/system';
|
|
11
12
|
import { identifyTokenInstruction, TokenInstruction, parseTransferCheckedInstruction, parseTransferInstruction } from '@solana-program/token';
|
|
12
|
-
import
|
|
13
|
+
import rn from '@blockaid/client';
|
|
13
14
|
|
|
14
|
-
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 Re(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(Re,"arrayHash");var be=a(async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=K.exponential()})=>{let s=0,a=0,c;for(;a<r;){a>0&&await $t(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"),Ie=class Ie{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(Ie,"RetryBackoffPolicy");var K=Ie;function $t(t){return new Promise(e=>setTimeout(e,t))}a($t,"delay");var we=a(t=>be({operation:e=>t(e>0),maxRetries:2,backoffPolicy:K.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 Ne=class Ne{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(Ne,"CoingeckoProxyClient");var oe=Ne;var zt=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())})),De=class De{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"}}],zt)}};a(De,"WatchlistProxyClient");var ue=De;var z,j,H,J,Ce=class Ce{constructor({storage:e$1,proxyApiUrl:r,fetch:n}){d(this,z,void 0);d(this,j,void 0);d(this,H,void 0);d(this,J,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,z,e$1),e(this,j,r),e(this,H,n??globalThis.fetch),e(this,J,getBasicCoingeckoHttp(void 0,c(this,H)));}async getWatchlistDataForToken({tokenDetails:e,currency:r=VsCurrencyType.USD}){let n=(await new ue(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?`${Re(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=c(this,z)?.get?.(a),n)return n;try{n=await we(c=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:c}));}catch{n=void 0;}return c(this,z)?.set?.(a,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,c$1=`getPricesWithMarketDataByAddresses-${`${Re(e)}-${r}-${n}`}`;if(s=c(this,z)?.get?.(c$1),s)return s;try{s=await we(p=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:p}));}catch(p){console.error(p),s=void 0;}return c(this,z)?.set?.(c$1,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=VsCurrencyType.USD,useCoingeckoProxy:s=!1}){if(s){let a=await new oe(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,J),{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 d=await new oe(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(d,r)}return simplePrice(c(this,J),{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:a,lastUpdated:c$1,shouldThrow:i})}};z=new WeakMap,j=new WeakMap,H=new WeakMap,J=new WeakMap,a(Ce,"TokenService");var se=Ce;object({date:string(),usd:record(number())});var _e=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"),Ee=a((t,e)=>({label:t,type:DetailItemType.ADDRESS_LIST,value:e}),"addressListItem");var ae=a((t,e)=>({label:t,type:DetailItemType.DATA,value:e}),"dataItem");var je=process.env.GLACIER_API_KEY;var Be=a(()=>je,"getGlacierApiKey");({rltoken:Be()});var W=a((t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}}),"rpcErrorOpts");var He={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 Zt={proxyApiUrl:"https://proxy-api.avax.network"},Qt={proxyApiUrl:"https://proxy-api-dev.avax.network"},Xe=a(t=>{switch(t){case Environment.PRODUCTION:return Zt;case Environment.DEV:return Qt}},"getEnv");var Je=a(t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string","hasDerivationDetails");var ge=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 Ze=a(async t=>{let{approvalController:e,secretId:r}=t,n=Je(t)?ge(t).SVM:void 0,s=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:n});return {[NetworkVMType.SVM]:base58.encode(hex.decode(s))}},"deriveAddress");var Qe="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",et="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",tt="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",rt="/proxy/nownodes/sol",nt="https://api.devnet.solana.com";var ot="DUMMY_API_KEY";var M=a(({isTestnet:t,proxyApiUrl:e})=>getSolanaProvider({isTestnet:t,rpcUrl:t?nt:e+rt}),"getProvider");var Le=1e6,V={high:150*Le,medium:75*Le,low:2*Le},ar=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 st(t,e){let s=await(await M({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(s.length===0||s.every(T=>T.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=ar(s.map(T=>Number(T.prioritizationFee))),p=c.at(0),i=c.at(-1),d=Math.floor(c.length/2),l=c.length%2===1?c[d]:(c[d-1]+c[d])/2,m=BigInt(Math.ceil(i*1.05)),u=BigInt(Math.ceil(l*1.05)),f=BigInt(Math.ceil(p*1.05));return {high:{maxFeePerGas:m,maxPriorityFeePerGas:m},medium:{maxFeePerGas:u,maxPriorityFeePerGas:u},low:{maxFeePerGas:f,maxPriorityFeePerGas:f},baseFee:f,displayDecimals:9,isFixedFee:!1}}a(st,"getNetworkFee");var cr=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()}),at=z$1.array(cr);async function it({caip2Id:t,proxyApiUrl:e}){try{return (await U([`${e}/solana-tokens?caip2Id=${t}`],at)).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(it,"getTokens");var ct=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 ie,ce,Te,pt,Ue=class Ue{constructor(e$1){d(this,Te);d(this,ie,void 0);d(this,ce,void 0);e(this,ie,`${e$1.proxyApiUrl}/proxy/moralis`),e(this,ce,e$1.fetch??globalThis.fetch);}async getPortfolio({address:e,network:r}){try{let n=f(this,Te,pt).call(this,`/account/${r}/${e}/portfolio`),s=await U([n],ct,c(this,ce));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}`}}}};ie=new WeakMap,ce=new WeakMap,Te=new WeakSet,pt=a(function(e){return `${c(this,ie)}${e}`},"#buildUrl"),a(Ue,"MoralisService");var Z=Ue;var q=a(t=>{switch(t.caipId){case Qe:return "mainnet";case et:return "devnet";case tt:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}},"getNetworkName");var dt=a(async({addresses:t,proxyApiUrl:e,currency:r,network:n,tokenService:s,fetch:a})=>{let c=new Z({proxyApiUrl:e,fetch:a}),p=n.pricingProviders?.coingecko.nativeTokenId??"",i=n.pricingProviders?.coingecko.assetPlatformId??"",d=r.toLowerCase(),l=q(n),m=await Promise.all(t.map(y=>c.getPortfolio({address:y,network:l}))),u=new Set(m.flatMap(y=>"portfolio"in y?y.portfolio.tokens.map(({mint:h})=>h):[])),f=await(i?s.getPricesByAddresses(Array.from(u),i,d):Promise.resolve(void 0)),T=await s.getWatchlistDataForToken({tokenDetails:{symbol:n.networkToken.symbol,isNative:!0,caip2Id:n.caipId??""},currency:d});return m.reduce((y,h)=>{if("error"in h)return {...y,[h.address]:{error:h.error}};let A=new TokenUnit(h.portfolio.nativeBalance.lamports,9,"SOL"),P=T.priceInCurrency!==void 0?A.mul(T.priceInCurrency):void 0,v={type:TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:A.toSubUnit(),balanceDisplayValue:A.toString(),balanceInCurrency:P?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:P?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:p,...T},E=h.portfolio.tokens.reduce((k,{amountRaw:b,symbol:S,decimals:x,mint:I,name:N,logo:L})=>{let O=new TokenUnit(b,x,S),me=lr(I,d,f),de=me.priceInCurrency!==void 0?O.mul(me.priceInCurrency):void 0,Y={type:TokenType.SPL,address:I,name:N,symbol:S,decimals:x,balance:O.toSubUnit(),balanceDisplayValue:O.toString(),balanceInCurrency:de?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:de?.toDisplay({fixedDp:2}),logoUri:L??void 0,reputation:null,...me};return {...k,[I]:Y}},{});return {...y,[h.address]:{[n.networkToken.symbol]:v,...E}}},{})},"getBalances"),lr=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 Fe=a(t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),"simplifyTokenBalance"),ut=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:d,mint:l,amount:m})=>({...i,[`${d}-${l}`]:m}),{}),c=r.postTokenBalances.reduce((i,{owner:d,mint:l,amount:m,decimals:u})=>{let f=`${d}-${l}`,T=a[f]??0n,y=m-T;if(y===0n)return i;let h=y>0n&&d===s,A=y<0n&&d===s;if(h){let P=Object.keys(a).find(k=>{let[b,S]=k.split("-");if(S!==l||b===s)return !1;let x=a[k],I=r.postTokenBalances.find(({owner:L,mint:O})=>L===b&&O===l);return !I||I.amount<x});if(!P)return i;let v=n.tokens?.filter(k=>"contractType"in k).find(k=>k.address===l)??{contractType:TokenType.SPL,decimals:u,address:l,symbol:"Unknown",name:"Unknown"},E={...v,type:v.contractType,from:{...v,address:P.split("-")[0]},to:{...v,address:d},amount:new TokenUnit(y,u,"").toDisplay()};return [...i,E]}else if(A){let P=r.postTokenBalances.find(({owner:k,mint:b})=>b===l&&k!==s&&(a[`${k}-${l}`]??0n)<(r.postTokenBalances.find(S=>S.owner===k&&S.mint===l)?.amount??0n));if(!P)return i;let v=n.tokens?.filter(k=>"contractType"in k).find(k=>k.address===l)??{contractType:TokenType.SPL,decimals:u,address:l,symbol:"Unknown",name:"Unknown"},E={...v,type:v.contractType,from:{...v,address:s},to:{...v,address:P.owner},amount:new TokenUnit(-y,u,"").toDisplay()};return [...i,E]}return i},[]),p=mr(t,e,r,n,c,s);return p&&c.push(p),c},"extractTokenTranfers"),mr=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,""),de=s.map((Y,ne)=>Y-n[ne]).reduce((Y,ne,ze)=>ze!==S&&ne>Y.amount&&ne>0?{index:ze,amount:ne}:Y,{index:0,amount:0});return {amount:O.toDisplay(),from:{address:p},to:{address:t[de.index]},name:a.networkToken.name,symbol:a.networkToken.symbol,type:TokenType.NATIVE}}}}}return null}let i=t[e],d=n[e],m=s[e]-d,u=s.map((b,S)=>b-n[S]),f=c.length>0,T=m!==0?m+r:0,y=T>0,h=0,A=!1;if(f&&e===0&&p){let b=c.some(x=>x.to?.address===p),S=c.some(x=>x.from?.address===p);b&&!S&&(y=!1,A=!0,h=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(f&&m<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&&!A&&(T=b.amount,y=!0,h=b.index);}else f&&m<=0&&c.some(S=>S.to?.address===i)&&(T=Math.abs(m)+r,y=!1,h=u.reduce((x,I,N)=>N!==e&&I>x.amount&&I>0?{index:N,amount:I}:x,{index:0,amount:0}).index);if(!T)return null;let P=new TokenUnit(Math.abs(T),a.networkToken.decimals,"");if(!f){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]});h=y?0:b.index;}let v=t[h],E=y?v||i:p||i,k=y?p||i:v||p||i;return {amount:P.toDisplay(),from:{address:E},to:{address:k},name:a.networkToken.name,symbol:a.networkToken.symbol,type:TokenType.NATIVE}},"extractNativeTransfer");var pe=a(t=>t.status==="fulfilled","isFulfilled");function ft(t){return e=>!!e[t]}a(ft,"hasPropertyDefined");var yt=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 Z({proxyApiUrl:r}),d=q(t),l=await i.getPortfolio({address:e,network:d});if("portfolio"in l){let m=l.portfolio.tokens.map(A=>A.associatedTokenAddress),u=l.portfolio.nfts.map(A=>A.associatedTokenAddress),T=[...m,...u].map(async A=>{try{return (await n.getSignaturesForAddress(address(A),{limit:25}).send()).map(v=>v.signature)}catch(P){return console.error("Failed to get signatures for ATA:",A,P),[]}}),h=(await Promise.allSettled(T)).filter(pe).map(A=>A.value).flat();c=Array.from(new Set([...a,...h]));}}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(pe).map(i=>i.value).filter(ft("tx"))},"getWrappedTransactions");var Tt=a((t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""},"getExplorerLink");async function ht({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await yt({network:t,address:e,proxyApiUrl:r})).map(({txHash:a,tx:c})=>{if(!c.meta)return null;let{meta:p,transaction:{message:i}}=c,d=i.accountKeys.map(y=>y.toString()),l=d.indexOf(e),m=l!==-1;!m&&p.preTokenBalances&&(p.preTokenBalances.some(h=>h.owner===e)||(p.postTokenBalances??[]).some(h=>h.owner===e))&&(m=!0,l=-1);let u=l!==-1&&l<i.header.numRequiredSignatures,f=ut(d,l,{paidFee:u?Number(p.fee):0,preBalances:p.preBalances.map(Number),postBalances:p.postBalances.map(Number),preTokenBalances:(p.preTokenBalances??[]).map(Fe),postTokenBalances:(p.postTokenBalances??[]).map(Fe)},t),T=ur(f,e);return {hash:a,txType:T,gasUsed:String(c.meta.computeUnitsConsumed??"0"),tokens:f,from:f[0]?.from?.address??d[0],to:f[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:Tt(a,t.explorerUrl)}}).filter(a=>a!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}a(ht,"getTransactionHistory");var ur=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 Pt=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 {type:AlertType.WARNING,details:{title:"Transaction simulation has failed",description:"It is possible that this transaction will fail. Please proceed with caution."}}},"getAlertForError"),Oe={[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 St(t){return t.ins.length===0&&t.outs.length===0}a(St,"isBalanceChangeEmpty");function kt(t){return t!=null}a(kt,"isNotNullish");var At=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 wr=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"),xt=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)}),d=await wr(t,p.source.address);if(!d)return null;let l=s.find(T=>T.address.toLowerCase()===d.toLowerCase());if(!l)return null;let u=(p.source.address===n||p.authority.address===n)===!0?"outs":"ins",f="decimals"in i?i.decimals:l.decimals;return r[u].push({token:l,items:[{displayValue:new TokenUnit(i.amount,f,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${l.symbol}`,items:[_("From",p.source.address),_("To",p.destination.address)]}}catch{return null}},"tryToParseSPLTransfer");var vt=a(async(t,e,r,n)=>{let s=await deserializeTransactionMessage(t,n),a={ins:[],outs:[]},c=await Promise.allSettled(s.instructions.map(async p=>At(p,a,e,r.networkToken)??await xt(n,p,a,e,r.tokens)??null)).then(p=>p.filter(pe).map(i=>i.value).filter(kt));return {balanceChange:a,details:c}},"parseTransaction");var bt=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:d})=>{let l=_r(p,r);if(!l)return;let m="address"in l?l.address:l.symbol;i&&(s[m]||(s[m]={token:l,items:[]}),s[m].items.push({displayValue:String(i.value),usdPrice:typeof i.usd_price=="number"?String(i.usd_price):void 0})),d&&(a[m]||(a[m]={token:l,items:[]}),a[m].items.push({displayValue:String(d.value),usdPrice:typeof d.usd_price=="number"?String(d.usd_price):void 0}));}),{balanceChange:{ins:Object.values(s),outs:Object.values(a)},otherAffectedAddresses:c}},"processBalanceChange"),Dr=a(t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),"convertNativeAssetToToken"),Cr=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"),_r=a((t,e)=>t.type==="TOKEN"?Cr(t,e):t.type==="SOL"||t.type==="ETH"?Dr(t):null,"convertDiffAssetToToken");var It=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 Se=a(async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,s=await It(t),{simulation:a,validation:c}=s?.result??{},p={title:"Transaction Details",items:[ae("Raw Data",t.params.transactionBase64)]},i=[p],d=!1,l,m;if(!c||c.result_type==="Warning"?m=Oe[AlertType.WARNING]:c.result_type==="Malicious"?m=Oe[AlertType.DANGER]:s?.error_details&&(m=Pt(s.error_details)),a){let{balanceChange:u,otherAffectedAddresses:f}=bt(n.account,a,e);if(l=u,f.length>0){let T=a.account_summary.account_assets_diff,y=T?.filter(P=>P.out&&P.out.raw_value>0)??[],h=T?.filter(P=>P.in&&P.in.raw_value>0)??[];y.length>0&&h.length>0?(p.items.push(_("Account",n.account)),p.items.push(Ee("Interacting with",f))):(p.items.push(_(f.length===1?"From":"Account",n.account)),p.items.push(f.length===1?_("To",f[0]):Ee("Interacting with",f)));}else p.items.push(_("Account",n.account));d=!0;}else {let{balanceChange:u,details:f}=await vt(n.transactionBase64,n.account,e,r);l=u,i.push(...f);}return {isSimulationSuccessful:d,details:i,alert:m,balanceChange:l}},"explainTransaction");var Lr="https://explorer.solana.com";function ke(t,e,r="tx"){try{let n=t.explorerUrl?new URL(t.explorerUrl):new URL(Lr);return n.pathname+=`${r}/${e}`,n.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}a(ke,"getExplorerAddressByNetwork");var Ve=400,Fr=15,Nt=a(async({provider:t,txHash:e,approvalController:r,request:n,network:s,commitment:a="confirmed",maxRetries:c=Fr})=>{let p=0,i=null,d=ke(s,e,"tx");for(;p<c;)try{let l=await t.getSignatureStatuses([signature(e)],{searchTransactionHistory:!0}).send();if(!l?.value?.[0]){await new Promise(f=>setTimeout(f,Ve)),p++;continue}let{confirmationStatus:m,err:u}=l.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}),a==="processed"&&m==="processed"||a==="confirmed"&&["confirmed","finalized"].includes(m)||a==="finalized"&&m==="finalized"))return r.onTransactionConfirmed({txHash:e,request:n,explorerLink:d}),!0;await new Promise(f=>setTimeout(f,Ve)),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(m=>setTimeout(m,Ve)),p++;}return i==="confirmed"||i==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:d}),!0):(r.onTransactionReverted({txHash:e,request:n}),!1)},"waitForTransactionConfirmation");var Or=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()}),Mr=z$1.tuple([Or]),Dt=a(t=>Mr.safeParse(t),"parseRequestParams");var _t=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:s})=>{let{params:a}=t,{data:c,success:p,error:i}=Dt(a);if(!p)return console.error("invalid params",i),{error:rpcErrors.invalidParams(W("Transaction params are invalid",i))};let[{account:d,serializedTx:l,sendOptions:m}]=c,u=M({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:f,isSimulationSuccessful:T,alert:y,balanceChange:h}=await Se({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:d,chain:q(e),transactionBase64:l},blockaid:s},network:e,provider:u}),A={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:f,alert:y,balanceChange:h,networkFeeSelector:!1,isSimulationSuccessful:T},P={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:d,data:l},v=await r.requestApproval({request:t,displayData:A,signingData:P});if("error"in v)return {error:v.error};let E;try{E=await Gr(u,v,m);let k=ke(e,E);return await r.onTransactionPending({txHash:E,request:t,explorerLink:k}),Nt({provider:u,txHash:E,approvalController:r,request:t,network:e,commitment:m?.preflightCommitment}),{result:E}}catch(k){return console.error(k),{error:rpcErrors.internal(W("Transaction failed",k))}}},"signAndSendTransaction"),Gr=a(async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send(),"getTxHash");var $r=z$1.object({account:z$1.string(),serializedTx:z$1.string().base64()}),zr=z$1.tuple([$r]),Et=a(t=>zr.safeParse(t),"parseRequestParams");var Lt=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:s})=>{let{params:a}=t,{data:c,success:p,error:i}=Et(a);if(!p)return console.error("invalid params",i),{error:rpcErrors.invalidParams(W("Transaction params are invalid",i))};let[{account:d,serializedTx:l}]=c,m=M({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:u,isSimulationSuccessful:f,alert:T,balanceChange:y}=await Se({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:d,chain:q(e),transactionBase64:l},blockaid:s},network:e,provider:m}),h={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:u,alert:T,balanceChange:y&&St(y)?void 0:y,networkFeeSelector:!1,isSimulationSuccessful:f},A={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:d,data:l},P=await r.requestApproval({request:t,displayData:h,signingData:A});return "error"in P?{error:P.error}:"signedData"in P?{result:P.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signTransaction");var Ut=a(t=>{try{let e=base64.decode(t);return getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}},"isTransactionBytes");var jr=z$1.object({account:z$1.string(),serializedMessage:z$1.string().base64()}).refine(({serializedMessage:t})=>!Ut(t),{message:"Cannot use signMessage() calls for signing transactions"}),Hr=z$1.tuple([jr]),Ft=a(t=>Hr.safeParse(t),"parseRequestParams");var Mt=a(async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:s,success:a,error:c}=Ft(n);if(!a)return console.error("invalid params",c),{error:rpcErrors.invalidParams(W("Message signing params are invalid",c))};let[{account:p,serializedMessage:i}]=s,d=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),_e("Message",d.decode(base64.decode(i))),ae("Raw Message (Base-64)",i)]}],networkFeeSelector:!1},m={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:p,data:i},u=await r.requestApproval({request:t,displayData:l,signingData:m});return "error"in u?{error:u.error}:"signedData"in u?{result:u.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signMessage");var B,$,le,te,re,$e=class $e{constructor({approvalController:e$1,environment:r,appInfo:n,runtime:s}){d(this,B,void 0);d(this,$,void 0);d(this,le,void 0);d(this,te,void 0);d(this,re,void 0);let{proxyApiUrl:a}=Xe(r);e(this,le,n),e(this,B,a),e(this,$,e$1),e(this,re,s),c(this,B),c(this,$),c(this,le),e(this,te,new Zr({baseURL:a+"/proxy/blockaid/",apiKey:ot,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 ge(e)}deriveAddress(e){return Ze({...e,approvalController:c(this,$)})}getBalances(e){let r=new se({storage:e.storage,proxyApiUrl:c(this,B),fetch:c(this,re)?.fetch});return dt({...e,tokenService:r,proxyApiUrl:c(this,B),fetch:c(this,re)?.fetch})}getManifest(){let e=parseManifest(He);return e.success?e.data:void 0}getNetworkFee(e){return st(e,c(this,B))}getTransactionHistory(e){return ht({network:e.network,address:e.address,proxyApiUrl:c(this,B)})}getTokens(e){return e.caipId?it({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 Lt({approvalController:c(this,$),proxyApiUrl:c(this,B),network:r,request:e,blockaid:c(this,te)});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return _t({approvalController:c(this,$),proxyApiUrl:c(this,B),network:r,request:e,blockaid:c(this,te)});case RpcMethod.SOLANA_SIGN_MESSAGE:return Mt({approvalController:c(this,$),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};B=new WeakMap,$=new WeakMap,le=new WeakMap,te=new WeakMap,re=new WeakMap,a($e,"SvmModule");var Gt=$e;
|
|
15
|
+
function We(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}a(We,"charsum");function Re(t){let e,r=0;for(e=0;e<t.length;e++){let n=We(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}a(Re,"arrayHash");var be=a(async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=q.exponential()})=>{let s=0,a=0,p;for(;a<r;){a>0&&await zt(s);try{let i=await t(a);if(e(i))return i}catch(i){p=i;}s=n(a),a++;}let c=p?`Max retry exceeded. ${p}`:"Max retry exceeded.";throw new Error(c)},"retry"),Ie=class Ie{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,p=2*r*(Math.pow(2,s)-1);return a+p}}};a(Ie,"RetryBackoffPolicy");var q=Ie;function zt(t){return new Promise(e=>setTimeout(e,t))}a(zt,"delay");var we=a(t=>be({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 Ne=class Ne{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(Ne,"CoingeckoProxyClient");var se=Ne;var Kt=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())})),De=class De{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"}}],Kt)}};a(De,"WatchlistProxyClient");var fe=De;var z,j,H,J,Ce=class Ce{constructor({storage:e$1,proxyApiUrl:r,fetch:n}){d(this,z,void 0);d(this,j,void 0);d(this,H,void 0);d(this,J,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(p=>{n[s]={[p]:{price:a?.[p],change24:a?.[`${p}_24h_change`],vol24:a?.[`${p}_24h_vol`],marketCap:a?.[`${p}_market_cap`]}};});}),n},"transformSimplePriceResponse"));e(this,z,e$1),e(this,j,r),e(this,H,n??globalThis.fetch),e(this,J,getBasicCoingeckoHttp(void 0,c(this,H)));}async getWatchlistDataForToken({tokenDetails:e,currency:r=VsCurrencyType.USD}){let n=(await new fe(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?`${Re(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=c(this,z)?.get?.(a),n)return n;try{n=await we(p=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:p}));}catch{n=void 0;}return c(this,z)?.set?.(a,n),n}async getPricesByAddresses(e,r,n=VsCurrencyType.USD){let s,p=`getPricesWithMarketDataByAddresses-${`${Re(e)}-${r}-${n}`}`;if(s=c(this,z)?.get?.(p),s)return s;try{s=await we(c=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:c}));}catch(c){console.error(c),s=void 0;}return c(this,z)?.set?.(p,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,J),{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:p=!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:s,include_24hr_change:a,include_last_updated_at:p});return this.transformSimplePriceResponse(d,r)}return simplePrice(c(this,J),{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:a,lastUpdated:p,shouldThrow:i})}};z=new WeakMap,j=new WeakMap,H=new WeakMap,J=new WeakMap,a(Ce,"TokenService");var ae=Ce;object({date:string(),usd:record(number())});var _e=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"),Ee=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 je=process.env.GLACIER_API_KEY;var Be=a(()=>je,"getGlacierApiKey");({rltoken:Be()});var K=a((t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}}),"rpcErrorOpts");var He={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 Qt={proxyApiUrl:"https://proxy-api.avax.network"},er={proxyApiUrl:"https://proxy-api-dev.avax.network"},Xe=a(t=>{switch(t){case Environment.PRODUCTION:return Qt;case Environment.DEV:return er}},"getEnv");var Je=a(t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string","hasDerivationDetails");var Z=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 Ze=a(async t=>{let{approvalController:e,secretId:r}=t,n=Je(t)?Z(t).SVM:void 0,s=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:n});return {[NetworkVMType.SVM]:base58.encode(hex.decode(s))}},"deriveAddress");var Qe=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 c=>{let i=Z({accountIndex:c,derivationPathType:s}).SVM,d=await e.requestPublicKey({curve:"ed25519",secretId:r,derivationPath:i});return Uint8Array.from(Buffer.from(d,"hex"))}));return (await deriveAddressesForSvm(a)).map(c=>({[NetworkVMType.SVM]:c}))},"deriveAddresses");var et="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",tt="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",rt="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",nt="/proxy/nownodes/sol",ot="https://api.devnet.solana.com";var st="DUMMY_API_KEY";var M=a(({isTestnet:t,proxyApiUrl:e})=>getSolanaProvider({isTestnet:t,rpcUrl:t?ot:e+nt}),"getProvider");var Le=1e6,V={high:150*Le,medium:75*Le,low:2*Le},lr=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 at(t,e){let s=await(await M({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(s.length===0||s.every(h=>h.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 p=lr(s.map(h=>Number(h.prioritizationFee))),c=p.at(0),i=p.at(-1),d=Math.floor(p.length/2),l=p.length%2===1?p[d]:(p[d-1]+p[d])/2,m=BigInt(Math.ceil(i*1.05)),u=BigInt(Math.ceil(l*1.05)),f=BigInt(Math.ceil(c*1.05));return {high:{maxFeePerGas:m,maxPriorityFeePerGas:m},medium:{maxFeePerGas:u,maxPriorityFeePerGas:u},low:{maxFeePerGas:f,maxPriorityFeePerGas:f},baseFee:f,displayDecimals:9,isFixedFee:!1}}a(at,"getNetworkFee");var dr=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()}),it=z$1.array(dr);async function ct({caip2Id:t,proxyApiUrl:e}){try{return (await U([`${e}/solana-tokens?caip2Id=${t}`],it)).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(ct,"getTokens");var pt=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 ce,pe,he,lt,Ue=class Ue{constructor(e$1){d(this,he);d(this,ce,void 0);d(this,pe,void 0);e(this,ce,`${e$1.proxyApiUrl}/proxy/moralis`),e(this,pe,e$1.fetch??globalThis.fetch);}async getPortfolio({address:e,network:r}){try{let n=f(this,he,lt).call(this,`/account/${r}/${e}/portfolio`),s=await U([n],pt,c(this,pe));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}`}}}};ce=new WeakMap,pe=new WeakMap,he=new WeakSet,lt=a(function(e){return `${c(this,ce)}${e}`},"#buildUrl"),a(Ue,"MoralisService");var Q=Ue;var W=a(t=>{switch(t.caipId){case et:return "mainnet";case tt:return "devnet";case rt:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}},"getNetworkName");var ut=a(async({addresses:t,proxyApiUrl:e,currency:r,network:n,tokenService:s,fetch:a})=>{let p=new Q({proxyApiUrl:e,fetch:a}),c=n.pricingProviders?.coingecko.nativeTokenId??"",i=n.pricingProviders?.coingecko.assetPlatformId??"",d=r.toLowerCase(),l=W(n),m=await Promise.all(t.map(g=>p.getPortfolio({address:g,network:l}))),u=new Set(m.flatMap(g=>"portfolio"in g?g.portfolio.tokens.map(({mint:T})=>T):[])),f=await(i?s.getPricesByAddresses(Array.from(u),i,d):Promise.resolve(void 0)),h=await s.getWatchlistDataForToken({tokenDetails:{symbol:n.networkToken.symbol,isNative:!0,caip2Id:n.caipId??""},currency:d});return m.reduce((g,T)=>{if("error"in T)return {...g,[T.address]:{error:T.error}};let A=new TokenUnit(T.portfolio.nativeBalance.lamports,9,"SOL"),P=h.priceInCurrency!==void 0?A.mul(h.priceInCurrency):void 0,x={type:TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:A.toSubUnit(),balanceDisplayValue:A.toString(),balanceInCurrency:P?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:P?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:c,...h},E=T.portfolio.tokens.reduce((k,{amountRaw:b,symbol:S,decimals:v,mint:I,name:N,logo:L})=>{let O=new TokenUnit(b,v,S),de=fr(I,d,f),ue=de.priceInCurrency!==void 0?O.mul(de.priceInCurrency):void 0,Y={type:TokenType.SPL,address:I,name:N,symbol:S,decimals:v,balance:O.toSubUnit(),balanceDisplayValue:O.toString(),balanceInCurrency:ue?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:ue?.toDisplay({fixedDp:2}),logoUri:L??void 0,reputation:null,...de};return {...k,[I]:Y}},{});return {...g,[T.address]:{[n.networkToken.symbol]:x,...E}}},{})},"getBalances"),fr=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 Fe=a(t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),"simplifyTokenBalance"),ft=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:d,mint:l,amount:m})=>({...i,[`${d}-${l}`]:m}),{}),p=r.postTokenBalances.reduce((i,{owner:d,mint:l,amount:m,decimals:u})=>{let f=`${d}-${l}`,h=a[f]??0n,g=m-h;if(g===0n)return i;let T=g>0n&&d===s,A=g<0n&&d===s;if(T){let P=Object.keys(a).find(k=>{let[b,S]=k.split("-");if(S!==l||b===s)return !1;let v=a[k],I=r.postTokenBalances.find(({owner:L,mint:O})=>L===b&&O===l);return !I||I.amount<v});if(!P)return i;let x=n.tokens?.filter(k=>"contractType"in k).find(k=>k.address===l)??{contractType:TokenType.SPL,decimals:u,address:l,symbol:"Unknown",name:"Unknown"},E={...x,type:x.contractType,from:{...x,address:P.split("-")[0]},to:{...x,address:d},amount:new TokenUnit(g,u,"").toDisplay()};return [...i,E]}else if(A){let P=r.postTokenBalances.find(({owner:k,mint:b})=>b===l&&k!==s&&(a[`${k}-${l}`]??0n)<(r.postTokenBalances.find(S=>S.owner===k&&S.mint===l)?.amount??0n));if(!P)return i;let x=n.tokens?.filter(k=>"contractType"in k).find(k=>k.address===l)??{contractType:TokenType.SPL,decimals:u,address:l,symbol:"Unknown",name:"Unknown"},E={...x,type:x.contractType,from:{...x,address:s},to:{...x,address:P.owner},amount:new TokenUnit(-g,u,"").toDisplay()};return [...i,E]}return i},[]),c=yr(t,e,r,n,p,s);return c&&p.push(c),p},"extractTokenTranfers"),yr=a((t,e,{paidFee:r,preBalances:n,postBalances:s},a,p=[],c)=>{if(e===-1){if(p.length>0&&c&&p.some(S=>S.to?.address===c)){let S=t.findIndex(v=>v===c);if(S!==-1){let v=n[S],N=s[S]-v;if(N<=0){let L=Math.abs(N)+r;if(L>r){let O=new TokenUnit(L,a.networkToken.decimals,""),ue=s.map((Y,oe)=>Y-n[oe]).reduce((Y,oe,ze)=>ze!==S&&oe>Y.amount&&oe>0?{index:ze,amount:oe}:Y,{index:0,amount:0});return {amount:O.toDisplay(),from:{address:c},to:{address:t[ue.index]},name:a.networkToken.name,symbol:a.networkToken.symbol,type:TokenType.NATIVE}}}}}return null}let i=t[e],d=n[e],m=s[e]-d,u=s.map((b,S)=>b-n[S]),f=p.length>0,h=m!==0?m+r:0,g=h>0,T=0,A=!1;if(f&&e===0&&c){let b=p.some(v=>v.to?.address===c),S=p.some(v=>v.from?.address===c);b&&!S&&(g=!1,A=!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(f&&m<0){let b=u.reduce((S,v,I)=>I!==e&&v>S.amount?{index:I,amount:v}:S,{index:0,amount:0});b.amount>r*2&&!A&&(h=b.amount,g=!0,T=b.index);}else f&&m<=0&&p.some(S=>S.to?.address===i)&&(h=Math.abs(m)+r,g=!1,T=u.reduce((v,I,N)=>N!==e&&I>v.amount&&I>0?{index:N,amount:I}:v,{index:0,amount:0}).index);if(!h)return null;let P=new TokenUnit(Math.abs(h),a.networkToken.decimals,"");if(!f){let b=u.reduce(({index:S,change:v},I,N)=>I>v?{index:N,change:I}:{index:S,change:v},{index:0,change:u[0]});T=g?0:b.index;}let x=t[T],E=g?x||i:c||i,k=g?c||i:x||c||i;return {amount:P.toDisplay(),from:{address:E},to:{address:k},name:a.networkToken.name,symbol:a.networkToken.symbol,type:TokenType.NATIVE}},"extractNativeTransfer");var le=a(t=>t.status==="fulfilled","isFulfilled");function yt(t){return e=>!!e[t]}a(yt,"hasPropertyDefined");var ht=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),p=a;try{let i=new Q({proxyApiUrl:r}),d=W(t),l=await i.getPortfolio({address:e,network:d});if("portfolio"in l){let m=l.portfolio.tokens.map(A=>A.associatedTokenAddress),u=l.portfolio.nfts.map(A=>A.associatedTokenAddress),h=[...m,...u].map(async A=>{try{return (await n.getSignaturesForAddress(address(A),{limit:25}).send()).map(x=>x.signature)}catch(P){return console.error("Failed to get signatures for ATA:",A,P),[]}}),T=(await Promise.allSettled(h)).filter(le).map(A=>A.value).flat();p=Array.from(new Set([...a,...T]));}}catch(i){console.error("ATA discovery failed with error:",i);}return (await Promise.allSettled(p.map(async i=>({txHash:i.toString(),tx:await n.getTransaction(i,{encoding:"json",maxSupportedTransactionVersion:0}).send()})))).filter(le).map(i=>i.value).filter(yt("tx"))},"getWrappedTransactions");var Tt=a((t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""},"getExplorerLink");async function Pt({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await ht({network:t,address:e,proxyApiUrl:r})).map(({txHash:a,tx:p})=>{if(!p.meta)return null;let{meta:c,transaction:{message:i}}=p,d=i.accountKeys.map(g=>g.toString()),l=d.indexOf(e),m=l!==-1;!m&&c.preTokenBalances&&(c.preTokenBalances.some(T=>T.owner===e)||(c.postTokenBalances??[]).some(T=>T.owner===e))&&(m=!0,l=-1);let u=l!==-1&&l<i.header.numRequiredSignatures,f=ft(d,l,{paidFee:u?Number(c.fee):0,preBalances:c.preBalances.map(Number),postBalances:c.postBalances.map(Number),preTokenBalances:(c.preTokenBalances??[]).map(Fe),postTokenBalances:(c.postTokenBalances??[]).map(Fe)},t),h=hr(f,e);return {hash:a,txType:h,gasUsed:String(p.meta.computeUnitsConsumed??"0"),tokens:f,from:f[0]?.from?.address??d[0],to:f[0]?.to?.address??(u?"":e),isOutgoing:u,isIncoming:!u,isSender:u,timestamp:Number(p.blockTime)*1e3,isContractCall:!1,gasPrice:String(Number(p.meta.fee)/Number(p.meta.computeUnitsConsumed)),chainId:String(t.chainId),explorerLink:Tt(a,t.explorerUrl)}}).filter(a=>a!==null)}:Promise.reject({error:rpcErrors.invalidParams("Network must have a CAIP-2 id")})}a(Pt,"getTransactionHistory");var hr=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 St=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 {type:AlertType.WARNING,details:{title:"Transaction simulation has failed",description:"It is possible that this transaction will fail. Please proceed with caution."}}},"getAlertForError"),Oe={[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 kt(t){return t.ins.length===0&&t.outs.length===0}a(kt,"isBalanceChangeEmpty");function At(t){return t!=null}a(At,"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:p}=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(p.amount,n.decimals,"").toString(),usdPrice:void 0}]}),{title:"Transfer SOL",items:[_("From",a.source.address),_("To",a.destination.address)]}}catch{return null}},"tryToParseSolTransfer");var _r=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"),xt=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 p=a===TokenInstruction.TransferChecked?parseTransferCheckedInstruction:parseTransferInstruction,{accounts:c,data:i}=p({...e,data:Uint8Array.from(e.data)}),d=await _r(t,c.source.address);if(!d)return null;let l=s.find(h=>h.address.toLowerCase()===d.toLowerCase());if(!l)return null;let u=(c.source.address===n||c.authority.address===n)===!0?"outs":"ins",f="decimals"in i?i.decimals:l.decimals;return r[u].push({token:l,items:[{displayValue:new TokenUnit(i.amount,f,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${l.symbol}`,items:[_("From",c.source.address),_("To",c.destination.address)]}}catch{return null}},"tryToParseSPLTransfer");var Rt=a(async(t,e,r,n)=>{let s=await deserializeTransactionMessage(t,n),a={ins:[],outs:[]},p=await Promise.allSettled(s.instructions.map(async c=>vt(c,a,e,r.networkToken)??await xt(n,c,a,e,r.tokens)??null)).then(c=>c.filter(le).map(i=>i.value).filter(At));return {balanceChange:a,details:p}},"parseTransaction");var It=a((t,e,r)=>{let n=e.account_summary.account_assets_diff??[],s={},a={},p=Object.keys(e.assets_diff??{}).filter(c=>c!==t);return n.forEach(({asset:c,in:i,out:d})=>{let l=Ur(c,r);if(!l)return;let m="address"in l?l.address:l.symbol;i&&(s[m]||(s[m]={token:l,items:[]}),s[m].items.push({displayValue:String(i.value),usdPrice:typeof i.usd_price=="number"?String(i.usd_price):void 0})),d&&(a[m]||(a[m]={token:l,items:[]}),a[m].items.push({displayValue:String(d.value),usdPrice:typeof d.usd_price=="number"?String(d.usd_price):void 0}));}),{balanceChange:{ins:Object.values(s),outs:Object.values(a)},otherAffectedAddresses:p}},"processBalanceChange"),Br=a(t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),"convertNativeAssetToToken"),Lr=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"),Ur=a((t,e)=>t.type==="TOKEN"?Lr(t,e):t.type==="SOL"||t.type==="ETH"?Br(t):null,"convertDiffAssetToToken");var wt=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 Se=a(async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,s=await wt(t),{simulation:a,validation:p}=s?.result??{},c={title:"Transaction Details",items:[ie("Raw Data",t.params.transactionBase64)]},i=[c],d=!1,l,m;if(!p||p.result_type==="Warning"?m=Oe[AlertType.WARNING]:p.result_type==="Malicious"?m=Oe[AlertType.DANGER]:s?.error_details&&(m=St(s.error_details)),a){let{balanceChange:u,otherAffectedAddresses:f}=It(n.account,a,e);if(l=u,f.length>0){let h=a.account_summary.account_assets_diff,g=h?.filter(P=>P.out&&P.out.raw_value>0)??[],T=h?.filter(P=>P.in&&P.in.raw_value>0)??[];g.length>0&&T.length>0?(c.items.push(_("Account",n.account)),c.items.push(Ee("Interacting with",f))):(c.items.push(_(f.length===1?"From":"Account",n.account)),c.items.push(f.length===1?_("To",f[0]):Ee("Interacting with",f)));}else c.items.push(_("Account",n.account));d=!0;}else {let{balanceChange:u,details:f}=await Rt(n.transactionBase64,n.account,e,r);l=u,i.push(...f);}return {isSimulationSuccessful:d,details:i,alert:m,balanceChange:l}},"explainTransaction");var Mr="https://explorer.solana.com";function ke(t,e,r="tx"){try{let n=t.explorerUrl?new URL(t.explorerUrl):new URL(Mr);return n.pathname+=`${r}/${e}`,n.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}a(ke,"getExplorerAddressByNetwork");var Ve=400,Gr=15,Dt=a(async({provider:t,txHash:e,approvalController:r,request:n,network:s,commitment:a="confirmed",maxRetries:p=Gr})=>{let c=0,i=null,d=ke(s,e,"tx");for(;c<p;)try{let l=await t.getSignatureStatuses([signature(e)],{searchTransactionHistory:!0}).send();if(!l?.value?.[0]){await new Promise(f=>setTimeout(f,Ve)),c++;continue}let{confirmationStatus:m,err:u}=l.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}),a==="processed"&&m==="processed"||a==="confirmed"&&["confirmed","finalized"].includes(m)||a==="finalized"&&m==="finalized"))return r.onTransactionConfirmed({txHash:e,request:n,explorerLink:d}),!0;await new Promise(f=>setTimeout(f,Ve)),c++;}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(m=>setTimeout(m,Ve)),c++;}return i==="confirmed"||i==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:d}),!0):(r.onTransactionReverted({txHash:e,request:n}),!1)},"waitForTransactionConfirmation");var $r=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()}),zr=z$1.tuple([$r]),Ct=a(t=>zr.safeParse(t),"parseRequestParams");var Et=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:s})=>{let{params:a}=t,{data:p,success:c,error:i}=Ct(a);if(!c)return console.error("invalid params",i),{error:rpcErrors.invalidParams(K("Transaction params are invalid",i))};let[{account:d,serializedTx:l,sendOptions:m}]=p,u=M({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:f,isSimulationSuccessful:h,alert:g,balanceChange:T}=await Se({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:d,chain:W(e),transactionBase64:l},blockaid:s},network:e,provider:u}),A={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:f,alert:g,balanceChange:T,networkFeeSelector:!1,isSimulationSuccessful:h},P={type:RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:d,data:l},x=await r.requestApproval({request:t,displayData:A,signingData:P});if("error"in x)return {error:x.error};let E;try{E=await Wr(u,x,m);let k=ke(e,E);return await r.onTransactionPending({txHash:E,request:t,explorerLink:k}),Dt({provider:u,txHash:E,approvalController:r,request:t,network:e,commitment:m?.preflightCommitment}),{result:E}}catch(k){return console.error(k),{error:rpcErrors.internal(K("Transaction failed",k))}}},"signAndSendTransaction"),Wr=a(async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send(),"getTxHash");var qr=z$1.object({account:z$1.string(),serializedTx:z$1.string().base64()}),jr=z$1.tuple([qr]),Bt=a(t=>jr.safeParse(t),"parseRequestParams");var Ut=a(async({request:t,network:e,approvalController:r,proxyApiUrl:n,blockaid:s})=>{let{params:a}=t,{data:p,success:c,error:i}=Bt(a);if(!c)return console.error("invalid params",i),{error:rpcErrors.invalidParams(K("Transaction params are invalid",i))};let[{account:d,serializedTx:l}]=p,m=M({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:u,isSimulationSuccessful:f,alert:h,balanceChange:g}=await Se({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:d,chain:W(e),transactionBase64:l},blockaid:s},network:e,provider:m}),T={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:u,alert:h,balanceChange:g&&kt(g)?void 0:g,networkFeeSelector:!1,isSimulationSuccessful:f},A={type:RpcMethod.SOLANA_SIGN_TRANSACTION,account:d,data:l},P=await r.requestApproval({request:t,displayData:T,signingData:A});return "error"in P?{error:P.error}:"signedData"in P?{result:P.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signTransaction");var Ft=a(t=>{try{let e=base64.decode(t);return getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}},"isTransactionBytes");var Jr=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"}),Zr=z$1.tuple([Jr]),Ot=a(t=>Zr.safeParse(t),"parseRequestParams");var Vt=a(async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:s,success:a,error:p}=Ot(n);if(!a)return console.error("invalid params",p),{error:rpcErrors.invalidParams(K("Message signing params are invalid",p))};let[{account:c,serializedMessage:i}]=s,d=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",c),_e("Message",d.decode(base64.decode(i))),ie("Raw Message (Base-64)",i)]}],networkFeeSelector:!1},m={type:RpcMethod.SOLANA_SIGN_MESSAGE,account:c,data:i},u=await r.requestApproval({request:t,displayData:l,signingData:m});return "error"in u?{error:u.error}:"signedData"in u?{result:u.signedData}:{error:rpcErrors.invalidRequest("No signed data returned")}},"signMessage");var B,G,me,re,ne,$e=class $e{constructor({approvalController:e$1,environment:r,appInfo:n,runtime:s}){d(this,B,void 0);d(this,G,void 0);d(this,me,void 0);d(this,re,void 0);d(this,ne,void 0);let{proxyApiUrl:a}=Xe(r);e(this,me,n),e(this,B,a),e(this,G,e$1),e(this,ne,s),c(this,B),c(this,G),c(this,me),e(this,re,new rn({baseURL:a+"/proxy/blockaid/",apiKey:st,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 Z(e)}deriveAddress(e){return Ze({...e,approvalController:c(this,G)})}deriveAddresses(e){return Qe({...e,approvalController:c(this,G)})}getBalances(e){let r=new ae({storage:e.storage,proxyApiUrl:c(this,B),fetch:c(this,ne)?.fetch});return ut({...e,tokenService:r,proxyApiUrl:c(this,B),fetch:c(this,ne)?.fetch})}getManifest(){let e=parseManifest(He);return e.success?e.data:void 0}getNetworkFee(e){return at(e,c(this,B))}getTransactionHistory(e){return Pt({network:e.network,address:e.address,proxyApiUrl:c(this,B)})}getTokens(e){return e.caipId?ct({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 Ut({approvalController:c(this,G),proxyApiUrl:c(this,B),network:r,request:e,blockaid:c(this,re)});case RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return Et({approvalController:c(this,G),proxyApiUrl:c(this,B),network:r,request:e,blockaid:c(this,re)});case RpcMethod.SOLANA_SIGN_MESSAGE:return Vt({approvalController:c(this,G),network:r,request:e})}return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};B=new WeakMap,G=new WeakMap,me=new WeakMap,re=new WeakMap,ne=new WeakMap,a($e,"SvmModule");var $t=$e;
|
|
15
16
|
|
|
16
|
-
export {
|
|
17
|
+
export { $t as SvmModule };
|
|
17
18
|
//# sourceMappingURL=out.js.map
|
|
18
19
|
//# sourceMappingURL=index.js.map
|