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