@avalabs/svm-module 1.9.7 → 1.9.8
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 +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -17,8 +17,8 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
17
17
|
|
|
18
18
|
var Tr__default = /*#__PURE__*/_interopDefault(Tr);
|
|
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 wt(s);try{let c=await t(o);if(e(c))return c}catch(c){i=c;}s=n(o),o++;}let a=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(a)},F=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function wt(t){return new Promise(e=>setTimeout(e,t))}var ie=t=>ae({operation:e=>t(e>0),maxRetries:2,backoffPolicy:F.constant(1),isSuccess:e=>e?.status?.error_code!==429});function ve(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=ve(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 Ie=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(Ie,{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(Ie,{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,n)=>({label:t,type:vmModuleTypes.DetailItemType.CURRENCY,value:e,maxDecimals:r,symbol:n}),le=(t,e,r="horizontal")=>({label:t,alignment:r,type:vmModuleTypes.DetailItemType.TEXT,value:e});var A=(t,e)=>({label:t,type:vmModuleTypes.DetailItemType.ADDRESS,value:e}),me=(t,e)=>({label:t,type:vmModuleTypes.DetailItemType.ADDRESS_LIST,value:e});var $=(t,e)=>({label:t,type:vmModuleTypes.DetailItemType.DATA,value:e});process.env.GLACIER_API_KEY;var Ne={name:"SVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"],namespaces:["solana"]},cointype:"501",permissions:{rpc:{dapps:!0,methods:["solana_signTransaction","solana_signAndSendTransaction","solana_signMessage"],nonRestrictedMethods:[]}},manifestVersion:"0.1"};var Ut={proxyApiUrl:"https://proxy-api.avax.network"},Mt={proxyApiUrl:"https://proxy-api-dev.avax.network"},De=t=>{switch(t){case vmModuleTypes.Environment.PRODUCTION:return Ut;case vmModuleTypes.Environment.DEV:return Mt}};var _e=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var q=({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 Ee=async t=>{let{approvalController:e,secretId:r}=t,n=_e(t)?q(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 Ce="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Be="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Le="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",Ue="/proxy/nownodes/sol",Me="https://api.devnet.solana.com";var I=({isTestnet:t,proxyApiUrl:e})=>coreWalletsSdk.getSolanaProvider({isTestnet:t,rpcUrl:t?Me:e+Ue});var ue=1e6,w={high:150*ue,medium:75*ue,low:2*ue},Wt=t=>(t.length===0?[w.low,w.low]:t.length===1?[t[0],w.low]:t).slice().sort((r,n)=>r-n);async function Fe(t,e){let s=await(await I({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(s.length===0||s.every(T=>T.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(w.high),maxPriorityFeePerGas:BigInt(w.high)},medium:{maxFeePerGas:BigInt(w.medium),maxPriorityFeePerGas:BigInt(w.medium)},low:{maxFeePerGas:BigInt(w.low),maxPriorityFeePerGas:BigInt(w.low)},baseFee:BigInt(w.low),displayDecimals:9,isFixedFee:!1};let i=Wt(s.map(T=>Number(T.prioritizationFee))),a=i.at(0),c=i.at(-1),l=Math.floor(i.length/2),m=i.length%2===1?i[l]:(i[l-1]+i[l])/2,p=BigInt(Math.ceil(c*1.05)),d=BigInt(Math.ceil(m*1.05)),u=BigInt(Math.ceil(a*1.05));return {high:{maxFeePerGas:p,maxPriorityFeePerGas:p},medium:{maxFeePerGas:d,maxPriorityFeePerGas:d},low:{maxFeePerGas:u,maxPriorityFeePerGas:u},baseFee:u,displayDecimals:9,isFixedFee:!1}}var 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()}),Oe=zod.z.array(jt);async function Ve({caip2Id:t,proxyApiUrl:e}){try{return (await b([`${e}/solana-tokens?caip2Id=${t}`],Oe)).map(n=>({...n,type:n.contractType}))}catch(r){throw console.error("getTokens() failed for",t,r),rpcErrors.rpcErrors.internal(`Failed to fetch tokens for caip2Id "${t}"`)}}var L=t=>t.status==="fulfilled";var Ge=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 W,X,ze,Y=class{constructor({proxyApiUrl:e}){chunkTKL4UUHE_cjs.c(this,X);chunkTKL4UUHE_cjs.c(this,W,void 0);chunkTKL4UUHE_cjs.d(this,W,`${e}/proxy/moralis`);}async getPortfolio({address:e,network:r}){try{let n=chunkTKL4UUHE_cjs.e(this,X,ze).call(this,`/account/${r}/${e}/portfolio`),s=await b([n],Ge);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}`}}}};W=new WeakMap,X=new WeakSet,ze=function(e){return `${chunkTKL4UUHE_cjs.b(this,W)}${e}`};var U=t=>{switch(t.caipId){case Ce:return "mainnet";case Be:return "devnet";case Le:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}};var 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:f})=>f):[])),d=await Promise.allSettled([i?await s.getSimplePrice({coinIds:[i],currencies:[c]}):Promise.resolve(void 0),a?await s.getPricesByAddresses(Array.from(p),a,c):Promise.resolve(void 0)]),[u,T]=d.map(y=>L(y)?y.value:void 0);return m.reduce((y,f)=>{if("error"in f)return {...y,[f.address]:{error:f.error}};let P=new coreUtilsSdk.TokenUnit(f.portfolio.nativeBalance.lamports,9,"SOL"),S=Ke(i,c,u),k=S.priceInCurrency!==void 0?P.mul(S.priceInCurrency):void 0,C={type:vmModuleTypes.TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:P.toSubUnit(),balanceDisplayValue:P.toString(),balanceInCurrency:k?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:k?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:i,...S},j=f.portfolio.tokens.reduce((te,{amountRaw:re,symbol:Pe,decimals:Se,mint:ne,name:vt,logo:Rt})=>{let oe=new coreUtilsSdk.TokenUnit(re,Se,Pe),se=Ke(ne,c,T),ke=se.priceInCurrency!==void 0?oe.mul(se.priceInCurrency):void 0,It={type:vmModuleTypes.TokenType.SPL,address:ne,name:vt,symbol:Pe,decimals:Se,balance:oe.toSubUnit(),balanceDisplayValue:oe.toString(),balanceInCurrency:ke?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:ke?.toDisplay({fixedDp:2}),logoUri:Rt??void 0,reputation:null,...se};return {...te,[ne]:It}},{});return {...y,[f.address]:{[n.networkToken.symbol]:C,...j}}},{})},Ke=(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 fe=t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),Ye=(t,e,r,n)=>{let s=r.preTokenBalances.reduce((a,{owner:c,mint:l,amount:m})=>({...a,[`${c}-${l}`]:m}),{}),o=r.postTokenBalances.reduce((a,{owner:c,mint:l,amount:m,decimals:p})=>{let d=`${c}-${l}`,u=s[d]??0n,T=m-u;if(T<=0n)return a;let y=Object.keys(s).find(S=>{let[k,C]=S.split("-"),j=r.postTokenBalances.find(({owner:te,mint:re})=>te===k&&re===l);return C===l&&j&&s[S]>j.amount});if(!y)return a;let f=n.tokens?.filter(S=>"contractType"in S).find(S=>S.address===l)??{contractType:vmModuleTypes.TokenType.SPL,decimals:p,address:l,symbol:"Unknown",name:"Unknown"},P={...f,type:f.contractType,from:{...f,address:y.split("-")[0]},to:{...f,address:c},amount:new coreUtilsSdk.TokenUnit(T,p,"").toDisplay()};return [...a,P]},[]),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,f)=>y-n[f]);if(!l)return null;let p=l>0,d=new coreUtilsSdk.TokenUnit(Math.abs(l),o.networkToken.decimals,""),u=m.reduce(({index:y,change:f},P,S)=>P>f?{index:S,change:P}:{index:y,change:f},{index:0,change:m[0]}),T=p?0:u.index;return {amount:d.toDisplay(),from:{address:p?t[T]:i},to:{address:p?i:t[T]},name:o.networkToken.name,symbol:o.networkToken.symbol,type:vmModuleTypes.TokenType.NATIVE}};function Xe(t){return e=>!!e[t]}var Je=async({isTestnet:t,address:e,proxyApiUrl:r})=>{let n=I({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(Xe("tx"))};var Ze=(t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""};async function Qe({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await Je({isTestnet:!!t.isTestnet,address:e,proxyApiUrl:r})).map(({txHash:o,tx:i})=>{if(!i.meta)return null;let{meta:a,transaction:{message:c}}=i,l=c.accountKeys.map(u=>u.toString()),m=l.indexOf(e),p=m<c.header.numRequiredSignatures,d=Ye(l,m,{paidFee:p?Number(a.fee):0,preBalances:a.preBalances.map(Number),postBalances:a.postBalances.map(Number),preTokenBalances:(a.preTokenBalances??[]).map(fe),postTokenBalances:(a.postTokenBalances??[]).map(fe)},t);return {hash:o,txType:Jt(d,e),gasUsed:String(i.meta.computeUnitsConsumed??"0"),tokens:d,from:d[0]?.from?.address??l[0],to:d[0]?.to?.address??(p?"":e),isOutgoing:p,isIncoming:!p,isSender:p,timestamp:Number(i.blockTime)*1e3,isContractCall:!1,gasPrice:String(Number(i.meta.fee)/Number(i.meta.computeUnitsConsumed)),chainId:String(t.chainId),explorerLink:Ze(o,t.explorerUrl)}}).filter(o=>o!==null)}:Promise.reject({error:rpcErrors.rpcErrors.invalidParams("Network must have a CAIP-2 id")})}var Jt=(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 et=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."}}},ye={[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 tt(t){return t.ins.length===0&&t.outs.length===0}function rt(t){return t!=null}var nt=(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:[A("From",o.source.address),A("To",o.destination.address)]}}catch{return null}};var dr=async(t,e)=>{try{let r=await t.getAccountInfo(e,{encoding:"jsonParsed"}).send();if(Array.isArray(r.value?.data))return null;let n=r.value?.data.parsed.info;return typeof n?.mint=="string"?n.mint:null}catch{return null}},ot=async(t,e,r,n,s)=>{if(!s?.length||!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 dr(t,a.source.address);if(!l)return null;let m=s.find(T=>T.address.toLowerCase()===l.toLowerCase());if(!m)return null;let d=(a.source.address===n||a.authority.address===n)===!0?"outs":"ins",u="decimals"in c?c.decimals:m.decimals;return r[d].push({token:m,items:[{displayValue:new coreUtilsSdk.TokenUnit(c.amount,u,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${m.symbol}`,items:[A("From",a.source.address),A("To",a.destination.address)]}}catch{return null}};var st=async(t,e,r,n)=>{let s=await coreWalletsSdk.deserializeTransactionMessage(t,n),o={ins:[],outs:[]},i=await Promise.allSettled(s.instructions.map(async a=>nt(a,o,e,r.networkToken)??await ot(n,a,o,e,r.tokens)??null)).then(a=>a.filter(L).map(c=>c.value).filter(rt));return {balanceChange:o,details:i}};var it=(t,e,r)=>{let n=e.account_summary.account_assets_diff??[],s={},o={},i=Object.keys(e.assets_diff??{}).filter(a=>a!==t);return n.forEach(({asset:a,in:c,out:l})=>{let m=gr(a,r);if(!m)return;let p="address"in m?m.address:m.symbol;c&&(s[p]||(s[p]={token:m,items:[]}),s[p].items.push({displayValue:String(c.value),usdPrice:typeof c.usd_price=="number"?String(c.usd_price):void 0})),l&&(o[p]||(o[p]={token:m,items:[]}),o[p].items.push({displayValue:String(l.value),usdPrice:typeof l.usd_price=="number"?String(l.usd_price):void 0}));}),{balanceChange:{ins:Object.values(s),outs:Object.values(o)},otherAffectedAddresses:i}},fr=t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),yr=(t,e)=>({type: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"?yr(t,e):t.type==="SOL"||t.type==="ETH"?fr(t):null;var Sr="DUMMY_API_KEY",ct=async({proxyApiUrl:t,params:e,dAppUrl:r})=>{let n=new Tr__default.default({baseURL:t+"/proxy/blockaid/",apiKey:Sr});try{return await n.solana.message.scan({chain:e.chain,options:["simulation","validation"],encoding:"base64",metadata:{url:r},transactions:[e.transactionBase64],account_address: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 ct(t),{simulation:o,validation:i}=s?.result??{},a={title:"Transaction Details",items:[$("Raw Data",t.params.transactionBase64)]},c=[a],l=!1,m,p;if(!i||i.result_type==="Warning"?p=ye[vmModuleTypes.AlertType.WARNING]:i.result_type==="Malicious"?p=ye[vmModuleTypes.AlertType.DANGER]:s?.error_details&&(p=et(s.error_details)),o){let{balanceChange:d,otherAffectedAddresses:u}=it(n.account,o,e);if(m=d,u.length>0){let y=o.account_summary.account_assets_diff,f=y?.filter(k=>k.asset.type==="TOKEN")??[],P=y?.find(k=>k.asset.type==="SOL");f.length>1||f.length===1&&P?(a.items.push(A("Account",n.account)),a.items.push(me("Interacting with",u))):(a.items.push(A(u.length===1?"From":"Account",n.account)),a.items.push(u.length===1?A("To",u[0]):me("Interacting with",u)));}else a.items.push(A("Account",n.account));let T=o.account_summary.account_assets_diff;if(T&&T.length>0){let y=T.find(f=>f.asset.type==="SOL");if(y){let f=0;if(!(T.filter(k=>k.asset.type==="TOKEN").length>1)&&y.out&&y.out.raw_value>0){let k=y.out.raw_value;k<=1e4&&(f=k);}f>0&&c.push({title:"Network Fee",items:[pe("Fee Amount",BigInt(f),e.networkToken.decimals,e.networkToken.symbol)]});}}l=!0;}else {let{balanceChange:d,details:u}=await st(n.transactionBase64,n.account,e,r);m=d,c.push(...u);}return {isSimulationSuccessful:l,details:c,alert:p,balanceChange:m}};var kr="https://explorer.solana.com";function lt(t,e,r="tx"){try{let n=t.explorerUrl?new URL(t.explorerUrl):new URL(kr);return n.pathname+=`${r}/${e}`,n.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}var Te=1e3,xr=60,mt=async({provider:t,txHash:e,approvalController:r,request:n,network:s,commitment:o="finalized",maxRetries:i=xr})=>{let a=0,c=null,l=lt(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,Te)),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,Te)),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,Te)),a++;}return c==="confirmed"||c==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:l}),!0):(r.onTransactionReverted({txHash:e,request:n}),!1)};var vr=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()}),Rr=zod.z.tuple([vr]),dt=t=>Rr.safeParse(t);var ft=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:o,success:i,error:a}=dt(s);if(!i)return console.error("invalid params",a),{error:rpcErrors.rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a}})};let[{account:c,serializedTx:l,sendOptions:m}]=o,p=I({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:d,isSimulationSuccessful:u,alert:T,balanceChange:y}=await Z({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:U(e),transactionBase64:l},proxyApiUrl:n},network:e,provider:p}),f={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:d,alert:T,balanceChange:y,networkFeeSelector:!1,isSimulationSuccessful:u},P={type:vmModuleTypes.RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:c,data:l},S=await r.requestApproval({request:t,displayData:f,signingData:P});if("error"in S)return {error:S.error};let k;try{return k=await wr(p,S,m),await r.onTransactionPending({txHash:k,request:t}),mt({provider:p,txHash:k,approvalController:r,request:t,network:e,commitment:m?.preflightCommitment}),{result:k}}catch(C){return console.error(C),{error:rpcErrors.rpcErrors.internal({message:"Transaction failed",data:{cause:C}})}}},wr=async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send();var Nr=zod.z.object({account:zod.z.string(),serializedTx:zod.z.string().base64()}),br=zod.z.tuple([Nr]),yt=t=>br.safeParse(t);var Tt=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:o,success:i,error:a}=yt(s);if(!i)return console.error("invalid params",a),{error:rpcErrors.rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:a}})};let[{account:c,serializedTx:l}]=o,m=I({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:p,isSimulationSuccessful:d,alert:u,balanceChange:T}=await Z({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:U(e),transactionBase64:l},proxyApiUrl:n},network:e,provider:m}),y={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:p,alert:u,balanceChange:T&&tt(T)?void 0:T,networkFeeSelector:!1,isSimulationSuccessful:d},f={type:vmModuleTypes.RpcMethod.SOLANA_SIGN_TRANSACTION,account:c,data:l},P=await r.requestApproval({request:t,displayData:y,signingData:f});return "error"in P?{error:P.error}:"signedData"in P?{result:P.signedData}:{error:rpcErrors.rpcErrors.invalidRequest("No signed data returned")}};var ht=t=>{try{let e=base.base64.decode(t);return kit.getCompiledTransactionMessageDecoder().decode(e),!0}catch{return !1}};var Cr=zod.z.object({account:zod.z.string(),serializedMessage:zod.z.string().base64()}).refine(({serializedMessage:t})=>!ht(t),{message:"Cannot use signMessage() calls for signing transactions"}),Br=zod.z.tuple([Cr]),Pt=t=>Br.safeParse(t);var kt=async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:s,success:o,error:i}=Pt(n);if(!o)return console.error("invalid params",i),{error:rpcErrors.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:[A("Account",a),le("Message",l.decode(base.base64.decode(c))),$("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,_,K,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,K,void 0);let{proxyApiUrl:s}=De(r);chunkTKL4UUHE_cjs.d(this,K,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,K);}async getProvider(e){return I({isTestnet:!!e.isTestnet,proxyApiUrl:chunkTKL4UUHE_cjs.b(this,x)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return q(e)}deriveAddress(e){return Ee({...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(Ne);return e.success?e.data:void 0}getNetworkFee(e){return Fe(e,chunkTKL4UUHE_cjs.b(this,x))}getTransactionHistory(e){return Qe({network:e.network,address:e.address,proxyApiUrl:chunkTKL4UUHE_cjs.b(this,x)})}getTokens(e){return e.caipId?Ve({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 Tt({approvalController:chunkTKL4UUHE_cjs.b(this,_),proxyApiUrl:chunkTKL4UUHE_cjs.b(this,x),network:r,request:e});case vmModuleTypes.RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return ft({approvalController:chunkTKL4UUHE_cjs.b(this,_),proxyApiUrl:chunkTKL4UUHE_cjs.b(this,x),network:r,request:e});case vmModuleTypes.RpcMethod.SOLANA_SIGN_MESSAGE:return kt({approvalController:chunkTKL4UUHE_cjs.b(this,_),network:r,request:e})}return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};x=new WeakMap,_=new WeakMap,K=new WeakMap;
|
|
20
|
+
var de=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:n=q.exponential()})=>{let s=0,o=0,i;for(;o<r;){o>0&&await wt(s);try{let c=await t(o);if(e(c))return c}catch(c){i=c;}s=n(o),o++;}let a=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(a)},q=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function wt(t){return new Promise(e=>setTimeout(e,t))}var ue=t=>de({operation:e=>t(e>0),maxRetries:2,backoffPolicy:q.constant(1),isSuccess:e=>e?.status?.error_code!==429});function we(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function fe(t){let e,r=0;for(e=0;e<t.length;e++){let n=we(t[e]??"");r=r+65027/n;}return (""+r).slice(0,16)}async function _(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 H=class{constructor(e){this.proxyApiUrl=e;}simplePrice(e){let r=new URLSearchParams(e);return _([`${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 _([`${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${r}?${s}`,{method:"POST",headers:{"Content-Type":"application/json"}}],vmModuleTypes.RawSimplePriceResponseSchema)}};var be=coreCoingeckoSdk.getBasicCoingeckoHttp(),B,z,X=class{constructor({storage:e,proxyApiUrl:r}){chunkTKL4UUHE_cjs.c(this,B,void 0);chunkTKL4UUHE_cjs.c(this,z,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,B,e),chunkTKL4UUHE_cjs.d(this,z,r);}async getSimplePrice({coinIds:e=[],currencies:r=[coreCoingeckoSdk.VsCurrencyType.USD]}){let n,o=`getSimplePrice-${e?`${fe(e)}-${r.toString()}`:`${r.toString()}`}`;if(n=chunkTKL4UUHE_cjs.b(this,B)?.get?.(o),n)return n;try{n=await ue(i=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{n=void 0;}return chunkTKL4UUHE_cjs.b(this,B)?.set?.(o,n),n}async getPricesByAddresses(e,r,n=coreCoingeckoSdk.VsCurrencyType.USD){let s,i=`getPricesWithMarketDataByAddresses-${`${fe(e)}-${r}-${n}`}`;if(s=chunkTKL4UUHE_cjs.b(this,B)?.get?.(i),s)return s;try{s=await ue(a=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:n,useCoingeckoProxy:a}));}catch(a){console.error(a),s=void 0;}return chunkTKL4UUHE_cjs.b(this,B)?.set?.(i,s),s}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:n=coreCoingeckoSdk.VsCurrencyType.USD,useCoingeckoProxy:s=!1}){if(s){let o=await new H(chunkTKL4UUHE_cjs.b(this,z)).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(be,{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 H(chunkTKL4UUHE_cjs.b(this,z)).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(be,{coinIds:e,currencies:r,marketCap:n,vol24:s,change24:o,lastUpdated:i,shouldThrow:c})}};B=new WeakMap,z=new WeakMap;zod.object({date:zod.string(),usd:zod.record(zod.number())});var ge=(t,e,r,n)=>({label:t,type:vmModuleTypes.DetailItemType.CURRENCY,value:e,maxDecimals:r,symbol:n}),ye=(t,e,r="horizontal")=>({label:t,alignment:r,type:vmModuleTypes.DetailItemType.TEXT,value:e});var x=(t,e)=>({label:t,type:vmModuleTypes.DetailItemType.ADDRESS,value:e}),Te=(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 _e={name:"SVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider/index.js",packageName:"@avalabs/svm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"],namespaces:["solana"]},cointype:"501",permissions:{rpc:{dapps:!0,methods:["solana_signTransaction","solana_signAndSendTransaction","solana_signMessage"],nonRestrictedMethods:[]}},manifestVersion:"0.1"};var Ut={proxyApiUrl:"https://proxy-api.avax.network"},Mt={proxyApiUrl:"https://proxy-api-dev.avax.network"},Ee=t=>{switch(t){case vmModuleTypes.Environment.PRODUCTION:return Ut;case vmModuleTypes.Environment.DEV:return Mt}};var Be=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var te=({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 Le=async t=>{let{approvalController:e,secretId:r}=t,n=Be(t)?te(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 Ue="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Me="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Fe="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",Oe="/proxy/nownodes/sol",Ve="https://api.devnet.solana.com";var w=({isTestnet:t,proxyApiUrl:e})=>coreWalletsSdk.getSolanaProvider({isTestnet:t,rpcUrl:t?Ve:e+Oe});var Se=1e6,N={high:150*Se,medium:75*Se,low:2*Se},Wt=t=>(t.length===0?[N.low,N.low]:t.length===1?[t[0],N.low]:t).slice().sort((r,n)=>r-n);async function Ge(t,e){let s=await(await w({isTestnet:!!t.isTestnet,proxyApiUrl:e}).getRecentPrioritizationFees()).send();if(s.length===0||s.every(y=>y.prioritizationFee===0n))return {high:{maxFeePerGas:BigInt(N.high),maxPriorityFeePerGas:BigInt(N.high)},medium:{maxFeePerGas:BigInt(N.medium),maxPriorityFeePerGas:BigInt(N.medium)},low:{maxFeePerGas:BigInt(N.low),maxPriorityFeePerGas:BigInt(N.low)},baseFee:BigInt(N.low),displayDecimals:9,isFixedFee:!1};let i=Wt(s.map(y=>Number(y.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)),u=BigInt(Math.ceil(m*1.05)),f=BigInt(Math.ceil(a*1.05));return {high:{maxFeePerGas:p,maxPriorityFeePerGas:p},medium:{maxFeePerGas:u,maxPriorityFeePerGas:u},low:{maxFeePerGas:f,maxPriorityFeePerGas:f},baseFee:f,displayDecimals:9,isFixedFee:!1}}var Kt=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()}),ze=zod.z.array(Kt);async function $e({caip2Id:t,proxyApiUrl:e}){try{return (await _([`${e}/solana-tokens?caip2Id=${t}`],ze)).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 $=t=>t.status==="fulfilled";var We=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 Q,oe,je,ne=class{constructor({proxyApiUrl:e}){chunkTKL4UUHE_cjs.c(this,oe);chunkTKL4UUHE_cjs.c(this,Q,void 0);chunkTKL4UUHE_cjs.d(this,Q,`${e}/proxy/moralis`);}async getPortfolio({address:e,network:r}){try{let n=chunkTKL4UUHE_cjs.e(this,oe,je).call(this,`/account/${r}/${e}/portfolio`),s=await _([n],We);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}`}}}};Q=new WeakMap,oe=new WeakSet,je=function(e){return `${chunkTKL4UUHE_cjs.b(this,Q)}${e}`};var W=t=>{switch(t.caipId){case Ue:return "mainnet";case Me:return "devnet";case Fe:return "testnet";default:throw new Error("Unrecognized CAIP-2 id: "+t.caipId)}};var Ye=async({addresses:t,proxyApiUrl:e,currency:r,network:n,tokenService:s})=>{let o=new ne({proxyApiUrl:e}),i=n.pricingProviders?.coingecko.nativeTokenId??"",a=n.pricingProviders?.coingecko.assetPlatformId??"",c=r.toLowerCase(),l=W(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:d})=>d):[])),u=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)]),[f,y]=u.map(g=>$(g)?g.value:void 0);return m.reduce((g,d)=>{if("error"in d)return {...g,[d.address]:{error:d.error}};let h=new coreUtilsSdk.TokenUnit(d.portfolio.nativeBalance.lamports,9,"SOL"),S=He(i,c,f),k=S.priceInCurrency!==void 0?h.mul(S.priceInCurrency):void 0,b={type:vmModuleTypes.TokenType.NATIVE,name:n.networkToken.name,symbol:n.networkToken.symbol,decimals:n.networkToken.decimals,balance:h.toSubUnit(),balanceDisplayValue:h.toString(),balanceInCurrency:k?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:k?.toDisplay({fixedDp:2}),logoUri:n.networkToken.logoUri??"",coingeckoId:i,...S},L=d.portfolio.tokens.reduce((A,{amountRaw:U,symbol:pe,decimals:F,mint:M,name:le,logo:K})=>{let O=new coreUtilsSdk.TokenUnit(U,F,pe),V=He(M,c,y),G=V.priceInCurrency!==void 0?O.mul(V.priceInCurrency):void 0,me={type:vmModuleTypes.TokenType.SPL,address:M,name:le,symbol:pe,decimals:F,balance:O.toSubUnit(),balanceDisplayValue:O.toString(),balanceInCurrency:G?.toDisplay({fixedDp:2,asNumber:!0}),balanceCurrencyDisplayValue:G?.toDisplay({fixedDp:2}),logoUri:K??void 0,reputation:null,...V};return {...A,[M]:me}},{});return {...g,[d.address]:{[n.networkToken.symbol]:b,...L}}},{})},He=(t,e,r)=>({priceInCurrency:r?.[t??""]?.[e]?.price??void 0,marketCap:r?.[t??""]?.[e]?.marketCap??void 0,vol24:r?.[t??""]?.[e]?.vol24??void 0,change24:r?.[t??""]?.[e]?.change24??void 0});var Pe=t=>({mint:t.mint,owner:t.owner,amount:BigInt(t.uiTokenAmount.amount),decimals:t.uiTokenAmount.decimals}),Ze=(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 u=`${c}-${l}`,f=s[u]??0n,y=m-f;if(y<=0n)return a;let g=Object.keys(s).find(S=>{let[k,b]=S.split("-"),L=r.postTokenBalances.find(({owner:A,mint:U})=>A===k&&U===l);return b===l&&L&&s[S]>L.amount});if(!g)return a;let d=n.tokens?.filter(S=>"contractType"in S).find(S=>S.address===l)??{contractType:vmModuleTypes.TokenType.SPL,decimals:p,address:l,symbol:"Unknown",name:"Unknown"},h={...d,type:d.contractType,from:{...d,address:g.split("-")[0]},to:{...d,address:c},amount:new coreUtilsSdk.TokenUnit(y,p,"").toDisplay()};return [...a,h]},[]),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,d)=>g-n[d]);if(!l)return null;let p=l>0,u=new coreUtilsSdk.TokenUnit(Math.abs(l),o.networkToken.decimals,""),f=m.reduce(({index:g,change:d},h,S)=>h>d?{index:S,change:h}:{index:g,change:d},{index:0,change:m[0]}),y=p?0:f.index;return {amount:u.toDisplay(),from:{address:p?t[y]:i},to:{address:p?i:t[y]},name:o.networkToken.name,symbol:o.networkToken.symbol,type:vmModuleTypes.TokenType.NATIVE}};function Qe(t){return e=>!!e[t]}var et=async({isTestnet:t,address:e,proxyApiUrl:r})=>{let n=w({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($).map(a=>a.value).filter(Qe("tx"))};var tt=(t,e)=>{let r=e?new URL(e):null;return r&&(r.pathname=`/tx/${t}`),r?.toString()??""};async function rt({network:t,address:e,proxyApiUrl:r}){return t.caipId?{transactions:(await et({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(f=>f.toString()),m=l.indexOf(e),p=m<c.header.numRequiredSignatures,u=Ze(l,m,{paidFee:p?Number(a.fee):0,preBalances:a.preBalances.map(Number),postBalances:a.postBalances.map(Number),preTokenBalances:(a.preTokenBalances??[]).map(Pe),postTokenBalances:(a.postTokenBalances??[]).map(Pe)},t);return {hash:o,txType:Jt(u,e),gasUsed:String(i.meta.computeUnitsConsumed??"0"),tokens:u,from:u[0]?.from?.address??l[0],to:u[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:tt(o,t.explorerUrl)}}).filter(o=>o!==null)}:Promise.reject({error:rpcErrors.rpcErrors.invalidParams("Network must have a CAIP-2 id")})}var Jt=(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 nt=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."}}},ke={[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 ot(t){return t.ins.length===0&&t.outs.length===0}function st(t){return t!=null}var at=(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:[x("From",o.source.address),x("To",o.destination.address)]}}catch{return null}};var dr=async(t,e)=>{try{let r=await t.getAccountInfo(e,{encoding:"jsonParsed"}).send();if(Array.isArray(r.value?.data))return null;let n=r.value?.data.parsed.info;return typeof n?.mint=="string"?n.mint:null}catch{return null}},it=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 dr(t,a.source.address);if(!l)return null;let m=s.find(y=>y.address.toLowerCase()===l.toLowerCase());if(!m)return null;let u=(a.source.address===n||a.authority.address===n)===!0?"outs":"ins",f="decimals"in c?c.decimals:m.decimals;return r[u].push({token:m,items:[{displayValue:new coreUtilsSdk.TokenUnit(c.amount,f,"").toString(),usdPrice:void 0}]}),{title:`Transfer ${m.symbol}`,items:[x("From",a.source.address),x("To",a.destination.address)]}}catch{return null}};var ct=async(t,e,r,n)=>{let s=await coreWalletsSdk.deserializeTransactionMessage(t,n),o={ins:[],outs:[]},i=await Promise.allSettled(s.instructions.map(async a=>at(a,o,e,r.networkToken)??await it(n,a,o,e,r.tokens)??null)).then(a=>a.filter($).map(c=>c.value).filter(st));return {balanceChange:o,details:i}};var lt=(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}},fr=t=>({name:t.type,symbol:t.type,decimals:t.decimals,description:"",logoUri:t.logo??void 0}),gr=(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"?gr(t,e):t.type==="SOL"||t.type==="ETH"?fr(t):null;var Pr="DUMMY_API_KEY",mt=async({proxyApiUrl:t,params:e,dAppUrl:r})=>{let n=new Tr__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 ae=async({simulationParams:t,network:e,provider:r})=>{let{params:n}=t,s=await mt(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=ke[vmModuleTypes.AlertType.WARNING]:i.result_type==="Malicious"?p=ke[vmModuleTypes.AlertType.DANGER]:s?.error_details&&(p=nt(s.error_details)),o){let{balanceChange:u,otherAffectedAddresses:f}=lt(n.account,o,e);if(m=u,f.length>0){let g=o.account_summary.account_assets_diff,d=g?.filter(k=>k.out&&k.out.raw_value>0)??[],h=g?.filter(k=>k.in&&k.in.raw_value>0)??[];d.length>0&&h.length>0?(a.items.push(x("Account",n.account)),a.items.push(Te("Interacting with",f))):(a.items.push(x(f.length===1?"From":"Account",n.account)),a.items.push(f.length===1?x("To",f[0]):Te("Interacting with",f)));}else a.items.push(x("Account",n.account));let y=o.account_summary.account_assets_diff;if(y&&y.length>0){let g=y.find(d=>d.asset.type==="SOL");if(g){let d=0,h=y.filter(A=>A.asset.type==="TOKEN"),S=y.filter(A=>A.out&&A.out.raw_value>0),k=y.filter(A=>A.in&&A.in.raw_value>0),b=h.length===0&&g&&S.length===1,L=h.length===1&&g&&S.length===2&&k.length===0;if(b||L){if(b){let A=o.assets_diff,U=n.account;if(A&&A[U]){let F=A[U].find(M=>M.asset.type==="SOL");if(F&&F.out){let M=F.out.raw_value,le=Object.keys(A),K=0;for(let O of le)if(O!==U){let V=A[O];if(V){let G=V.find(me=>me.asset.type==="SOL");if(G&&G.in){K=G.in.raw_value;break}}}K>0&&(d=M-K);}}}else L&&(d=5e3);d>0&&d<=1e4||(d=0);}d>0&&c.push({title:"Network Fee",items:[ge("Fee Amount",BigInt(d),e.networkToken.decimals,e.networkToken.symbol)]});}}l=!0;}else {let{balanceChange:u,details:f}=await ct(n.transactionBase64,n.account,e,r);m=u,c.push(...f);}return {isSimulationSuccessful:l,details:c,alert:p,balanceChange:m}};var kr="https://explorer.solana.com";function ut(t,e,r="tx"){try{let n=t.explorerUrl?new URL(t.explorerUrl):new URL(kr);return n.pathname+=`${r}/${e}`,n.toString()}catch{return `${t.explorerUrl}/${r}/${e}`}}var xe=1e3,xr=60,ft=async({provider:t,txHash:e,approvalController:r,request:n,network:s,commitment:o="finalized",maxRetries:i=xr})=>{let a=0,c=null,l=ut(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(f=>setTimeout(f,xe)),a++;continue}let{confirmationStatus:p,err:u}=m.value[0];if(u)return console.error("[waitForTransactionConfirmation] Transaction failed:",u),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(f=>setTimeout(f,xe)),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,xe)),a++;}return c==="confirmed"||c==="finalized"?(r.onTransactionConfirmed({txHash:e,request:n,explorerLink:l}),!0):(r.onTransactionReverted({txHash:e,request:n}),!1)};var vr=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()}),Rr=zod.z.tuple([vr]),gt=t=>Rr.safeParse(t);var Tt=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:o,success:i,error:a}=gt(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=w({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:u,isSimulationSuccessful:f,alert:y,balanceChange:g}=await ae({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:W(e),transactionBase64:l},proxyApiUrl:n},network:e,provider:p}),d={title:"Do you approve this transaction?",network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:u,alert:y,balanceChange:g,networkFeeSelector:!1,isSimulationSuccessful:f},h={type:vmModuleTypes.RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION,account:c,data:l},S=await r.requestApproval({request:t,displayData:d,signingData:h});if("error"in S)return {error:S.error};let k;try{return k=await wr(p,S,m),await r.onTransactionPending({txHash:k,request:t}),ft({provider:p,txHash:k,approvalController:r,request:t,network:e,commitment:m?.preflightCommitment}),{result:k}}catch(b){return console.error(b),{error:rpcErrors.rpcErrors.internal({message:"Transaction failed",data:{cause:b}})}}},wr=async(t,e,r)=>"txHash"in e?e.txHash:await t.sendTransaction(e.signedData,{...r,encoding:"base64"}).send();var Nr=zod.z.object({account:zod.z.string(),serializedTx:zod.z.string().base64()}),br=zod.z.tuple([Nr]),ht=t=>br.safeParse(t);var Pt=async({request:t,network:e,approvalController:r,proxyApiUrl:n})=>{let{params:s}=t,{data:o,success:i,error:a}=ht(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=w({isTestnet:!!e.isTestnet,proxyApiUrl:n}),{details:p,isSimulationSuccessful:u,alert:f,balanceChange:y}=await ae({simulationParams:{dAppUrl:t.dappInfo.url,params:{account:c,chain:W(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:f,balanceChange:y&&ot(y)?void 0:y,networkFeeSelector:!1,isSimulationSuccessful:u},d={type:vmModuleTypes.RpcMethod.SOLANA_SIGN_TRANSACTION,account:c,data:l},h=await r.requestApproval({request:t,displayData:g,signingData:d});return "error"in h?{error:h.error}:"signedData"in h?{result:h.signedData}:{error:rpcErrors.rpcErrors.invalidRequest("No signed data returned")}};var kt=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})=>!kt(t),{message:"Cannot use signMessage() calls for signing transactions"}),Br=zod.z.tuple([Er]),At=t=>Br.safeParse(t);var vt=async({request:t,network:e,approvalController:r})=>{let{params:n}=t,{data:s,success:o,error:i}=At(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:[x("Account",a),ye("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},u=await r.requestApproval({request:t,displayData:m,signingData:p});return "error"in u?{error:u.error}:"signedData"in u?{result:u.signedData}:{error:rpcErrors.rpcErrors.invalidRequest("No signed data returned")}};var v,E,ee,It=class{constructor({approvalController:e,environment:r,appInfo:n}){chunkTKL4UUHE_cjs.c(this,v,void 0);chunkTKL4UUHE_cjs.c(this,E,void 0);chunkTKL4UUHE_cjs.c(this,ee,void 0);let{proxyApiUrl:s}=Ee(r);chunkTKL4UUHE_cjs.d(this,ee,n),chunkTKL4UUHE_cjs.d(this,v,s),chunkTKL4UUHE_cjs.d(this,E,e),chunkTKL4UUHE_cjs.b(this,v),chunkTKL4UUHE_cjs.b(this,E),chunkTKL4UUHE_cjs.b(this,ee);}async getProvider(e){return w({isTestnet:!!e.isTestnet,proxyApiUrl:chunkTKL4UUHE_cjs.b(this,v)})}getAddress(){return Promise.resolve({})}buildDerivationPath(e){return te(e)}deriveAddress(e){return Le({...e,approvalController:chunkTKL4UUHE_cjs.b(this,E)})}getBalances(e){let r=new X({storage:e.storage,proxyApiUrl:chunkTKL4UUHE_cjs.b(this,v)});return Ye({...e,tokenService:r,proxyApiUrl:chunkTKL4UUHE_cjs.b(this,v)})}getManifest(){let e=vmModuleTypes.parseManifest(_e);return e.success?e.data:void 0}getNetworkFee(e){return Ge(e,chunkTKL4UUHE_cjs.b(this,v))}getTransactionHistory(e){return rt({network:e.network,address:e.address,proxyApiUrl:chunkTKL4UUHE_cjs.b(this,v)})}getTokens(e){return e.caipId?$e({caip2Id:e.caipId,proxyApiUrl:chunkTKL4UUHE_cjs.b(this,v)}):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 Pt({approvalController:chunkTKL4UUHE_cjs.b(this,E),proxyApiUrl:chunkTKL4UUHE_cjs.b(this,v),network:r,request:e});case vmModuleTypes.RpcMethod.SOLANA_SIGN_AND_SEND_TRANSACTION:return Tt({approvalController:chunkTKL4UUHE_cjs.b(this,E),proxyApiUrl:chunkTKL4UUHE_cjs.b(this,v),network:r,request:e});case vmModuleTypes.RpcMethod.SOLANA_SIGN_MESSAGE:return vt({approvalController:chunkTKL4UUHE_cjs.b(this,E),network:r,request:e})}return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}};v=new WeakMap,E=new WeakMap,ee=new WeakMap;
|
|
21
21
|
|
|
22
|
-
exports.SvmModule =
|
|
22
|
+
exports.SvmModule = It;
|
|
23
23
|
//# sourceMappingURL=out.js.map
|
|
24
24
|
//# sourceMappingURL=index.cjs.map
|