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