@avalabs/avalanche-module 0.1.3 → 0.1.4
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 +6 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -3
- package/dist/index.d.ts +8 -3
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -9,17 +9,17 @@ var coreCoingeckoSdk = require('@avalabs/core-coingecko-sdk');
|
|
|
9
9
|
var core = require('@zodios/core');
|
|
10
10
|
var zod = require('zod');
|
|
11
11
|
var coreUtilsSdk = require('@avalabs/core-utils-sdk');
|
|
12
|
-
var
|
|
12
|
+
var at = require('crypto');
|
|
13
13
|
|
|
14
14
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
15
|
|
|
16
16
|
var v__default = /*#__PURE__*/_interopDefault(v);
|
|
17
|
-
var
|
|
17
|
+
var at__default = /*#__PURE__*/_interopDefault(at);
|
|
18
18
|
|
|
19
|
-
var we=Object.defineProperty;var Re=(e,t,n)=>t in e?we(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var b=(e,t,n)=>(Re(e,typeof t!="symbol"?t+"":t,n),n),K=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var y=(e,t,n)=>(K(e,t,"read from private field"),n?n.call(e):t.get(e)),C=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n);},B=(e,t,n,a)=>(K(e,t,"write to private field"),a?a.call(e,n):t.set(e,n),n);var z={name:"Avalanche",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo","avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG","avax:imji8papUf2EhV3le337w1vgFauqkJg-","avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl"],namespaces:["avax"]},cointype:"9000",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_signTransaction","avalanche_signMessage"]}},manifestVersion:"0.0"};async function Z(){return {baseFee:BigInt(1e6),low:{maxFeePerGas:BigInt(1e6)},medium:{maxFeePerGas:BigInt(1e6)},high:{maxFeePerGas:BigInt(1e6)},isFixedFee:!0}}var te=e=>e.chainInfo.chainName===glacierSdk.PrimaryNetworkChainName.P_CHAIN,ne=e=>e.chainInfo.chainName===glacierSdk.PrimaryNetworkChainName.X_CHAIN;function E(e,t,n="tx"){return `${e}/${n}/${t}`}function S({amount:e,decimals:t}){return e===void 0?new v__default.default(0):new v__default.default(e/10**t)}function re({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Me({tx:e,isTestnet:s,networkToken:n,froms:i}),m=Ue({tx:e,isTestnet:s,networkToken:n}),p=t.toLowerCase().startsWith("p-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.blockTimestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:vmModuleTypes.TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:E(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Me({tx:e,isTestnet:t,networkToken:n,froms:a}){let r=["ImportTx","ExportTx"].includes(e.txType),s=e.txType==="BaseTx",i=e.emittedUtxos.filter(l=>l.asset.assetId===I(!!t)&&!l.addresses.some(u=>a.has(u))).reduce((l,u)=>l.add(u.asset.amount),new v__default.default(0)),c=e.value.find(l=>l.assetId===I(!!t))?.amount,o=i.gt(new v__default.default(0))?i:c?new v__default.default(c):new v__default.default(0)??new v__default.default(0),m=t?coreWalletsSdk.Avalanche.FujiContext.pBlockchainID:coreWalletsSdk.Avalanche.MainnetContext.pBlockchainID,p=e.emittedUtxos.filter(l=>l.asset.assetId===I(!!t)&&(e.txType==="ImportTx"&&l.consumedOnChainId===m||e.txType==="ExportTx"&&l.consumedOnChainId!==m)).reduce((l,u)=>l.add(u.amount),new v__default.default(0)),d=s?o:r?p:e.amountStaked.length===0?ae(e.value,!!t):ae(e.amountStaked,!!t);return S({amount:d?.toNumber(),decimals:n.decimals})}function Ue({tx:e,isTestnet:t,networkToken:n}){let a=e.amountBurned?.filter(r=>r.assetId===I(!!t)).reduce((r,s)=>r.add(s.amount),new v__default.default(0));return S({amount:a?.toNumber(),decimals:n.decimals})}function ae(e,t){return e.filter(n=>n.assetId===I(t)).reduce((n,a)=>n.add(a.amount),new v__default.default(0))}function I(e){return e?coreWalletsSdk.Avalanche.FujiContext.avaxAssetID:coreWalletsSdk.Avalanche.MainnetContext.avaxAssetID}function oe({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Le({tx:e,isTestnet:s,networkToken:n}),m=Ee({isTestnet:s,tx:e,totalAmountCreated:o,networkToken:n}),p=t.toLowerCase().startsWith("x-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.timestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:vmModuleTypes.TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:E(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Le({tx:e,isTestnet:t,networkToken:n}){let a=["ImportTx","ExportTx"].includes(e.txType),r=t?coreWalletsSdk.Avalanche.FujiContext.xBlockchainID:coreWalletsSdk.Avalanche.MainnetContext.xBlockchainID,s=e.emittedUtxos.filter(o=>o.asset.assetId===F(!!t)&&(e.txType==="ImportTx"&&o.consumedOnChainId===r||e.txType==="ExportTx"&&o.consumedOnChainId!==r)).reduce((o,m)=>o.add(m.asset.amount),new v__default.default(0)),i=e.amountCreated.filter(o=>o.assetId===F(!!t)).reduce((o,m)=>o.add(m.amount),new v__default.default(0));return S({amount:(a?s:i).toNumber(),decimals:n.decimals})}function Ee({isTestnet:e,tx:t,totalAmountCreated:n,networkToken:a}){let s=t.amountUnlocked.filter(i=>i.assetId===F(!!e)).reduce((i,c)=>i.add(c.amount),new v__default.default(0)).minus(n);return S({amount:s.toNumber(),decimals:a.decimals})}function F(e){return e?coreWalletsSdk.Avalanche.FujiContext.avaxAssetID:coreWalletsSdk.Avalanche.MainnetContext.avaxAssetID}var ce=async({address:e,nextPageToken:t,offset:n,network:a,glacierService:r})=>{let{isTestnet:s,networkToken:i,explorerUrl:c,chainId:o}=a;if(!r.isHealthy())return {transactions:[],nextPageToken:""};let p=await r.listLatestPrimaryNetworkTransactions({addresses:e,blockchainId:Xe(e),network:s?glacierSdk.Network.FUJI:glacierSdk.Network.MAINNET,pageSize:n,pageToken:t,sortOrder:glacierSdk.SortOrder.DESC}),d=[];return te(p)&&(d=p.transactions.map(l=>re({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),ne(p)&&(d=p.transactions.map(l=>oe({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),{transactions:d,nextPageToken:p.nextPageToken}},Xe=e=>e.split(",")[0]?.toLowerCase().startsWith("p-")?glacierSdk.BlockchainId.P_CHAIN:glacierSdk.BlockchainId.X_CHAIN;var Ge={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},De={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},me=e=>{switch(e){case vmModuleTypes.Environment.PRODUCTION:return Ge;case vmModuleTypes.Environment.DEV:return De}};var G=class extends Error{constructor(){super(...arguments);b(this,"message","Glacier is unhealthy. Try again later.");}},D=class{constructor({glacierApiUrl:t}){b(this,"glacierSdk");b(this,"isGlacierHealthy",!0);b(this,"isHealthy",()=>this.isGlacierHealthy);this.glacierSdk=new glacierSdk.Glacier({BASE:t});}setGlacierToUnhealthy(){this.isGlacierHealthy=!1,setTimeout(()=>{this.isGlacierHealthy=!0;},5*60*1e3);}async listLatestPrimaryNetworkTransactions(t){try{return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(t)}catch(n){throw n instanceof G&&this.setGlacierToUnhealthy(),n}}async getChainBalance(t){try{return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(t)}catch(n){throw n instanceof G&&this.setGlacierToUnhealthy(),n}}};var pe=async({operation:e,isSuccess:t,maxRetries:n=10,backoffPolicy:a=N.exponential()})=>{let r=0,s=0,i;for(;s<n;){s>0&&await je(r);try{let o=await e(s);if(t(o))return o}catch(o){i=o;}r=a(s),s++;}let c=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(c)},N=class{static exponential(){return t=>Math.pow(2,t)*1e3}static constant(t){return n=>t*1e3}static constantMs(t){return n=>t}};function je(e){return new Promise(t=>setTimeout(t,e))}var W=e=>pe({operation:t=>e(t>0),maxRetries:2,backoffPolicy:N.constant(1),isSuccess:t=>t?.status?.error_code!==429});function de(e){let t,n=0;for(t=0;t<e.length;t++)n+=e.charCodeAt(t)*(t+1);return n}function O(e){let t,n=0;for(t=0;t<e.length;t++){let a=de(e[t]??"");n=n+65027/a;}return (""+n).slice(0,16)}var Q=e=>new core.Zodios(`${e}/proxy/coingecko`,[{method:"post",path:"/simple/price",parameters:[{name:"ids",type:"Query",schema:zod.string()},{name:"vs_currencies",type:"Query",schema:zod.string()},{name:"include_market_cap",type:"Query",schema:zod.string().optional()},{name:"include_24hr_vol",type:"Query",schema:zod.string().optional()},{name:"include_24hr_change",type:"Query",schema:zod.string().optional()},{name:"include_last_updated_at",type:"Query",schema:zod.string().optional()}],alias:"simplePrice",response:vmModuleTypes.RawSimplePriceResponseSchema},{method:"post",path:"/simple/token_price/:id",parameters:[{name:"id",type:"Path",schema:zod.string()},{name:"contract_addresses",type:"Query",schema:zod.string().array()},{name:"vs_currencies",type:"Query",schema:zod.string().array()},{name:"include_market_cap",type:"Query",schema:zod.boolean().optional()},{name:"include_24hr_vol",type:"Query",schema:zod.boolean().optional()},{name:"include_24hr_change",type:"Query",schema:zod.boolean().optional()}],alias:"simplePriceByContractAddresses",response:vmModuleTypes.SimplePriceResponseSchema}],{axiosConfig:{headers:{"Content-Type":"application/json"}}});var ue=coreCoingeckoSdk.getBasicCoingeckoHttp(),x,w,U=class{constructor({storage:t,proxyApiUrl:n}){C(this,x,void 0);C(this,w,void 0);b(this,"transformSimplePriceResponse",(t,n=[coreCoingeckoSdk.VsCurrencyType.USD])=>{let a={};return Object.keys(t).forEach(r=>{let s=t[r];a[r]={},n.forEach(i=>{a[r]={[i]:{price:s?.[i],change24:s?.[`${i}_24h_change`],vol24:s?.[`${i}_24h_vol`],marketCap:s?.[`${i}_market_cap`]}};});}),a});B(this,x,t),B(this,w,n);}async getSimplePrice({coinIds:t=[],currencies:n=[coreCoingeckoSdk.VsCurrencyType.USD]}){let a,s=`getSimplePrice-${t?`${O(t)}-${n.toString()}`:`${n.toString()}`}`;if(a=y(this,x)?.get?.(s),a)return a;try{a=await W(i=>this.simplePrice({coinIds:t,currencies:n,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{a=void 0;}return y(this,x)?.set?.(s,a),a}async getPricesByAddresses(t,n,a=coreCoingeckoSdk.VsCurrencyType.USD){let r,i=`getPricesWithMarketDataByAddresses-${`${O(t)}-${n}-${a}`}`;if(r=y(this,x)?.get?.(i),r)return r;try{r=await W(c=>this.fetchPricesByAddresses({assetPlatformId:n,tokenAddresses:t,currency:a,useCoingeckoProxy:c}));}catch{r=void 0;}return y(this,x)?.set?.(i,r),r}async fetchPricesByAddresses({assetPlatformId:t,tokenAddresses:n,currency:a=coreCoingeckoSdk.VsCurrencyType.USD,useCoingeckoProxy:r=!1}){return r?Q(y(this,w)).simplePriceByContractAddresses(void 0,{params:{id:t},queries:{contract_addresses:n,vs_currencies:[a],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}}):coreCoingeckoSdk.simpleTokenPrice(ue,{assetPlatformId:t,tokenAddresses:n,currencies:[a],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:t=[],currencies:n=[coreCoingeckoSdk.VsCurrencyType.USD],marketCap:a=!1,vol24:r=!1,change24:s=!1,lastUpdated:i=!1,useCoingeckoProxy:c=!1,shouldThrow:o=!0}){if(c){let m=await Q(y(this,w)).simplePrice(void 0,{queries:{ids:t?.join(","),vs_currencies:n.join(","),include_market_cap:String(a),include_24hr_vol:String(r),include_24hr_change:String(s),include_last_updated_at:String(i)}});return this.transformSimplePriceResponse(m,n)}return coreCoingeckoSdk.simplePrice(ue,{coinIds:t,currencies:n,marketCap:a,vol24:r,change24:s,lastUpdated:i,shouldThrow:o})}};x=new WeakMap,w=new WeakMap;var he=e=>Object.keys(e).includes("unlockedUnstaked"),ye=e=>Object.keys(e).includes("locked");function H(e){let t=Object.values(e).reduce(function(n,a){let r=a.reduce(function(s,i){let c=Number(i.amount);return s+c},0);return n+r},0);return BigInt(t)}function h(e,t){return t===void 0?0:t/10**e}var ge=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlockedUnstaked:e.unlockedUnstaked,unlockedStaked:e.unlockedStaked,pendingStaked:e.pendingStaked,lockedStaked:e.lockedStaked,lockedStakeable:e.lockedStakeable,lockedPlatform:e.lockedPlatform,atomicMemoryLocked:e.atomicMemoryLocked,atomicMemoryUnlocked:e.atomicMemoryUnlocked};for(let g in m){let A=m[g];if(!A||!A.length){o[g]=0;continue}A.forEach(P=>{let Se=(o[g]??0)+Number(P.amount);o[g]=Se;});}let p=new coreUtilsSdk.TokenUnit(o.unlockedUnstaked?o.unlockedUnstaked:0n,t.decimals,t.symbol),d=n?Number(p.mul(n).toDisplay(2)):void 0,l=p.toDisplay(),u=new coreUtilsSdk.TokenUnit(H(e),t.decimals,t.symbol),k=n?Number(u.mul(n).toDisplay(2)):void 0,T=u.toDisplay();return {...t,type:vmModuleTypes.TokenType.NATIVE,priceInCurrency:n,balance:u.toSubUnit(),balanceInCurrency:k,balanceDisplayValue:T,balanceCurrencyDisplayValue:k?.toFixed(2),available:p.toSubUnit(),availableInCurrency:d,availableDisplayValue:l,availableCurrencyDisplayValue:d?.toFixed(2),utxos:e,balancePerType:{lockedStaked:h(c,o.lockedStaked),lockedStakeable:h(c,o.lockedStakeable),lockedPlatform:h(c,o.lockedPlatform),atomicMemoryLocked:h(c,o.atomicMemoryLocked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),unlockedUnstaked:h(c,o.unlockedUnstaked),unlockedStaked:h(c,o.unlockedStaked),pendingStaked:h(c,o.pendingStaked)},marketCap:a,vol24:r,change24:s,coingeckoId:i}};var fe=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlocked:e.unlocked,locked:e.locked,atomicMemoryUnlocked:e.atomicMemoryUnlocked,atomicMemoryLocked:e.atomicMemoryLocked};for(let k in m){let T=m[k];if(!T||!T.length){o[k]=0;continue}T.forEach(g=>{let P=(o[k]??0)+Number(g.amount);o[k]=P;});}let p=new coreUtilsSdk.TokenUnit(H(e),t.decimals,t.symbol),d=p.toDisplay(),l=n?p.mul(n).toDisplay(2):void 0,u=l?Number(l.replaceAll(",","")):void 0;return {...t,coingeckoId:i,type:vmModuleTypes.TokenType.NATIVE,priceInCurrency:n,balance:p.toSubUnit(),balanceInCurrency:u,balanceDisplayValue:d,balanceCurrencyDisplayValue:l,utxos:e,balancePerType:{unlocked:h(c,o.unlocked),locked:h(c,o.locked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),atomicMemoryLocked:h(c,o.atomicMemoryLocked)},marketCap:a,vol24:r,change24:s}};var ve=async({addresses:e,currency:t,network:n,glacierService:a,tokenService:r})=>{if(!a.isHealthy())return Promise.reject("Glacier is unhealthy. Try again later.");let i=t.toLowerCase(),c=e[0]??"",o=n.networkToken,m=n.pricingProviders?.coingecko.nativeTokenId,p=n.vmName===vmModuleTypes.NetworkVMType.PVM?glacierSdk.BlockchainId.P_CHAIN:glacierSdk.BlockchainId.X_CHAIN,d=n.isTestnet?glacierSdk.Network.FUJI:glacierSdk.Network.MAINNET,l=await a.getChainBalance({blockchainId:p,network:d,addresses:e.join(",")}).then(J=>J.balances),u=m?await r.getSimplePrice({coinIds:[m],currencies:[i]}):{},k=u?.[m??""]?.[i]?.price??void 0,T=u?.[m??""]?.[i]?.marketCap??void 0,g=u?.[m??""]?.[i]?.vol24??void 0,A=u?.[m??""]?.[i]?.change24??void 0,P;return he(l)?(P=ge({balance:l,networkToken:o,priceInCurrency:k,marketCap:T,vol24:g,change24:A,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):ye(l)?(P=fe({balance:l,networkToken:o,priceInCurrency:k,marketCap:T,vol24:g,change24:A,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):Promise.reject("Incorrect type balance was returned from glacier")};function xe({blockchainId:e,isTestnet:t}){let n=t?"fuji"+e:e,a=Ye__default.default.createHash("sha256").update(n).digest("base64");return "avax:"+et(a).substring(0,32)}var et=e=>e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");var Ce=async({accountIndex:e,isTestnet:t,xpubXP:n,walletType:a})=>{if(n===void 0)throw rpcErrors.rpcErrors.invalidParams("xpubXP is required to get address");let r=t?coreWalletsSdk.Avalanche.JsonRpcProvider.getDefaultFujiProvider():coreWalletsSdk.Avalanche.JsonRpcProvider.getDefaultMainnetProvider(),s;switch(a){case vmModuleTypes.WalletType.Mnemonic:case vmModuleTypes.WalletType.Ledger:case vmModuleTypes.WalletType.Keystone:{s=coreWalletsSdk.Avalanche.getAddressPublicKeyFromXpub(n,e);break}case vmModuleTypes.WalletType.LedgerLive:case vmModuleTypes.WalletType.Seedless:{s=Buffer.from(n,"hex");break}default:throw rpcErrors.rpcErrors.invalidParams(`Unsupported wallet type: ${a}`)}return {[vmModuleTypes.NetworkVMType.AVM]:r.getAddress(s,"X"),[vmModuleTypes.NetworkVMType.PVM]:r.getAddress(s,"P")}};var R,L,Be=class{constructor({environment:t}){C(this,R,void 0);C(this,L,void 0);let{glacierApiUrl:n,proxyApiUrl:a}=me(t);B(this,R,new D({glacierApiUrl:n})),B(this,L,a);}getAddress({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r}){return Ce({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r})}getBalances({addresses:t,network:n,storage:a,currency:r}){let s=new U({storage:a,proxyApiUrl:y(this,L)});return ve({addresses:t,currency:r,network:n,glacierService:y(this,R),tokenService:s})}getManifest(){let t=vmModuleTypes.parseManifest(z);return t.success?t.data:void 0}getNetworkFee(t){return Z()}getTransactionHistory({network:t,address:n,nextPageToken:a,offset:r}){return ce({network:t,address:n,nextPageToken:a,offset:r,glacierService:y(this,R)})}getTokens(t){return Promise.resolve([])}async onRpcRequest(t,n){switch(t.method){default:return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${t.method} not supported`)}}}static getHashedBlockchainId({blockchainId:t,isTestnet:n}){return xe({blockchainId:t,isTestnet:n})}};R=new WeakMap,L=new WeakMap;var Gn=e=>"balancePerType"in e&&"unlockedUnstaked"in e.balancePerType,Dn=e=>"balancePerType"in e&&"unlocked"in e.balancePerType;
|
|
19
|
+
var Me=Object.defineProperty;var Ue=(e,t,n)=>t in e?Me(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var C=(e,t,n)=>(Ue(e,typeof t!="symbol"?t+"":t,n),n),Z=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var y=(e,t,n)=>(Z(e,t,"read from private field"),n?n.call(e):t.get(e)),b=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n);},B=(e,t,n,a)=>(Z(e,t,"write to private field"),a?a.call(e,n):t.set(e,n),n);var Y={name:"Avalanche",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo","avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG","avax:imji8papUf2EhV3le337w1vgFauqkJg-","avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl"],namespaces:["avax"]},cointype:"9000",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_signTransaction","avalanche_signMessage"]}},manifestVersion:"0.0"};async function ee(){return {baseFee:BigInt(1e6),low:{maxFeePerGas:BigInt(1e6)},medium:{maxFeePerGas:BigInt(1e6)},high:{maxFeePerGas:BigInt(1e6)},isFixedFee:!0}}var ae=e=>e.chainInfo.chainName===glacierSdk.PrimaryNetworkChainName.P_CHAIN,re=e=>e.chainInfo.chainName===glacierSdk.PrimaryNetworkChainName.X_CHAIN;function D(e,t,n="tx"){return `${e}/${n}/${t}`}function S({amount:e,decimals:t}){return e===void 0?new v__default.default(0):new v__default.default(e/10**t)}function se({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Le({tx:e,isTestnet:s,networkToken:n,froms:i}),m=Ve({tx:e,isTestnet:s,networkToken:n}),p=t.toLowerCase().startsWith("p-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.blockTimestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:vmModuleTypes.TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:D(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Le({tx:e,isTestnet:t,networkToken:n,froms:a}){let r=["ImportTx","ExportTx"].includes(e.txType),s=e.txType==="BaseTx",i=e.emittedUtxos.filter(l=>l.asset.assetId===N(!!t)&&!l.addresses.some(u=>a.has(u))).reduce((l,u)=>l.add(u.asset.amount),new v__default.default(0)),c=e.value.find(l=>l.assetId===N(!!t))?.amount,o=i.gt(new v__default.default(0))?i:c?new v__default.default(c):new v__default.default(0)??new v__default.default(0),m=t?coreWalletsSdk.Avalanche.FujiContext.pBlockchainID:coreWalletsSdk.Avalanche.MainnetContext.pBlockchainID,p=e.emittedUtxos.filter(l=>l.asset.assetId===N(!!t)&&(e.txType==="ImportTx"&&l.consumedOnChainId===m||e.txType==="ExportTx"&&l.consumedOnChainId!==m)).reduce((l,u)=>l.add(u.amount),new v__default.default(0)),d=s?o:r?p:e.amountStaked.length===0?oe(e.value,!!t):oe(e.amountStaked,!!t);return S({amount:d?.toNumber(),decimals:n.decimals})}function Ve({tx:e,isTestnet:t,networkToken:n}){let a=e.amountBurned?.filter(r=>r.assetId===N(!!t)).reduce((r,s)=>r.add(s.amount),new v__default.default(0));return S({amount:a?.toNumber(),decimals:n.decimals})}function oe(e,t){return e.filter(n=>n.assetId===N(t)).reduce((n,a)=>n.add(a.amount),new v__default.default(0))}function N(e){return e?coreWalletsSdk.Avalanche.FujiContext.avaxAssetID:coreWalletsSdk.Avalanche.MainnetContext.avaxAssetID}function ie({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Ge({tx:e,isTestnet:s,networkToken:n}),m=Xe({isTestnet:s,tx:e,totalAmountCreated:o,networkToken:n}),p=t.toLowerCase().startsWith("x-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.timestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:vmModuleTypes.TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:D(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Ge({tx:e,isTestnet:t,networkToken:n}){let a=["ImportTx","ExportTx"].includes(e.txType),r=t?coreWalletsSdk.Avalanche.FujiContext.xBlockchainID:coreWalletsSdk.Avalanche.MainnetContext.xBlockchainID,s=e.emittedUtxos.filter(o=>o.asset.assetId===O(!!t)&&(e.txType==="ImportTx"&&o.consumedOnChainId===r||e.txType==="ExportTx"&&o.consumedOnChainId!==r)).reduce((o,m)=>o.add(m.asset.amount),new v__default.default(0)),i=e.amountCreated.filter(o=>o.assetId===O(!!t)).reduce((o,m)=>o.add(m.amount),new v__default.default(0));return S({amount:(a?s:i).toNumber(),decimals:n.decimals})}function Xe({isTestnet:e,tx:t,totalAmountCreated:n,networkToken:a}){let s=t.amountUnlocked.filter(i=>i.assetId===O(!!e)).reduce((i,c)=>i.add(c.amount),new v__default.default(0)).minus(n);return S({amount:s.toNumber(),decimals:a.decimals})}function O(e){return e?coreWalletsSdk.Avalanche.FujiContext.avaxAssetID:coreWalletsSdk.Avalanche.MainnetContext.avaxAssetID}var me=async({address:e,nextPageToken:t,offset:n,network:a,glacierService:r})=>{let{isTestnet:s,networkToken:i,explorerUrl:c,chainId:o}=a;if(!r.isHealthy())return {transactions:[],nextPageToken:""};let p=await r.listLatestPrimaryNetworkTransactions({addresses:e,blockchainId:je(e),network:s?glacierSdk.Network.FUJI:glacierSdk.Network.MAINNET,pageSize:n,pageToken:t,sortOrder:glacierSdk.SortOrder.DESC}),d=[];return ae(p)&&(d=p.transactions.map(l=>se({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),re(p)&&(d=p.transactions.map(l=>ie({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),{transactions:d,nextPageToken:p.nextPageToken}},je=e=>e.split(",")[0]?.toLowerCase().startsWith("p-")?glacierSdk.BlockchainId.P_CHAIN:glacierSdk.BlockchainId.X_CHAIN;var Fe={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},We={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},de=e=>{switch(e){case vmModuleTypes.Environment.PRODUCTION:return Fe;case vmModuleTypes.Environment.DEV:return We}};var H=class extends Error{constructor(){super(...arguments);C(this,"message","Glacier is unhealthy. Try again later.");}},j=class{constructor({glacierApiUrl:t}){C(this,"glacierSdk");C(this,"isGlacierHealthy",!0);C(this,"isHealthy",()=>this.isGlacierHealthy);this.glacierSdk=new glacierSdk.Glacier({BASE:t});}setGlacierToUnhealthy(){this.isGlacierHealthy=!1,setTimeout(()=>{this.isGlacierHealthy=!0;},5*60*1e3);}async listLatestPrimaryNetworkTransactions(t){try{return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(t)}catch(n){throw n instanceof H&&this.setGlacierToUnhealthy(),n}}async getChainBalance(t){try{return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(t)}catch(n){throw n instanceof H&&this.setGlacierToUnhealthy(),n}}};var ue=async({operation:e,isSuccess:t,maxRetries:n=10,backoffPolicy:a=M.exponential()})=>{let r=0,s=0,i;for(;s<n;){s>0&&await $e(r);try{let o=await e(s);if(t(o))return o}catch(o){i=o;}r=a(s),s++;}let c=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(c)},M=class{static exponential(){return t=>Math.pow(2,t)*1e3}static constant(t){return n=>t*1e3}static constantMs(t){return n=>t}};function $e(e){return new Promise(t=>setTimeout(t,e))}var $=e=>ue({operation:t=>e(t>0),maxRetries:2,backoffPolicy:M.constant(1),isSuccess:t=>t?.status?.error_code!==429});function he(e){let t,n=0;for(t=0;t<e.length;t++)n+=e.charCodeAt(t)*(t+1);return n}function q(e){let t,n=0;for(t=0;t<e.length;t++){let a=he(e[t]??"");n=n+65027/a;}return (""+n).slice(0,16)}var J=e=>new core.Zodios(`${e}/proxy/coingecko`,[{method:"post",path:"/simple/price",parameters:[{name:"ids",type:"Query",schema:zod.string()},{name:"vs_currencies",type:"Query",schema:zod.string()},{name:"include_market_cap",type:"Query",schema:zod.string().optional()},{name:"include_24hr_vol",type:"Query",schema:zod.string().optional()},{name:"include_24hr_change",type:"Query",schema:zod.string().optional()},{name:"include_last_updated_at",type:"Query",schema:zod.string().optional()}],alias:"simplePrice",response:vmModuleTypes.RawSimplePriceResponseSchema},{method:"post",path:"/simple/token_price/:id",parameters:[{name:"id",type:"Path",schema:zod.string()},{name:"contract_addresses",type:"Query",schema:zod.string().array()},{name:"vs_currencies",type:"Query",schema:zod.string().array()},{name:"include_market_cap",type:"Query",schema:zod.boolean().optional()},{name:"include_24hr_vol",type:"Query",schema:zod.boolean().optional()},{name:"include_24hr_change",type:"Query",schema:zod.boolean().optional()}],alias:"simplePriceByContractAddresses",response:vmModuleTypes.SimplePriceResponseSchema}],{axiosConfig:{headers:{"Content-Type":"application/json"}}});var ye=coreCoingeckoSdk.getBasicCoingeckoHttp(),A,w,_=class{constructor({storage:t,proxyApiUrl:n}){b(this,A,void 0);b(this,w,void 0);C(this,"transformSimplePriceResponse",(t,n=[coreCoingeckoSdk.VsCurrencyType.USD])=>{let a={};return Object.keys(t).forEach(r=>{let s=t[r];a[r]={},n.forEach(i=>{a[r]={[i]:{price:s?.[i],change24:s?.[`${i}_24h_change`],vol24:s?.[`${i}_24h_vol`],marketCap:s?.[`${i}_market_cap`]}};});}),a});B(this,A,t),B(this,w,n);}async getSimplePrice({coinIds:t=[],currencies:n=[coreCoingeckoSdk.VsCurrencyType.USD]}){let a,s=`getSimplePrice-${t?`${q(t)}-${n.toString()}`:`${n.toString()}`}`;if(a=y(this,A)?.get?.(s),a)return a;try{a=await $(i=>this.simplePrice({coinIds:t,currencies:n,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{a=void 0;}return y(this,A)?.set?.(s,a),a}async getPricesByAddresses(t,n,a=coreCoingeckoSdk.VsCurrencyType.USD){let r,i=`getPricesWithMarketDataByAddresses-${`${q(t)}-${n}-${a}`}`;if(r=y(this,A)?.get?.(i),r)return r;try{r=await $(c=>this.fetchPricesByAddresses({assetPlatformId:n,tokenAddresses:t,currency:a,useCoingeckoProxy:c}));}catch{r=void 0;}return y(this,A)?.set?.(i,r),r}async fetchPricesByAddresses({assetPlatformId:t,tokenAddresses:n,currency:a=coreCoingeckoSdk.VsCurrencyType.USD,useCoingeckoProxy:r=!1}){return r?J(y(this,w)).simplePriceByContractAddresses(void 0,{params:{id:t},queries:{contract_addresses:n,vs_currencies:[a],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}}):coreCoingeckoSdk.simpleTokenPrice(ye,{assetPlatformId:t,tokenAddresses:n,currencies:[a],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:t=[],currencies:n=[coreCoingeckoSdk.VsCurrencyType.USD],marketCap:a=!1,vol24:r=!1,change24:s=!1,lastUpdated:i=!1,useCoingeckoProxy:c=!1,shouldThrow:o=!0}){if(c){let m=await J(y(this,w)).simplePrice(void 0,{queries:{ids:t?.join(","),vs_currencies:n.join(","),include_market_cap:String(a),include_24hr_vol:String(r),include_24hr_change:String(s),include_last_updated_at:String(i)}});return this.transformSimplePriceResponse(m,n)}return coreCoingeckoSdk.simplePrice(ye,{coinIds:t,currencies:n,marketCap:a,vol24:r,change24:s,lastUpdated:i,shouldThrow:o})}};A=new WeakMap,w=new WeakMap;var ge=e=>Object.keys(e).includes("unlockedUnstaked"),ke=e=>Object.keys(e).includes("locked");function F(e){let t=Object.values(e).reduce(function(n,a){let r=a.reduce(function(s,i){let c=Number(i.amount);return s+c},0);return n+r},0);return BigInt(t)}function h(e,t){return t===void 0?0:t/10**e}var Te=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlockedUnstaked:e.unlockedUnstaked,unlockedStaked:e.unlockedStaked,pendingStaked:e.pendingStaked,lockedStaked:e.lockedStaked,lockedStakeable:e.lockedStakeable,lockedPlatform:e.lockedPlatform,atomicMemoryLocked:e.atomicMemoryLocked,atomicMemoryUnlocked:e.atomicMemoryUnlocked};for(let k in m){let x=m[k];if(!x||!x.length){o[k]=0;continue}x.forEach(P=>{let Ne=(o[k]??0)+Number(P.amount);o[k]=Ne;});}let p=new coreUtilsSdk.TokenUnit(o.unlockedUnstaked?o.unlockedUnstaked:0n,t.decimals,t.symbol),d=n?Number(p.mul(n).toDisplay(2)):void 0,l=p.toDisplay(),u=new coreUtilsSdk.TokenUnit(F(e),t.decimals,t.symbol),g=n?Number(u.mul(n).toDisplay(2)):void 0,T=u.toDisplay();return {...t,type:vmModuleTypes.TokenType.NATIVE,priceInCurrency:n,balance:u.toSubUnit(),balanceInCurrency:g,balanceDisplayValue:T,balanceCurrencyDisplayValue:g?.toFixed(2),available:p.toSubUnit(),availableInCurrency:d,availableDisplayValue:l,availableCurrencyDisplayValue:d?.toFixed(2),utxos:e,balancePerType:{lockedStaked:h(c,o.lockedStaked),lockedStakeable:h(c,o.lockedStakeable),lockedPlatform:h(c,o.lockedPlatform),atomicMemoryLocked:h(c,o.atomicMemoryLocked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),unlockedUnstaked:h(c,o.unlockedUnstaked),unlockedStaked:h(c,o.unlockedStaked),pendingStaked:h(c,o.pendingStaked)},marketCap:a,vol24:r,change24:s,coingeckoId:i}};var Pe=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlocked:e.unlocked,locked:e.locked,atomicMemoryUnlocked:e.atomicMemoryUnlocked,atomicMemoryLocked:e.atomicMemoryLocked};for(let g in m){let T=m[g];if(!T||!T.length){o[g]=0;continue}T.forEach(k=>{let P=(o[g]??0)+Number(k.amount);o[g]=P;});}let p=new coreUtilsSdk.TokenUnit(F(e),t.decimals,t.symbol),d=p.toDisplay(),l=n?p.mul(n).toDisplay(2):void 0,u=l?Number(l.replaceAll(",","")):void 0;return {...t,coingeckoId:i,type:vmModuleTypes.TokenType.NATIVE,priceInCurrency:n,balance:p.toSubUnit(),balanceInCurrency:u,balanceDisplayValue:d,balanceCurrencyDisplayValue:l,utxos:e,balancePerType:{unlocked:h(c,o.unlocked),locked:h(c,o.locked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),atomicMemoryLocked:h(c,o.atomicMemoryLocked)},marketCap:a,vol24:r,change24:s}};var xe=async({addresses:e,currency:t,network:n,glacierService:a,tokenService:r})=>{if(!a.isHealthy())return Promise.reject("Glacier is unhealthy. Try again later.");let i=t.toLowerCase(),c=e[0]??"",o=n.networkToken,m=n.pricingProviders?.coingecko.nativeTokenId,p=n.vmName===vmModuleTypes.NetworkVMType.PVM?glacierSdk.BlockchainId.P_CHAIN:glacierSdk.BlockchainId.X_CHAIN,d=n.isTestnet?glacierSdk.Network.FUJI:glacierSdk.Network.MAINNET,l=await a.getChainBalance({blockchainId:p,network:d,addresses:e.join(",")}).then(K=>K.balances),u=m?await r.getSimplePrice({coinIds:[m],currencies:[i]}):{},g=u?.[m??""]?.[i]?.price??void 0,T=u?.[m??""]?.[i]?.marketCap??void 0,k=u?.[m??""]?.[i]?.vol24??void 0,x=u?.[m??""]?.[i]?.change24??void 0,P;return ge(l)?(P=Te({balance:l,networkToken:o,priceInCurrency:g,marketCap:T,vol24:k,change24:x,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):ke(l)?(P=Pe({balance:l,networkToken:o,priceInCurrency:g,marketCap:T,vol24:k,change24:x,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):Promise.reject("Incorrect type balance was returned from glacier")};function Ce({blockchainId:e,isTestnet:t}){let n=t?"fuji"+e:e,a=at__default.default.createHash("sha256").update(n).digest("base64");return "avax:"+rt(a).substring(0,32)}var rt=e=>e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");var Se=async({accountIndex:e,isTestnet:t,xpubXP:n,walletType:a})=>{if(n===void 0)throw rpcErrors.rpcErrors.invalidParams("xpubXP is required to get address");let r=t?coreWalletsSdk.Avalanche.JsonRpcProvider.getDefaultFujiProvider():coreWalletsSdk.Avalanche.JsonRpcProvider.getDefaultMainnetProvider(),s;switch(a){case vmModuleTypes.WalletType.Mnemonic:case vmModuleTypes.WalletType.Ledger:case vmModuleTypes.WalletType.Keystone:{s=coreWalletsSdk.Avalanche.getAddressPublicKeyFromXpub(n,e);break}case vmModuleTypes.WalletType.LedgerLive:case vmModuleTypes.WalletType.Seedless:{s=Buffer.from(n,"hex");break}default:throw rpcErrors.rpcErrors.invalidParams(`Unsupported wallet type: ${a}`)}return {[vmModuleTypes.NetworkVMType.AVM]:r.getAddress(s,"X"),[vmModuleTypes.NetworkVMType.PVM]:r.getAddress(s,"P")}};var ot=zod.z.union([zod.z.tuple([zod.z.string()]).describe("message to sign"),zod.z.tuple([zod.z.string().describe("message to sign"),zod.z.number().nonnegative().describe("account index")])]),we=e=>ot.safeParse(e);var Re=async({request:e,network:t,approvalController:n})=>{let a=we(e.params);if(!a.success)return console.error("invalid params",a.error),{error:rpcErrors.rpcErrors.invalidParams("Params are invalid")};let[r,s]=a.data,i=Buffer.from(r,"utf-8").toString("hex"),c={type:vmModuleTypes.RpcMethod.AVALANCHE_SIGN_MESSAGE,data:i,accountIndex:s},o={title:"Sign Message",dAppInfo:{name:e.dappInfo.name,action:`${e.dappInfo.name} requests you to sign the following message`,logoUri:e.dappInfo.icon},network:{chainId:t.chainId,name:t.chainName,logoUri:t.logoUri},messageDetails:r},m=await n.requestApproval({request:e,displayData:o,signingData:c});return "error"in m?{error:m.error}:{result:m.result}};var I,L,V,Ie=class{constructor({approvalController:t,environment:n}){b(this,I,void 0);b(this,L,void 0);b(this,V,void 0);let{glacierApiUrl:a,proxyApiUrl:r}=de(n);B(this,I,new j({glacierApiUrl:a})),B(this,L,r),B(this,V,t);}getAddress({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r}){return Se({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r})}getBalances({addresses:t,network:n,storage:a,currency:r}){let s=new _({storage:a,proxyApiUrl:y(this,L)});return xe({addresses:t,currency:r,network:n,glacierService:y(this,I),tokenService:s})}getManifest(){let t=vmModuleTypes.parseManifest(Y);return t.success?t.data:void 0}getNetworkFee(t){return ee()}getTransactionHistory({network:t,address:n,nextPageToken:a,offset:r}){return me({network:t,address:n,nextPageToken:a,offset:r,glacierService:y(this,I)})}getTokens(t){return Promise.resolve([])}async onRpcRequest(t,n){switch(t.method){case vmModuleTypes.RpcMethod.AVALANCHE_SIGN_MESSAGE:return Re({request:t,network:n,approvalController:y(this,V)});default:return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${t.method} not supported`)}}}static getHashedBlockchainId({blockchainId:t,isTestnet:n}){return Ce({blockchainId:t,isTestnet:n})}};I=new WeakMap,L=new WeakMap,V=new WeakMap;var ea=e=>"balancePerType"in e&&"unlockedUnstaked"in e.balancePerType,ta=e=>"balancePerType"in e&&"unlocked"in e.balancePerType;
|
|
20
20
|
|
|
21
|
-
exports.AvalancheModule =
|
|
22
|
-
exports.isTokenWithBalanceAVM =
|
|
23
|
-
exports.isTokenWithBalancePVM =
|
|
21
|
+
exports.AvalancheModule = Ie;
|
|
22
|
+
exports.isTokenWithBalanceAVM = ta;
|
|
23
|
+
exports.isTokenWithBalancePVM = ea;
|
|
24
24
|
//# sourceMappingURL=out.js.map
|
|
25
25
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/utils.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/env.ts","../src/services/glacier-service/glacier-service.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../src/handlers/get-balances/get-balances.ts","../src/handlers/get-balances/utils.ts","../src/handlers/get-balances/convert-p-chain-balance.ts","../src/handlers/get-balances/covnert-x-chain-balance.ts","../src/utils/hash-blockchain-id.ts","../src/handlers/get-address/get-address.ts","../src/handlers/get-balances/typeguards.ts"],"names":["parseManifest","rpcErrors","manifest_default","getNetworkFee","BlockchainId","Network","SortOrder","PrimaryNetworkChainName","Big","isPChainTransactions","value","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","amount","decimals","Avalanche","TokenType","convertPChainTransaction","tx","address","networkToken","chainId","isTestnet","froms","utxo","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","isBaseTx","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","xBlockchainId","totalAmountCreated","asset","getTransactionHistory","nextPageToken","offset","network","glacierService","response","getBlockchainIdByAddress","transactions","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","__publicField","AvalancheGlacierService","glacierApiUrl","params","error","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","proxyApiUrl","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","NetworkVMType","isPchainBalance","balanceResult","isXchainBalance","calculateTotalBalance","uxtos","totalAcc","utxoList","typeSum","typeAcc","balanceToAdd","TokenUnit","convertPChainBalance","balance","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","uxto","newBalance","available","availableInCurrency","availableDisplayValue","totalBalance","balanceInCurrency","balanceDisplayValue","convertXChainBalance","balanceCurrencyDisplayValue","getBalances","addresses","tokenService","lowercaseCurrency","blockchainId","networkName","chainBalances","simplePriceResponse","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","WalletType","getAddress","accountIndex","xpubXP","walletType","provXP","xpPub","_glacierService","AvalancheModule","request","_network","isTokenWithBalancePVM","token","isTokenWithBalanceAVM"],"mappings":"2fAaA,OAAS,iBAAAA,OAAqB,2BAC9B,OAAS,aAAAC,OAAiB,uBCd1B,IAAAC,EAAA,CACE,KAAQ,YACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CACV,wCACA,wCACA,wCACA,uCACF,EACA,WAAc,CAAC,MAAM,CACvB,EACA,SAAY,OACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,4BAA6B,4BAA6B,uBAAuB,CAC/F,CACF,EACA,gBAAmB,KACrB,ECtCA,eAAsBC,GAAsC,CAE1D,MAAO,CACL,QAAS,OAAO,GAAO,EACvB,IAAK,CACH,aAAc,OAAO,GAAO,CAC9B,EACA,OAAQ,CACN,aAAc,OAAO,GAAO,CAC9B,EACA,KAAM,CACJ,aAAc,OAAO,GAAO,CAC9B,EACA,WAAY,EACd,CACF,CCnBA,OAAS,gBAAAC,GAAc,WAAAC,GAAS,aAAAC,OAAiB,uBCDjD,OACE,2BAAAC,OAIK,uBACP,OAAOC,MAAS,SAET,IAAMC,GACXC,GAEOA,EAAM,UAAU,YAAcH,GAAwB,QAGlDI,GACXD,GAEOA,EAAM,UAAU,YAAcH,GAAwB,QAGxD,SAASK,EACdC,EACAC,EACAC,EAA6B,KACrB,CACR,MAAO,GAAGF,CAAW,IAAIE,CAAQ,IAAID,CAAI,EAC3C,CAEO,SAASE,EAAc,CAAE,OAAAC,EAAQ,SAAAC,CAAS,EAA+C,CAC9F,OAAOD,IAAW,OAAY,IAAIT,EAAI,CAAC,EAAI,IAAIA,EAAIS,EAAS,IAAMC,CAAQ,CAC5E,CC9BA,MAA0D,uBAC1D,OAAOV,MAAS,SAChB,OAAS,aAAAW,MAAiB,4BAC1B,OAAS,aAAAC,OAAmC,2BAGrC,SAASC,GAAyB,CACvC,GAAAC,EACA,QAAAC,EACA,aAAAC,EACA,QAAAC,EACA,YAAAZ,EACA,UAAAa,CACF,EAOgB,CACd,IAAMC,EAAQ,IAAI,IAAIL,EAAG,cAAc,QAASM,GAASA,EAAK,SAAS,GAAK,CAAC,CAAC,EACxEC,EAAM,IAAI,IAAIP,EAAG,aAAa,QAASM,GAASA,EAAK,SAAS,GAAK,CAAC,CAAC,EAErEX,EAASa,GAAU,CACvB,GAAAR,EACA,UAAAI,EACA,aAAAF,EACA,MAAAG,CACF,CAAC,EAEKI,EAAmBC,GAAgB,CAAE,GAAAV,EAAI,UAAAI,EAAW,aAAAF,CAAa,CAAC,EAClES,EAAeV,EAAQ,YAAY,EAAE,WAAW,IAAI,EAAIA,EAAQ,MAAM,CAAC,EAAIA,EAC3EW,EAAWP,EAAM,IAAIM,CAAY,EAEvC,MAAO,CACL,KAAMX,EAAG,OACT,eAAgB,GAChB,WAAY,CAACY,EACb,WAAYA,EACZ,KAAM,CAAC,GAAGP,EAAM,OAAO,CAAC,EAAE,KAAK,GAAG,EAClC,GAAI,CAAC,GAAGE,EAAI,OAAO,CAAC,EAAE,KAAK,GAAG,EAC9B,SAAAK,EACA,UAAWZ,EAAG,eAAiB,IAC/B,OAAQ,CACN,CACE,QAASE,EAAa,SAAS,SAAS,EACxC,KAAMA,EAAa,KACnB,OAAQA,EAAa,OACrB,KAAMJ,GAAU,OAChB,OAAQH,EAAO,SAAS,CAC1B,CACF,EACA,QAASc,EAAiB,SAAS,EACnC,aAAcnB,EAA4BC,GAAe,GAAIS,EAAG,OAAQ,IAAI,EAC5E,OAAQA,EAAG,OACX,QAASG,EAAQ,SAAS,CAC5B,CACF,CAEA,SAASK,GAAU,CACjB,GAAAR,EACA,UAAAI,EACA,aAAAF,EACA,MAAAG,CACF,EAKQ,CACN,IAAMQ,EAAiB,CAAC,WAAY,UAAU,EAAE,SAASb,EAAG,MAAM,EAC5Dc,EAAWd,EAAG,SAAW,SAEzBe,EAA2Bf,EAAG,aACjC,OACEM,GAASA,EAAK,MAAM,UAAYU,EAAe,CAAC,CAACZ,CAAS,GAAK,CAACE,EAAK,UAAU,KAAMW,GAASZ,EAAM,IAAIY,CAAI,CAAC,CAChH,EACC,OAAO,CAACC,EAAKZ,IAASY,EAAI,IAAIZ,EAAK,MAAM,MAAM,EAAG,IAAIpB,EAAI,CAAC,CAAC,EACzDiC,EAAUnB,EAAG,MAAM,KAAMoB,GAAQA,EAAI,UAAYJ,EAAe,CAAC,CAACZ,CAAS,CAAC,GAAG,OAG/EiB,EAAcN,EAAyB,GAAG,IAAI7B,EAAI,CAAC,CAAC,EACtD6B,EACAI,EACA,IAAIjC,EAAIiC,CAAO,EACf,IAAIjC,EAAI,CAAC,GAAK,IAAIA,EAAI,CAAC,EAErBoC,EAAgBlB,EAAYP,EAAU,YAAY,cAAgBA,EAAU,eAAe,cAE3F0B,EAAqBvB,EAAG,aAC3B,OACEM,GACCA,EAAK,MAAM,UAAYU,EAAe,CAAC,CAACZ,CAAS,IAC/CJ,EAAG,SAAW,YAAcM,EAAK,oBAAsBgB,GACtDtB,EAAG,SAAW,YAAcM,EAAK,oBAAsBgB,EAC9D,EACC,OAAO,CAACJ,EAAKZ,IAASY,EAAI,IAAIZ,EAAK,MAAM,EAAG,IAAIpB,EAAI,CAAC,CAAC,EACnDsC,EAAcV,EAChBO,EACAR,EACAU,EACAvB,EAAG,aAAa,SAAW,EAC3ByB,GAAezB,EAAG,MAAO,CAAC,CAACI,CAAS,EACpCqB,GAAezB,EAAG,aAAc,CAAC,CAACI,CAAS,EAC/C,OAAOV,EAAc,CAAE,OAAQ8B,GAAa,SAAS,EAAG,SAAUtB,EAAa,QAAS,CAAC,CAC3F,CAEA,SAASQ,GAAgB,CACvB,GAAAV,EACA,UAAAI,EACA,aAAAF,CACF,EAIQ,CACN,IAAMwB,EAAW1B,EAAG,cAChB,OAAQZ,GAAUA,EAAM,UAAY4B,EAAe,CAAC,CAACZ,CAAS,CAAC,EAChE,OAAO,CAACuB,EAAavC,IAAUuC,EAAY,IAAIvC,EAAM,MAAM,EAAG,IAAIF,EAAI,CAAC,CAAC,EAC3E,OAAOQ,EAAc,CAAE,OAAQgC,GAAU,SAAS,EAAG,SAAUxB,EAAa,QAAS,CAAC,CACxF,CAEA,SAASuB,GAAerC,EAAmCgB,EAAqC,CAC9F,OAAOhB,EACJ,OAAQwC,GAAWA,EAAO,UAAYZ,EAAeZ,CAAS,CAAC,EAC/D,OAAO,CAACuB,EAAaC,IAAWD,EAAY,IAAIC,EAAO,MAAM,EAAG,IAAI1C,EAAI,CAAC,CAAC,CAC/E,CAEA,SAAS8B,EAAeZ,EAA4B,CAClD,OAAOA,EAAYP,EAAU,YAAY,YAAcA,EAAU,eAAe,WAClF,CCnIA,MAAuF,uBACvF,OAAOX,MAAS,SAChB,OAAS,aAAAW,MAAiB,4BAC1B,OAAS,aAAAC,OAAmC,2BAGrC,SAAS+B,GAAyB,CACvC,GAAA7B,EACA,QAAAC,EACA,aAAAC,EACA,QAAAC,EACA,YAAAZ,EACA,UAAAa,CACF,EAOgB,CACd,IAAMC,EAAQ,IAAI,IAAIL,EAAG,cAAc,QAASM,GAASA,EAAK,SAAS,GAAK,CAAC,CAAC,EACxEC,EAAM,IAAI,IAAIP,EAAG,aAAa,QAASM,GAASA,EAAK,SAAS,GAAK,CAAC,CAAC,EAErEX,EAASa,GAAU,CACvB,GAAAR,EACA,UAAAI,EACA,aAAAF,CACF,CAAC,EACKO,EAAmBC,GAAgB,CAAE,UAAAN,EAAW,GAAAJ,EAAI,mBAAoBL,EAAQ,aAAAO,CAAa,CAAC,EAC9FS,EAAeV,EAAQ,YAAY,EAAE,WAAW,IAAI,EAAIA,EAAQ,MAAM,CAAC,EAAIA,EAC3EW,EAAWP,EAAM,IAAIM,CAAY,EAEvC,MAAO,CACL,KAAMX,EAAG,OACT,eAAgB,GAChB,WAAY,CAACY,EACb,WAAYA,EACZ,KAAM,CAAC,GAAGP,EAAM,OAAO,CAAC,EAAE,KAAK,GAAG,EAClC,GAAI,CAAC,GAAGE,EAAI,OAAO,CAAC,EAAE,KAAK,GAAG,EAC9B,SAAAK,EACA,UAAWZ,EAAG,UAAY,IAC1B,OAAQ,CACN,CACE,QAASE,EAAa,SAAS,SAAS,EACxC,KAAMA,EAAa,KACnB,OAAQA,EAAa,OACrB,KAAMJ,GAAU,OAChB,OAAQH,EAAO,SAAS,CAC1B,CACF,EACA,QAASc,EAAiB,SAAS,EACnC,aAAcnB,EAA4BC,GAAe,GAAIS,EAAG,OAAQ,IAAI,EAC5E,OAAQA,EAAG,OACX,QAASG,EAAQ,SAAS,CAC5B,CACF,CAEA,SAASK,GAAU,CACjB,GAAAR,EACA,UAAAI,EACA,aAAAF,CACF,EAIQ,CACN,IAAMW,EAAiB,CAAC,WAAY,UAAU,EAAE,SAASb,EAAG,MAAM,EAC5D8B,EAAgB1B,EAAYP,EAAU,YAAY,cAAgBA,EAAU,eAAe,cAC3F0B,EAAqBvB,EAAG,aAC3B,OACEM,GACCA,EAAK,MAAM,UAAYU,EAAe,CAAC,CAACZ,CAAS,IAC/CJ,EAAG,SAAW,YAAcM,EAAK,oBAAsBwB,GACtD9B,EAAG,SAAW,YAAcM,EAAK,oBAAsBwB,EAC9D,EACC,OAAO,CAACZ,EAAKZ,IAASY,EAAI,IAAIZ,EAAK,MAAM,MAAM,EAAG,IAAIpB,EAAI,CAAC,CAAC,EAEzD6C,EAAqB/B,EAAG,cAC3B,OAAQgC,GAAUA,EAAM,UAAYhB,EAAe,CAAC,CAACZ,CAAS,CAAC,EAC/D,OAAO,CAACuB,EAAaK,IAAUL,EAAY,IAAIK,EAAM,MAAM,EAAG,IAAI9C,EAAI,CAAC,CAAC,EAE3E,OAAOQ,EAAc,CAAE,QADNmB,EAAiBU,EAAqBQ,GACf,SAAS,EAAG,SAAU7B,EAAa,QAAS,CAAC,CACvF,CAEA,SAASQ,GAAgB,CACvB,UAAAN,EACA,GAAAJ,EACA,mBAAA+B,EACA,aAAA7B,CACF,EAKQ,CAIN,IAAMwB,EAHsB1B,EAAG,eAC5B,OAAQgC,GAAUA,EAAM,UAAYhB,EAAe,CAAC,CAACZ,CAAS,CAAC,EAC/D,OAAO,CAACuB,EAAaK,IAAUL,EAAY,IAAIK,EAAM,MAAM,EAAG,IAAI9C,EAAI,CAAC,CAAC,EACtC,MAAM6C,CAAkB,EAC7D,OAAOrC,EAAc,CAAE,OAAQgC,EAAS,SAAS,EAAG,SAAUxB,EAAa,QAAS,CAAC,CACvF,CAEA,SAASc,EAAeZ,EAA4B,CAClD,OAAOA,EAAYP,EAAU,YAAY,YAAcA,EAAU,eAAe,WAClF,CHlGO,IAAMoC,GAAwB,MAAO,CAC1C,QAAAhC,EACA,cAAAiC,EACA,OAAAC,EACA,QAAAC,EACA,eAAAC,CACF,IAAgH,CAC9G,GAAM,CAAE,UAAAjC,EAAW,aAAAF,EAAc,YAAAX,EAAa,QAAAY,CAAQ,EAAIiC,EAE1D,GAAI,CADcC,EAAe,UAAU,EAEzC,MAAO,CACL,aAAc,CAAC,EACf,cAAe,EACjB,EAGF,IAAMC,EAAW,MAAMD,EAAe,qCAAqC,CACzE,UAAWpC,EACX,aAAcsC,GAAyBtC,CAAO,EAC9C,QAASG,EAAYrB,GAAQ,KAAOA,GAAQ,QAC5C,SAAUoD,EACV,UAAWD,EACX,UAAWlD,GAAU,IACvB,CAAC,EAEGwD,EAA8B,CAAC,EACnC,OAAIrD,GAAqBmD,CAAQ,IAC/BE,EAAeF,EAAS,aAAa,IAAKlD,GACxCW,GAAyB,CAAE,GAAIX,EAAO,UAAAgB,EAAW,QAAAH,EAAS,aAAAC,EAAc,YAAAX,EAAa,QAAAY,CAAQ,CAAC,CAChG,GAEEd,GAAqBiD,CAAQ,IAC/BE,EAAeF,EAAS,aAAa,IAAKlD,GACxCyC,GAAyB,CAAE,GAAIzC,EAAO,UAAAgB,EAAW,QAAAH,EAAS,aAAAC,EAAc,YAAAX,EAAa,QAAAY,CAAQ,CAAC,CAChG,GAGK,CACL,aAAAqC,EACA,cAAeF,EAAS,aAC1B,CACF,EAEMC,GAA4BtC,GAGXA,EAAQ,MAAM,GAAG,EAAE,CAAC,GACvB,YAAY,EAAE,WAAW,IAAI,EACtCnB,GAAa,QAEfA,GAAa,QIzDtB,OAAS,eAAA2D,OAAmB,2BAOrB,IAAMC,GAAe,CAC1B,cAAe,mCACf,YAAa,gCACf,EAEaC,GAAc,CACzB,cAAe,uCACf,YAAa,oCACf,EAEaC,GAAUC,GAAkC,CACvD,OAAQA,EAAa,CACnB,KAAKJ,GAAY,WACf,OAAOC,GACT,KAAKD,GAAY,IACf,OAAOE,EACX,CACF,ECxBA,OAEE,WAAAG,OAUK,uBAEP,IAAMC,EAAN,cAAoC,KAAM,CAA1C,kCACEC,EAAA,KAAS,UAAU,0CACrB,EAEaC,EAAN,KAA8B,CAInC,YAAY,CAAE,cAAAC,CAAc,EAA8B,CAH1DF,EAAA,mBACAA,EAAA,wBAAmB,IAMnBA,EAAA,iBAAY,IAAe,KAAK,kBAH9B,KAAK,WAAa,IAAIF,GAAQ,CAAE,KAAMI,CAAc,CAAC,CACvD,CAIA,uBAA8B,CAC5B,KAAK,iBAAmB,GACxB,WACE,IAAM,CACJ,KAAK,iBAAmB,EAC1B,EACA,EAAI,GAAK,GACX,CACF,CAEA,MAAM,qCAAqCC,EAUyE,CAClH,GAAI,CACF,OAAO,KAAK,WAAW,2BAA2B,qCAAqCA,CAAM,CAC/F,OAASC,EAAO,CACd,MAAIA,aAAiBL,GACnB,KAAK,sBAAsB,EAEvBK,CACR,CACF,CAEA,MAAM,gBAAgBD,EAKkF,CACtG,GAAI,CACF,OAAO,KAAK,WAAW,uBAAuB,uBAAuBA,CAAM,CAC7E,OAASC,EAAO,CACd,MAAIA,aAAiBL,GACnB,KAAK,sBAAsB,EAEvBK,CACR,CACF,CACF,EC1EA,OACE,kBAAAC,EACA,yBAAAC,GACA,eAAAC,GACA,oBAAAC,OAEK,8BCsBA,IAAMC,GAAQ,MAAU,CAC7B,UAAAC,EACA,UAAAC,EACA,WAAAC,EAAa,GACb,cAAAC,EAAgBC,EAAmB,YAAY,CACjD,IAAkC,CAChC,IAAIC,EAAsB,EACtBC,EAAU,EACVC,EAEJ,KAAOD,EAAUJ,GAAY,CACvBI,EAAU,GACZ,MAAME,GAAMH,CAAmB,EAGjC,GAAI,CACF,IAAMI,EAAS,MAAMT,EAAUM,CAAO,EAEtC,GAAIL,EAAUQ,CAAM,EAClB,OAAOA,CAEX,OAASC,EAAK,CAEZH,EAAYG,CACd,CAEAL,EAAsBF,EAAcG,CAAO,EAC3CA,GACF,CAEA,IAAMK,EAAeJ,EAAY,uBAAuBA,CAAS,GAAK,sBAEtE,MAAM,IAAI,MAAMI,CAAY,CAC9B,EAIaP,EAAN,KAAyB,CAC9B,OAAO,aAA2C,CAChD,OAAQQ,GACC,KAAK,IAAI,EAAGA,CAAU,EAAI,GAErC,CAEA,OAAO,SAASC,EAAqD,CACnE,OAAQC,GACCD,EAAiB,GAE5B,CAEA,OAAO,WAAWE,EAAgD,CAChE,OAAQD,GACCC,CAEX,CACF,EAEA,SAASP,GAAMQ,EAAY,CACzB,OAAO,IAAI,QAASC,GAAM,WAAWA,EAAGD,CAAE,CAAC,CAC7C,CC9EO,IAAME,EACXlB,GAEOD,GAAM,CACX,UAAYa,GAAuBZ,EAAUY,EAAa,CAAC,EAC3D,WAAY,EACZ,cAAeR,EAAmB,SAAS,CAAC,EAC5C,UAAYxB,GACWA,GAAoB,QACrB,aAAe,GAEvC,CAAC,ECpBI,SAASuC,GAAQC,EAAmB,CACzC,IAAIC,EACFC,EAAM,EACR,IAAKD,EAAI,EAAGA,EAAID,EAAE,OAAQC,IACxBC,GAAOF,EAAE,WAAWC,CAAC,GAAKA,EAAI,GAEhC,OAAOC,CACT,CCJO,SAASC,EAAUC,EAAyB,CACjD,IAAIH,EACFC,EAAM,EACR,IAAKD,EAAI,EAAGA,EAAIG,EAAM,OAAQH,IAAK,CACjC,IAAMI,EAAKN,GAAQK,EAAMH,CAAC,GAAK,EAAE,EACjCC,EAAMA,EAAM,MAAQG,CACtB,CACA,OAAQ,GAAKH,GAAK,MAAM,EAAG,EAAE,CAC/B,CCXA,OAAS,UAAAI,OAAc,eACvB,OAAS,gCAAAC,GAA8B,6BAAAC,OAAiC,2BACxE,OAAS,WAAAC,EAAS,UAAAC,MAAc,MAEzB,IAAMC,EAAwBC,GACnC,IAAIN,GACF,GAAGM,CAAW,mBACd,CACE,CACE,OAAQ,OACR,KAAM,gBACN,WAAY,CACV,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQF,EAAO,CAAE,EAC/C,CAAE,KAAM,gBAAiB,KAAM,QAAS,OAAQA,EAAO,CAAE,EACzD,CACE,KAAM,qBACN,KAAM,QACN,OAAQA,EAAO,EAAE,SAAS,CAC5B,EACA,CACE,KAAM,mBACN,KAAM,QACN,OAAQA,EAAO,EAAE,SAAS,CAC5B,EACA,CACE,KAAM,sBACN,KAAM,QACN,OAAQA,EAAO,EAAE,SAAS,CAC5B,EACA,CACE,KAAM,0BACN,KAAM,QACN,OAAQA,EAAO,EAAE,SAAS,CAC5B,CACF,EACA,MAAO,cACP,SAAUH,EACZ,EACA,CACE,OAAQ,OACR,KAAM,0BACN,WAAY,CACV,CAAE,KAAM,KAAM,KAAM,OAAQ,OAAQG,EAAO,CAAE,EAC7C,CAAE,KAAM,qBAAsB,KAAM,QAAS,OAAQA,EAAO,EAAE,MAAM,CAAE,EACtE,CAAE,KAAM,gBAAiB,KAAM,QAAS,OAAQA,EAAO,EAAE,MAAM,CAAE,EACjE,CACE,KAAM,qBACN,KAAM,QACN,OAAQD,EAAQ,EAAE,SAAS,CAC7B,EACA,CACE,KAAM,mBACN,KAAM,QACN,OAAQA,EAAQ,EAAE,SAAS,CAC7B,EACA,CACE,KAAM,sBACN,KAAM,QACN,OAAQA,EAAQ,EAAE,SAAS,CAC7B,CACF,EACA,MAAO,iCACP,SAAUD,EACZ,CACF,EACA,CACE,YAAa,CACX,QAAS,CACP,eAAgB,kBAClB,CACF,CACF,CACF,EL5DF,IAAMK,GAAuBrC,GAAsB,EAZnDsC,EAAAC,EAcaC,EAAN,KAAmB,CAIxB,YAAY,CAAE,QAAAC,EAAS,YAAAL,CAAY,EAA+C,CAHlFM,EAAA,KAAAJ,EAAA,QACAI,EAAA,KAAAH,EAAA,QAuJA7C,EAAA,KAAQ,+BAA+B,CACrCiD,EACAC,EAAa,CAAC7C,EAAe,GAAG,IACR,CACxB,IAAM8C,EAAqC,CAAC,EAC5C,cAAO,KAAKF,CAAI,EAAE,QAASG,GAAO,CAChC,IAAMC,EAAYJ,EAAKG,CAAE,EACzBD,EAAcC,CAAE,EAAI,CAAC,EACrBF,EAAW,QAASI,GAA6B,CAC/CH,EAAcC,CAAE,EAAI,CAClB,CAACE,CAAQ,EAAG,CACV,MAAOD,IAAYC,CAAQ,EAC3B,SAAUD,IAAY,GAAGC,CAAQ,aAAa,EAC9C,MAAOD,IAAY,GAAGC,CAAQ,UAAU,EACxC,UAAWD,IAAY,GAAGC,CAAQ,aAAa,CACjD,CACF,CACF,CAAC,CACH,CAAC,EACMH,CACT,GAxKEI,EAAA,KAAKX,EAAWG,GAChBQ,EAAA,KAAKV,EAAeH,EACtB,CAOA,MAAM,eAAe,CACnB,QAAAc,EAAU,CAAC,EACX,WAAAN,EAAa,CAAC7C,EAAe,GAAG,CAClC,EAAgE,CAC9D,IAAI4C,EAIEQ,EAAU,kBAFJD,EAAU,GAAGvB,EAAUuB,CAAO,CAAC,IAAIN,EAAW,SAAS,CAAC,GAAK,GAAGA,EAAW,SAAS,CAAC,EAE5D,GAIrC,GAFAD,EAAOS,EAAA,KAAKd,IAAU,MAA2Ba,CAAO,EAEpDR,EAAM,OAAOA,EAEjB,GAAI,CACFA,EAAO,MAAMrB,EAAgB+B,GAC3B,KAAK,YAAY,CACf,QAAAH,EACA,WAAAN,EACA,UAAW,GACX,MAAO,GACP,SAAU,GACV,kBAAAS,CACF,CAAC,CACH,CACF,MAAQ,CACNV,EAAO,MACT,CACA,OAAAS,EAAA,KAAKd,IAAU,MAAMa,EAASR,CAAI,EAC3BA,CACT,CASA,MAAM,qBACJW,EACAC,EACAP,EAA2BjD,EAAe,IACA,CAC1C,IAAI4C,EAIEQ,EAAU,sCAFJ,GAAGxB,EAAU2B,CAAc,CAAC,IAAIC,CAAe,IAAIP,CAAQ,EAEd,GAGzD,GAFAL,EAAOS,EAAA,KAAKd,IAAU,MAA2Ba,CAAO,EAEpDR,EAAM,OAAOA,EAEjB,GAAI,CACFA,EAAO,MAAMrB,EAAgB+B,GAC3B,KAAK,uBAAuB,CAC1B,gBAAAE,EACA,eAAAD,EACA,SAAAN,EACA,kBAAAK,CACF,CAAC,CACH,CACF,MAAQ,CACNV,EAAO,MACT,CACA,OAAAS,EAAA,KAAKd,IAAU,MAAMa,EAASR,CAAI,EAC3BA,CACT,CAEA,MAAc,uBAAuB,CACnC,gBAAAY,EACA,eAAAD,EACA,SAAAN,EAAWjD,EAAe,IAC1B,kBAAAsD,EAAoB,EACtB,EAKiC,CAC/B,OAAIA,EACKlB,EAAqBiB,EAAA,KAAKb,EAAY,EAAE,+BAA+B,OAAW,CACvF,OAAQ,CACN,GAAIgB,CACN,EACA,QAAS,CACP,mBAAoBD,EACpB,cAAe,CAACN,CAAQ,EACxB,mBAAoB,GACpB,iBAAkB,GAClB,oBAAqB,EACvB,CACF,CAAC,EAGI9C,GAAiBmC,GAAsB,CAC5C,gBAAAkB,EACA,eAAAD,EACA,WAAY,CAACN,CAAQ,EACrB,UAAW,GACX,MAAO,GACP,SAAU,EACZ,CAAC,CACH,CAEA,MAAc,YAAY,CACxB,QAAAE,EAAU,CAAC,EACX,WAAAN,EAAa,CAAC7C,EAAe,GAAG,EAChC,UAAAyD,EAAY,GACZ,MAAAC,EAAQ,GACR,SAAAC,EAAW,GACX,YAAAC,EAAc,GACd,kBAAAN,EAAoB,GACpB,YAAAO,EAAc,EAChB,EAAsF,CACpF,GAAIP,EAAmB,CACrB,IAAMQ,EAAU,MAAM1B,EAAqBiB,EAAA,KAAKb,EAAY,EAAE,YAAY,OAAW,CACnF,QAAS,CACP,IAAKW,GAAS,KAAK,GAAG,EACtB,cAAeN,EAAW,KAAK,GAAG,EAClC,mBAAoB,OAAOY,CAAS,EACpC,iBAAkB,OAAOC,CAAK,EAC9B,oBAAqB,OAAOC,CAAQ,EACpC,wBAAyB,OAAOC,CAAW,CAC7C,CACF,CAAC,EACD,OAAO,KAAK,6BAA6BE,EAASjB,CAAU,CAC9D,CACA,OAAO3C,GAAYoC,GAAsB,CACvC,QAAAa,EACA,WAAAN,EACA,UAAAY,EACA,MAAAC,EACA,SAAAC,EACA,YAAAC,EACA,YAAAC,CACF,CAAC,CACH,CAuBF,EA7KEtB,EAAA,YACAC,EAAA,YMhBF,OACE,iBAAAuB,OAIK,2BAEP,OACE,gBAAAtI,GACA,WAAAC,OAGK,uBAEP,MAA+B,8BCZxB,IAAMsI,GAAmBC,GACvB,OAAO,KAAKA,CAAa,EAAE,SAAS,kBAAkB,EAGlDC,GAAmBD,GACvB,OAAO,KAAKA,CAAa,EAAE,SAAS,QAAQ,EAG9C,SAASE,EAAsBC,EAA+C,CACnF,IAAMzC,EAAM,OAAO,OAAOyC,CAAK,EAAE,OAAO,SAAUC,EAAUC,EAAU,CACpE,IAAMC,EAAUD,EAAS,OAAO,SAAUE,EAASvH,EAAM,CACvD,IAAMwH,EAAe,OAAOxH,EAAK,MAAM,EACvC,OAAOuH,EAAUC,CACnB,EAAG,CAAC,EAEJ,OAAOJ,EAAWE,CACpB,EAAG,CAAC,EAEJ,OAAO,OAAO5C,CAAG,CACnB,CAEO,SAAStF,EAAcE,EAAkBD,EAAiB,CAC/D,OAAOA,IAAW,OAAY,EAAIA,EAAS,IAAMC,CACnD,CCxBA,OAAS,aAAAmI,OAAiB,0BAE1B,OAA4B,aAAAjI,OAA2C,2BAEhE,IAAMkI,GAAuB,CAAC,CACnC,QAAAC,EACA,aAAA/H,EACA,gBAAAgI,EACA,UAAApB,EACA,MAAAC,EACA,SAAAC,EACA,YAAAmB,CACF,IAQ2B,CACzB,IAAMvI,EAAWM,EAAa,SACxBkI,EAAyC,CAAC,EAE1CC,EAAwD,CAC5D,iBAAkBJ,EAAQ,iBAC1B,eAAgBA,EAAQ,eACxB,cAAeA,EAAQ,cACvB,aAAcA,EAAQ,aACtB,gBAAiBA,EAAQ,gBACzB,eAAgBA,EAAQ,eACxB,mBAAoBA,EAAQ,mBAC5B,qBAAsBA,EAAQ,oBAChC,EAEA,QAAWK,KAAeD,EAAc,CACtC,IAAME,EAAgBF,EAAaC,CAAW,EAC9C,GAAI,CAACC,GAAiB,CAACA,EAAc,OAAQ,CAC3CH,EAAeE,CAAW,EAAI,EAC9B,QACF,CAEAC,EAAc,QAASC,GAAgC,CAErD,IAAMC,IADkBL,EAAeE,CAAW,GAAK,GAClB,OAAOE,EAAK,MAAM,EACvDJ,EAAeE,CAAW,EAAIG,EAChC,CAAC,CACH,CAEA,IAAMC,EAAY,IAAIX,GACpBK,EAAe,iBAAsBA,EAAe,iBAAsB,GAC1ElI,EAAa,SACbA,EAAa,MACf,EACMyI,EAAsBT,EAAkB,OAAOQ,EAAU,IAAIR,CAAe,EAAE,UAAU,CAAC,CAAC,EAAI,OAC9FU,EAAwBF,EAAU,UAAU,EAC5CG,EAAe,IAAId,GAAUP,EAAsBS,CAAO,EAAG/H,EAAa,SAAUA,EAAa,MAAM,EACvG4I,EAAoBZ,EAAkB,OAAOW,EAAa,IAAIX,CAAe,EAAE,UAAU,CAAC,CAAC,EAAI,OAC/Fa,EAAsBF,EAAa,UAAU,EAEnD,MAAO,CACL,GAAG3I,EACH,KAAMJ,GAAU,OAChB,gBAAAoI,EACA,QAASW,EAAa,UAAU,EAChC,kBAAAC,EACA,oBAAAC,EACA,4BAA6BD,GAAmB,QAAQ,CAAC,EACzD,UAAWJ,EAAU,UAAU,EAC/B,oBAAAC,EACA,sBAAAC,EACA,8BAA+BD,GAAqB,QAAQ,CAAC,EAC7D,MAAOV,EACP,eAAgB,CACd,aAAcvI,EAAcE,EAAUwI,EAAe,YAAe,EACpE,gBAAiB1I,EAAcE,EAAUwI,EAAe,eAAkB,EAC1E,eAAgB1I,EAAcE,EAAUwI,EAAe,cAAiB,EACxE,mBAAoB1I,EAAcE,EAAUwI,EAAe,kBAAqB,EAChF,qBAAsB1I,EAAcE,EAAUwI,EAAe,oBAAuB,EACpF,iBAAkB1I,EAAcE,EAAUwI,EAAe,gBAAmB,EAC5E,eAAgB1I,EAAcE,EAAUwI,EAAe,cAAiB,EACxE,cAAe1I,EAAcE,EAAUwI,EAAe,aAAgB,CACxE,EACA,UAAAtB,EACA,MAAAC,EACA,SAAAC,EACA,YAAAmB,CACF,CACF,ECxFA,OAAS,aAAAJ,OAAiB,0BAE1B,OAAS,aAAAjI,OAA8D,2BAEhE,IAAMkJ,GAAuB,CAAC,CACnC,QAAAf,EACA,aAAA/H,EACA,gBAAAgI,EACA,UAAApB,EACA,MAAAC,EACA,SAAAC,EACA,YAAAmB,CACF,IAQ2B,CACzB,IAAMvI,EAAWM,EAAa,SACxBkI,EAAyC,CAAC,EAE1CC,EAAwD,CAC5D,SAAUJ,EAAQ,SAClB,OAAQA,EAAQ,OAChB,qBAAsBA,EAAQ,qBAC9B,mBAAoBA,EAAQ,kBAC9B,EAEA,QAAWK,KAAeD,EAAc,CACtC,IAAME,EAAgBF,EAAaC,CAAW,EAC9C,GAAI,CAACC,GAAiB,CAACA,EAAc,OAAQ,CAC3CH,EAAeE,CAAW,EAAI,EAC9B,QACF,CAEAC,EAAc,QAASC,GAAgC,CAErD,IAAMC,GADkBL,EAAeE,CAAW,GAAK,GAClB,OAAOE,EAAK,MAAM,EACvDJ,EAAeE,CAAW,EAAIG,CAChC,CAAC,CACH,CAEA,IAAMI,EAAe,IAAId,GAAUP,EAAsBS,CAAO,EAAG/H,EAAa,SAAUA,EAAa,MAAM,EACvG6I,EAAsBF,EAAa,UAAU,EAC7CI,EAA8Bf,EAAkBW,EAAa,IAAIX,CAAe,EAAE,UAAU,CAAC,EAAI,OACjGY,EAAoBG,EACtB,OAAOA,EAA4B,WAAW,IAAK,EAAE,CAAC,EACtD,OAEJ,MAAO,CACL,GAAG/I,EACH,YAAAiI,EACA,KAAMrI,GAAU,OAChB,gBAAAoI,EACA,QAASW,EAAa,UAAU,EAChC,kBAAAC,EACA,oBAAAC,EACA,4BAAAE,EACA,MAAOhB,EACP,eAAgB,CACd,SAAUvI,EAAcE,EAAUwI,EAAe,QAAW,EAC5D,OAAQ1I,EAAcE,EAAUwI,EAAe,MAAS,EACxD,qBAAsB1I,EAAcE,EAAUwI,EAAe,oBAAuB,EACpF,mBAAoB1I,EAAcE,EAAUwI,EAAe,kBAAqB,CAClF,EACA,UAAAtB,EACA,MAAAC,EACA,SAAAC,CACF,CACF,EHpDO,IAAMkC,GAAc,MAAO,CAChC,UAAAC,EACA,SAAA7C,EACA,QAAAlE,EACA,eAAAC,EACA,aAAA+G,CACF,IAG6C,CAE3C,GAAI,CADc/G,EAAe,UAAU,EAEzC,OAAO,QAAQ,OAAO,wCAAwC,EAGhE,IAAMgH,EAAoB/C,EAAS,YAAY,EACzCrG,EAAUkJ,EAAU,CAAC,GAAK,GAC1BjJ,EAAekC,EAAQ,aACvB+F,EAAc/F,EAAQ,kBAAkB,UAAU,cAElDkH,EAAelH,EAAQ,SAAWgF,GAAc,IAAMtI,GAAa,QAAUA,GAAa,QAC1FyK,EAAcnH,EAAQ,UAAYrD,GAAQ,KAAOA,GAAQ,QAEzDyK,EAAgB,MAAMnH,EACzB,gBAAgB,CACf,aAAAiH,EACA,QAASC,EACT,UAAWJ,EAAU,KAAK,GAAG,CAC/B,CAAC,EACA,KAAM/J,GAAWA,EAAkE,QAAQ,EAExFqK,EAAsBtB,EACxB,MAAMiB,EAAa,eAAe,CAChC,QAAS,CAACjB,CAAW,EACrB,WAAY,CAACkB,CAAiB,CAChC,CAAC,EACD,CAAC,EAECnB,EAAkBuB,IAAsBtB,GAAe,EAAE,IAAIkB,CAAiB,GAAG,OAAS,OAC1FvC,EAAY2C,IAAsBtB,GAAe,EAAE,IAAIkB,CAAiB,GAAG,WAAa,OACxFtC,EAAQ0C,IAAsBtB,GAAe,EAAE,IAAIkB,CAAiB,GAAG,OAAS,OAChFrC,EAAWyC,IAAsBtB,GAAe,EAAE,IAAIkB,CAAiB,GAAG,UAAY,OAExFpB,EACJ,OAAIZ,GAAgBmC,CAAa,GAC/BvB,EAAUD,GAAqB,CAC7B,QAASwB,EACT,aAAAtJ,EACA,gBAAAgI,EACA,UAAApB,EACA,MAAAC,EACA,SAAAC,EACA,YAAamB,GAAe,EAC9B,CAAC,EAEM,CACL,CAAClI,CAAO,EAAG,CACT,CAACC,EAAa,MAAM,EAAG+H,CACzB,CACF,GAGEV,GAAgBiC,CAAa,GAC/BvB,EAAUe,GAAqB,CAC7B,QAASQ,EACT,aAAAtJ,EACA,gBAAAgI,EACA,UAAApB,EACA,MAAAC,EACA,SAAAC,EACA,YAAamB,GAAe,EAC9B,CAAC,EACM,CACL,CAAClI,CAAO,EAAG,CACT,CAACC,EAAa,MAAM,EAAG+H,CACzB,CACF,GAEK,QAAQ,OAAO,kDAAkD,CAC1E,EIpGA,OAAOyB,OAAY,SAGZ,SAASC,GAAiB,CAAE,aAAAL,EAAc,UAAAlJ,CAAU,EAA0D,CACnH,IAAMwJ,EAAyBxJ,EAAY,OAASkJ,EAAeA,EAC7DO,EAASH,GAAO,WAAW,QAAQ,EAAE,OAAOE,CAAsB,EAAE,OAAO,QAAQ,EAEzF,MAAO,QADME,GAAyBD,CAAM,EAAE,UAAU,EAAG,EAAE,CAE/D,CAEA,IAAMC,GAA4BD,GAAmBA,EAAO,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,KAAM,EAAE,ECTpH,OAAS,aAAAhK,MAAiB,4BAC1B,OAAS,iBAAAuH,GAAe,cAAA2C,MAAkB,2BAC1C,OAAS,aAAApL,OAAiB,uBAInB,IAAMqL,GAAa,MAAO,CAC/B,aAAAC,EACA,UAAA7J,EACA,OAAA8J,EACA,WAAAC,CACF,IAA+C,CAC7C,GAAID,IAAW,OACb,MAAMvL,GAAU,cAAc,mCAAmC,EAGnE,IAAMyL,EAAShK,EACXP,EAAU,gBAAgB,uBAAuB,EACjDA,EAAU,gBAAgB,0BAA0B,EACpDwK,EAEJ,OAAQF,EAAY,CAClB,KAAKJ,EAAW,SAChB,KAAKA,EAAW,OAChB,KAAKA,EAAW,SAAU,CAExBM,EAAQxK,EAAU,4BAA4BqK,EAAQD,CAAY,EAClE,KACF,CACA,KAAKF,EAAW,WAChB,KAAKA,EAAW,SAAU,CACxBM,EAAQ,OAAO,KAAKH,EAAQ,KAAK,EACjC,KACF,CACA,QACE,MAAMvL,GAAU,cAAc,4BAA4BwL,CAAU,EAAE,CAC1E,CAEA,MAAO,CACL,CAAC/C,GAAc,GAAG,EAAGgD,EAAO,WAAWC,EAAO,GAAG,EACjD,CAACjD,GAAc,GAAG,EAAGgD,EAAO,WAAWC,EAAO,GAAG,CACnD,CACF,EpB3CA,IAAAC,EAAAzE,EAyBa0E,GAAN,KAAwC,CAI7C,YAAY,CAAE,YAAA1H,CAAY,EAAiC,CAH3DmD,EAAA,KAAAsE,EAAA,QACAtE,EAAA,KAAAH,EAAA,QAGE,GAAM,CAAE,cAAA3C,EAAe,YAAAwC,CAAY,EAAI9C,GAAOC,CAAW,EACzD0D,EAAA,KAAK+D,EAAkB,IAAIrH,EAAwB,CAAE,cAAAC,CAAc,CAAC,GACpEqD,EAAA,KAAKV,EAAeH,EACtB,CAEA,WAAW,CAAE,aAAAuE,EAAc,OAAAC,EAAQ,UAAA9J,EAAW,WAAA+J,CAAW,EAAkD,CACzG,OAAOH,GAAW,CAAE,aAAAC,EAAc,OAAAC,EAAQ,UAAA9J,EAAW,WAAA+J,CAAW,CAAC,CACnE,CAEA,YAAY,CAAE,UAAAhB,EAAW,QAAA/G,EAAS,QAAA2D,EAAS,SAAAO,CAAS,EAAoD,CACtG,IAAM8C,EAAe,IAAItD,EAAa,CAAE,QAAAC,EAAS,YAAaW,EAAA,KAAKb,EAAa,CAAC,EACjF,OAAOqD,GAAY,CAAE,UAAAC,EAAW,SAAA7C,EAAU,QAAAlE,EAAS,eAAgBsE,EAAA,KAAK4D,GAAiB,aAAAlB,CAAa,CAAC,CACzG,CAEA,aAAoC,CAClC,IAAMjF,EAASzF,GAAcE,CAAY,EACzC,OAAOuF,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,cAAcK,EAAkC,CAC9C,OAAO3F,EAAc,CACvB,CAEA,sBAAsB,CAAE,QAAAuD,EAAS,QAAAnC,EAAS,cAAAiC,EAAe,OAAAC,CAAO,EAA0B,CACxF,OAAOF,GAAsB,CAAE,QAAAG,EAAS,QAAAnC,EAAS,cAAAiC,EAAe,OAAAC,EAAQ,eAAgBuE,EAAA,KAAK4D,EAAgB,CAAC,CAChH,CAEA,UAAU9F,EAAY,CACpB,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAC3B,CAEA,MAAM,aAAagG,EAAqBC,EAAmB,CACzD,OAAQD,EAAQ,OAAQ,CACtB,QACE,MAAO,CAAE,MAAO7L,GAAU,mBAAmB,UAAU6L,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CAEA,OAAO,sBAAsB,CAAE,aAAAlB,EAAc,UAAAlJ,CAAU,EAA0D,CAC/G,OAAOuJ,GAAiB,CAAE,aAAAL,EAAc,UAAAlJ,CAAU,CAAC,CACrD,CACF,EA7CEkK,EAAA,YACAzE,EAAA,YqBzBK,IAAM6E,GAAyBC,GAC7B,mBAAoBA,GAAS,qBAAsBA,EAAM,eAGrDC,GAAyBD,GAC7B,mBAAoBA,GAAS,aAAcA,EAAM","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n GetBalancesParams,\n GetBalancesResponse,\n Environment,\n GetAddressParams,\n GetAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { getEnv } from './env';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { TokenService } from '@internal/utils';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\nimport { getAddress } from './handlers/get-address/get-address';\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n\n constructor({ environment }: { environment: Environment }) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#glacierService = new AvalancheGlacierService({ glacierApiUrl });\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpubXP, isTestnet, walletType });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl });\n return getBalances({ addresses, currency, network, glacierService: this.#glacierService, tokenService });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return getNetworkFee();\n }\n\n getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory) {\n return getTransactionHistory({ network, address, nextPageToken, offset, glacierService: this.#glacierService });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, _network: Network) {\n switch (request.method) {\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n static getHashedBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n return hashBlockchainId({ blockchainId, isTestnet });\n }\n}\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo\",\n \"avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG\",\n \"avax:imji8papUf2EhV3le337w1vgFauqkJg-\",\n \"avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n}\n","import type { GetTransactionHistory, Transaction, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { BlockchainId, Network, SortOrder } from '@avalabs/glacier-sdk';\nimport { isPChainTransactions, isXChainTransactions } from './utils';\nimport { convertPChainTransaction } from './convert-p-chain-transaction';\nimport { convertXChainTransaction } from './convert-x-chain-transaction';\nimport type { AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getTransactionHistory = async ({\n address,\n nextPageToken,\n offset,\n network,\n glacierService,\n}: GetTransactionHistory & { glacierService: AvalancheGlacierService }): Promise<TransactionHistoryResponse> => {\n const { isTestnet, networkToken, explorerUrl, chainId } = network;\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n const response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: isTestnet ? Network.FUJI : Network.MAINNET,\n pageSize: offset,\n pageToken: nextPageToken,\n sortOrder: SortOrder.DESC,\n });\n\n let transactions: Transaction[] = [];\n if (isPChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertPChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n if (isXChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertXChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n};\n\nconst getBlockchainIdByAddress = (address: string) => {\n // A comma separated list of X-Chain or P-Chain wallet addresses,\n // starting with \"avax\"/\"fuji\", \"P-avax\"/\"P-fuji\" or \"X-avax\"/\"X-fuji\"\n const firstAddress = address.split(',')[0];\n if (firstAddress?.toLowerCase().startsWith('p-')) {\n return BlockchainId.P_CHAIN;\n }\n return BlockchainId.X_CHAIN;\n};\n","import {\n PrimaryNetworkChainName,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainTransactionsResponse,\n type ListXChainTransactionsResponse,\n} from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\n\nexport const isPChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListPChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.P_CHAIN;\n};\n\nexport const isXChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListXChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.X_CHAIN;\n};\n\nexport function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n\nexport function getTokenValue({ amount, decimals }: { decimals: number; amount?: number }): Big {\n return amount === undefined ? new Big(0) : new Big(amount / 10 ** decimals);\n}\n","import { type PChainTransaction, type NetworkToken } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertPChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: PChainTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl?: string;\n isTestnet?: boolean;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n });\n\n const avaxBurnedAmount = getBurnedAmount({ tx, isTestnet, networkToken });\n const chainAddress = address.toLowerCase().startsWith('p-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.blockTimestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n froms: Set<string>;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const isBaseTx = tx.txType === 'BaseTx';\n\n const nonChangeEmittedUtxosAmt = tx.emittedUtxos\n .filter(\n (utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && !utxo.addresses.some((addr) => froms.has(addr)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n const txValue = tx.value.find((val) => val.assetId === getAvaxAssetId(!!isTestnet))?.amount;\n // This ternary attempts to cover the case where users send themselves AVAX\n // in which case the senders are the recipients and we should use the total tx value.\n const baseTxValue = nonChangeEmittedUtxosAmt.gt(new Big(0))\n ? nonChangeEmittedUtxosAmt\n : txValue\n ? new Big(txValue)\n : new Big(0) ?? new Big(0);\n\n const pBlockchainId = isTestnet ? Avalanche.FujiContext.pBlockchainID : Avalanche.MainnetContext.pBlockchainID;\n\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === pBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== pBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.amount), new Big(0));\n const nAvaxAmount = isBaseTx\n ? baseTxValue\n : isImportExport\n ? importExportAmount\n : tx.amountStaked.length === 0\n ? aggregateValue(tx.value, !!isTestnet)\n : aggregateValue(tx.amountStaked, !!isTestnet);\n return getTokenValue({ amount: nAvaxAmount?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const nAvaxFee = tx.amountBurned\n ?.filter((value) => value.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, value) => accumulator.add(value.amount), new Big(0));\n return getTokenValue({ amount: nAvaxFee?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction aggregateValue(value: PChainTransaction['value'], isTestnet: boolean): Big | undefined {\n return value\n .filter((value_) => value_.assetId === getAvaxAssetId(isTestnet))\n .reduce((accumulator, value_) => accumulator.add(value_.amount), new Big(0));\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { type NetworkToken, XChainNonLinearTransaction, XChainLinearTransaction } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertXChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n isTestnet?: boolean;\n explorerUrl?: string;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, totalAmountCreated: amount, networkToken });\n const chainAddress = address.toLowerCase().startsWith('x-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.timestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === xBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== xBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n\n const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxAmt = isImportExport ? importExportAmount : totalAmountCreated;\n return getTokenValue({ amount: nAvaxAmt.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n totalAmountCreated,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n totalAmountCreated: Big;\n networkToken: NetworkToken;\n}): Big {\n const totalAmountUnlocked = tx.amountUnlocked\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxFee = totalAmountUnlocked.minus(totalAmountCreated);\n return getTokenValue({ amount: nAvaxFee.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n BlockchainId,\n Glacier,\n type ListCChainAtomicBalancesResponse,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainBalancesResponse,\n type ListPChainTransactionsResponse,\n type ListXChainBalancesResponse,\n type ListXChainTransactionsResponse,\n Network,\n PrimaryNetworkTxType,\n SortOrder,\n} from '@avalabs/glacier-sdk';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class AvalancheGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n\n constructor({ glacierApiUrl }: { glacierApiUrl: string }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl });\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async listLatestPrimaryNetworkTransactions(params: {\n blockchainId: BlockchainId;\n network: Network;\n addresses?: string;\n txTypes?: Array<PrimaryNetworkTxType>;\n startTimestamp?: number;\n endTimestamp?: number;\n pageToken?: string;\n pageSize?: number;\n sortOrder?: SortOrder;\n }): Promise<ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse> {\n try {\n return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getChainBalance(params: {\n blockchainId: BlockchainId;\n network: Network;\n blockTimestamp?: number;\n addresses?: string;\n }): Promise<ListPChainBalancesResponse | ListXChainBalancesResponse | ListCChainAtomicBalancesResponse> {\n try {\n return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n return coingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses(undefined, {\n params: {\n id: assetPlatformId,\n },\n queries: {\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n },\n });\n }\n\n return simpleTokenPrice(coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await coingeckoProxyClient(this.#proxyApiUrl).simplePrice(undefined, {\n queries: {\n ids: coinIds?.join(','),\n vs_currencies: currencies.join(','),\n include_market_cap: String(marketCap),\n include_24hr_vol: String(vol24),\n include_24hr_change: String(change24),\n include_last_updated_at: String(lastUpdated),\n },\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","import { Zodios } from '@zodios/core';\nimport { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { boolean, string } from 'zod';\n\nexport const coingeckoProxyClient = (proxyApiUrl: string) =>\n new Zodios(\n `${proxyApiUrl}/proxy/coingecko`,\n [\n {\n method: 'post',\n path: '/simple/price',\n parameters: [\n { name: 'ids', type: 'Query', schema: string() },\n { name: 'vs_currencies', type: 'Query', schema: string() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_last_updated_at',\n type: 'Query',\n schema: string().optional(),\n },\n ],\n alias: 'simplePrice',\n response: RawSimplePriceResponseSchema,\n },\n {\n method: 'post',\n path: '/simple/token_price/:id',\n parameters: [\n { name: 'id', type: 'Path', schema: string() },\n { name: 'contract_addresses', type: 'Query', schema: string().array() },\n { name: 'vs_currencies', type: 'Query', schema: string().array() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: boolean().optional(),\n },\n ],\n alias: 'simplePriceByContractAddresses',\n response: SimplePriceResponseSchema,\n },\n ],\n {\n axiosConfig: {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n },\n );\n","import {\n NetworkVMType,\n type GetBalancesParams,\n type TokenWithBalanceAVM,\n type TokenWithBalancePVM,\n} from '@avalabs/vm-module-types';\nimport { type AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\nimport {\n BlockchainId,\n Network,\n type ListPChainBalancesResponse,\n type ListXChainBalancesResponse,\n} from '@avalabs/glacier-sdk';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { isPchainBalance, isXchainBalance } from './utils';\nimport { convertPChainBalance } from './convert-p-chain-balance';\nimport { convertXChainBalance } from './covnert-x-chain-balance';\n\ntype GetAvalancheBalancesResponse = Record<string, Record<string, TokenWithBalanceAVM | TokenWithBalancePVM>>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n glacierService,\n tokenService,\n}: GetBalancesParams & {\n glacierService: AvalancheGlacierService;\n tokenService: TokenService;\n}): Promise<GetAvalancheBalancesResponse> => {\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return Promise.reject('Glacier is unhealthy. Try again later.');\n }\n\n const lowercaseCurrency = currency.toLowerCase();\n const address = addresses[0] ?? '';\n const networkToken = network.networkToken;\n const coingeckoId = network.pricingProviders?.coingecko.nativeTokenId;\n\n const blockchainId = network.vmName === NetworkVMType.PVM ? BlockchainId.P_CHAIN : BlockchainId.X_CHAIN;\n const networkName = network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: networkName,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const simplePriceResponse = coingeckoId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoId],\n currencies: [lowercaseCurrency] as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.change24 ?? undefined;\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n\n if (isXchainBalance(chainBalances)) {\n balance = convertXChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n return Promise.reject('Incorrect type balance was returned from glacier');\n};\n","import type { PChainBalance, XChainBalances } from '@avalabs/glacier-sdk';\n\nexport const isPchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is PChainBalance => {\n return Object.keys(balanceResult).includes('unlockedUnstaked');\n};\n\nexport const isXchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is XChainBalances => {\n return Object.keys(balanceResult).includes('locked');\n};\n\nexport function calculateTotalBalance(uxtos: PChainBalance | XChainBalances): bigint {\n const sum = Object.values(uxtos).reduce(function (totalAcc, utxoList) {\n const typeSum = utxoList.reduce(function (typeAcc, utxo) {\n const balanceToAdd = Number(utxo.amount);\n return typeAcc + balanceToAdd;\n }, 0);\n\n return totalAcc + typeSum;\n }, 0);\n\n return BigInt(sum);\n}\n\nexport function getTokenValue(decimals: number, amount?: number) {\n return amount === undefined ? 0 : amount / 10 ** decimals;\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { type NetworkToken, TokenType, type TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const convertPChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalancePVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlockedUnstaked: balance.unlockedUnstaked,\n unlockedStaked: balance.unlockedStaked,\n pendingStaked: balance.pendingStaked,\n lockedStaked: balance.lockedStaked,\n lockedStakeable: balance.lockedStakeable,\n lockedPlatform: balance.lockedPlatform,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlockedUnstaked'] ? balancePerType['unlockedUnstaked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency ? Number(available.mul(priceInCurrency).toDisplay(2)) : undefined;\n const availableDisplayValue = available.toDisplay();\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceInCurrency = priceInCurrency ? Number(totalBalance.mul(priceInCurrency).toDisplay(2)) : undefined;\n const balanceDisplayValue = totalBalance.toDisplay();\n\n return {\n ...networkToken,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue: balanceInCurrency?.toFixed(2),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue,\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n lockedStaked: getTokenValue(decimals, balancePerType['lockedStaked']),\n lockedStakeable: getTokenValue(decimals, balancePerType['lockedStakeable']),\n lockedPlatform: getTokenValue(decimals, balancePerType['lockedPlatform']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n unlockedUnstaked: getTokenValue(decimals, balancePerType['unlockedUnstaked']),\n unlockedStaked: getTokenValue(decimals, balancePerType['unlockedStaked']),\n pendingStaked: getTokenValue(decimals, balancePerType['pendingStaked']),\n },\n marketCap,\n vol24,\n change24,\n coingeckoId,\n };\n};\n","import type { AggregatedAssetAmount, XChainBalances } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { TokenType, type NetworkToken, type TokenWithBalanceAVM } from '@avalabs/vm-module-types';\n\nexport const convertXChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalanceAVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlocked: balance.unlocked,\n locked: balance.locked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceDisplayValue = totalBalance.toDisplay();\n const balanceCurrencyDisplayValue = priceInCurrency ? totalBalance.mul(priceInCurrency).toDisplay(2) : undefined;\n const balanceInCurrency = balanceCurrencyDisplayValue\n ? Number(balanceCurrencyDisplayValue.replaceAll(',', ''))\n : undefined;\n\n return {\n ...networkToken,\n coingeckoId,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue,\n utxos: balance,\n balancePerType: {\n unlocked: getTokenValue(decimals, balancePerType['unlocked']),\n locked: getTokenValue(decimals, balancePerType['locked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n },\n marketCap,\n vol24,\n change24,\n };\n};\n","import Crypto from 'crypto';\n\n//github.com/gergelylovas/chain-agnostic-namespaces/pull/1/files#diff-cf7185539a48e85d069d194c1c17d7cfa0317b3caa3a89c92e797e3717e49d59R40\nexport function hashBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n const blockChainIdWithPrefix = isTestnet ? 'fuji' + blockchainId : blockchainId;\n const base64 = Crypto.createHash('sha256').update(blockChainIdWithPrefix).digest('base64');\n const hash = convertBase64ToBase64Url(base64).substring(0, 32);\n return 'avax:' + hash;\n}\n\nconst convertBase64ToBase64Url = (base64: string) => base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n isTestnet,\n xpubXP,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\n let xpPub: Buffer;\n\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n // X and P addresses different derivation path m/44'/9000'/0'...\n xpPub = Avalanche.getAddressPublicKeyFromXpub(xpubXP, accountIndex);\n break;\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n xpPub = Buffer.from(xpubXP, 'hex');\n break;\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n\n return {\n [NetworkVMType.AVM]: provXP.getAddress(xpPub, 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(xpPub, 'P'),\n };\n};\n","import type { TokenWithBalance, TokenWithBalanceAVM, TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const isTokenWithBalancePVM = (token: TokenWithBalance): token is TokenWithBalancePVM => {\n return 'balancePerType' in token && 'unlockedUnstaked' in token.balancePerType;\n};\n\nexport const isTokenWithBalanceAVM = (token: TokenWithBalance): token is TokenWithBalanceAVM => {\n return 'balancePerType' in token && 'unlocked' in token.balancePerType;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/utils.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/env.ts","../src/services/glacier-service/glacier-service.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../src/handlers/get-balances/get-balances.ts","../src/handlers/get-balances/utils.ts","../src/handlers/get-balances/convert-p-chain-balance.ts","../src/handlers/get-balances/covnert-x-chain-balance.ts","../src/utils/hash-blockchain-id.ts","../src/handlers/get-address/get-address.ts","../src/handlers/avalanche-sign-message/avalanche-sign-message.ts","../src/handlers/avalanche-sign-message/schemas/parse-request-params/parse-request-params.ts","../src/handlers/get-balances/typeguards.ts"],"names":["parseManifest","RpcMethod","rpcErrors","manifest_default","getNetworkFee","BlockchainId","Network","SortOrder","PrimaryNetworkChainName","Big","isPChainTransactions","value","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","amount","decimals","Avalanche","TokenType","convertPChainTransaction","tx","address","networkToken","chainId","isTestnet","froms","utxo","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","isBaseTx","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","xBlockchainId","totalAmountCreated","asset","getTransactionHistory","nextPageToken","offset","network","glacierService","response","getBlockchainIdByAddress","transactions","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","__publicField","AvalancheGlacierService","glacierApiUrl","params","error","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","proxyApiUrl","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","NetworkVMType","isPchainBalance","balanceResult","isXchainBalance","calculateTotalBalance","uxtos","totalAcc","utxoList","typeSum","typeAcc","balanceToAdd","TokenUnit","convertPChainBalance","balance","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","uxto","newBalance","available","availableInCurrency","availableDisplayValue","totalBalance","balanceInCurrency","balanceDisplayValue","convertXChainBalance","balanceCurrencyDisplayValue","getBalances","addresses","tokenService","lowercaseCurrency","blockchainId","networkName","chainBalances","simplePriceResponse","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","WalletType","getAddress","accountIndex","xpubXP","walletType","provXP","xpPub","z","paramsSchema","parseRequestParams","avalancheSignMessage","request","approvalController","message","msgHex","signingData","displayData","_glacierService","_approvalController","AvalancheModule","isTokenWithBalancePVM","token","isTokenWithBalanceAVM"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n GetBalancesParams,\n GetBalancesResponse,\n Environment,\n GetAddressParams,\n GetAddressResponse,\n ApprovalController,\n} from '@avalabs/vm-module-types';\nimport { parseManifest, RpcMethod } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { getEnv } from './env';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { TokenService } from '@internal/utils';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { avalancheSignMessage } from './handlers/avalanche-sign-message/avalanche-sign-message';\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n #approvalController: ApprovalController;\n\n constructor({\n approvalController,\n environment,\n }: {\n approvalController: ApprovalController;\n environment: Environment;\n }) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#glacierService = new AvalancheGlacierService({ glacierApiUrl });\n this.#proxyApiUrl = proxyApiUrl;\n this.#approvalController = approvalController;\n }\n\n getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpubXP, isTestnet, walletType });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl });\n return getBalances({ addresses, currency, network, glacierService: this.#glacierService, tokenService });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return getNetworkFee();\n }\n\n getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory) {\n return getTransactionHistory({ network, address, nextPageToken, offset, glacierService: this.#glacierService });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, network: Network) {\n switch (request.method) {\n case RpcMethod.AVALANCHE_SIGN_MESSAGE:\n return avalancheSignMessage({ request, network, approvalController: this.#approvalController });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n static getHashedBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n return hashBlockchainId({ blockchainId, isTestnet });\n }\n}\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo\",\n \"avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG\",\n \"avax:imji8papUf2EhV3le337w1vgFauqkJg-\",\n \"avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n}\n","import type { GetTransactionHistory, Transaction, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { BlockchainId, Network, SortOrder } from '@avalabs/glacier-sdk';\nimport { isPChainTransactions, isXChainTransactions } from './utils';\nimport { convertPChainTransaction } from './convert-p-chain-transaction';\nimport { convertXChainTransaction } from './convert-x-chain-transaction';\nimport type { AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getTransactionHistory = async ({\n address,\n nextPageToken,\n offset,\n network,\n glacierService,\n}: GetTransactionHistory & { glacierService: AvalancheGlacierService }): Promise<TransactionHistoryResponse> => {\n const { isTestnet, networkToken, explorerUrl, chainId } = network;\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n const response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: isTestnet ? Network.FUJI : Network.MAINNET,\n pageSize: offset,\n pageToken: nextPageToken,\n sortOrder: SortOrder.DESC,\n });\n\n let transactions: Transaction[] = [];\n if (isPChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertPChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n if (isXChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertXChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n};\n\nconst getBlockchainIdByAddress = (address: string) => {\n // A comma separated list of X-Chain or P-Chain wallet addresses,\n // starting with \"avax\"/\"fuji\", \"P-avax\"/\"P-fuji\" or \"X-avax\"/\"X-fuji\"\n const firstAddress = address.split(',')[0];\n if (firstAddress?.toLowerCase().startsWith('p-')) {\n return BlockchainId.P_CHAIN;\n }\n return BlockchainId.X_CHAIN;\n};\n","import {\n PrimaryNetworkChainName,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainTransactionsResponse,\n type ListXChainTransactionsResponse,\n} from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\n\nexport const isPChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListPChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.P_CHAIN;\n};\n\nexport const isXChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListXChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.X_CHAIN;\n};\n\nexport function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n\nexport function getTokenValue({ amount, decimals }: { decimals: number; amount?: number }): Big {\n return amount === undefined ? new Big(0) : new Big(amount / 10 ** decimals);\n}\n","import { type PChainTransaction, type NetworkToken } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertPChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: PChainTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl?: string;\n isTestnet?: boolean;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n });\n\n const avaxBurnedAmount = getBurnedAmount({ tx, isTestnet, networkToken });\n const chainAddress = address.toLowerCase().startsWith('p-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.blockTimestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n froms: Set<string>;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const isBaseTx = tx.txType === 'BaseTx';\n\n const nonChangeEmittedUtxosAmt = tx.emittedUtxos\n .filter(\n (utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && !utxo.addresses.some((addr) => froms.has(addr)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n const txValue = tx.value.find((val) => val.assetId === getAvaxAssetId(!!isTestnet))?.amount;\n // This ternary attempts to cover the case where users send themselves AVAX\n // in which case the senders are the recipients and we should use the total tx value.\n const baseTxValue = nonChangeEmittedUtxosAmt.gt(new Big(0))\n ? nonChangeEmittedUtxosAmt\n : txValue\n ? new Big(txValue)\n : new Big(0) ?? new Big(0);\n\n const pBlockchainId = isTestnet ? Avalanche.FujiContext.pBlockchainID : Avalanche.MainnetContext.pBlockchainID;\n\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === pBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== pBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.amount), new Big(0));\n const nAvaxAmount = isBaseTx\n ? baseTxValue\n : isImportExport\n ? importExportAmount\n : tx.amountStaked.length === 0\n ? aggregateValue(tx.value, !!isTestnet)\n : aggregateValue(tx.amountStaked, !!isTestnet);\n return getTokenValue({ amount: nAvaxAmount?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const nAvaxFee = tx.amountBurned\n ?.filter((value) => value.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, value) => accumulator.add(value.amount), new Big(0));\n return getTokenValue({ amount: nAvaxFee?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction aggregateValue(value: PChainTransaction['value'], isTestnet: boolean): Big | undefined {\n return value\n .filter((value_) => value_.assetId === getAvaxAssetId(isTestnet))\n .reduce((accumulator, value_) => accumulator.add(value_.amount), new Big(0));\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { type NetworkToken, XChainNonLinearTransaction, XChainLinearTransaction } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertXChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n isTestnet?: boolean;\n explorerUrl?: string;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, totalAmountCreated: amount, networkToken });\n const chainAddress = address.toLowerCase().startsWith('x-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.timestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === xBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== xBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n\n const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxAmt = isImportExport ? importExportAmount : totalAmountCreated;\n return getTokenValue({ amount: nAvaxAmt.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n totalAmountCreated,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n totalAmountCreated: Big;\n networkToken: NetworkToken;\n}): Big {\n const totalAmountUnlocked = tx.amountUnlocked\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxFee = totalAmountUnlocked.minus(totalAmountCreated);\n return getTokenValue({ amount: nAvaxFee.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n BlockchainId,\n Glacier,\n type ListCChainAtomicBalancesResponse,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainBalancesResponse,\n type ListPChainTransactionsResponse,\n type ListXChainBalancesResponse,\n type ListXChainTransactionsResponse,\n Network,\n PrimaryNetworkTxType,\n SortOrder,\n} from '@avalabs/glacier-sdk';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class AvalancheGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n\n constructor({ glacierApiUrl }: { glacierApiUrl: string }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl });\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async listLatestPrimaryNetworkTransactions(params: {\n blockchainId: BlockchainId;\n network: Network;\n addresses?: string;\n txTypes?: Array<PrimaryNetworkTxType>;\n startTimestamp?: number;\n endTimestamp?: number;\n pageToken?: string;\n pageSize?: number;\n sortOrder?: SortOrder;\n }): Promise<ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse> {\n try {\n return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getChainBalance(params: {\n blockchainId: BlockchainId;\n network: Network;\n blockTimestamp?: number;\n addresses?: string;\n }): Promise<ListPChainBalancesResponse | ListXChainBalancesResponse | ListCChainAtomicBalancesResponse> {\n try {\n return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n return coingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses(undefined, {\n params: {\n id: assetPlatformId,\n },\n queries: {\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n },\n });\n }\n\n return simpleTokenPrice(coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await coingeckoProxyClient(this.#proxyApiUrl).simplePrice(undefined, {\n queries: {\n ids: coinIds?.join(','),\n vs_currencies: currencies.join(','),\n include_market_cap: String(marketCap),\n include_24hr_vol: String(vol24),\n include_24hr_change: String(change24),\n include_last_updated_at: String(lastUpdated),\n },\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","import { Zodios } from '@zodios/core';\nimport { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { boolean, string } from 'zod';\n\nexport const coingeckoProxyClient = (proxyApiUrl: string) =>\n new Zodios(\n `${proxyApiUrl}/proxy/coingecko`,\n [\n {\n method: 'post',\n path: '/simple/price',\n parameters: [\n { name: 'ids', type: 'Query', schema: string() },\n { name: 'vs_currencies', type: 'Query', schema: string() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_last_updated_at',\n type: 'Query',\n schema: string().optional(),\n },\n ],\n alias: 'simplePrice',\n response: RawSimplePriceResponseSchema,\n },\n {\n method: 'post',\n path: '/simple/token_price/:id',\n parameters: [\n { name: 'id', type: 'Path', schema: string() },\n { name: 'contract_addresses', type: 'Query', schema: string().array() },\n { name: 'vs_currencies', type: 'Query', schema: string().array() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: boolean().optional(),\n },\n ],\n alias: 'simplePriceByContractAddresses',\n response: SimplePriceResponseSchema,\n },\n ],\n {\n axiosConfig: {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n },\n );\n","import {\n NetworkVMType,\n type GetBalancesParams,\n type TokenWithBalanceAVM,\n type TokenWithBalancePVM,\n} from '@avalabs/vm-module-types';\nimport { type AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\nimport {\n BlockchainId,\n Network,\n type ListPChainBalancesResponse,\n type ListXChainBalancesResponse,\n} from '@avalabs/glacier-sdk';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { isPchainBalance, isXchainBalance } from './utils';\nimport { convertPChainBalance } from './convert-p-chain-balance';\nimport { convertXChainBalance } from './covnert-x-chain-balance';\n\ntype GetAvalancheBalancesResponse = Record<string, Record<string, TokenWithBalanceAVM | TokenWithBalancePVM>>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n glacierService,\n tokenService,\n}: GetBalancesParams & {\n glacierService: AvalancheGlacierService;\n tokenService: TokenService;\n}): Promise<GetAvalancheBalancesResponse> => {\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return Promise.reject('Glacier is unhealthy. Try again later.');\n }\n\n const lowercaseCurrency = currency.toLowerCase();\n const address = addresses[0] ?? '';\n const networkToken = network.networkToken;\n const coingeckoId = network.pricingProviders?.coingecko.nativeTokenId;\n\n const blockchainId = network.vmName === NetworkVMType.PVM ? BlockchainId.P_CHAIN : BlockchainId.X_CHAIN;\n const networkName = network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: networkName,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const simplePriceResponse = coingeckoId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoId],\n currencies: [lowercaseCurrency] as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.change24 ?? undefined;\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n\n if (isXchainBalance(chainBalances)) {\n balance = convertXChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n return Promise.reject('Incorrect type balance was returned from glacier');\n};\n","import type { PChainBalance, XChainBalances } from '@avalabs/glacier-sdk';\n\nexport const isPchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is PChainBalance => {\n return Object.keys(balanceResult).includes('unlockedUnstaked');\n};\n\nexport const isXchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is XChainBalances => {\n return Object.keys(balanceResult).includes('locked');\n};\n\nexport function calculateTotalBalance(uxtos: PChainBalance | XChainBalances): bigint {\n const sum = Object.values(uxtos).reduce(function (totalAcc, utxoList) {\n const typeSum = utxoList.reduce(function (typeAcc, utxo) {\n const balanceToAdd = Number(utxo.amount);\n return typeAcc + balanceToAdd;\n }, 0);\n\n return totalAcc + typeSum;\n }, 0);\n\n return BigInt(sum);\n}\n\nexport function getTokenValue(decimals: number, amount?: number) {\n return amount === undefined ? 0 : amount / 10 ** decimals;\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { type NetworkToken, TokenType, type TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const convertPChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalancePVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlockedUnstaked: balance.unlockedUnstaked,\n unlockedStaked: balance.unlockedStaked,\n pendingStaked: balance.pendingStaked,\n lockedStaked: balance.lockedStaked,\n lockedStakeable: balance.lockedStakeable,\n lockedPlatform: balance.lockedPlatform,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlockedUnstaked'] ? balancePerType['unlockedUnstaked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency ? Number(available.mul(priceInCurrency).toDisplay(2)) : undefined;\n const availableDisplayValue = available.toDisplay();\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceInCurrency = priceInCurrency ? Number(totalBalance.mul(priceInCurrency).toDisplay(2)) : undefined;\n const balanceDisplayValue = totalBalance.toDisplay();\n\n return {\n ...networkToken,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue: balanceInCurrency?.toFixed(2),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue,\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n lockedStaked: getTokenValue(decimals, balancePerType['lockedStaked']),\n lockedStakeable: getTokenValue(decimals, balancePerType['lockedStakeable']),\n lockedPlatform: getTokenValue(decimals, balancePerType['lockedPlatform']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n unlockedUnstaked: getTokenValue(decimals, balancePerType['unlockedUnstaked']),\n unlockedStaked: getTokenValue(decimals, balancePerType['unlockedStaked']),\n pendingStaked: getTokenValue(decimals, balancePerType['pendingStaked']),\n },\n marketCap,\n vol24,\n change24,\n coingeckoId,\n };\n};\n","import type { AggregatedAssetAmount, XChainBalances } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { TokenType, type NetworkToken, type TokenWithBalanceAVM } from '@avalabs/vm-module-types';\n\nexport const convertXChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalanceAVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlocked: balance.unlocked,\n locked: balance.locked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceDisplayValue = totalBalance.toDisplay();\n const balanceCurrencyDisplayValue = priceInCurrency ? totalBalance.mul(priceInCurrency).toDisplay(2) : undefined;\n const balanceInCurrency = balanceCurrencyDisplayValue\n ? Number(balanceCurrencyDisplayValue.replaceAll(',', ''))\n : undefined;\n\n return {\n ...networkToken,\n coingeckoId,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue,\n utxos: balance,\n balancePerType: {\n unlocked: getTokenValue(decimals, balancePerType['unlocked']),\n locked: getTokenValue(decimals, balancePerType['locked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n },\n marketCap,\n vol24,\n change24,\n };\n};\n","import Crypto from 'crypto';\n\n//github.com/gergelylovas/chain-agnostic-namespaces/pull/1/files#diff-cf7185539a48e85d069d194c1c17d7cfa0317b3caa3a89c92e797e3717e49d59R40\nexport function hashBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n const blockChainIdWithPrefix = isTestnet ? 'fuji' + blockchainId : blockchainId;\n const base64 = Crypto.createHash('sha256').update(blockChainIdWithPrefix).digest('base64');\n const hash = convertBase64ToBase64Url(base64).substring(0, 32);\n return 'avax:' + hash;\n}\n\nconst convertBase64ToBase64Url = (base64: string) => base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n isTestnet,\n xpubXP,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\n let xpPub: Buffer;\n\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n // X and P addresses different derivation path m/44'/9000'/0'...\n xpPub = Avalanche.getAddressPublicKeyFromXpub(xpubXP, accountIndex);\n break;\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n xpPub = Buffer.from(xpubXP, 'hex');\n break;\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n\n return {\n [NetworkVMType.AVM]: provXP.getAddress(xpPub, 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(xpPub, 'P'),\n };\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n} from '@avalabs/vm-module-types';\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport const avalancheSignMessage = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n error: rpcErrors.invalidParams('Params are invalid'),\n };\n }\n const [message, accountIndex] = result.data;\n const msgHex = Buffer.from(message, 'utf-8').toString('hex');\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SIGN_MESSAGE,\n data: msgHex,\n accountIndex,\n };\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n messageDetails: message,\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n return { result: response.result };\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.union([\n z.tuple([z.string()]).describe('message to sign'),\n z.tuple([z.string().describe('message to sign'), z.number().nonnegative().describe('account index')]),\n]);\n\nexport const parseRequestParams = (\n params: unknown,\n): z.SafeParseReturnType<[string, number], [string, number] | [string]> => {\n return paramsSchema.safeParse(params);\n};\n","import type { TokenWithBalance, TokenWithBalanceAVM, TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const isTokenWithBalancePVM = (token: TokenWithBalance): token is TokenWithBalancePVM => {\n return 'balancePerType' in token && 'unlockedUnstaked' in token.balancePerType;\n};\n\nexport const isTokenWithBalanceAVM = (token: TokenWithBalance): token is TokenWithBalanceAVM => {\n return 'balancePerType' in token && 'unlocked' in token.balancePerType;\n};\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as _metamask_rpc_errors from '@metamask/rpc-errors';
|
|
2
2
|
import * as _avalabs_vm_module_types_dist_transaction_history from '@avalabs/vm-module-types/dist/transaction-history';
|
|
3
|
-
import { Module, Environment, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, Manifest, Network, NetworkFees, GetTransactionHistory, RpcRequest, TokenWithBalance, TokenWithBalancePVM, TokenWithBalanceAVM } from '@avalabs/vm-module-types';
|
|
3
|
+
import { Module, ApprovalController, Environment, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, Manifest, Network, NetworkFees, GetTransactionHistory, RpcRequest, TokenWithBalance, TokenWithBalancePVM, TokenWithBalanceAVM } from '@avalabs/vm-module-types';
|
|
4
4
|
|
|
5
5
|
declare class AvalancheModule implements Module {
|
|
6
6
|
#private;
|
|
7
|
-
constructor({ environment }: {
|
|
7
|
+
constructor({ approvalController, environment, }: {
|
|
8
|
+
approvalController: ApprovalController;
|
|
8
9
|
environment: Environment;
|
|
9
10
|
});
|
|
10
11
|
getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse>;
|
|
@@ -13,8 +14,12 @@ declare class AvalancheModule implements Module {
|
|
|
13
14
|
getNetworkFee(_: Network): Promise<NetworkFees>;
|
|
14
15
|
getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory): Promise<_avalabs_vm_module_types_dist_transaction_history.TransactionHistoryResponse>;
|
|
15
16
|
getTokens(_: Network): Promise<never[]>;
|
|
16
|
-
onRpcRequest(request: RpcRequest,
|
|
17
|
+
onRpcRequest(request: RpcRequest, network: Network): Promise<{
|
|
17
18
|
error: _metamask_rpc_errors.JsonRpcError<_metamask_rpc_errors.OptionalDataWithOptionalCause>;
|
|
19
|
+
result?: undefined;
|
|
20
|
+
} | {
|
|
21
|
+
result: `0x${string}`;
|
|
22
|
+
error?: undefined;
|
|
18
23
|
}>;
|
|
19
24
|
static getHashedBlockchainId({ blockchainId, isTestnet }: {
|
|
20
25
|
blockchainId: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as _metamask_rpc_errors from '@metamask/rpc-errors';
|
|
2
2
|
import * as _avalabs_vm_module_types_dist_transaction_history from '@avalabs/vm-module-types/dist/transaction-history';
|
|
3
|
-
import { Module, Environment, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, Manifest, Network, NetworkFees, GetTransactionHistory, RpcRequest, TokenWithBalance, TokenWithBalancePVM, TokenWithBalanceAVM } from '@avalabs/vm-module-types';
|
|
3
|
+
import { Module, ApprovalController, Environment, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, Manifest, Network, NetworkFees, GetTransactionHistory, RpcRequest, TokenWithBalance, TokenWithBalancePVM, TokenWithBalanceAVM } from '@avalabs/vm-module-types';
|
|
4
4
|
|
|
5
5
|
declare class AvalancheModule implements Module {
|
|
6
6
|
#private;
|
|
7
|
-
constructor({ environment }: {
|
|
7
|
+
constructor({ approvalController, environment, }: {
|
|
8
|
+
approvalController: ApprovalController;
|
|
8
9
|
environment: Environment;
|
|
9
10
|
});
|
|
10
11
|
getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse>;
|
|
@@ -13,8 +14,12 @@ declare class AvalancheModule implements Module {
|
|
|
13
14
|
getNetworkFee(_: Network): Promise<NetworkFees>;
|
|
14
15
|
getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory): Promise<_avalabs_vm_module_types_dist_transaction_history.TransactionHistoryResponse>;
|
|
15
16
|
getTokens(_: Network): Promise<never[]>;
|
|
16
|
-
onRpcRequest(request: RpcRequest,
|
|
17
|
+
onRpcRequest(request: RpcRequest, network: Network): Promise<{
|
|
17
18
|
error: _metamask_rpc_errors.JsonRpcError<_metamask_rpc_errors.OptionalDataWithOptionalCause>;
|
|
19
|
+
result?: undefined;
|
|
20
|
+
} | {
|
|
21
|
+
result: `0x${string}`;
|
|
22
|
+
error?: undefined;
|
|
18
23
|
}>;
|
|
19
24
|
static getHashedBlockchainId({ blockchainId, isTestnet }: {
|
|
20
25
|
blockchainId: string;
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { parseManifest, Environment, NetworkVMType, WalletType, TokenType, RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';
|
|
1
|
+
import { parseManifest, RpcMethod, Environment, NetworkVMType, WalletType, TokenType, RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';
|
|
2
2
|
import { rpcErrors } from '@metamask/rpc-errors';
|
|
3
3
|
import { Network, SortOrder, BlockchainId, Glacier, PrimaryNetworkChainName } from '@avalabs/glacier-sdk';
|
|
4
4
|
import v from 'big.js';
|
|
5
5
|
import { Avalanche } from '@avalabs/core-wallets-sdk';
|
|
6
6
|
import { getBasicCoingeckoHttp, VsCurrencyType, simpleTokenPrice, simplePrice } from '@avalabs/core-coingecko-sdk';
|
|
7
7
|
import { Zodios } from '@zodios/core';
|
|
8
|
-
import { string, boolean } from 'zod';
|
|
8
|
+
import { z, string, boolean } from 'zod';
|
|
9
9
|
import { TokenUnit } from '@avalabs/core-utils-sdk';
|
|
10
|
-
import
|
|
10
|
+
import at from 'crypto';
|
|
11
11
|
|
|
12
|
-
var we=Object.defineProperty;var Re=(e,t,n)=>t in e?we(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var b=(e,t,n)=>(Re(e,typeof t!="symbol"?t+"":t,n),n),K=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var y=(e,t,n)=>(K(e,t,"read from private field"),n?n.call(e):t.get(e)),C=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n);},B=(e,t,n,a)=>(K(e,t,"write to private field"),a?a.call(e,n):t.set(e,n),n);var z={name:"Avalanche",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo","avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG","avax:imji8papUf2EhV3le337w1vgFauqkJg-","avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl"],namespaces:["avax"]},cointype:"9000",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_signTransaction","avalanche_signMessage"]}},manifestVersion:"0.0"};async function Z(){return {baseFee:BigInt(1e6),low:{maxFeePerGas:BigInt(1e6)},medium:{maxFeePerGas:BigInt(1e6)},high:{maxFeePerGas:BigInt(1e6)},isFixedFee:!0}}var te=e=>e.chainInfo.chainName===PrimaryNetworkChainName.P_CHAIN,ne=e=>e.chainInfo.chainName===PrimaryNetworkChainName.X_CHAIN;function E(e,t,n="tx"){return `${e}/${n}/${t}`}function S({amount:e,decimals:t}){return e===void 0?new v(0):new v(e/10**t)}function re({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Me({tx:e,isTestnet:s,networkToken:n,froms:i}),m=Ue({tx:e,isTestnet:s,networkToken:n}),p=t.toLowerCase().startsWith("p-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.blockTimestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:E(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Me({tx:e,isTestnet:t,networkToken:n,froms:a}){let r=["ImportTx","ExportTx"].includes(e.txType),s=e.txType==="BaseTx",i=e.emittedUtxos.filter(l=>l.asset.assetId===I(!!t)&&!l.addresses.some(u=>a.has(u))).reduce((l,u)=>l.add(u.asset.amount),new v(0)),c=e.value.find(l=>l.assetId===I(!!t))?.amount,o=i.gt(new v(0))?i:c?new v(c):new v(0)??new v(0),m=t?Avalanche.FujiContext.pBlockchainID:Avalanche.MainnetContext.pBlockchainID,p=e.emittedUtxos.filter(l=>l.asset.assetId===I(!!t)&&(e.txType==="ImportTx"&&l.consumedOnChainId===m||e.txType==="ExportTx"&&l.consumedOnChainId!==m)).reduce((l,u)=>l.add(u.amount),new v(0)),d=s?o:r?p:e.amountStaked.length===0?ae(e.value,!!t):ae(e.amountStaked,!!t);return S({amount:d?.toNumber(),decimals:n.decimals})}function Ue({tx:e,isTestnet:t,networkToken:n}){let a=e.amountBurned?.filter(r=>r.assetId===I(!!t)).reduce((r,s)=>r.add(s.amount),new v(0));return S({amount:a?.toNumber(),decimals:n.decimals})}function ae(e,t){return e.filter(n=>n.assetId===I(t)).reduce((n,a)=>n.add(a.amount),new v(0))}function I(e){return e?Avalanche.FujiContext.avaxAssetID:Avalanche.MainnetContext.avaxAssetID}function oe({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Le({tx:e,isTestnet:s,networkToken:n}),m=Ee({isTestnet:s,tx:e,totalAmountCreated:o,networkToken:n}),p=t.toLowerCase().startsWith("x-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.timestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:E(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Le({tx:e,isTestnet:t,networkToken:n}){let a=["ImportTx","ExportTx"].includes(e.txType),r=t?Avalanche.FujiContext.xBlockchainID:Avalanche.MainnetContext.xBlockchainID,s=e.emittedUtxos.filter(o=>o.asset.assetId===F(!!t)&&(e.txType==="ImportTx"&&o.consumedOnChainId===r||e.txType==="ExportTx"&&o.consumedOnChainId!==r)).reduce((o,m)=>o.add(m.asset.amount),new v(0)),i=e.amountCreated.filter(o=>o.assetId===F(!!t)).reduce((o,m)=>o.add(m.amount),new v(0));return S({amount:(a?s:i).toNumber(),decimals:n.decimals})}function Ee({isTestnet:e,tx:t,totalAmountCreated:n,networkToken:a}){let s=t.amountUnlocked.filter(i=>i.assetId===F(!!e)).reduce((i,c)=>i.add(c.amount),new v(0)).minus(n);return S({amount:s.toNumber(),decimals:a.decimals})}function F(e){return e?Avalanche.FujiContext.avaxAssetID:Avalanche.MainnetContext.avaxAssetID}var ce=async({address:e,nextPageToken:t,offset:n,network:a,glacierService:r})=>{let{isTestnet:s,networkToken:i,explorerUrl:c,chainId:o}=a;if(!r.isHealthy())return {transactions:[],nextPageToken:""};let p=await r.listLatestPrimaryNetworkTransactions({addresses:e,blockchainId:Xe(e),network:s?Network.FUJI:Network.MAINNET,pageSize:n,pageToken:t,sortOrder:SortOrder.DESC}),d=[];return te(p)&&(d=p.transactions.map(l=>re({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),ne(p)&&(d=p.transactions.map(l=>oe({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),{transactions:d,nextPageToken:p.nextPageToken}},Xe=e=>e.split(",")[0]?.toLowerCase().startsWith("p-")?BlockchainId.P_CHAIN:BlockchainId.X_CHAIN;var Ge={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},De={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},me=e=>{switch(e){case Environment.PRODUCTION:return Ge;case Environment.DEV:return De}};var G=class extends Error{constructor(){super(...arguments);b(this,"message","Glacier is unhealthy. Try again later.");}},D=class{constructor({glacierApiUrl:t}){b(this,"glacierSdk");b(this,"isGlacierHealthy",!0);b(this,"isHealthy",()=>this.isGlacierHealthy);this.glacierSdk=new Glacier({BASE:t});}setGlacierToUnhealthy(){this.isGlacierHealthy=!1,setTimeout(()=>{this.isGlacierHealthy=!0;},5*60*1e3);}async listLatestPrimaryNetworkTransactions(t){try{return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(t)}catch(n){throw n instanceof G&&this.setGlacierToUnhealthy(),n}}async getChainBalance(t){try{return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(t)}catch(n){throw n instanceof G&&this.setGlacierToUnhealthy(),n}}};var pe=async({operation:e,isSuccess:t,maxRetries:n=10,backoffPolicy:a=N.exponential()})=>{let r=0,s=0,i;for(;s<n;){s>0&&await je(r);try{let o=await e(s);if(t(o))return o}catch(o){i=o;}r=a(s),s++;}let c=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(c)},N=class{static exponential(){return t=>Math.pow(2,t)*1e3}static constant(t){return n=>t*1e3}static constantMs(t){return n=>t}};function je(e){return new Promise(t=>setTimeout(t,e))}var W=e=>pe({operation:t=>e(t>0),maxRetries:2,backoffPolicy:N.constant(1),isSuccess:t=>t?.status?.error_code!==429});function de(e){let t,n=0;for(t=0;t<e.length;t++)n+=e.charCodeAt(t)*(t+1);return n}function O(e){let t,n=0;for(t=0;t<e.length;t++){let a=de(e[t]??"");n=n+65027/a;}return (""+n).slice(0,16)}var Q=e=>new Zodios(`${e}/proxy/coingecko`,[{method:"post",path:"/simple/price",parameters:[{name:"ids",type:"Query",schema:string()},{name:"vs_currencies",type:"Query",schema:string()},{name:"include_market_cap",type:"Query",schema:string().optional()},{name:"include_24hr_vol",type:"Query",schema:string().optional()},{name:"include_24hr_change",type:"Query",schema:string().optional()},{name:"include_last_updated_at",type:"Query",schema:string().optional()}],alias:"simplePrice",response:RawSimplePriceResponseSchema},{method:"post",path:"/simple/token_price/:id",parameters:[{name:"id",type:"Path",schema:string()},{name:"contract_addresses",type:"Query",schema:string().array()},{name:"vs_currencies",type:"Query",schema:string().array()},{name:"include_market_cap",type:"Query",schema:boolean().optional()},{name:"include_24hr_vol",type:"Query",schema:boolean().optional()},{name:"include_24hr_change",type:"Query",schema:boolean().optional()}],alias:"simplePriceByContractAddresses",response:SimplePriceResponseSchema}],{axiosConfig:{headers:{"Content-Type":"application/json"}}});var ue=getBasicCoingeckoHttp(),x,w,U=class{constructor({storage:t,proxyApiUrl:n}){C(this,x,void 0);C(this,w,void 0);b(this,"transformSimplePriceResponse",(t,n=[VsCurrencyType.USD])=>{let a={};return Object.keys(t).forEach(r=>{let s=t[r];a[r]={},n.forEach(i=>{a[r]={[i]:{price:s?.[i],change24:s?.[`${i}_24h_change`],vol24:s?.[`${i}_24h_vol`],marketCap:s?.[`${i}_market_cap`]}};});}),a});B(this,x,t),B(this,w,n);}async getSimplePrice({coinIds:t=[],currencies:n=[VsCurrencyType.USD]}){let a,s=`getSimplePrice-${t?`${O(t)}-${n.toString()}`:`${n.toString()}`}`;if(a=y(this,x)?.get?.(s),a)return a;try{a=await W(i=>this.simplePrice({coinIds:t,currencies:n,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{a=void 0;}return y(this,x)?.set?.(s,a),a}async getPricesByAddresses(t,n,a=VsCurrencyType.USD){let r,i=`getPricesWithMarketDataByAddresses-${`${O(t)}-${n}-${a}`}`;if(r=y(this,x)?.get?.(i),r)return r;try{r=await W(c=>this.fetchPricesByAddresses({assetPlatformId:n,tokenAddresses:t,currency:a,useCoingeckoProxy:c}));}catch{r=void 0;}return y(this,x)?.set?.(i,r),r}async fetchPricesByAddresses({assetPlatformId:t,tokenAddresses:n,currency:a=VsCurrencyType.USD,useCoingeckoProxy:r=!1}){return r?Q(y(this,w)).simplePriceByContractAddresses(void 0,{params:{id:t},queries:{contract_addresses:n,vs_currencies:[a],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}}):simpleTokenPrice(ue,{assetPlatformId:t,tokenAddresses:n,currencies:[a],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:t=[],currencies:n=[VsCurrencyType.USD],marketCap:a=!1,vol24:r=!1,change24:s=!1,lastUpdated:i=!1,useCoingeckoProxy:c=!1,shouldThrow:o=!0}){if(c){let m=await Q(y(this,w)).simplePrice(void 0,{queries:{ids:t?.join(","),vs_currencies:n.join(","),include_market_cap:String(a),include_24hr_vol:String(r),include_24hr_change:String(s),include_last_updated_at:String(i)}});return this.transformSimplePriceResponse(m,n)}return simplePrice(ue,{coinIds:t,currencies:n,marketCap:a,vol24:r,change24:s,lastUpdated:i,shouldThrow:o})}};x=new WeakMap,w=new WeakMap;var he=e=>Object.keys(e).includes("unlockedUnstaked"),ye=e=>Object.keys(e).includes("locked");function H(e){let t=Object.values(e).reduce(function(n,a){let r=a.reduce(function(s,i){let c=Number(i.amount);return s+c},0);return n+r},0);return BigInt(t)}function h(e,t){return t===void 0?0:t/10**e}var ge=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlockedUnstaked:e.unlockedUnstaked,unlockedStaked:e.unlockedStaked,pendingStaked:e.pendingStaked,lockedStaked:e.lockedStaked,lockedStakeable:e.lockedStakeable,lockedPlatform:e.lockedPlatform,atomicMemoryLocked:e.atomicMemoryLocked,atomicMemoryUnlocked:e.atomicMemoryUnlocked};for(let g in m){let A=m[g];if(!A||!A.length){o[g]=0;continue}A.forEach(P=>{let Se=(o[g]??0)+Number(P.amount);o[g]=Se;});}let p=new TokenUnit(o.unlockedUnstaked?o.unlockedUnstaked:0n,t.decimals,t.symbol),d=n?Number(p.mul(n).toDisplay(2)):void 0,l=p.toDisplay(),u=new TokenUnit(H(e),t.decimals,t.symbol),k=n?Number(u.mul(n).toDisplay(2)):void 0,T=u.toDisplay();return {...t,type:TokenType.NATIVE,priceInCurrency:n,balance:u.toSubUnit(),balanceInCurrency:k,balanceDisplayValue:T,balanceCurrencyDisplayValue:k?.toFixed(2),available:p.toSubUnit(),availableInCurrency:d,availableDisplayValue:l,availableCurrencyDisplayValue:d?.toFixed(2),utxos:e,balancePerType:{lockedStaked:h(c,o.lockedStaked),lockedStakeable:h(c,o.lockedStakeable),lockedPlatform:h(c,o.lockedPlatform),atomicMemoryLocked:h(c,o.atomicMemoryLocked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),unlockedUnstaked:h(c,o.unlockedUnstaked),unlockedStaked:h(c,o.unlockedStaked),pendingStaked:h(c,o.pendingStaked)},marketCap:a,vol24:r,change24:s,coingeckoId:i}};var fe=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlocked:e.unlocked,locked:e.locked,atomicMemoryUnlocked:e.atomicMemoryUnlocked,atomicMemoryLocked:e.atomicMemoryLocked};for(let k in m){let T=m[k];if(!T||!T.length){o[k]=0;continue}T.forEach(g=>{let P=(o[k]??0)+Number(g.amount);o[k]=P;});}let p=new TokenUnit(H(e),t.decimals,t.symbol),d=p.toDisplay(),l=n?p.mul(n).toDisplay(2):void 0,u=l?Number(l.replaceAll(",","")):void 0;return {...t,coingeckoId:i,type:TokenType.NATIVE,priceInCurrency:n,balance:p.toSubUnit(),balanceInCurrency:u,balanceDisplayValue:d,balanceCurrencyDisplayValue:l,utxos:e,balancePerType:{unlocked:h(c,o.unlocked),locked:h(c,o.locked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),atomicMemoryLocked:h(c,o.atomicMemoryLocked)},marketCap:a,vol24:r,change24:s}};var ve=async({addresses:e,currency:t,network:n,glacierService:a,tokenService:r})=>{if(!a.isHealthy())return Promise.reject("Glacier is unhealthy. Try again later.");let i=t.toLowerCase(),c=e[0]??"",o=n.networkToken,m=n.pricingProviders?.coingecko.nativeTokenId,p=n.vmName===NetworkVMType.PVM?BlockchainId.P_CHAIN:BlockchainId.X_CHAIN,d=n.isTestnet?Network.FUJI:Network.MAINNET,l=await a.getChainBalance({blockchainId:p,network:d,addresses:e.join(",")}).then(J=>J.balances),u=m?await r.getSimplePrice({coinIds:[m],currencies:[i]}):{},k=u?.[m??""]?.[i]?.price??void 0,T=u?.[m??""]?.[i]?.marketCap??void 0,g=u?.[m??""]?.[i]?.vol24??void 0,A=u?.[m??""]?.[i]?.change24??void 0,P;return he(l)?(P=ge({balance:l,networkToken:o,priceInCurrency:k,marketCap:T,vol24:g,change24:A,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):ye(l)?(P=fe({balance:l,networkToken:o,priceInCurrency:k,marketCap:T,vol24:g,change24:A,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):Promise.reject("Incorrect type balance was returned from glacier")};function xe({blockchainId:e,isTestnet:t}){let n=t?"fuji"+e:e,a=Ye.createHash("sha256").update(n).digest("base64");return "avax:"+et(a).substring(0,32)}var et=e=>e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");var Ce=async({accountIndex:e,isTestnet:t,xpubXP:n,walletType:a})=>{if(n===void 0)throw rpcErrors.invalidParams("xpubXP is required to get address");let r=t?Avalanche.JsonRpcProvider.getDefaultFujiProvider():Avalanche.JsonRpcProvider.getDefaultMainnetProvider(),s;switch(a){case WalletType.Mnemonic:case WalletType.Ledger:case WalletType.Keystone:{s=Avalanche.getAddressPublicKeyFromXpub(n,e);break}case WalletType.LedgerLive:case WalletType.Seedless:{s=Buffer.from(n,"hex");break}default:throw rpcErrors.invalidParams(`Unsupported wallet type: ${a}`)}return {[NetworkVMType.AVM]:r.getAddress(s,"X"),[NetworkVMType.PVM]:r.getAddress(s,"P")}};var R,L,Be=class{constructor({environment:t}){C(this,R,void 0);C(this,L,void 0);let{glacierApiUrl:n,proxyApiUrl:a}=me(t);B(this,R,new D({glacierApiUrl:n})),B(this,L,a);}getAddress({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r}){return Ce({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r})}getBalances({addresses:t,network:n,storage:a,currency:r}){let s=new U({storage:a,proxyApiUrl:y(this,L)});return ve({addresses:t,currency:r,network:n,glacierService:y(this,R),tokenService:s})}getManifest(){let t=parseManifest(z);return t.success?t.data:void 0}getNetworkFee(t){return Z()}getTransactionHistory({network:t,address:n,nextPageToken:a,offset:r}){return ce({network:t,address:n,nextPageToken:a,offset:r,glacierService:y(this,R)})}getTokens(t){return Promise.resolve([])}async onRpcRequest(t,n){switch(t.method){default:return {error:rpcErrors.methodNotSupported(`Method ${t.method} not supported`)}}}static getHashedBlockchainId({blockchainId:t,isTestnet:n}){return xe({blockchainId:t,isTestnet:n})}};R=new WeakMap,L=new WeakMap;var Gn=e=>"balancePerType"in e&&"unlockedUnstaked"in e.balancePerType,Dn=e=>"balancePerType"in e&&"unlocked"in e.balancePerType;
|
|
12
|
+
var Me=Object.defineProperty;var Ue=(e,t,n)=>t in e?Me(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var C=(e,t,n)=>(Ue(e,typeof t!="symbol"?t+"":t,n),n),Z=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var y=(e,t,n)=>(Z(e,t,"read from private field"),n?n.call(e):t.get(e)),b=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n);},B=(e,t,n,a)=>(Z(e,t,"write to private field"),a?a.call(e,n):t.set(e,n),n);var Y={name:"Avalanche",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo","avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG","avax:imji8papUf2EhV3le337w1vgFauqkJg-","avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl"],namespaces:["avax"]},cointype:"9000",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_signTransaction","avalanche_signMessage"]}},manifestVersion:"0.0"};async function ee(){return {baseFee:BigInt(1e6),low:{maxFeePerGas:BigInt(1e6)},medium:{maxFeePerGas:BigInt(1e6)},high:{maxFeePerGas:BigInt(1e6)},isFixedFee:!0}}var ae=e=>e.chainInfo.chainName===PrimaryNetworkChainName.P_CHAIN,re=e=>e.chainInfo.chainName===PrimaryNetworkChainName.X_CHAIN;function D(e,t,n="tx"){return `${e}/${n}/${t}`}function S({amount:e,decimals:t}){return e===void 0?new v(0):new v(e/10**t)}function se({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Le({tx:e,isTestnet:s,networkToken:n,froms:i}),m=Ve({tx:e,isTestnet:s,networkToken:n}),p=t.toLowerCase().startsWith("p-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.blockTimestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:D(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Le({tx:e,isTestnet:t,networkToken:n,froms:a}){let r=["ImportTx","ExportTx"].includes(e.txType),s=e.txType==="BaseTx",i=e.emittedUtxos.filter(l=>l.asset.assetId===N(!!t)&&!l.addresses.some(u=>a.has(u))).reduce((l,u)=>l.add(u.asset.amount),new v(0)),c=e.value.find(l=>l.assetId===N(!!t))?.amount,o=i.gt(new v(0))?i:c?new v(c):new v(0)??new v(0),m=t?Avalanche.FujiContext.pBlockchainID:Avalanche.MainnetContext.pBlockchainID,p=e.emittedUtxos.filter(l=>l.asset.assetId===N(!!t)&&(e.txType==="ImportTx"&&l.consumedOnChainId===m||e.txType==="ExportTx"&&l.consumedOnChainId!==m)).reduce((l,u)=>l.add(u.amount),new v(0)),d=s?o:r?p:e.amountStaked.length===0?oe(e.value,!!t):oe(e.amountStaked,!!t);return S({amount:d?.toNumber(),decimals:n.decimals})}function Ve({tx:e,isTestnet:t,networkToken:n}){let a=e.amountBurned?.filter(r=>r.assetId===N(!!t)).reduce((r,s)=>r.add(s.amount),new v(0));return S({amount:a?.toNumber(),decimals:n.decimals})}function oe(e,t){return e.filter(n=>n.assetId===N(t)).reduce((n,a)=>n.add(a.amount),new v(0))}function N(e){return e?Avalanche.FujiContext.avaxAssetID:Avalanche.MainnetContext.avaxAssetID}function ie({tx:e,address:t,networkToken:n,chainId:a,explorerUrl:r,isTestnet:s}){let i=new Set(e.consumedUtxos.flatMap(l=>l.addresses)||[]),c=new Set(e.emittedUtxos.flatMap(l=>l.addresses)||[]),o=Ge({tx:e,isTestnet:s,networkToken:n}),m=Xe({isTestnet:s,tx:e,totalAmountCreated:o,networkToken:n}),p=t.toLowerCase().startsWith("x-")?t.slice(2):t,d=i.has(p);return {hash:e.txHash,isContractCall:!1,isIncoming:!d,isOutgoing:d,from:[...i.values()].join(","),to:[...c.values()].join(","),isSender:d,timestamp:e.timestamp*1e3,tokens:[{decimal:n.decimals.toString(),name:n.name,symbol:n.symbol,type:TokenType.NATIVE,amount:o.toString()}],gasUsed:m.toString(),explorerLink:D(r??"",e.txHash,"tx"),txType:e.txType,chainId:a.toString()}}function Ge({tx:e,isTestnet:t,networkToken:n}){let a=["ImportTx","ExportTx"].includes(e.txType),r=t?Avalanche.FujiContext.xBlockchainID:Avalanche.MainnetContext.xBlockchainID,s=e.emittedUtxos.filter(o=>o.asset.assetId===O(!!t)&&(e.txType==="ImportTx"&&o.consumedOnChainId===r||e.txType==="ExportTx"&&o.consumedOnChainId!==r)).reduce((o,m)=>o.add(m.asset.amount),new v(0)),i=e.amountCreated.filter(o=>o.assetId===O(!!t)).reduce((o,m)=>o.add(m.amount),new v(0));return S({amount:(a?s:i).toNumber(),decimals:n.decimals})}function Xe({isTestnet:e,tx:t,totalAmountCreated:n,networkToken:a}){let s=t.amountUnlocked.filter(i=>i.assetId===O(!!e)).reduce((i,c)=>i.add(c.amount),new v(0)).minus(n);return S({amount:s.toNumber(),decimals:a.decimals})}function O(e){return e?Avalanche.FujiContext.avaxAssetID:Avalanche.MainnetContext.avaxAssetID}var me=async({address:e,nextPageToken:t,offset:n,network:a,glacierService:r})=>{let{isTestnet:s,networkToken:i,explorerUrl:c,chainId:o}=a;if(!r.isHealthy())return {transactions:[],nextPageToken:""};let p=await r.listLatestPrimaryNetworkTransactions({addresses:e,blockchainId:je(e),network:s?Network.FUJI:Network.MAINNET,pageSize:n,pageToken:t,sortOrder:SortOrder.DESC}),d=[];return ae(p)&&(d=p.transactions.map(l=>se({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),re(p)&&(d=p.transactions.map(l=>ie({tx:l,isTestnet:s,address:e,networkToken:i,explorerUrl:c,chainId:o}))),{transactions:d,nextPageToken:p.nextPageToken}},je=e=>e.split(",")[0]?.toLowerCase().startsWith("p-")?BlockchainId.P_CHAIN:BlockchainId.X_CHAIN;var Fe={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},We={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},de=e=>{switch(e){case Environment.PRODUCTION:return Fe;case Environment.DEV:return We}};var H=class extends Error{constructor(){super(...arguments);C(this,"message","Glacier is unhealthy. Try again later.");}},j=class{constructor({glacierApiUrl:t}){C(this,"glacierSdk");C(this,"isGlacierHealthy",!0);C(this,"isHealthy",()=>this.isGlacierHealthy);this.glacierSdk=new Glacier({BASE:t});}setGlacierToUnhealthy(){this.isGlacierHealthy=!1,setTimeout(()=>{this.isGlacierHealthy=!0;},5*60*1e3);}async listLatestPrimaryNetworkTransactions(t){try{return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(t)}catch(n){throw n instanceof H&&this.setGlacierToUnhealthy(),n}}async getChainBalance(t){try{return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(t)}catch(n){throw n instanceof H&&this.setGlacierToUnhealthy(),n}}};var ue=async({operation:e,isSuccess:t,maxRetries:n=10,backoffPolicy:a=M.exponential()})=>{let r=0,s=0,i;for(;s<n;){s>0&&await $e(r);try{let o=await e(s);if(t(o))return o}catch(o){i=o;}r=a(s),s++;}let c=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(c)},M=class{static exponential(){return t=>Math.pow(2,t)*1e3}static constant(t){return n=>t*1e3}static constantMs(t){return n=>t}};function $e(e){return new Promise(t=>setTimeout(t,e))}var $=e=>ue({operation:t=>e(t>0),maxRetries:2,backoffPolicy:M.constant(1),isSuccess:t=>t?.status?.error_code!==429});function he(e){let t,n=0;for(t=0;t<e.length;t++)n+=e.charCodeAt(t)*(t+1);return n}function q(e){let t,n=0;for(t=0;t<e.length;t++){let a=he(e[t]??"");n=n+65027/a;}return (""+n).slice(0,16)}var J=e=>new Zodios(`${e}/proxy/coingecko`,[{method:"post",path:"/simple/price",parameters:[{name:"ids",type:"Query",schema:string()},{name:"vs_currencies",type:"Query",schema:string()},{name:"include_market_cap",type:"Query",schema:string().optional()},{name:"include_24hr_vol",type:"Query",schema:string().optional()},{name:"include_24hr_change",type:"Query",schema:string().optional()},{name:"include_last_updated_at",type:"Query",schema:string().optional()}],alias:"simplePrice",response:RawSimplePriceResponseSchema},{method:"post",path:"/simple/token_price/:id",parameters:[{name:"id",type:"Path",schema:string()},{name:"contract_addresses",type:"Query",schema:string().array()},{name:"vs_currencies",type:"Query",schema:string().array()},{name:"include_market_cap",type:"Query",schema:boolean().optional()},{name:"include_24hr_vol",type:"Query",schema:boolean().optional()},{name:"include_24hr_change",type:"Query",schema:boolean().optional()}],alias:"simplePriceByContractAddresses",response:SimplePriceResponseSchema}],{axiosConfig:{headers:{"Content-Type":"application/json"}}});var ye=getBasicCoingeckoHttp(),A,w,_=class{constructor({storage:t,proxyApiUrl:n}){b(this,A,void 0);b(this,w,void 0);C(this,"transformSimplePriceResponse",(t,n=[VsCurrencyType.USD])=>{let a={};return Object.keys(t).forEach(r=>{let s=t[r];a[r]={},n.forEach(i=>{a[r]={[i]:{price:s?.[i],change24:s?.[`${i}_24h_change`],vol24:s?.[`${i}_24h_vol`],marketCap:s?.[`${i}_market_cap`]}};});}),a});B(this,A,t),B(this,w,n);}async getSimplePrice({coinIds:t=[],currencies:n=[VsCurrencyType.USD]}){let a,s=`getSimplePrice-${t?`${q(t)}-${n.toString()}`:`${n.toString()}`}`;if(a=y(this,A)?.get?.(s),a)return a;try{a=await $(i=>this.simplePrice({coinIds:t,currencies:n,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{a=void 0;}return y(this,A)?.set?.(s,a),a}async getPricesByAddresses(t,n,a=VsCurrencyType.USD){let r,i=`getPricesWithMarketDataByAddresses-${`${q(t)}-${n}-${a}`}`;if(r=y(this,A)?.get?.(i),r)return r;try{r=await $(c=>this.fetchPricesByAddresses({assetPlatformId:n,tokenAddresses:t,currency:a,useCoingeckoProxy:c}));}catch{r=void 0;}return y(this,A)?.set?.(i,r),r}async fetchPricesByAddresses({assetPlatformId:t,tokenAddresses:n,currency:a=VsCurrencyType.USD,useCoingeckoProxy:r=!1}){return r?J(y(this,w)).simplePriceByContractAddresses(void 0,{params:{id:t},queries:{contract_addresses:n,vs_currencies:[a],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}}):simpleTokenPrice(ye,{assetPlatformId:t,tokenAddresses:n,currencies:[a],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:t=[],currencies:n=[VsCurrencyType.USD],marketCap:a=!1,vol24:r=!1,change24:s=!1,lastUpdated:i=!1,useCoingeckoProxy:c=!1,shouldThrow:o=!0}){if(c){let m=await J(y(this,w)).simplePrice(void 0,{queries:{ids:t?.join(","),vs_currencies:n.join(","),include_market_cap:String(a),include_24hr_vol:String(r),include_24hr_change:String(s),include_last_updated_at:String(i)}});return this.transformSimplePriceResponse(m,n)}return simplePrice(ye,{coinIds:t,currencies:n,marketCap:a,vol24:r,change24:s,lastUpdated:i,shouldThrow:o})}};A=new WeakMap,w=new WeakMap;var ge=e=>Object.keys(e).includes("unlockedUnstaked"),ke=e=>Object.keys(e).includes("locked");function F(e){let t=Object.values(e).reduce(function(n,a){let r=a.reduce(function(s,i){let c=Number(i.amount);return s+c},0);return n+r},0);return BigInt(t)}function h(e,t){return t===void 0?0:t/10**e}var Te=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlockedUnstaked:e.unlockedUnstaked,unlockedStaked:e.unlockedStaked,pendingStaked:e.pendingStaked,lockedStaked:e.lockedStaked,lockedStakeable:e.lockedStakeable,lockedPlatform:e.lockedPlatform,atomicMemoryLocked:e.atomicMemoryLocked,atomicMemoryUnlocked:e.atomicMemoryUnlocked};for(let k in m){let x=m[k];if(!x||!x.length){o[k]=0;continue}x.forEach(P=>{let Ne=(o[k]??0)+Number(P.amount);o[k]=Ne;});}let p=new TokenUnit(o.unlockedUnstaked?o.unlockedUnstaked:0n,t.decimals,t.symbol),d=n?Number(p.mul(n).toDisplay(2)):void 0,l=p.toDisplay(),u=new TokenUnit(F(e),t.decimals,t.symbol),g=n?Number(u.mul(n).toDisplay(2)):void 0,T=u.toDisplay();return {...t,type:TokenType.NATIVE,priceInCurrency:n,balance:u.toSubUnit(),balanceInCurrency:g,balanceDisplayValue:T,balanceCurrencyDisplayValue:g?.toFixed(2),available:p.toSubUnit(),availableInCurrency:d,availableDisplayValue:l,availableCurrencyDisplayValue:d?.toFixed(2),utxos:e,balancePerType:{lockedStaked:h(c,o.lockedStaked),lockedStakeable:h(c,o.lockedStakeable),lockedPlatform:h(c,o.lockedPlatform),atomicMemoryLocked:h(c,o.atomicMemoryLocked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),unlockedUnstaked:h(c,o.unlockedUnstaked),unlockedStaked:h(c,o.unlockedStaked),pendingStaked:h(c,o.pendingStaked)},marketCap:a,vol24:r,change24:s,coingeckoId:i}};var Pe=({balance:e,networkToken:t,priceInCurrency:n,marketCap:a,vol24:r,change24:s,coingeckoId:i})=>{let c=t.decimals,o={},m={unlocked:e.unlocked,locked:e.locked,atomicMemoryUnlocked:e.atomicMemoryUnlocked,atomicMemoryLocked:e.atomicMemoryLocked};for(let g in m){let T=m[g];if(!T||!T.length){o[g]=0;continue}T.forEach(k=>{let P=(o[g]??0)+Number(k.amount);o[g]=P;});}let p=new TokenUnit(F(e),t.decimals,t.symbol),d=p.toDisplay(),l=n?p.mul(n).toDisplay(2):void 0,u=l?Number(l.replaceAll(",","")):void 0;return {...t,coingeckoId:i,type:TokenType.NATIVE,priceInCurrency:n,balance:p.toSubUnit(),balanceInCurrency:u,balanceDisplayValue:d,balanceCurrencyDisplayValue:l,utxos:e,balancePerType:{unlocked:h(c,o.unlocked),locked:h(c,o.locked),atomicMemoryUnlocked:h(c,o.atomicMemoryUnlocked),atomicMemoryLocked:h(c,o.atomicMemoryLocked)},marketCap:a,vol24:r,change24:s}};var xe=async({addresses:e,currency:t,network:n,glacierService:a,tokenService:r})=>{if(!a.isHealthy())return Promise.reject("Glacier is unhealthy. Try again later.");let i=t.toLowerCase(),c=e[0]??"",o=n.networkToken,m=n.pricingProviders?.coingecko.nativeTokenId,p=n.vmName===NetworkVMType.PVM?BlockchainId.P_CHAIN:BlockchainId.X_CHAIN,d=n.isTestnet?Network.FUJI:Network.MAINNET,l=await a.getChainBalance({blockchainId:p,network:d,addresses:e.join(",")}).then(K=>K.balances),u=m?await r.getSimplePrice({coinIds:[m],currencies:[i]}):{},g=u?.[m??""]?.[i]?.price??void 0,T=u?.[m??""]?.[i]?.marketCap??void 0,k=u?.[m??""]?.[i]?.vol24??void 0,x=u?.[m??""]?.[i]?.change24??void 0,P;return ge(l)?(P=Te({balance:l,networkToken:o,priceInCurrency:g,marketCap:T,vol24:k,change24:x,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):ke(l)?(P=Pe({balance:l,networkToken:o,priceInCurrency:g,marketCap:T,vol24:k,change24:x,coingeckoId:m??""}),{[c]:{[o.symbol]:P}}):Promise.reject("Incorrect type balance was returned from glacier")};function Ce({blockchainId:e,isTestnet:t}){let n=t?"fuji"+e:e,a=at.createHash("sha256").update(n).digest("base64");return "avax:"+rt(a).substring(0,32)}var rt=e=>e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");var Se=async({accountIndex:e,isTestnet:t,xpubXP:n,walletType:a})=>{if(n===void 0)throw rpcErrors.invalidParams("xpubXP is required to get address");let r=t?Avalanche.JsonRpcProvider.getDefaultFujiProvider():Avalanche.JsonRpcProvider.getDefaultMainnetProvider(),s;switch(a){case WalletType.Mnemonic:case WalletType.Ledger:case WalletType.Keystone:{s=Avalanche.getAddressPublicKeyFromXpub(n,e);break}case WalletType.LedgerLive:case WalletType.Seedless:{s=Buffer.from(n,"hex");break}default:throw rpcErrors.invalidParams(`Unsupported wallet type: ${a}`)}return {[NetworkVMType.AVM]:r.getAddress(s,"X"),[NetworkVMType.PVM]:r.getAddress(s,"P")}};var ot=z.union([z.tuple([z.string()]).describe("message to sign"),z.tuple([z.string().describe("message to sign"),z.number().nonnegative().describe("account index")])]),we=e=>ot.safeParse(e);var Re=async({request:e,network:t,approvalController:n})=>{let a=we(e.params);if(!a.success)return console.error("invalid params",a.error),{error:rpcErrors.invalidParams("Params are invalid")};let[r,s]=a.data,i=Buffer.from(r,"utf-8").toString("hex"),c={type:RpcMethod.AVALANCHE_SIGN_MESSAGE,data:i,accountIndex:s},o={title:"Sign Message",dAppInfo:{name:e.dappInfo.name,action:`${e.dappInfo.name} requests you to sign the following message`,logoUri:e.dappInfo.icon},network:{chainId:t.chainId,name:t.chainName,logoUri:t.logoUri},messageDetails:r},m=await n.requestApproval({request:e,displayData:o,signingData:c});return "error"in m?{error:m.error}:{result:m.result}};var I,L,V,Ie=class{constructor({approvalController:t,environment:n}){b(this,I,void 0);b(this,L,void 0);b(this,V,void 0);let{glacierApiUrl:a,proxyApiUrl:r}=de(n);B(this,I,new j({glacierApiUrl:a})),B(this,L,r),B(this,V,t);}getAddress({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r}){return Se({accountIndex:t,xpubXP:n,isTestnet:a,walletType:r})}getBalances({addresses:t,network:n,storage:a,currency:r}){let s=new _({storage:a,proxyApiUrl:y(this,L)});return xe({addresses:t,currency:r,network:n,glacierService:y(this,I),tokenService:s})}getManifest(){let t=parseManifest(Y);return t.success?t.data:void 0}getNetworkFee(t){return ee()}getTransactionHistory({network:t,address:n,nextPageToken:a,offset:r}){return me({network:t,address:n,nextPageToken:a,offset:r,glacierService:y(this,I)})}getTokens(t){return Promise.resolve([])}async onRpcRequest(t,n){switch(t.method){case RpcMethod.AVALANCHE_SIGN_MESSAGE:return Re({request:t,network:n,approvalController:y(this,V)});default:return {error:rpcErrors.methodNotSupported(`Method ${t.method} not supported`)}}}static getHashedBlockchainId({blockchainId:t,isTestnet:n}){return Ce({blockchainId:t,isTestnet:n})}};I=new WeakMap,L=new WeakMap,V=new WeakMap;var ea=e=>"balancePerType"in e&&"unlockedUnstaked"in e.balancePerType,ta=e=>"balancePerType"in e&&"unlocked"in e.balancePerType;
|
|
13
13
|
|
|
14
|
-
export {
|
|
14
|
+
export { Ie as AvalancheModule, ta as isTokenWithBalanceAVM, ea as isTokenWithBalancePVM };
|
|
15
15
|
//# sourceMappingURL=out.js.map
|
|
16
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/utils.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/env.ts","../src/services/glacier-service/glacier-service.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../src/handlers/get-balances/get-balances.ts","../src/handlers/get-balances/utils.ts","../src/handlers/get-balances/convert-p-chain-balance.ts","../src/handlers/get-balances/covnert-x-chain-balance.ts","../src/utils/hash-blockchain-id.ts","../src/handlers/get-address/get-address.ts","../src/handlers/get-balances/typeguards.ts"],"names":["parseManifest","rpcErrors","manifest_default","getNetworkFee","BlockchainId","Network","SortOrder","PrimaryNetworkChainName","Big","isPChainTransactions","value","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","amount","decimals","Avalanche","TokenType","convertPChainTransaction","tx","address","networkToken","chainId","isTestnet","froms","utxo","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","isBaseTx","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","xBlockchainId","totalAmountCreated","asset","getTransactionHistory","nextPageToken","offset","network","glacierService","response","getBlockchainIdByAddress","transactions","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","__publicField","AvalancheGlacierService","glacierApiUrl","params","error","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","proxyApiUrl","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","NetworkVMType","isPchainBalance","balanceResult","isXchainBalance","calculateTotalBalance","uxtos","totalAcc","utxoList","typeSum","typeAcc","balanceToAdd","TokenUnit","convertPChainBalance","balance","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","uxto","newBalance","available","availableInCurrency","availableDisplayValue","totalBalance","balanceInCurrency","balanceDisplayValue","convertXChainBalance","balanceCurrencyDisplayValue","getBalances","addresses","tokenService","lowercaseCurrency","blockchainId","networkName","chainBalances","simplePriceResponse","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","WalletType","getAddress","accountIndex","xpubXP","walletType","provXP","xpPub","_glacierService","AvalancheModule","request","_network","isTokenWithBalancePVM","token","isTokenWithBalanceAVM"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n GetBalancesParams,\n GetBalancesResponse,\n Environment,\n GetAddressParams,\n GetAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { getEnv } from './env';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { TokenService } from '@internal/utils';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\nimport { getAddress } from './handlers/get-address/get-address';\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n\n constructor({ environment }: { environment: Environment }) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#glacierService = new AvalancheGlacierService({ glacierApiUrl });\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpubXP, isTestnet, walletType });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl });\n return getBalances({ addresses, currency, network, glacierService: this.#glacierService, tokenService });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return getNetworkFee();\n }\n\n getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory) {\n return getTransactionHistory({ network, address, nextPageToken, offset, glacierService: this.#glacierService });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, _network: Network) {\n switch (request.method) {\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n static getHashedBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n return hashBlockchainId({ blockchainId, isTestnet });\n }\n}\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo\",\n \"avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG\",\n \"avax:imji8papUf2EhV3le337w1vgFauqkJg-\",\n \"avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n}\n","import type { GetTransactionHistory, Transaction, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { BlockchainId, Network, SortOrder } from '@avalabs/glacier-sdk';\nimport { isPChainTransactions, isXChainTransactions } from './utils';\nimport { convertPChainTransaction } from './convert-p-chain-transaction';\nimport { convertXChainTransaction } from './convert-x-chain-transaction';\nimport type { AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getTransactionHistory = async ({\n address,\n nextPageToken,\n offset,\n network,\n glacierService,\n}: GetTransactionHistory & { glacierService: AvalancheGlacierService }): Promise<TransactionHistoryResponse> => {\n const { isTestnet, networkToken, explorerUrl, chainId } = network;\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n const response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: isTestnet ? Network.FUJI : Network.MAINNET,\n pageSize: offset,\n pageToken: nextPageToken,\n sortOrder: SortOrder.DESC,\n });\n\n let transactions: Transaction[] = [];\n if (isPChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertPChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n if (isXChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertXChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n};\n\nconst getBlockchainIdByAddress = (address: string) => {\n // A comma separated list of X-Chain or P-Chain wallet addresses,\n // starting with \"avax\"/\"fuji\", \"P-avax\"/\"P-fuji\" or \"X-avax\"/\"X-fuji\"\n const firstAddress = address.split(',')[0];\n if (firstAddress?.toLowerCase().startsWith('p-')) {\n return BlockchainId.P_CHAIN;\n }\n return BlockchainId.X_CHAIN;\n};\n","import {\n PrimaryNetworkChainName,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainTransactionsResponse,\n type ListXChainTransactionsResponse,\n} from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\n\nexport const isPChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListPChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.P_CHAIN;\n};\n\nexport const isXChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListXChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.X_CHAIN;\n};\n\nexport function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n\nexport function getTokenValue({ amount, decimals }: { decimals: number; amount?: number }): Big {\n return amount === undefined ? new Big(0) : new Big(amount / 10 ** decimals);\n}\n","import { type PChainTransaction, type NetworkToken } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertPChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: PChainTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl?: string;\n isTestnet?: boolean;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n });\n\n const avaxBurnedAmount = getBurnedAmount({ tx, isTestnet, networkToken });\n const chainAddress = address.toLowerCase().startsWith('p-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.blockTimestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n froms: Set<string>;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const isBaseTx = tx.txType === 'BaseTx';\n\n const nonChangeEmittedUtxosAmt = tx.emittedUtxos\n .filter(\n (utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && !utxo.addresses.some((addr) => froms.has(addr)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n const txValue = tx.value.find((val) => val.assetId === getAvaxAssetId(!!isTestnet))?.amount;\n // This ternary attempts to cover the case where users send themselves AVAX\n // in which case the senders are the recipients and we should use the total tx value.\n const baseTxValue = nonChangeEmittedUtxosAmt.gt(new Big(0))\n ? nonChangeEmittedUtxosAmt\n : txValue\n ? new Big(txValue)\n : new Big(0) ?? new Big(0);\n\n const pBlockchainId = isTestnet ? Avalanche.FujiContext.pBlockchainID : Avalanche.MainnetContext.pBlockchainID;\n\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === pBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== pBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.amount), new Big(0));\n const nAvaxAmount = isBaseTx\n ? baseTxValue\n : isImportExport\n ? importExportAmount\n : tx.amountStaked.length === 0\n ? aggregateValue(tx.value, !!isTestnet)\n : aggregateValue(tx.amountStaked, !!isTestnet);\n return getTokenValue({ amount: nAvaxAmount?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const nAvaxFee = tx.amountBurned\n ?.filter((value) => value.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, value) => accumulator.add(value.amount), new Big(0));\n return getTokenValue({ amount: nAvaxFee?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction aggregateValue(value: PChainTransaction['value'], isTestnet: boolean): Big | undefined {\n return value\n .filter((value_) => value_.assetId === getAvaxAssetId(isTestnet))\n .reduce((accumulator, value_) => accumulator.add(value_.amount), new Big(0));\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { type NetworkToken, XChainNonLinearTransaction, XChainLinearTransaction } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertXChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n isTestnet?: boolean;\n explorerUrl?: string;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, totalAmountCreated: amount, networkToken });\n const chainAddress = address.toLowerCase().startsWith('x-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.timestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === xBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== xBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n\n const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxAmt = isImportExport ? importExportAmount : totalAmountCreated;\n return getTokenValue({ amount: nAvaxAmt.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n totalAmountCreated,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n totalAmountCreated: Big;\n networkToken: NetworkToken;\n}): Big {\n const totalAmountUnlocked = tx.amountUnlocked\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxFee = totalAmountUnlocked.minus(totalAmountCreated);\n return getTokenValue({ amount: nAvaxFee.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n BlockchainId,\n Glacier,\n type ListCChainAtomicBalancesResponse,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainBalancesResponse,\n type ListPChainTransactionsResponse,\n type ListXChainBalancesResponse,\n type ListXChainTransactionsResponse,\n Network,\n PrimaryNetworkTxType,\n SortOrder,\n} from '@avalabs/glacier-sdk';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class AvalancheGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n\n constructor({ glacierApiUrl }: { glacierApiUrl: string }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl });\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async listLatestPrimaryNetworkTransactions(params: {\n blockchainId: BlockchainId;\n network: Network;\n addresses?: string;\n txTypes?: Array<PrimaryNetworkTxType>;\n startTimestamp?: number;\n endTimestamp?: number;\n pageToken?: string;\n pageSize?: number;\n sortOrder?: SortOrder;\n }): Promise<ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse> {\n try {\n return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getChainBalance(params: {\n blockchainId: BlockchainId;\n network: Network;\n blockTimestamp?: number;\n addresses?: string;\n }): Promise<ListPChainBalancesResponse | ListXChainBalancesResponse | ListCChainAtomicBalancesResponse> {\n try {\n return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n return coingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses(undefined, {\n params: {\n id: assetPlatformId,\n },\n queries: {\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n },\n });\n }\n\n return simpleTokenPrice(coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await coingeckoProxyClient(this.#proxyApiUrl).simplePrice(undefined, {\n queries: {\n ids: coinIds?.join(','),\n vs_currencies: currencies.join(','),\n include_market_cap: String(marketCap),\n include_24hr_vol: String(vol24),\n include_24hr_change: String(change24),\n include_last_updated_at: String(lastUpdated),\n },\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","import { Zodios } from '@zodios/core';\nimport { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { boolean, string } from 'zod';\n\nexport const coingeckoProxyClient = (proxyApiUrl: string) =>\n new Zodios(\n `${proxyApiUrl}/proxy/coingecko`,\n [\n {\n method: 'post',\n path: '/simple/price',\n parameters: [\n { name: 'ids', type: 'Query', schema: string() },\n { name: 'vs_currencies', type: 'Query', schema: string() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_last_updated_at',\n type: 'Query',\n schema: string().optional(),\n },\n ],\n alias: 'simplePrice',\n response: RawSimplePriceResponseSchema,\n },\n {\n method: 'post',\n path: '/simple/token_price/:id',\n parameters: [\n { name: 'id', type: 'Path', schema: string() },\n { name: 'contract_addresses', type: 'Query', schema: string().array() },\n { name: 'vs_currencies', type: 'Query', schema: string().array() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: boolean().optional(),\n },\n ],\n alias: 'simplePriceByContractAddresses',\n response: SimplePriceResponseSchema,\n },\n ],\n {\n axiosConfig: {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n },\n );\n","import {\n NetworkVMType,\n type GetBalancesParams,\n type TokenWithBalanceAVM,\n type TokenWithBalancePVM,\n} from '@avalabs/vm-module-types';\nimport { type AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\nimport {\n BlockchainId,\n Network,\n type ListPChainBalancesResponse,\n type ListXChainBalancesResponse,\n} from '@avalabs/glacier-sdk';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { isPchainBalance, isXchainBalance } from './utils';\nimport { convertPChainBalance } from './convert-p-chain-balance';\nimport { convertXChainBalance } from './covnert-x-chain-balance';\n\ntype GetAvalancheBalancesResponse = Record<string, Record<string, TokenWithBalanceAVM | TokenWithBalancePVM>>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n glacierService,\n tokenService,\n}: GetBalancesParams & {\n glacierService: AvalancheGlacierService;\n tokenService: TokenService;\n}): Promise<GetAvalancheBalancesResponse> => {\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return Promise.reject('Glacier is unhealthy. Try again later.');\n }\n\n const lowercaseCurrency = currency.toLowerCase();\n const address = addresses[0] ?? '';\n const networkToken = network.networkToken;\n const coingeckoId = network.pricingProviders?.coingecko.nativeTokenId;\n\n const blockchainId = network.vmName === NetworkVMType.PVM ? BlockchainId.P_CHAIN : BlockchainId.X_CHAIN;\n const networkName = network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: networkName,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const simplePriceResponse = coingeckoId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoId],\n currencies: [lowercaseCurrency] as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.change24 ?? undefined;\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n\n if (isXchainBalance(chainBalances)) {\n balance = convertXChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n return Promise.reject('Incorrect type balance was returned from glacier');\n};\n","import type { PChainBalance, XChainBalances } from '@avalabs/glacier-sdk';\n\nexport const isPchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is PChainBalance => {\n return Object.keys(balanceResult).includes('unlockedUnstaked');\n};\n\nexport const isXchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is XChainBalances => {\n return Object.keys(balanceResult).includes('locked');\n};\n\nexport function calculateTotalBalance(uxtos: PChainBalance | XChainBalances): bigint {\n const sum = Object.values(uxtos).reduce(function (totalAcc, utxoList) {\n const typeSum = utxoList.reduce(function (typeAcc, utxo) {\n const balanceToAdd = Number(utxo.amount);\n return typeAcc + balanceToAdd;\n }, 0);\n\n return totalAcc + typeSum;\n }, 0);\n\n return BigInt(sum);\n}\n\nexport function getTokenValue(decimals: number, amount?: number) {\n return amount === undefined ? 0 : amount / 10 ** decimals;\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { type NetworkToken, TokenType, type TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const convertPChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalancePVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlockedUnstaked: balance.unlockedUnstaked,\n unlockedStaked: balance.unlockedStaked,\n pendingStaked: balance.pendingStaked,\n lockedStaked: balance.lockedStaked,\n lockedStakeable: balance.lockedStakeable,\n lockedPlatform: balance.lockedPlatform,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlockedUnstaked'] ? balancePerType['unlockedUnstaked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency ? Number(available.mul(priceInCurrency).toDisplay(2)) : undefined;\n const availableDisplayValue = available.toDisplay();\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceInCurrency = priceInCurrency ? Number(totalBalance.mul(priceInCurrency).toDisplay(2)) : undefined;\n const balanceDisplayValue = totalBalance.toDisplay();\n\n return {\n ...networkToken,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue: balanceInCurrency?.toFixed(2),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue,\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n lockedStaked: getTokenValue(decimals, balancePerType['lockedStaked']),\n lockedStakeable: getTokenValue(decimals, balancePerType['lockedStakeable']),\n lockedPlatform: getTokenValue(decimals, balancePerType['lockedPlatform']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n unlockedUnstaked: getTokenValue(decimals, balancePerType['unlockedUnstaked']),\n unlockedStaked: getTokenValue(decimals, balancePerType['unlockedStaked']),\n pendingStaked: getTokenValue(decimals, balancePerType['pendingStaked']),\n },\n marketCap,\n vol24,\n change24,\n coingeckoId,\n };\n};\n","import type { AggregatedAssetAmount, XChainBalances } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { TokenType, type NetworkToken, type TokenWithBalanceAVM } from '@avalabs/vm-module-types';\n\nexport const convertXChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalanceAVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlocked: balance.unlocked,\n locked: balance.locked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceDisplayValue = totalBalance.toDisplay();\n const balanceCurrencyDisplayValue = priceInCurrency ? totalBalance.mul(priceInCurrency).toDisplay(2) : undefined;\n const balanceInCurrency = balanceCurrencyDisplayValue\n ? Number(balanceCurrencyDisplayValue.replaceAll(',', ''))\n : undefined;\n\n return {\n ...networkToken,\n coingeckoId,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue,\n utxos: balance,\n balancePerType: {\n unlocked: getTokenValue(decimals, balancePerType['unlocked']),\n locked: getTokenValue(decimals, balancePerType['locked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n },\n marketCap,\n vol24,\n change24,\n };\n};\n","import Crypto from 'crypto';\n\n//github.com/gergelylovas/chain-agnostic-namespaces/pull/1/files#diff-cf7185539a48e85d069d194c1c17d7cfa0317b3caa3a89c92e797e3717e49d59R40\nexport function hashBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n const blockChainIdWithPrefix = isTestnet ? 'fuji' + blockchainId : blockchainId;\n const base64 = Crypto.createHash('sha256').update(blockChainIdWithPrefix).digest('base64');\n const hash = convertBase64ToBase64Url(base64).substring(0, 32);\n return 'avax:' + hash;\n}\n\nconst convertBase64ToBase64Url = (base64: string) => base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n isTestnet,\n xpubXP,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\n let xpPub: Buffer;\n\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n // X and P addresses different derivation path m/44'/9000'/0'...\n xpPub = Avalanche.getAddressPublicKeyFromXpub(xpubXP, accountIndex);\n break;\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n xpPub = Buffer.from(xpubXP, 'hex');\n break;\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n\n return {\n [NetworkVMType.AVM]: provXP.getAddress(xpPub, 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(xpPub, 'P'),\n };\n};\n","import type { TokenWithBalance, TokenWithBalanceAVM, TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const isTokenWithBalancePVM = (token: TokenWithBalance): token is TokenWithBalancePVM => {\n return 'balancePerType' in token && 'unlockedUnstaked' in token.balancePerType;\n};\n\nexport const isTokenWithBalanceAVM = (token: TokenWithBalance): token is TokenWithBalanceAVM => {\n return 'balancePerType' in token && 'unlocked' in token.balancePerType;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-transaction-history/utils.ts","../src/handlers/get-transaction-history/convert-p-chain-transaction.ts","../src/handlers/get-transaction-history/convert-x-chain-transaction.ts","../src/env.ts","../src/services/glacier-service/glacier-service.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/utils/retry.ts","../../../packages-internal/utils/src/utils/coingecko-retry.ts","../../../packages-internal/utils/src/utils/charsum.ts","../../../packages-internal/utils/src/utils/array-hash.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../src/handlers/get-balances/get-balances.ts","../src/handlers/get-balances/utils.ts","../src/handlers/get-balances/convert-p-chain-balance.ts","../src/handlers/get-balances/covnert-x-chain-balance.ts","../src/utils/hash-blockchain-id.ts","../src/handlers/get-address/get-address.ts","../src/handlers/avalanche-sign-message/avalanche-sign-message.ts","../src/handlers/avalanche-sign-message/schemas/parse-request-params/parse-request-params.ts","../src/handlers/get-balances/typeguards.ts"],"names":["parseManifest","RpcMethod","rpcErrors","manifest_default","getNetworkFee","BlockchainId","Network","SortOrder","PrimaryNetworkChainName","Big","isPChainTransactions","value","isXChainTransactions","getExplorerAddressByNetwork","explorerUrl","hash","hashType","getTokenValue","amount","decimals","Avalanche","TokenType","convertPChainTransaction","tx","address","networkToken","chainId","isTestnet","froms","utxo","tos","getAmount","avaxBurnedAmount","getBurnedAmount","chainAddress","isSender","isImportExport","isBaseTx","nonChangeEmittedUtxosAmt","getAvaxAssetId","addr","agg","txValue","val","baseTxValue","pBlockchainId","importExportAmount","nAvaxAmount","aggregateValue","nAvaxFee","accumulator","value_","convertXChainTransaction","xBlockchainId","totalAmountCreated","asset","getTransactionHistory","nextPageToken","offset","network","glacierService","response","getBlockchainIdByAddress","transactions","Environment","prodEnv","devEnv","getEnv","environment","Glacier","GlacierUnhealthyError","__publicField","AvalancheGlacierService","glacierApiUrl","params","error","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","proxyApiUrl","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","NetworkVMType","isPchainBalance","balanceResult","isXchainBalance","calculateTotalBalance","uxtos","totalAcc","utxoList","typeSum","typeAcc","balanceToAdd","TokenUnit","convertPChainBalance","balance","priceInCurrency","coingeckoId","balancePerType","balanceTypes","balanceType","balancesToAdd","uxto","newBalance","available","availableInCurrency","availableDisplayValue","totalBalance","balanceInCurrency","balanceDisplayValue","convertXChainBalance","balanceCurrencyDisplayValue","getBalances","addresses","tokenService","lowercaseCurrency","blockchainId","networkName","chainBalances","simplePriceResponse","Crypto","hashBlockchainId","blockChainIdWithPrefix","base64","convertBase64ToBase64Url","WalletType","getAddress","accountIndex","xpubXP","walletType","provXP","xpPub","z","paramsSchema","parseRequestParams","avalancheSignMessage","request","approvalController","message","msgHex","signingData","displayData","_glacierService","_approvalController","AvalancheModule","isTokenWithBalancePVM","token","isTokenWithBalanceAVM"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n GetBalancesParams,\n GetBalancesResponse,\n Environment,\n GetAddressParams,\n GetAddressResponse,\n ApprovalController,\n} from '@avalabs/vm-module-types';\nimport { parseManifest, RpcMethod } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport { getEnv } from './env';\nimport { AvalancheGlacierService } from './services/glacier-service/glacier-service';\nimport { TokenService } from '@internal/utils';\nimport { getBalances } from './handlers/get-balances/get-balances';\nimport { hashBlockchainId } from './utils/hash-blockchain-id';\nimport { getAddress } from './handlers/get-address/get-address';\nimport { avalancheSignMessage } from './handlers/avalanche-sign-message/avalanche-sign-message';\n\nexport class AvalancheModule implements Module {\n #glacierService: AvalancheGlacierService;\n #proxyApiUrl: string;\n #approvalController: ApprovalController;\n\n constructor({\n approvalController,\n environment,\n }: {\n approvalController: ApprovalController;\n environment: Environment;\n }) {\n const { glacierApiUrl, proxyApiUrl } = getEnv(environment);\n this.#glacierService = new AvalancheGlacierService({ glacierApiUrl });\n this.#proxyApiUrl = proxyApiUrl;\n this.#approvalController = approvalController;\n }\n\n getAddress({ accountIndex, xpubXP, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpubXP, isTestnet, walletType });\n }\n\n getBalances({ addresses, network, storage, currency }: GetBalancesParams): Promise<GetBalancesResponse> {\n const tokenService = new TokenService({ storage, proxyApiUrl: this.#proxyApiUrl });\n return getBalances({ addresses, currency, network, glacierService: this.#glacierService, tokenService });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return getNetworkFee();\n }\n\n getTransactionHistory({ network, address, nextPageToken, offset }: GetTransactionHistory) {\n return getTransactionHistory({ network, address, nextPageToken, offset, glacierService: this.#glacierService });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, network: Network) {\n switch (request.method) {\n case RpcMethod.AVALANCHE_SIGN_MESSAGE:\n return avalancheSignMessage({ request, network, approvalController: this.#approvalController });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n static getHashedBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n return hashBlockchainId({ blockchainId, isTestnet });\n }\n}\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo\",\n \"avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG\",\n \"avax:imji8papUf2EhV3le337w1vgFauqkJg-\",\n \"avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_signTransaction\", \"avalanche_signMessage\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n}\n","import type { GetTransactionHistory, Transaction, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { BlockchainId, Network, SortOrder } from '@avalabs/glacier-sdk';\nimport { isPChainTransactions, isXChainTransactions } from './utils';\nimport { convertPChainTransaction } from './convert-p-chain-transaction';\nimport { convertXChainTransaction } from './convert-x-chain-transaction';\nimport type { AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\n\nexport const getTransactionHistory = async ({\n address,\n nextPageToken,\n offset,\n network,\n glacierService,\n}: GetTransactionHistory & { glacierService: AvalancheGlacierService }): Promise<TransactionHistoryResponse> => {\n const { isTestnet, networkToken, explorerUrl, chainId } = network;\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n\n const response = await glacierService.listLatestPrimaryNetworkTransactions({\n addresses: address,\n blockchainId: getBlockchainIdByAddress(address),\n network: isTestnet ? Network.FUJI : Network.MAINNET,\n pageSize: offset,\n pageToken: nextPageToken,\n sortOrder: SortOrder.DESC,\n });\n\n let transactions: Transaction[] = [];\n if (isPChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertPChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n if (isXChainTransactions(response)) {\n transactions = response.transactions.map((value) =>\n convertXChainTransaction({ tx: value, isTestnet, address, networkToken, explorerUrl, chainId }),\n );\n }\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n};\n\nconst getBlockchainIdByAddress = (address: string) => {\n // A comma separated list of X-Chain or P-Chain wallet addresses,\n // starting with \"avax\"/\"fuji\", \"P-avax\"/\"P-fuji\" or \"X-avax\"/\"X-fuji\"\n const firstAddress = address.split(',')[0];\n if (firstAddress?.toLowerCase().startsWith('p-')) {\n return BlockchainId.P_CHAIN;\n }\n return BlockchainId.X_CHAIN;\n};\n","import {\n PrimaryNetworkChainName,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainTransactionsResponse,\n type ListXChainTransactionsResponse,\n} from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\n\nexport const isPChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListPChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.P_CHAIN;\n};\n\nexport const isXChainTransactions = (\n value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,\n): value is ListXChainTransactionsResponse => {\n return value.chainInfo.chainName === PrimaryNetworkChainName.X_CHAIN;\n};\n\nexport function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n\nexport function getTokenValue({ amount, decimals }: { decimals: number; amount?: number }): Big {\n return amount === undefined ? new Big(0) : new Big(amount / 10 ** decimals);\n}\n","import { type PChainTransaction, type NetworkToken } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertPChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: PChainTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl?: string;\n isTestnet?: boolean;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n });\n\n const avaxBurnedAmount = getBurnedAmount({ tx, isTestnet, networkToken });\n const chainAddress = address.toLowerCase().startsWith('p-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.blockTimestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n froms,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n froms: Set<string>;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const isBaseTx = tx.txType === 'BaseTx';\n\n const nonChangeEmittedUtxosAmt = tx.emittedUtxos\n .filter(\n (utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && !utxo.addresses.some((addr) => froms.has(addr)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n const txValue = tx.value.find((val) => val.assetId === getAvaxAssetId(!!isTestnet))?.amount;\n // This ternary attempts to cover the case where users send themselves AVAX\n // in which case the senders are the recipients and we should use the total tx value.\n const baseTxValue = nonChangeEmittedUtxosAmt.gt(new Big(0))\n ? nonChangeEmittedUtxosAmt\n : txValue\n ? new Big(txValue)\n : new Big(0) ?? new Big(0);\n\n const pBlockchainId = isTestnet ? Avalanche.FujiContext.pBlockchainID : Avalanche.MainnetContext.pBlockchainID;\n\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === pBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== pBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.amount), new Big(0));\n const nAvaxAmount = isBaseTx\n ? baseTxValue\n : isImportExport\n ? importExportAmount\n : tx.amountStaked.length === 0\n ? aggregateValue(tx.value, !!isTestnet)\n : aggregateValue(tx.amountStaked, !!isTestnet);\n return getTokenValue({ amount: nAvaxAmount?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: PChainTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const nAvaxFee = tx.amountBurned\n ?.filter((value) => value.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, value) => accumulator.add(value.amount), new Big(0));\n return getTokenValue({ amount: nAvaxFee?.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction aggregateValue(value: PChainTransaction['value'], isTestnet: boolean): Big | undefined {\n return value\n .filter((value_) => value_.assetId === getAvaxAssetId(isTestnet))\n .reduce((accumulator, value_) => accumulator.add(value_.amount), new Big(0));\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { type NetworkToken, XChainNonLinearTransaction, XChainLinearTransaction } from '@avalabs/glacier-sdk';\nimport Big from 'big.js';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { TokenType, type Transaction } from '@avalabs/vm-module-types';\nimport { getExplorerAddressByNetwork, getTokenValue } from './utils';\n\nexport function convertXChainTransaction({\n tx,\n address,\n networkToken,\n chainId,\n explorerUrl,\n isTestnet,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n address: string;\n networkToken: NetworkToken;\n chainId: number;\n isTestnet?: boolean;\n explorerUrl?: string;\n}): Transaction {\n const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);\n const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);\n\n const amount = getAmount({\n tx,\n isTestnet,\n networkToken,\n });\n const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, totalAmountCreated: amount, networkToken });\n const chainAddress = address.toLowerCase().startsWith('x-') ? address.slice(2) : address;\n const isSender = froms.has(chainAddress);\n\n return {\n hash: tx.txHash,\n isContractCall: false,\n isIncoming: !isSender,\n isOutgoing: isSender,\n from: [...froms.values()].join(','),\n to: [...tos.values()].join(','),\n isSender,\n timestamp: tx.timestamp * 1000, // to millis\n tokens: [\n {\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n amount: amount.toString(),\n },\n ],\n gasUsed: avaxBurnedAmount.toString(),\n explorerLink: getExplorerAddressByNetwork(explorerUrl ?? '', tx.txHash, 'tx'),\n txType: tx.txType,\n chainId: chainId.toString(),\n };\n}\n\nfunction getAmount({\n tx,\n isTestnet,\n networkToken,\n}: {\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n isTestnet?: boolean;\n networkToken: NetworkToken;\n}): Big {\n const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);\n const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;\n const importExportAmount = tx.emittedUtxos\n .filter(\n (utxo) =>\n utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&\n ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === xBlockchainId) ||\n (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== xBlockchainId)),\n )\n .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));\n\n const totalAmountCreated = tx.amountCreated\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxAmt = isImportExport ? importExportAmount : totalAmountCreated;\n return getTokenValue({ amount: nAvaxAmt.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getBurnedAmount({\n isTestnet,\n tx,\n totalAmountCreated,\n networkToken,\n}: {\n isTestnet?: boolean;\n tx: XChainNonLinearTransaction | XChainLinearTransaction;\n totalAmountCreated: Big;\n networkToken: NetworkToken;\n}): Big {\n const totalAmountUnlocked = tx.amountUnlocked\n .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))\n .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));\n const nAvaxFee = totalAmountUnlocked.minus(totalAmountCreated);\n return getTokenValue({ amount: nAvaxFee.toNumber(), decimals: networkToken.decimals });\n}\n\nfunction getAvaxAssetId(isTestnet: boolean): string {\n return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;\n}\n","import { Environment } from '@avalabs/vm-module-types';\n\ntype Env = {\n glacierApiUrl: string;\n proxyApiUrl: string;\n};\n\nexport const prodEnv: Env = {\n glacierApiUrl: 'https://glacier-api.avax.network',\n proxyApiUrl: 'https://proxy-api.avax.network',\n};\n\nexport const devEnv: Env = {\n glacierApiUrl: 'https://glacier-api-dev.avax.network',\n proxyApiUrl: 'https://proxy-api-dev.avax.network',\n};\n\nexport const getEnv = (environment: Environment): Env => {\n switch (environment) {\n case Environment.PRODUCTION:\n return prodEnv;\n case Environment.DEV:\n return devEnv;\n }\n};\n","import {\n BlockchainId,\n Glacier,\n type ListCChainAtomicBalancesResponse,\n type ListCChainAtomicTransactionsResponse,\n type ListPChainBalancesResponse,\n type ListPChainTransactionsResponse,\n type ListXChainBalancesResponse,\n type ListXChainTransactionsResponse,\n Network,\n PrimaryNetworkTxType,\n SortOrder,\n} from '@avalabs/glacier-sdk';\n\nclass GlacierUnhealthyError extends Error {\n override message = 'Glacier is unhealthy. Try again later.';\n}\n\nexport class AvalancheGlacierService {\n glacierSdk: Glacier;\n isGlacierHealthy = true;\n\n constructor({ glacierApiUrl }: { glacierApiUrl: string }) {\n this.glacierSdk = new Glacier({ BASE: glacierApiUrl });\n }\n\n isHealthy = (): boolean => this.isGlacierHealthy;\n\n setGlacierToUnhealthy(): void {\n this.isGlacierHealthy = false;\n setTimeout(\n () => {\n this.isGlacierHealthy = true;\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n }\n\n async listLatestPrimaryNetworkTransactions(params: {\n blockchainId: BlockchainId;\n network: Network;\n addresses?: string;\n txTypes?: Array<PrimaryNetworkTxType>;\n startTimestamp?: number;\n endTimestamp?: number;\n pageToken?: string;\n pageSize?: number;\n sortOrder?: SortOrder;\n }): Promise<ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse> {\n try {\n return this.glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n\n async getChainBalance(params: {\n blockchainId: BlockchainId;\n network: Network;\n blockTimestamp?: number;\n addresses?: string;\n }): Promise<ListPChainBalancesResponse | ListXChainBalancesResponse | ListCChainAtomicBalancesResponse> {\n try {\n return this.glacierSdk.primaryNetworkBalances.getBalancesByAddresses(params);\n } catch (error) {\n if (error instanceof GlacierUnhealthyError) {\n this.setGlacierToUnhealthy();\n }\n throw error;\n }\n }\n}\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/core-coingecko-sdk';\nimport type { Storage, RawSimplePriceResponse, SimplePriceResponse } from '@avalabs/vm-module-types';\nimport { coingeckoRetry } from '../../utils/coingecko-retry';\nimport { arrayHash } from '../../utils/array-hash';\nimport { coingeckoProxyClient } from './coingecko-proxy-client';\n\nconst coingeckoBasicClient = getBasicCoingeckoHttp();\n\nexport class TokenService {\n #storage?: Storage;\n #proxyApiUrl: string;\n\n constructor({ storage, proxyApiUrl }: { proxyApiUrl: string; storage?: Storage }) {\n this.#storage = storage;\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n /**\n * Get token price with market data first on coingecko (free tier) directly,\n * if we get 429 error, retry it on coingecko proxy (paid service)\n * @returns token price with market data\n */\n async getSimplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n }: SimplePriceParams): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = coinIds ? `${arrayHash(coinIds)}-${currencies.toString()}` : `${currencies.toString()}`;\n\n const cacheId = `getSimplePrice-${key}`;\n\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.simplePrice({\n coinIds,\n currencies,\n marketCap: true,\n vol24: true,\n change24: true,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n /**\n * Get token price with market data for a list of addresses\n * @param tokenAddresses the token addresses\n * @param assetPlatformId The platform id for all the tokens in the list\n * @param currency the currency to be used\n * @returns a list of token price with market data\n */\n async getPricesByAddresses(\n tokenAddresses: string[],\n assetPlatformId: string,\n currency: VsCurrencyType = VsCurrencyType.USD,\n ): Promise<SimplePriceResponse | undefined> {\n let data: SimplePriceResponse | undefined;\n\n const key = `${arrayHash(tokenAddresses)}-${assetPlatformId}-${currency}`;\n\n const cacheId = `getPricesWithMarketDataByAddresses-${key}`;\n data = this.#storage?.get?.<SimplePriceResponse>(cacheId);\n\n if (data) return data;\n\n try {\n data = await coingeckoRetry((useCoingeckoProxy) =>\n this.fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency,\n useCoingeckoProxy,\n }),\n );\n } catch {\n data = undefined;\n }\n this.#storage?.set?.(cacheId, data);\n return data;\n }\n\n private async fetchPricesByAddresses({\n assetPlatformId,\n tokenAddresses,\n currency = VsCurrencyType.USD,\n useCoingeckoProxy = false,\n }: {\n assetPlatformId: string;\n tokenAddresses: string[];\n currency: VsCurrencyType;\n useCoingeckoProxy?: boolean;\n }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n return coingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses(undefined, {\n params: {\n id: assetPlatformId,\n },\n queries: {\n contract_addresses: tokenAddresses,\n vs_currencies: [currency],\n include_market_cap: true,\n include_24hr_vol: true,\n include_24hr_change: true,\n },\n });\n }\n\n return simpleTokenPrice(coingeckoBasicClient, {\n assetPlatformId,\n tokenAddresses,\n currencies: [currency],\n marketCap: true,\n vol24: true,\n change24: true,\n });\n }\n\n private async simplePrice({\n coinIds = [],\n currencies = [VsCurrencyType.USD],\n marketCap = false,\n vol24 = false,\n change24 = false,\n lastUpdated = false,\n useCoingeckoProxy = false,\n shouldThrow = true,\n }: SimplePriceParams & { useCoingeckoProxy?: boolean }): Promise<SimplePriceResponse> {\n if (useCoingeckoProxy) {\n const rawData = await coingeckoProxyClient(this.#proxyApiUrl).simplePrice(undefined, {\n queries: {\n ids: coinIds?.join(','),\n vs_currencies: currencies.join(','),\n include_market_cap: String(marketCap),\n include_24hr_vol: String(vol24),\n include_24hr_change: String(change24),\n include_last_updated_at: String(lastUpdated),\n },\n });\n return this.transformSimplePriceResponse(rawData, currencies);\n }\n return simplePrice(coingeckoBasicClient, {\n coinIds,\n currencies,\n marketCap,\n vol24,\n change24,\n lastUpdated,\n shouldThrow,\n });\n }\n\n private transformSimplePriceResponse = (\n data: RawSimplePriceResponse,\n currencies = [VsCurrencyType.USD],\n ): SimplePriceResponse => {\n const formattedData: SimplePriceResponse = {};\n Object.keys(data).forEach((id) => {\n const tokenData = data[id];\n formattedData[id] = {};\n currencies.forEach((currency: VsCurrencyType) => {\n formattedData[id] = {\n [currency]: {\n price: tokenData?.[currency],\n change24: tokenData?.[`${currency}_24h_change`],\n vol24: tokenData?.[`${currency}_24h_vol`],\n marketCap: tokenData?.[`${currency}_market_cap`],\n },\n };\n });\n });\n return formattedData;\n };\n}\n","const DEFAULT_MAX_RETRIES = 10;\n\ntype RetryParams<T> = {\n operation: (retryIndex: number) => Promise<T>;\n isSuccess: (result: T) => boolean;\n maxRetries?: number;\n backoffPolicy?: RetryBackoffPolicyInterface;\n};\n/*\n * Retries an operation with defined backoff policy.\n *\n * @param operation - The operation to retry.\n * @param isSuccess - The predicate to check if the operation succeeded.\n * @param maxRetries - The maximum number of retries.\n * @param backoffPolicy - Function to generate delay time based on current retry count.\n *\n * @returns The result of the operation.\n * @throws An error if the operation fails after the maximum number of retries.\n *\n * @example\n * const result = await retry(\n * async () => {\n * const response = await fetch('https://example.com')\n * return response.json()\n * },\n * result => result.status === 200\n * )\n */\nexport const retry = async <T>({\n operation,\n isSuccess,\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffPolicy = RetryBackoffPolicy.exponential(),\n}: RetryParams<T>): Promise<T> => {\n let backoffPeriodMillis = 0;\n let retries = 0;\n let lastError: unknown;\n\n while (retries < maxRetries) {\n if (retries > 0) {\n await delay(backoffPeriodMillis);\n }\n\n try {\n const result = await operation(retries);\n\n if (isSuccess(result)) {\n return result;\n }\n } catch (err) {\n // when the operation throws an error, we still retry\n lastError = err;\n }\n\n backoffPeriodMillis = backoffPolicy(retries);\n retries++;\n }\n\n const errorMessage = lastError ? `Max retry exceeded. ${lastError}` : 'Max retry exceeded.';\n\n throw new Error(errorMessage);\n};\n\ntype RetryBackoffPolicyInterface = (retryIndex: number) => number;\n\nexport class RetryBackoffPolicy {\n static exponential(): RetryBackoffPolicyInterface {\n return (retryIndex: number): number => {\n return Math.pow(2, retryIndex) * 1000;\n };\n }\n\n static constant(secondsToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return secondsToDelay * 1000;\n };\n }\n\n static constantMs(msToDelay: number): RetryBackoffPolicyInterface {\n return (_: number): number => {\n return msToDelay;\n };\n }\n}\n\nfunction delay(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { RetryBackoffPolicy, retry } from './retry';\n\ntype Error = {\n status: {\n error_code: number;\n error_message: string;\n };\n};\n\nexport const coingeckoRetry = <T>(\n operation: (useCoingeckoProxy: boolean) => Promise<T | Error>,\n): Promise<T | undefined> => {\n return retry({\n operation: (retryIndex: number) => operation(retryIndex > 0),\n maxRetries: 2,\n backoffPolicy: RetryBackoffPolicy.constant(1),\n isSuccess: (response: T | Error) => {\n const errorStatus = (response as Error)?.status;\n return errorStatus?.error_code !== 429;\n },\n }) as Promise<T | undefined>;\n};\n","export function charsum(s: string): number {\n let i,\n sum = 0;\n for (i = 0; i < s.length; i++) {\n sum += s.charCodeAt(i) * (i + 1);\n }\n return sum;\n}\n","import { charsum } from './charsum';\n\n// from https://stackoverflow.com/a/25105589\nexport function arrayHash(array: string[]): string {\n let i,\n sum = 0;\n for (i = 0; i < array.length; i++) {\n const cs = charsum(array[i] ?? '');\n sum = sum + 65027 / cs;\n }\n return ('' + sum).slice(0, 16);\n}\n","import { Zodios } from '@zodios/core';\nimport { RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { boolean, string } from 'zod';\n\nexport const coingeckoProxyClient = (proxyApiUrl: string) =>\n new Zodios(\n `${proxyApiUrl}/proxy/coingecko`,\n [\n {\n method: 'post',\n path: '/simple/price',\n parameters: [\n { name: 'ids', type: 'Query', schema: string() },\n { name: 'vs_currencies', type: 'Query', schema: string() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: string().optional(),\n },\n {\n name: 'include_last_updated_at',\n type: 'Query',\n schema: string().optional(),\n },\n ],\n alias: 'simplePrice',\n response: RawSimplePriceResponseSchema,\n },\n {\n method: 'post',\n path: '/simple/token_price/:id',\n parameters: [\n { name: 'id', type: 'Path', schema: string() },\n { name: 'contract_addresses', type: 'Query', schema: string().array() },\n { name: 'vs_currencies', type: 'Query', schema: string().array() },\n {\n name: 'include_market_cap',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_vol',\n type: 'Query',\n schema: boolean().optional(),\n },\n {\n name: 'include_24hr_change',\n type: 'Query',\n schema: boolean().optional(),\n },\n ],\n alias: 'simplePriceByContractAddresses',\n response: SimplePriceResponseSchema,\n },\n ],\n {\n axiosConfig: {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n },\n );\n","import {\n NetworkVMType,\n type GetBalancesParams,\n type TokenWithBalanceAVM,\n type TokenWithBalancePVM,\n} from '@avalabs/vm-module-types';\nimport { type AvalancheGlacierService } from '../../services/glacier-service/glacier-service';\nimport {\n BlockchainId,\n Network,\n type ListPChainBalancesResponse,\n type ListXChainBalancesResponse,\n} from '@avalabs/glacier-sdk';\nimport type { TokenService } from '@internal/utils';\nimport { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport { isPchainBalance, isXchainBalance } from './utils';\nimport { convertPChainBalance } from './convert-p-chain-balance';\nimport { convertXChainBalance } from './covnert-x-chain-balance';\n\ntype GetAvalancheBalancesResponse = Record<string, Record<string, TokenWithBalanceAVM | TokenWithBalancePVM>>;\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n glacierService,\n tokenService,\n}: GetBalancesParams & {\n glacierService: AvalancheGlacierService;\n tokenService: TokenService;\n}): Promise<GetAvalancheBalancesResponse> => {\n const isHealthy = glacierService.isHealthy();\n if (!isHealthy) {\n return Promise.reject('Glacier is unhealthy. Try again later.');\n }\n\n const lowercaseCurrency = currency.toLowerCase();\n const address = addresses[0] ?? '';\n const networkToken = network.networkToken;\n const coingeckoId = network.pricingProviders?.coingecko.nativeTokenId;\n\n const blockchainId = network.vmName === NetworkVMType.PVM ? BlockchainId.P_CHAIN : BlockchainId.X_CHAIN;\n const networkName = network.isTestnet ? Network.FUJI : Network.MAINNET;\n\n const chainBalances = await glacierService\n .getChainBalance({\n blockchainId,\n network: networkName,\n addresses: addresses.join(','),\n })\n .then((value) => (value as ListPChainBalancesResponse | ListXChainBalancesResponse).balances);\n\n const simplePriceResponse = coingeckoId\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoId],\n currencies: [lowercaseCurrency] as VsCurrencyType[],\n })\n : {};\n\n const priceInCurrency = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.price ?? undefined;\n const marketCap = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.marketCap ?? undefined;\n const vol24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.vol24 ?? undefined;\n const change24 = simplePriceResponse?.[coingeckoId ?? '']?.[lowercaseCurrency]?.change24 ?? undefined;\n\n let balance: TokenWithBalanceAVM | TokenWithBalancePVM;\n if (isPchainBalance(chainBalances)) {\n balance = convertPChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n\n if (isXchainBalance(chainBalances)) {\n balance = convertXChainBalance({\n balance: chainBalances,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId: coingeckoId ?? '',\n });\n return {\n [address]: {\n [networkToken.symbol]: balance,\n },\n };\n }\n return Promise.reject('Incorrect type balance was returned from glacier');\n};\n","import type { PChainBalance, XChainBalances } from '@avalabs/glacier-sdk';\n\nexport const isPchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is PChainBalance => {\n return Object.keys(balanceResult).includes('unlockedUnstaked');\n};\n\nexport const isXchainBalance = (balanceResult: PChainBalance | XChainBalances): balanceResult is XChainBalances => {\n return Object.keys(balanceResult).includes('locked');\n};\n\nexport function calculateTotalBalance(uxtos: PChainBalance | XChainBalances): bigint {\n const sum = Object.values(uxtos).reduce(function (totalAcc, utxoList) {\n const typeSum = utxoList.reduce(function (typeAcc, utxo) {\n const balanceToAdd = Number(utxo.amount);\n return typeAcc + balanceToAdd;\n }, 0);\n\n return totalAcc + typeSum;\n }, 0);\n\n return BigInt(sum);\n}\n\nexport function getTokenValue(decimals: number, amount?: number) {\n return amount === undefined ? 0 : amount / 10 ** decimals;\n}\n","import type { AggregatedAssetAmount, PChainBalance } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { type NetworkToken, TokenType, type TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const convertPChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: PChainBalance;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalancePVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlockedUnstaked: balance.unlockedUnstaked,\n unlockedStaked: balance.unlockedStaked,\n pendingStaked: balance.pendingStaked,\n lockedStaked: balance.lockedStaked,\n lockedStakeable: balance.lockedStakeable,\n lockedPlatform: balance.lockedPlatform,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const available = new TokenUnit(\n balancePerType['unlockedUnstaked'] ? balancePerType['unlockedUnstaked'] : 0n,\n networkToken.decimals,\n networkToken.symbol,\n );\n const availableInCurrency = priceInCurrency ? Number(available.mul(priceInCurrency).toDisplay(2)) : undefined;\n const availableDisplayValue = available.toDisplay();\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceInCurrency = priceInCurrency ? Number(totalBalance.mul(priceInCurrency).toDisplay(2)) : undefined;\n const balanceDisplayValue = totalBalance.toDisplay();\n\n return {\n ...networkToken,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue: balanceInCurrency?.toFixed(2),\n available: available.toSubUnit(),\n availableInCurrency,\n availableDisplayValue,\n availableCurrencyDisplayValue: availableInCurrency?.toFixed(2),\n utxos: balance,\n balancePerType: {\n lockedStaked: getTokenValue(decimals, balancePerType['lockedStaked']),\n lockedStakeable: getTokenValue(decimals, balancePerType['lockedStakeable']),\n lockedPlatform: getTokenValue(decimals, balancePerType['lockedPlatform']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n unlockedUnstaked: getTokenValue(decimals, balancePerType['unlockedUnstaked']),\n unlockedStaked: getTokenValue(decimals, balancePerType['unlockedStaked']),\n pendingStaked: getTokenValue(decimals, balancePerType['pendingStaked']),\n },\n marketCap,\n vol24,\n change24,\n coingeckoId,\n };\n};\n","import type { AggregatedAssetAmount, XChainBalances } from '@avalabs/glacier-sdk';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { calculateTotalBalance, getTokenValue } from './utils';\nimport { TokenType, type NetworkToken, type TokenWithBalanceAVM } from '@avalabs/vm-module-types';\n\nexport const convertXChainBalance = ({\n balance,\n networkToken,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n coingeckoId,\n}: {\n balance: XChainBalances;\n networkToken: NetworkToken;\n priceInCurrency?: number;\n marketCap?: number;\n vol24?: number;\n change24?: number;\n coingeckoId: string;\n}): TokenWithBalanceAVM => {\n const decimals = networkToken.decimals;\n const balancePerType: Record<string, number> = {};\n\n const balanceTypes: Record<string, AggregatedAssetAmount[]> = {\n unlocked: balance.unlocked,\n locked: balance.locked,\n atomicMemoryUnlocked: balance.atomicMemoryUnlocked,\n atomicMemoryLocked: balance.atomicMemoryLocked,\n };\n\n for (const balanceType in balanceTypes) {\n const balancesToAdd = balanceTypes[balanceType];\n if (!balancesToAdd || !balancesToAdd.length) {\n balancePerType[balanceType] = 0;\n continue;\n }\n\n balancesToAdd.forEach((uxto: AggregatedAssetAmount) => {\n const previousBalance = balancePerType[balanceType] ?? 0;\n const newBalance = previousBalance + Number(uxto.amount);\n balancePerType[balanceType] = newBalance;\n });\n }\n\n const totalBalance = new TokenUnit(calculateTotalBalance(balance), networkToken.decimals, networkToken.symbol);\n const balanceDisplayValue = totalBalance.toDisplay();\n const balanceCurrencyDisplayValue = priceInCurrency ? totalBalance.mul(priceInCurrency).toDisplay(2) : undefined;\n const balanceInCurrency = balanceCurrencyDisplayValue\n ? Number(balanceCurrencyDisplayValue.replaceAll(',', ''))\n : undefined;\n\n return {\n ...networkToken,\n coingeckoId,\n type: TokenType.NATIVE,\n priceInCurrency,\n balance: totalBalance.toSubUnit(),\n balanceInCurrency,\n balanceDisplayValue,\n balanceCurrencyDisplayValue,\n utxos: balance,\n balancePerType: {\n unlocked: getTokenValue(decimals, balancePerType['unlocked']),\n locked: getTokenValue(decimals, balancePerType['locked']),\n atomicMemoryUnlocked: getTokenValue(decimals, balancePerType['atomicMemoryUnlocked']),\n atomicMemoryLocked: getTokenValue(decimals, balancePerType['atomicMemoryLocked']),\n },\n marketCap,\n vol24,\n change24,\n };\n};\n","import Crypto from 'crypto';\n\n//github.com/gergelylovas/chain-agnostic-namespaces/pull/1/files#diff-cf7185539a48e85d069d194c1c17d7cfa0317b3caa3a89c92e797e3717e49d59R40\nexport function hashBlockchainId({ blockchainId, isTestnet }: { blockchainId: string; isTestnet?: boolean }): string {\n const blockChainIdWithPrefix = isTestnet ? 'fuji' + blockchainId : blockchainId;\n const base64 = Crypto.createHash('sha256').update(blockChainIdWithPrefix).digest('base64');\n const hash = convertBase64ToBase64Url(base64).substring(0, 32);\n return 'avax:' + hash;\n}\n\nconst convertBase64ToBase64Url = (base64: string) => base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { Avalanche } from '@avalabs/core-wallets-sdk';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpub'>;\n\nexport const getAddress = async ({\n accountIndex,\n isTestnet,\n xpubXP,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n if (xpubXP === undefined) {\n throw rpcErrors.invalidParams('xpubXP is required to get address');\n }\n\n const provXP = isTestnet\n ? Avalanche.JsonRpcProvider.getDefaultFujiProvider()\n : Avalanche.JsonRpcProvider.getDefaultMainnetProvider();\n let xpPub: Buffer;\n\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n // X and P addresses different derivation path m/44'/9000'/0'...\n xpPub = Avalanche.getAddressPublicKeyFromXpub(xpubXP, accountIndex);\n break;\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n xpPub = Buffer.from(xpubXP, 'hex');\n break;\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n\n return {\n [NetworkVMType.AVM]: provXP.getAddress(xpPub, 'X'),\n [NetworkVMType.PVM]: provXP.getAddress(xpPub, 'P'),\n };\n};\n","import {\n type SigningData,\n type Network,\n type ApprovalController,\n type DisplayData,\n type RpcRequest,\n RpcMethod,\n} from '@avalabs/vm-module-types';\nimport { parseRequestParams } from './schemas/parse-request-params/parse-request-params';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nexport const avalancheSignMessage = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const result = parseRequestParams(request.params);\n\n if (!result.success) {\n console.error('invalid params', result.error);\n\n return {\n error: rpcErrors.invalidParams('Params are invalid'),\n };\n }\n const [message, accountIndex] = result.data;\n const msgHex = Buffer.from(message, 'utf-8').toString('hex');\n const signingData: SigningData = {\n type: RpcMethod.AVALANCHE_SIGN_MESSAGE,\n data: msgHex,\n accountIndex,\n };\n\n const displayData: DisplayData = {\n title: 'Sign Message',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n messageDetails: message,\n };\n\n // prompt user for approval\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n return { result: response.result };\n};\n","import { z } from 'zod';\n\nconst paramsSchema = z.union([\n z.tuple([z.string()]).describe('message to sign'),\n z.tuple([z.string().describe('message to sign'), z.number().nonnegative().describe('account index')]),\n]);\n\nexport const parseRequestParams = (\n params: unknown,\n): z.SafeParseReturnType<[string, number], [string, number] | [string]> => {\n return paramsSchema.safeParse(params);\n};\n","import type { TokenWithBalance, TokenWithBalanceAVM, TokenWithBalancePVM } from '@avalabs/vm-module-types';\n\nexport const isTokenWithBalancePVM = (token: TokenWithBalance): token is TokenWithBalancePVM => {\n return 'balancePerType' in token && 'unlockedUnstaked' in token.balancePerType;\n};\n\nexport const isTokenWithBalanceAVM = (token: TokenWithBalance): token is TokenWithBalanceAVM => {\n return 'balancePerType' in token && 'unlocked' in token.balancePerType;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avalabs/avalanche-module",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"main": "dist/index.cjs",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
],
|
|
12
12
|
"license": "Limited Ecosystem License",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@avalabs/vm-module-types": "0.1.
|
|
14
|
+
"@avalabs/vm-module-types": "0.1.4",
|
|
15
15
|
"@metamask/rpc-errors": "6.3.0",
|
|
16
16
|
"@avalabs/core-utils-sdk": "3.0.1-alpha.1",
|
|
17
17
|
"@avalabs/core-etherscan-sdk": "3.0.1-alpha.1",
|