@avalabs/bitcoin-module 0.0.23 → 0.1.1
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/LICENSE +9 -0
- package/README.md +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +10 -5
- package/.turbo/turbo-build.log +0 -22
- package/.turbo/turbo-lint.log +0 -4
- package/.turbo/turbo-test.log +0 -16
- package/CHANGELOG.md +0 -56
- package/jest.config.js +0 -10
- package/src/env.ts +0 -25
- package/src/handlers/get-address/get-address.ts +0 -37
- package/src/handlers/get-balances/get-balances.test.ts +0 -181
- package/src/handlers/get-balances/get-balances.ts +0 -110
- package/src/handlers/get-balances/index.ts +0 -1
- package/src/handlers/get-network-fee/get-network-fee.test.ts +0 -67
- package/src/handlers/get-network-fee/get-network-fee.ts +0 -34
- package/src/handlers/get-network-fee/index.ts +0 -1
- package/src/handlers/get-transaction-history/convert-btc-transaction.test.ts +0 -108
- package/src/handlers/get-transaction-history/convert-btc-transaction.ts +0 -36
- package/src/handlers/get-transaction-history/get-transaction-history.test.ts +0 -98
- package/src/handlers/get-transaction-history/get-transaction-history.ts +0 -23
- package/src/handlers/get-transaction-history/index.ts +0 -1
- package/src/index.ts +0 -1
- package/src/module.test.ts +0 -57
- package/src/module.ts +0 -77
- package/src/utils/extract-token-market-data.ts +0 -16
- package/src/utils/get-provider.test.ts +0 -55
- package/src/utils/get-provider.ts +0 -18
- package/tsconfig.jest.json +0 -7
- package/tsconfig.json +0 -14
- package/tsup.config.ts +0 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Copyright (C) 2021, Ava Labs, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
Subject to the limited license below (**”License””), you may not, and you may not permit anyone else to, copy, reproduce, aggregate, republish, download, post, distribute, license, sublicense, reverse engineer, modify, or create derivative works based on this software (collectively, **“Software”**).
|
|
4
|
+
|
|
5
|
+
You are hereby granted a limited, non-exclusive, non-sublicensable and non-transferable license to download and use the Software as-is solely (i) for use in connection with the Avalanche Public Blockchain platform, having a NetworkID of 1 (Mainnet) or 5 (Fuji), and associated blockchains, comprised exclusively of the Avalanche X-Chain, C-Chain, P-Chain and any subnets linked to the P-Chain (**“Avalanche Authorized Platform”**) or (ii) for non-production, testing or research purposes without any commercial application within the Avalanche ecosystem (**“Non-Commercial Use”**); provided that, in each case, you may not use or allow use of the Software (a) in connection with any forks of the Avalanche Authorized Platform, (b) in any manner not operationally connected to the Avalanche Authorized Platform other than for Non-Commercial Use, or (c) to the extent the number of monthly active users or the number of total installs of any software that uses the Software across all versions thereof exceeds 10,000 at any time. You may not modify or alter the Software in any way.
|
|
6
|
+
|
|
7
|
+
You hereby acknowledge and agree to the terms set forth at www.avalabs.org/important-notice.
|
|
8
|
+
|
|
9
|
+
**TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED ON AN “AS IS” BASIS, AND AVA LABS EXPRESSLY DISCLAIMS AND EXCLUDES ALL REPRESENTATIONS, WARRANTIES AND OTHER TERMS AND CONDITIONS, WHETHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION BY OPERATION OF LAW OR BY CUSTOM, STATUTE OR OTHERWISE, AND INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTY, TERM, OR CONDITION OF NON-INFRINGEMENT, MERCHANTABILITY, TITLE, OR FITNESS FOR PARTICULAR PURPOSE. YOU USE THE SOFTWARE AT YOUR OWN RISK. AVA LABS EXPRESSLY DISCLAIMS ALL LIABILITY (INCLUDING FOR ALL DIRECT, CONSEQUENTIAL OR OTHER DAMAGES OR LOSSES) RELATED TO ANY USE OF THE SOFTWARE.**
|
package/README.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var vmModuleTypes = require('@avalabs/vm-module-types');
|
|
4
4
|
var rpcErrors = require('@metamask/rpc-errors');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var coreWalletsSdk = require('@avalabs/core-wallets-sdk');
|
|
6
|
+
var coreUtilsSdk = require('@avalabs/core-utils-sdk');
|
|
7
7
|
var Z = require('big.js');
|
|
8
|
-
var
|
|
8
|
+
var coreCoingeckoSdk = require('@avalabs/core-coingecko-sdk');
|
|
9
9
|
var core = require('@zodios/core');
|
|
10
10
|
var zod = require('zod');
|
|
11
11
|
var bitcoinjsLib = require('bitcoinjs-lib');
|
|
@@ -14,7 +14,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
14
14
|
|
|
15
15
|
var Z__default = /*#__PURE__*/_interopDefault(Z);
|
|
16
16
|
|
|
17
|
-
var fe=Object.defineProperty;var ge=(t,e,r)=>e in t?fe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var M=(t,e,r)=>(ge(t,typeof e!="symbol"?e+"":e,r),r),$=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)};var c=(t,e,r)=>($(t,e,"read from private field"),r?r.call(t):e.get(t)),P=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r);},k=(t,e,r,o)=>($(t,e,"write to private field"),o?o.call(t,r):e.set(t,r),r);var he={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},Pe={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},V=t=>{switch(t){case vmModuleTypes.Environment.PRODUCTION:return he;case vmModuleTypes.Environment.DEV:return Pe}};var H={name:"Bitcoin",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/bitcoin-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/bitcoin-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["bip122:000000000019d6689c085ae165831e93","bip122:000000000933ea01ad0ee984209779ba"],namespaces:["bip122"]},cointype:"0",permissions:{rpc:{dapps:!0,methods:["bitcoin_sendTransaction"]}},manifestVersion:"0.0"};var y=({isTestnet:t,proxyApiUrl:e})=>new
|
|
17
|
+
var fe=Object.defineProperty;var ge=(t,e,r)=>e in t?fe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var M=(t,e,r)=>(ge(t,typeof e!="symbol"?e+"":e,r),r),$=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)};var c=(t,e,r)=>($(t,e,"read from private field"),r?r.call(t):e.get(t)),P=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r);},k=(t,e,r,o)=>($(t,e,"write to private field"),o?o.call(t,r):e.set(t,r),r);var he={glacierApiUrl:"https://glacier-api.avax.network",proxyApiUrl:"https://proxy-api.avax.network"},Pe={glacierApiUrl:"https://glacier-api-dev.avax.network",proxyApiUrl:"https://proxy-api-dev.avax.network"},V=t=>{switch(t){case vmModuleTypes.Environment.PRODUCTION:return he;case vmModuleTypes.Environment.DEV:return Pe}};var H={name:"Bitcoin",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/bitcoin-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/bitcoin-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["bip122:000000000019d6689c085ae165831e93","bip122:000000000933ea01ad0ee984209779ba"],namespaces:["bip122"]},cointype:"0",permissions:{rpc:{dapps:!0,methods:["bitcoin_sendTransaction"]}},manifestVersion:"0.0"};var y=({isTestnet:t,proxyApiUrl:e})=>new coreWalletsSdk.BitcoinProvider(!t,void 0,`${e}/proxy/nownodes/${t?"btcbook-testnet":"btcbook"}`,`${e}/proxy/nownodes/${t?"btc-testnet":"btc"}`,process.env.GLACIER_API_KEY?{token:process.env.GLACIER_API_KEY}:{});async function O({isTestnet:t,proxyApiUrl:e}){let r=y({isTestnet:t,proxyApiUrl:e}),{high:o,low:n,medium:s}=await r.getFeeRates();return {low:{maxFeePerGas:BigInt(n)},medium:{maxFeePerGas:BigInt(s)},high:{maxFeePerGas:BigInt(o)},isFixedFee:!1}}var j=(t,{address:e,network:r})=>{let{explorerUrl:o,isTestnet:n,networkToken:s}=r,i=t.addresses[0]??"";return {chainId:r.chainId.toString(),explorerLink:`${o}/${n?"btc-testnet":"btc"}/tx/${t.hash}`,from:t.isSender?e:i,gasUsed:t.fee.toString(),hash:t.hash,isContractCall:!1,isIncoming:!t.isSender,isOutgoing:t.isSender,isSender:t.isSender,timestamp:t.receivedTime*1e3,to:t.isSender?i:e,tokens:[{amount:(Math.abs(t.amount)/10**s.decimals).toString(),decimal:s.decimals.toString(),name:s.name,symbol:s.symbol,type:vmModuleTypes.TokenType.NATIVE}],txType:t.isSender?vmModuleTypes.TransactionType.SEND:vmModuleTypes.TransactionType.RECEIVE}};var L=async({address:t,network:e,proxyApiUrl:r})=>(await y({isTestnet:!!e.isTestnet,proxyApiUrl:r}).getTxHistory(t)).map(s=>j(s,{address:t,network:e}));var K=async({operation:t,isSuccess:e,maxRetries:r=10,backoffPolicy:o=v.exponential()})=>{let n=0,s=0,i;for(;s<r;){s>0&&await be(n);try{let a=await t(s);if(e(a))return a}catch(a){i=a;}n=o(s),s++;}let l=i?`Max retry exceeded. ${i}`:"Max retry exceeded.";throw new Error(l)},v=class{static exponential(){return e=>Math.pow(2,e)*1e3}static constant(e){return r=>e*1e3}static constantMs(e){return r=>e}};function be(t){return new Promise(e=>setTimeout(e,t))}var B=t=>K({operation:e=>t(e>0),maxRetries:2,backoffPolicy:v.constant(1),isSuccess:e=>e?.status?.error_code!==429});function q(t){let e,r=0;for(e=0;e<t.length;e++)r+=t.charCodeAt(e)*(e+1);return r}function _(t){let e,r=0;for(e=0;e<t.length;e++){let o=q(t[e]??"");r=r+65027/o;}return (""+r).slice(0,16)}var A=t=>new core.Zodios(`${t}/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 W=coreCoingeckoSdk.getBasicCoingeckoHttp(),m,f,b=class{constructor({storage:e,proxyApiUrl:r}){P(this,m,void 0);P(this,f,void 0);M(this,"transformSimplePriceResponse",(e,r=[coreCoingeckoSdk.VsCurrencyType.USD])=>{let o={};return Object.keys(e).forEach(n=>{let s=e[n];o[n]={},r.forEach(i=>{o[n]={[i]:{price:s?.[i],change24:s?.[`${i}_24h_change`],vol24:s?.[`${i}_24h_vol`],marketCap:s?.[`${i}_market_cap`]}};});}),o});k(this,m,e),k(this,f,r);}async getSimplePrice({coinIds:e=[],currencies:r=[coreCoingeckoSdk.VsCurrencyType.USD]}){let o,s=`getSimplePrice-${e?`${_(e)}-${r.toString()}`:`${r.toString()}`}`;if(o=c(this,m)?.get?.(s),o)return o;try{o=await B(i=>this.simplePrice({coinIds:e,currencies:r,marketCap:!0,vol24:!0,change24:!0,useCoingeckoProxy:i}));}catch{o=void 0;}return c(this,m)?.set?.(s,o),o}async getPricesByAddresses(e,r,o=coreCoingeckoSdk.VsCurrencyType.USD){let n,i=`getPricesWithMarketDataByAddresses-${`${_(e)}-${r}-${o}`}`;if(n=c(this,m)?.get?.(i),n)return n;try{n=await B(l=>this.fetchPricesByAddresses({assetPlatformId:r,tokenAddresses:e,currency:o,useCoingeckoProxy:l}));}catch{n=void 0;}return c(this,m)?.set?.(i,n),n}async fetchPricesByAddresses({assetPlatformId:e,tokenAddresses:r,currency:o=coreCoingeckoSdk.VsCurrencyType.USD,useCoingeckoProxy:n=!1}){return n?A(c(this,f)).simplePriceByContractAddresses(void 0,{params:{id:e},queries:{contract_addresses:r,vs_currencies:[o],include_market_cap:!0,include_24hr_vol:!0,include_24hr_change:!0}}):coreCoingeckoSdk.simpleTokenPrice(W,{assetPlatformId:e,tokenAddresses:r,currencies:[o],marketCap:!0,vol24:!0,change24:!0})}async simplePrice({coinIds:e=[],currencies:r=[coreCoingeckoSdk.VsCurrencyType.USD],marketCap:o=!1,vol24:n=!1,change24:s=!1,lastUpdated:i=!1,useCoingeckoProxy:l=!1,shouldThrow:a=!0}){if(l){let C=await A(c(this,f)).simplePrice(void 0,{queries:{ids:e?.join(","),vs_currencies:r.join(","),include_market_cap:String(o),include_24hr_vol:String(n),include_24hr_change:String(s),include_last_updated_at:String(i)}});return this.transformSimplePriceResponse(C,r)}return coreCoingeckoSdk.simplePrice(W,{coinIds:e,currencies:r,marketCap:o,vol24:n,change24:s,lastUpdated:i,shouldThrow:a})}};m=new WeakMap,f=new WeakMap;var X=(t,e,r)=>{let o=r?.[t]?.[e??""]??{};return {priceInCurrency:o.price??void 0,marketCap:o.marketCap??void 0,vol24:o.vol24??void 0,change24:o.change24??void 0}};var z=async({addresses:t,currency:e,network:r,withScripts:o,proxyApiUrl:n,storage:s})=>{let i=y({isTestnet:!!r.isTestnet,proxyApiUrl:n}),l=new b({proxyApiUrl:n,storage:s}),a=r.pricingProviders?.coingecko.nativeTokenId,oe=typeof e=="string"&&typeof a=="string"?await l.getSimplePrice({coinIds:[a],currencies:[e]}):void 0,u=r.networkToken.decimals,{priceInCurrency:g,change24:ne,marketCap:se,vol24:ie}=X(a??"",e,oe);return (await Promise.allSettled(t.map(async h=>{let{balance:S,utxos:ae,balanceUnconfirmed:ce,utxosUnconfirmed:pe}=await i.getUtxoBalance(h,o),E=new Z__default.default(S).div(10**u),I=coreUtilsSdk.bigToBN(E,u),me=coreUtilsSdk.balanceToDisplayValue(I,u),N=g===void 0?void 0:E.times(g).toNumber(),le=N?.toFixed(2),U=new Z__default.default(ce).div(10**u),G=coreUtilsSdk.bigToBN(U,u),de=coreUtilsSdk.balanceToDisplayValue(G,u),D=g===void 0?void 0:U.times(g).toNumber(),ue=D?.toFixed(2),ye=r.networkToken.symbol;return {[h]:{[ye]:{...r.networkToken,utxos:ae,utxosUnconfirmed:pe,coingeckoId:a??"",type:vmModuleTypes.TokenType.NATIVE,balance:I,balanceDisplayValue:me,balanceInCurrency:N,balanceCurrencyDisplayValue:le,priceInCurrency:g,marketCap:se,vol24:ie,change24:ne,unconfirmedBalance:G,unconfirmedBalanceDisplayValue:de,unconfirmedBalanceInCurrency:D,unconfirmedBalanceCurrencyDisplayValue:ue}}}}))).reduce((h,S)=>S.status==="rejected"?h:{...h,...S.value},{})};var re=async({accountIndex:t,xpub:e,isTestnet:r,walletType:o})=>{switch(o){case vmModuleTypes.WalletType.Mnemonic:case vmModuleTypes.WalletType.Ledger:case vmModuleTypes.WalletType.Keystone:return {[vmModuleTypes.NetworkVMType.BITCOIN]:coreWalletsSdk.getBech32AddressFromXPub(e,t,r?bitcoinjsLib.networks.testnet:bitcoinjsLib.networks.bitcoin)};case vmModuleTypes.WalletType.LedgerLive:case vmModuleTypes.WalletType.Seedless:{let n=Buffer.from(e,"hex");return {[vmModuleTypes.NetworkVMType.BITCOIN]:coreWalletsSdk.getBtcAddressFromPubKey(n,r?bitcoinjsLib.networks.testnet:bitcoinjsLib.networks.bitcoin)}}default:throw rpcErrors.rpcErrors.invalidParams(`Unsupported wallet type: ${o}`)}};var d,te=class{constructor({environment:e}){P(this,d,void 0);let{proxyApiUrl:r}=V(e);k(this,d,r);}getAddress({accountIndex:e,xpub:r,isTestnet:o,walletType:n}){return re({accountIndex:e,xpub:r,isTestnet:o,walletType:n})}getBalances({addresses:e,currency:r,network:o,storage:n}){return z({addresses:e,currency:r,network:o,proxyApiUrl:c(this,d),storage:n})}getManifest(){let e=vmModuleTypes.parseManifest(H);return e.success?e.data:void 0}getNetworkFee(e){return O({isTestnet:!!e.isTestnet,proxyApiUrl:c(this,d)})}async getTransactionHistory({address:e,network:r}){return {transactions:await L({address:e,network:r,proxyApiUrl:c(this,d)})}}getTokens(e){return Promise.resolve([])}async onRpcRequest(e,r){switch(e.method){default:return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};d=new WeakMap;
|
|
18
18
|
|
|
19
19
|
exports.BitcoinModule = te;
|
|
20
20
|
//# sourceMappingURL=out.js.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../src/env.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/convert-btc-transaction.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-balances/get-balances.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/utils/extract-token-market-data.ts","../src/handlers/get-address/get-address.ts"],"names":["parseManifest","rpcErrors","Environment","prodEnv","devEnv","getEnv","environment","manifest_default","BitcoinProvider","getProvider","isTestnet","proxyApiUrl","getNetworkFee","provider","high","low","medium","TokenType","TransactionType","convertBtcTransaction","tx","address","network","explorerUrl","networkToken","txAddress","getTransactionHistory","bigToBN","balanceToDisplayValue","Big","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","response","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","__publicField","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","extractTokenMarketData","coinId","coinData","getBalances","addresses","withScripts","tokenService","coingeckoTokenId","marketData","denomination","priceInCurrency","balanceInSatoshis","utxos","unconfirmedBalanceInSatoshis","utxosUnconfirmed","balanceBig","balance","balanceDisplayValue","balanceInCurrency","balanceCurrencyDisplayValue","unconfirmedBalanceBig","unconfirmedBalance","unconfirmedBalanceDisplayValue","unconfirmedBalanceInCurrency","unconfirmedBalanceCurrencyDisplayValue","symbol","acc","accountBalance","getBech32AddressFromXPub","getBtcAddressFromPubKey","networks","NetworkVMType","WalletType","getAddress","accountIndex","xpub","walletType","pubKeyBuffer","BitcoinModule","request","_network"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n Environment,\n GetBalancesParams,\n GetAddressParams,\n GetAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getEnv } from './env';\n\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history';\nimport { getBalances } from './handlers/get-balances';\nimport { getAddress } from './handlers/get-address/get-address';\n\nexport class BitcoinModule implements Module {\n #proxyApiUrl: string;\n\n constructor({ environment }: { environment: Environment }) {\n const { proxyApiUrl } = getEnv(environment);\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n getAddress({ accountIndex, xpub, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpub, isTestnet, walletType });\n }\n\n getBalances({ addresses, currency, network, storage }: GetBalancesParams) {\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n storage,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n return getNetworkFee({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl: this.#proxyApiUrl,\n });\n }\n\n async getTransactionHistory({ address, network }: GetTransactionHistory) {\n return {\n transactions: await getTransactionHistory({\n address,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n }),\n };\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","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","{\n \"name\": \"Bitcoin\",\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/bitcoin-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/bitcoin-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"bip122:000000000019d6689c085ae165831e93\", \"bip122:000000000933ea01ad0ee984209779ba\"],\n \"namespaces\": [\"bip122\"]\n },\n \"cointype\": \"0\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"bitcoin_sendTransaction\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import { BitcoinProvider } from '@avalabs/wallets-sdk';\n\ntype ProviderParams = {\n isTestnet: boolean;\n proxyApiUrl: string;\n};\n\nexport const getProvider = ({ isTestnet, proxyApiUrl }: ProviderParams): BitcoinProvider =>\n new BitcoinProvider(\n !isTestnet,\n undefined,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btcbook-testnet' : 'btcbook'}`,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btc-testnet' : 'btc'}`,\n\n // The Glacier API key is only needed in development to bypass rate limits.\n // It should never be used in production.\n process.env.GLACIER_API_KEY ? { token: process.env.GLACIER_API_KEY } : {},\n );\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\n/**\n * Returns {@link NetworkFees} based on `estimatesmartfee` RPC call\n */\nexport async function getNetworkFee({\n isTestnet,\n proxyApiUrl,\n}: {\n isTestnet: boolean;\n proxyApiUrl: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n isTestnet,\n proxyApiUrl,\n });\n\n const { high, low, medium } = await provider.getFeeRates();\n\n return {\n low: {\n maxFeePerGas: BigInt(low),\n },\n medium: {\n maxFeePerGas: BigInt(medium),\n },\n high: {\n maxFeePerGas: BigInt(high),\n },\n isFixedFee: false,\n };\n}\n","import { TokenType, TransactionType, type Network, type Transaction } from '@avalabs/vm-module-types';\nimport type { BitcoinHistoryTx } from '@avalabs/wallets-sdk';\n\ntype ConverterOptions = {\n address: string;\n network: Network;\n};\n\nexport const convertBtcTransaction = (tx: BitcoinHistoryTx, { address, network }: ConverterOptions): Transaction => {\n const { explorerUrl, isTestnet, networkToken } = network;\n const txAddress = tx.addresses[0] ?? '';\n\n return {\n chainId: network.chainId.toString(),\n explorerLink: `${explorerUrl}/${isTestnet ? 'btc-testnet' : 'btc'}/tx/${tx.hash}`,\n from: tx.isSender ? address : txAddress,\n gasUsed: tx.fee.toString(),\n hash: tx.hash,\n isContractCall: false,\n isIncoming: !tx.isSender,\n isOutgoing: tx.isSender,\n isSender: tx.isSender,\n timestamp: tx.receivedTime * 1000,\n to: tx.isSender ? txAddress : address,\n tokens: [\n {\n amount: (Math.abs(tx.amount) / 10 ** networkToken.decimals).toString(),\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n },\n ],\n txType: tx.isSender ? TransactionType.SEND : TransactionType.RECEIVE,\n };\n};\n","import type { Network } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\nimport { convertBtcTransaction } from './convert-btc-transaction';\n\ntype GetBtcTransactionHistoryOptions = {\n network: Network;\n address: string;\n proxyApiUrl: string;\n};\n\nexport const getTransactionHistory = async ({ address, network, proxyApiUrl }: GetBtcTransactionHistoryOptions) => {\n const provider = getProvider({ isTestnet: Boolean(network.isTestnet), proxyApiUrl });\n const rawHistory = await provider.getTxHistory(address);\n\n return rawHistory.map((tx) =>\n convertBtcTransaction(tx, {\n address,\n network,\n }),\n );\n};\n","import { TokenType, type GetBalancesParams, type TokenWithBalanceBTC } from '@avalabs/vm-module-types';\nimport { bigToBN, balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport type { VsCurrencyType } from '@avalabs/coingecko-sdk';\nimport Big from 'big.js';\n\nimport { TokenService } from '@internal/utils';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { extractTokenMarketData } from '../../utils/extract-token-market-data';\n\ntype GetBtcBalancesResponse = Record<string, Record<string, TokenWithBalanceBTC>>;\n\ntype GetBTCBalancesParams = Omit<GetBalancesParams, 'currency'> & {\n proxyApiUrl: string;\n withScripts?: boolean;\n currency?: string;\n};\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n withScripts,\n proxyApiUrl,\n storage,\n}: GetBTCBalancesParams): Promise<GetBtcBalancesResponse> => {\n const provider = getProvider({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl,\n });\n\n const tokenService = new TokenService({ proxyApiUrl, storage });\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const withPrices = typeof currency === 'string' && typeof coingeckoTokenId === 'string';\n const marketData = withPrices\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] as VsCurrencyType[],\n })\n : undefined;\n const denomination = network.networkToken.decimals;\n const { priceInCurrency, change24, marketCap, vol24 } = extractTokenMarketData(\n coingeckoTokenId ?? '',\n currency,\n marketData,\n );\n\n const balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const {\n balance: balanceInSatoshis,\n utxos,\n balanceUnconfirmed: unconfirmedBalanceInSatoshis,\n utxosUnconfirmed,\n } = await provider.getUtxoBalance(address, withScripts);\n\n const balanceBig = new Big(balanceInSatoshis).div(10 ** denomination);\n const balance = bigToBN(balanceBig, denomination);\n const balanceDisplayValue = balanceToDisplayValue(balance, denomination);\n const balanceInCurrency =\n priceInCurrency === undefined ? undefined : balanceBig.times(priceInCurrency).toNumber();\n\n const balanceCurrencyDisplayValue = balanceInCurrency?.toFixed(2);\n\n const unconfirmedBalanceBig = new Big(unconfirmedBalanceInSatoshis).div(10 ** denomination);\n const unconfirmedBalance = bigToBN(unconfirmedBalanceBig, denomination);\n const unconfirmedBalanceDisplayValue = balanceToDisplayValue(unconfirmedBalance, denomination);\n const unconfirmedBalanceInCurrency =\n priceInCurrency === undefined ? undefined : unconfirmedBalanceBig.times(priceInCurrency).toNumber();\n const unconfirmedBalanceCurrencyDisplayValue = unconfirmedBalanceInCurrency?.toFixed(2);\n\n const symbol = network.networkToken.symbol;\n\n return {\n [address]: {\n [symbol]: {\n ...network.networkToken,\n utxos,\n utxosUnconfirmed,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n unconfirmedBalance,\n unconfirmedBalanceDisplayValue,\n unconfirmedBalanceInCurrency,\n unconfirmedBalanceCurrencyDisplayValue,\n },\n },\n };\n }),\n );\n\n return balances.reduce((acc, accountBalance) => {\n if (accountBalance.status === 'rejected') {\n return acc;\n }\n\n return {\n ...acc,\n ...accountBalance.value,\n };\n }, {});\n};\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/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 type { SimplePriceResponse, TokenMarketData } from '@avalabs/vm-module-types';\n\nexport const extractTokenMarketData = (\n coinId: string,\n currency?: string,\n data?: SimplePriceResponse,\n): TokenMarketData => {\n const coinData = data?.[coinId]?.[currency ?? ''] ?? {};\n\n return {\n priceInCurrency: coinData.price ?? undefined,\n marketCap: coinData.marketCap ?? undefined,\n vol24: coinData.vol24 ?? undefined,\n change24: coinData.change24 ?? undefined,\n };\n};\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { getBech32AddressFromXPub, getBtcAddressFromPubKey } from '@avalabs/wallets-sdk';\nimport { networks } from 'bitcoinjs-lib';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpubXP'>;\n\nexport const getAddress = async ({\n accountIndex,\n xpub,\n isTestnet,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n return {\n [NetworkVMType.BITCOIN]: getBech32AddressFromXPub(\n xpub,\n accountIndex,\n isTestnet ? networks.testnet : networks.bitcoin,\n ),\n };\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n const pubKeyBuffer = Buffer.from(xpub, 'hex');\n return {\n [NetworkVMType.BITCOIN]: getBtcAddressFromPubKey(pubKeyBuffer, isTestnet ? networks.testnet : networks.bitcoin),\n };\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../src/env.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/convert-btc-transaction.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-balances/get-balances.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/utils/extract-token-market-data.ts","../src/handlers/get-address/get-address.ts"],"names":["parseManifest","rpcErrors","Environment","prodEnv","devEnv","getEnv","environment","manifest_default","BitcoinProvider","getProvider","isTestnet","proxyApiUrl","getNetworkFee","provider","high","low","medium","TokenType","TransactionType","convertBtcTransaction","tx","address","network","explorerUrl","networkToken","txAddress","getTransactionHistory","bigToBN","balanceToDisplayValue","Big","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","response","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","__publicField","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","extractTokenMarketData","coinId","coinData","getBalances","addresses","withScripts","tokenService","coingeckoTokenId","marketData","denomination","priceInCurrency","balanceInSatoshis","utxos","unconfirmedBalanceInSatoshis","utxosUnconfirmed","balanceBig","balance","balanceDisplayValue","balanceInCurrency","balanceCurrencyDisplayValue","unconfirmedBalanceBig","unconfirmedBalance","unconfirmedBalanceDisplayValue","unconfirmedBalanceInCurrency","unconfirmedBalanceCurrencyDisplayValue","symbol","acc","accountBalance","getBech32AddressFromXPub","getBtcAddressFromPubKey","networks","NetworkVMType","WalletType","getAddress","accountIndex","xpub","walletType","pubKeyBuffer","BitcoinModule","request","_network"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n Environment,\n GetBalancesParams,\n GetAddressParams,\n GetAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getEnv } from './env';\n\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history';\nimport { getBalances } from './handlers/get-balances';\nimport { getAddress } from './handlers/get-address/get-address';\n\nexport class BitcoinModule implements Module {\n #proxyApiUrl: string;\n\n constructor({ environment }: { environment: Environment }) {\n const { proxyApiUrl } = getEnv(environment);\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n getAddress({ accountIndex, xpub, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpub, isTestnet, walletType });\n }\n\n getBalances({ addresses, currency, network, storage }: GetBalancesParams) {\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n storage,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n return getNetworkFee({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl: this.#proxyApiUrl,\n });\n }\n\n async getTransactionHistory({ address, network }: GetTransactionHistory) {\n return {\n transactions: await getTransactionHistory({\n address,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n }),\n };\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","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","{\n \"name\": \"Bitcoin\",\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/bitcoin-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/bitcoin-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"bip122:000000000019d6689c085ae165831e93\", \"bip122:000000000933ea01ad0ee984209779ba\"],\n \"namespaces\": [\"bip122\"]\n },\n \"cointype\": \"0\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"bitcoin_sendTransaction\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import { BitcoinProvider } from '@avalabs/core-wallets-sdk';\n\ntype ProviderParams = {\n isTestnet: boolean;\n proxyApiUrl: string;\n};\n\nexport const getProvider = ({ isTestnet, proxyApiUrl }: ProviderParams): BitcoinProvider =>\n new BitcoinProvider(\n !isTestnet,\n undefined,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btcbook-testnet' : 'btcbook'}`,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btc-testnet' : 'btc'}`,\n\n // The Glacier API key is only needed in development to bypass rate limits.\n // It should never be used in production.\n process.env.GLACIER_API_KEY ? { token: process.env.GLACIER_API_KEY } : {},\n );\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\n/**\n * Returns {@link NetworkFees} based on `estimatesmartfee` RPC call\n */\nexport async function getNetworkFee({\n isTestnet,\n proxyApiUrl,\n}: {\n isTestnet: boolean;\n proxyApiUrl: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n isTestnet,\n proxyApiUrl,\n });\n\n const { high, low, medium } = await provider.getFeeRates();\n\n return {\n low: {\n maxFeePerGas: BigInt(low),\n },\n medium: {\n maxFeePerGas: BigInt(medium),\n },\n high: {\n maxFeePerGas: BigInt(high),\n },\n isFixedFee: false,\n };\n}\n","import { TokenType, TransactionType, type Network, type Transaction } from '@avalabs/vm-module-types';\nimport type { BitcoinHistoryTx } from '@avalabs/core-wallets-sdk';\n\ntype ConverterOptions = {\n address: string;\n network: Network;\n};\n\nexport const convertBtcTransaction = (tx: BitcoinHistoryTx, { address, network }: ConverterOptions): Transaction => {\n const { explorerUrl, isTestnet, networkToken } = network;\n const txAddress = tx.addresses[0] ?? '';\n\n return {\n chainId: network.chainId.toString(),\n explorerLink: `${explorerUrl}/${isTestnet ? 'btc-testnet' : 'btc'}/tx/${tx.hash}`,\n from: tx.isSender ? address : txAddress,\n gasUsed: tx.fee.toString(),\n hash: tx.hash,\n isContractCall: false,\n isIncoming: !tx.isSender,\n isOutgoing: tx.isSender,\n isSender: tx.isSender,\n timestamp: tx.receivedTime * 1000,\n to: tx.isSender ? txAddress : address,\n tokens: [\n {\n amount: (Math.abs(tx.amount) / 10 ** networkToken.decimals).toString(),\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n },\n ],\n txType: tx.isSender ? TransactionType.SEND : TransactionType.RECEIVE,\n };\n};\n","import type { Network } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\nimport { convertBtcTransaction } from './convert-btc-transaction';\n\ntype GetBtcTransactionHistoryOptions = {\n network: Network;\n address: string;\n proxyApiUrl: string;\n};\n\nexport const getTransactionHistory = async ({ address, network, proxyApiUrl }: GetBtcTransactionHistoryOptions) => {\n const provider = getProvider({ isTestnet: Boolean(network.isTestnet), proxyApiUrl });\n const rawHistory = await provider.getTxHistory(address);\n\n return rawHistory.map((tx) =>\n convertBtcTransaction(tx, {\n address,\n network,\n }),\n );\n};\n","import { TokenType, type GetBalancesParams, type TokenWithBalanceBTC } from '@avalabs/vm-module-types';\nimport { bigToBN, balanceToDisplayValue } from '@avalabs/core-utils-sdk';\nimport type { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport Big from 'big.js';\n\nimport { TokenService } from '@internal/utils';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { extractTokenMarketData } from '../../utils/extract-token-market-data';\n\ntype GetBtcBalancesResponse = Record<string, Record<string, TokenWithBalanceBTC>>;\n\ntype GetBTCBalancesParams = Omit<GetBalancesParams, 'currency'> & {\n proxyApiUrl: string;\n withScripts?: boolean;\n currency?: string;\n};\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n withScripts,\n proxyApiUrl,\n storage,\n}: GetBTCBalancesParams): Promise<GetBtcBalancesResponse> => {\n const provider = getProvider({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl,\n });\n\n const tokenService = new TokenService({ proxyApiUrl, storage });\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const withPrices = typeof currency === 'string' && typeof coingeckoTokenId === 'string';\n const marketData = withPrices\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] as VsCurrencyType[],\n })\n : undefined;\n const denomination = network.networkToken.decimals;\n const { priceInCurrency, change24, marketCap, vol24 } = extractTokenMarketData(\n coingeckoTokenId ?? '',\n currency,\n marketData,\n );\n\n const balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const {\n balance: balanceInSatoshis,\n utxos,\n balanceUnconfirmed: unconfirmedBalanceInSatoshis,\n utxosUnconfirmed,\n } = await provider.getUtxoBalance(address, withScripts);\n\n const balanceBig = new Big(balanceInSatoshis).div(10 ** denomination);\n const balance = bigToBN(balanceBig, denomination);\n const balanceDisplayValue = balanceToDisplayValue(balance, denomination);\n const balanceInCurrency =\n priceInCurrency === undefined ? undefined : balanceBig.times(priceInCurrency).toNumber();\n\n const balanceCurrencyDisplayValue = balanceInCurrency?.toFixed(2);\n\n const unconfirmedBalanceBig = new Big(unconfirmedBalanceInSatoshis).div(10 ** denomination);\n const unconfirmedBalance = bigToBN(unconfirmedBalanceBig, denomination);\n const unconfirmedBalanceDisplayValue = balanceToDisplayValue(unconfirmedBalance, denomination);\n const unconfirmedBalanceInCurrency =\n priceInCurrency === undefined ? undefined : unconfirmedBalanceBig.times(priceInCurrency).toNumber();\n const unconfirmedBalanceCurrencyDisplayValue = unconfirmedBalanceInCurrency?.toFixed(2);\n\n const symbol = network.networkToken.symbol;\n\n return {\n [address]: {\n [symbol]: {\n ...network.networkToken,\n utxos,\n utxosUnconfirmed,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n unconfirmedBalance,\n unconfirmedBalanceDisplayValue,\n unconfirmedBalanceInCurrency,\n unconfirmedBalanceCurrencyDisplayValue,\n },\n },\n };\n }),\n );\n\n return balances.reduce((acc, accountBalance) => {\n if (accountBalance.status === 'rejected') {\n return acc;\n }\n\n return {\n ...acc,\n ...accountBalance.value,\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 type { SimplePriceResponse, TokenMarketData } from '@avalabs/vm-module-types';\n\nexport const extractTokenMarketData = (\n coinId: string,\n currency?: string,\n data?: SimplePriceResponse,\n): TokenMarketData => {\n const coinData = data?.[coinId]?.[currency ?? ''] ?? {};\n\n return {\n priceInCurrency: coinData.price ?? undefined,\n marketCap: coinData.marketCap ?? undefined,\n vol24: coinData.vol24 ?? undefined,\n change24: coinData.change24 ?? undefined,\n };\n};\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { getBech32AddressFromXPub, getBtcAddressFromPubKey } from '@avalabs/core-wallets-sdk';\nimport { networks } from 'bitcoinjs-lib';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpubXP'>;\n\nexport const getAddress = async ({\n accountIndex,\n xpub,\n isTestnet,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n return {\n [NetworkVMType.BITCOIN]: getBech32AddressFromXPub(\n xpub,\n accountIndex,\n isTestnet ? networks.testnet : networks.bitcoin,\n ),\n };\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n const pubKeyBuffer = Buffer.from(xpub, 'hex');\n return {\n [NetworkVMType.BITCOIN]: getBtcAddressFromPubKey(pubKeyBuffer, isTestnet ? networks.testnet : networks.bitcoin),\n };\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n};\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { parseManifest, Environment, TokenType, WalletType, NetworkVMType, TransactionType, RawSimplePriceResponseSchema, SimplePriceResponseSchema } from '@avalabs/vm-module-types';
|
|
2
2
|
import { rpcErrors } from '@metamask/rpc-errors';
|
|
3
|
-
import { getBtcAddressFromPubKey, getBech32AddressFromXPub, BitcoinProvider } from '@avalabs/wallets-sdk';
|
|
4
|
-
import { bigToBN, balanceToDisplayValue } from '@avalabs/utils-sdk';
|
|
3
|
+
import { getBtcAddressFromPubKey, getBech32AddressFromXPub, BitcoinProvider } from '@avalabs/core-wallets-sdk';
|
|
4
|
+
import { bigToBN, balanceToDisplayValue } from '@avalabs/core-utils-sdk';
|
|
5
5
|
import Z from 'big.js';
|
|
6
|
-
import { getBasicCoingeckoHttp, VsCurrencyType, simpleTokenPrice, simplePrice } from '@avalabs/coingecko-sdk';
|
|
6
|
+
import { getBasicCoingeckoHttp, VsCurrencyType, simpleTokenPrice, simplePrice } from '@avalabs/core-coingecko-sdk';
|
|
7
7
|
import { Zodios } from '@zodios/core';
|
|
8
8
|
import { string, boolean } from 'zod';
|
|
9
9
|
import { networks } from 'bitcoinjs-lib';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../src/env.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/convert-btc-transaction.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-balances/get-balances.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/utils/extract-token-market-data.ts","../src/handlers/get-address/get-address.ts"],"names":["parseManifest","rpcErrors","Environment","prodEnv","devEnv","getEnv","environment","manifest_default","BitcoinProvider","getProvider","isTestnet","proxyApiUrl","getNetworkFee","provider","high","low","medium","TokenType","TransactionType","convertBtcTransaction","tx","address","network","explorerUrl","networkToken","txAddress","getTransactionHistory","bigToBN","balanceToDisplayValue","Big","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","response","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","__publicField","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","extractTokenMarketData","coinId","coinData","getBalances","addresses","withScripts","tokenService","coingeckoTokenId","marketData","denomination","priceInCurrency","balanceInSatoshis","utxos","unconfirmedBalanceInSatoshis","utxosUnconfirmed","balanceBig","balance","balanceDisplayValue","balanceInCurrency","balanceCurrencyDisplayValue","unconfirmedBalanceBig","unconfirmedBalance","unconfirmedBalanceDisplayValue","unconfirmedBalanceInCurrency","unconfirmedBalanceCurrencyDisplayValue","symbol","acc","accountBalance","getBech32AddressFromXPub","getBtcAddressFromPubKey","networks","NetworkVMType","WalletType","getAddress","accountIndex","xpub","walletType","pubKeyBuffer","BitcoinModule","request","_network"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n Environment,\n GetBalancesParams,\n GetAddressParams,\n GetAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getEnv } from './env';\n\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history';\nimport { getBalances } from './handlers/get-balances';\nimport { getAddress } from './handlers/get-address/get-address';\n\nexport class BitcoinModule implements Module {\n #proxyApiUrl: string;\n\n constructor({ environment }: { environment: Environment }) {\n const { proxyApiUrl } = getEnv(environment);\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n getAddress({ accountIndex, xpub, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpub, isTestnet, walletType });\n }\n\n getBalances({ addresses, currency, network, storage }: GetBalancesParams) {\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n storage,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n return getNetworkFee({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl: this.#proxyApiUrl,\n });\n }\n\n async getTransactionHistory({ address, network }: GetTransactionHistory) {\n return {\n transactions: await getTransactionHistory({\n address,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n }),\n };\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","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","{\n \"name\": \"Bitcoin\",\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/bitcoin-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/bitcoin-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"bip122:000000000019d6689c085ae165831e93\", \"bip122:000000000933ea01ad0ee984209779ba\"],\n \"namespaces\": [\"bip122\"]\n },\n \"cointype\": \"0\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"bitcoin_sendTransaction\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import { BitcoinProvider } from '@avalabs/wallets-sdk';\n\ntype ProviderParams = {\n isTestnet: boolean;\n proxyApiUrl: string;\n};\n\nexport const getProvider = ({ isTestnet, proxyApiUrl }: ProviderParams): BitcoinProvider =>\n new BitcoinProvider(\n !isTestnet,\n undefined,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btcbook-testnet' : 'btcbook'}`,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btc-testnet' : 'btc'}`,\n\n // The Glacier API key is only needed in development to bypass rate limits.\n // It should never be used in production.\n process.env.GLACIER_API_KEY ? { token: process.env.GLACIER_API_KEY } : {},\n );\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\n/**\n * Returns {@link NetworkFees} based on `estimatesmartfee` RPC call\n */\nexport async function getNetworkFee({\n isTestnet,\n proxyApiUrl,\n}: {\n isTestnet: boolean;\n proxyApiUrl: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n isTestnet,\n proxyApiUrl,\n });\n\n const { high, low, medium } = await provider.getFeeRates();\n\n return {\n low: {\n maxFeePerGas: BigInt(low),\n },\n medium: {\n maxFeePerGas: BigInt(medium),\n },\n high: {\n maxFeePerGas: BigInt(high),\n },\n isFixedFee: false,\n };\n}\n","import { TokenType, TransactionType, type Network, type Transaction } from '@avalabs/vm-module-types';\nimport type { BitcoinHistoryTx } from '@avalabs/wallets-sdk';\n\ntype ConverterOptions = {\n address: string;\n network: Network;\n};\n\nexport const convertBtcTransaction = (tx: BitcoinHistoryTx, { address, network }: ConverterOptions): Transaction => {\n const { explorerUrl, isTestnet, networkToken } = network;\n const txAddress = tx.addresses[0] ?? '';\n\n return {\n chainId: network.chainId.toString(),\n explorerLink: `${explorerUrl}/${isTestnet ? 'btc-testnet' : 'btc'}/tx/${tx.hash}`,\n from: tx.isSender ? address : txAddress,\n gasUsed: tx.fee.toString(),\n hash: tx.hash,\n isContractCall: false,\n isIncoming: !tx.isSender,\n isOutgoing: tx.isSender,\n isSender: tx.isSender,\n timestamp: tx.receivedTime * 1000,\n to: tx.isSender ? txAddress : address,\n tokens: [\n {\n amount: (Math.abs(tx.amount) / 10 ** networkToken.decimals).toString(),\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n },\n ],\n txType: tx.isSender ? TransactionType.SEND : TransactionType.RECEIVE,\n };\n};\n","import type { Network } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\nimport { convertBtcTransaction } from './convert-btc-transaction';\n\ntype GetBtcTransactionHistoryOptions = {\n network: Network;\n address: string;\n proxyApiUrl: string;\n};\n\nexport const getTransactionHistory = async ({ address, network, proxyApiUrl }: GetBtcTransactionHistoryOptions) => {\n const provider = getProvider({ isTestnet: Boolean(network.isTestnet), proxyApiUrl });\n const rawHistory = await provider.getTxHistory(address);\n\n return rawHistory.map((tx) =>\n convertBtcTransaction(tx, {\n address,\n network,\n }),\n );\n};\n","import { TokenType, type GetBalancesParams, type TokenWithBalanceBTC } from '@avalabs/vm-module-types';\nimport { bigToBN, balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport type { VsCurrencyType } from '@avalabs/coingecko-sdk';\nimport Big from 'big.js';\n\nimport { TokenService } from '@internal/utils';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { extractTokenMarketData } from '../../utils/extract-token-market-data';\n\ntype GetBtcBalancesResponse = Record<string, Record<string, TokenWithBalanceBTC>>;\n\ntype GetBTCBalancesParams = Omit<GetBalancesParams, 'currency'> & {\n proxyApiUrl: string;\n withScripts?: boolean;\n currency?: string;\n};\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n withScripts,\n proxyApiUrl,\n storage,\n}: GetBTCBalancesParams): Promise<GetBtcBalancesResponse> => {\n const provider = getProvider({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl,\n });\n\n const tokenService = new TokenService({ proxyApiUrl, storage });\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const withPrices = typeof currency === 'string' && typeof coingeckoTokenId === 'string';\n const marketData = withPrices\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] as VsCurrencyType[],\n })\n : undefined;\n const denomination = network.networkToken.decimals;\n const { priceInCurrency, change24, marketCap, vol24 } = extractTokenMarketData(\n coingeckoTokenId ?? '',\n currency,\n marketData,\n );\n\n const balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const {\n balance: balanceInSatoshis,\n utxos,\n balanceUnconfirmed: unconfirmedBalanceInSatoshis,\n utxosUnconfirmed,\n } = await provider.getUtxoBalance(address, withScripts);\n\n const balanceBig = new Big(balanceInSatoshis).div(10 ** denomination);\n const balance = bigToBN(balanceBig, denomination);\n const balanceDisplayValue = balanceToDisplayValue(balance, denomination);\n const balanceInCurrency =\n priceInCurrency === undefined ? undefined : balanceBig.times(priceInCurrency).toNumber();\n\n const balanceCurrencyDisplayValue = balanceInCurrency?.toFixed(2);\n\n const unconfirmedBalanceBig = new Big(unconfirmedBalanceInSatoshis).div(10 ** denomination);\n const unconfirmedBalance = bigToBN(unconfirmedBalanceBig, denomination);\n const unconfirmedBalanceDisplayValue = balanceToDisplayValue(unconfirmedBalance, denomination);\n const unconfirmedBalanceInCurrency =\n priceInCurrency === undefined ? undefined : unconfirmedBalanceBig.times(priceInCurrency).toNumber();\n const unconfirmedBalanceCurrencyDisplayValue = unconfirmedBalanceInCurrency?.toFixed(2);\n\n const symbol = network.networkToken.symbol;\n\n return {\n [address]: {\n [symbol]: {\n ...network.networkToken,\n utxos,\n utxosUnconfirmed,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n unconfirmedBalance,\n unconfirmedBalanceDisplayValue,\n unconfirmedBalanceInCurrency,\n unconfirmedBalanceCurrencyDisplayValue,\n },\n },\n };\n }),\n );\n\n return balances.reduce((acc, accountBalance) => {\n if (accountBalance.status === 'rejected') {\n return acc;\n }\n\n return {\n ...acc,\n ...accountBalance.value,\n };\n }, {});\n};\n","import {\n VsCurrencyType,\n getBasicCoingeckoHttp,\n simplePrice,\n simpleTokenPrice,\n type SimplePriceParams,\n} from '@avalabs/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 type { SimplePriceResponse, TokenMarketData } from '@avalabs/vm-module-types';\n\nexport const extractTokenMarketData = (\n coinId: string,\n currency?: string,\n data?: SimplePriceResponse,\n): TokenMarketData => {\n const coinData = data?.[coinId]?.[currency ?? ''] ?? {};\n\n return {\n priceInCurrency: coinData.price ?? undefined,\n marketCap: coinData.marketCap ?? undefined,\n vol24: coinData.vol24 ?? undefined,\n change24: coinData.change24 ?? undefined,\n };\n};\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { getBech32AddressFromXPub, getBtcAddressFromPubKey } from '@avalabs/wallets-sdk';\nimport { networks } from 'bitcoinjs-lib';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpubXP'>;\n\nexport const getAddress = async ({\n accountIndex,\n xpub,\n isTestnet,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n return {\n [NetworkVMType.BITCOIN]: getBech32AddressFromXPub(\n xpub,\n accountIndex,\n isTestnet ? networks.testnet : networks.bitcoin,\n ),\n };\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n const pubKeyBuffer = Buffer.from(xpub, 'hex');\n return {\n [NetworkVMType.BITCOIN]: getBtcAddressFromPubKey(pubKeyBuffer, isTestnet ? networks.testnet : networks.bitcoin),\n };\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../src/env.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/convert-btc-transaction.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/handlers/get-balances/get-balances.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/utils/extract-token-market-data.ts","../src/handlers/get-address/get-address.ts"],"names":["parseManifest","rpcErrors","Environment","prodEnv","devEnv","getEnv","environment","manifest_default","BitcoinProvider","getProvider","isTestnet","proxyApiUrl","getNetworkFee","provider","high","low","medium","TokenType","TransactionType","convertBtcTransaction","tx","address","network","explorerUrl","networkToken","txAddress","getTransactionHistory","bigToBN","balanceToDisplayValue","Big","VsCurrencyType","getBasicCoingeckoHttp","simplePrice","simpleTokenPrice","retry","operation","isSuccess","maxRetries","backoffPolicy","RetryBackoffPolicy","backoffPeriodMillis","retries","lastError","delay","result","err","errorMessage","retryIndex","secondsToDelay","_","msToDelay","ms","r","coingeckoRetry","response","charsum","s","i","sum","arrayHash","array","cs","Zodios","RawSimplePriceResponseSchema","SimplePriceResponseSchema","boolean","string","coingeckoProxyClient","coingeckoBasicClient","_storage","_proxyApiUrl","TokenService","storage","__privateAdd","__publicField","data","currencies","formattedData","id","tokenData","currency","__privateSet","coinIds","cacheId","__privateGet","useCoingeckoProxy","tokenAddresses","assetPlatformId","marketCap","vol24","change24","lastUpdated","shouldThrow","rawData","extractTokenMarketData","coinId","coinData","getBalances","addresses","withScripts","tokenService","coingeckoTokenId","marketData","denomination","priceInCurrency","balanceInSatoshis","utxos","unconfirmedBalanceInSatoshis","utxosUnconfirmed","balanceBig","balance","balanceDisplayValue","balanceInCurrency","balanceCurrencyDisplayValue","unconfirmedBalanceBig","unconfirmedBalance","unconfirmedBalanceDisplayValue","unconfirmedBalanceInCurrency","unconfirmedBalanceCurrencyDisplayValue","symbol","acc","accountBalance","getBech32AddressFromXPub","getBtcAddressFromPubKey","networks","NetworkVMType","WalletType","getAddress","accountIndex","xpub","walletType","pubKeyBuffer","BitcoinModule","request","_network"],"mappings":"2fAYA,OAAS,iBAAAA,OAAqB,2BAC9B,OAAS,aAAAC,OAAiB,uBCb1B,OAAS,eAAAC,MAAmB,2BAOrB,IAAMC,GAAe,CAC1B,cAAe,mCACf,YAAa,gCACf,EAEaC,GAAc,CACzB,cAAe,uCACf,YAAa,oCACf,EAEaC,EAAUC,GAAkC,CACvD,OAAQA,EAAa,CACnB,KAAKJ,EAAY,WACf,OAAOC,GACT,KAAKD,EAAY,IACf,OAAOE,EACX,CACF,ECxBA,IAAAG,EAAA,CACE,KAAQ,UACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,0BACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,0BACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CAAC,0CAA2C,yCAAyC,EACjG,WAAc,CAAC,QAAQ,CACzB,EACA,SAAY,IACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,yBAAyB,CACvC,CACF,EACA,gBAAmB,KACrB,ECtCA,OAAS,mBAAAC,OAAuB,4BAOzB,IAAMC,EAAc,CAAC,CAAE,UAAAC,EAAW,YAAAC,CAAY,IACnD,IAAIH,GACF,CAACE,EACD,OACA,GAAGC,CAAW,mBAAmBD,EAAY,kBAAoB,SAAS,GAC1E,GAAGC,CAAW,mBAAmBD,EAAY,cAAgB,KAAK,GAIlE,QAAQ,IAAI,gBAAkB,CAAE,MAAO,QAAQ,IAAI,eAAgB,EAAI,CAAC,CAC1E,ECVF,eAAsBE,EAAc,CAClC,UAAAF,EACA,YAAAC,CACF,EAGyB,CACvB,IAAME,EAAWJ,EAAY,CAC3B,UAAAC,EACA,YAAAC,CACF,CAAC,EAEK,CAAE,KAAAG,EAAM,IAAAC,EAAK,OAAAC,CAAO,EAAI,MAAMH,EAAS,YAAY,EAEzD,MAAO,CACL,IAAK,CACH,aAAc,OAAOE,CAAG,CAC1B,EACA,OAAQ,CACN,aAAc,OAAOC,CAAM,CAC7B,EACA,KAAM,CACJ,aAAc,OAAOF,CAAI,CAC3B,EACA,WAAY,EACd,CACF,CCjCA,OAAS,aAAAG,GAAW,mBAAAC,MAAuD,2BAQpE,IAAMC,EAAwB,CAACC,EAAsB,CAAE,QAAAC,EAAS,QAAAC,CAAQ,IAAqC,CAClH,GAAM,CAAE,YAAAC,EAAa,UAAAb,EAAW,aAAAc,CAAa,EAAIF,EAC3CG,EAAYL,EAAG,UAAU,CAAC,GAAK,GAErC,MAAO,CACL,QAASE,EAAQ,QAAQ,SAAS,EAClC,aAAc,GAAGC,CAAW,IAAIb,EAAY,cAAgB,KAAK,OAAOU,EAAG,IAAI,GAC/E,KAAMA,EAAG,SAAWC,EAAUI,EAC9B,QAASL,EAAG,IAAI,SAAS,EACzB,KAAMA,EAAG,KACT,eAAgB,GAChB,WAAY,CAACA,EAAG,SAChB,WAAYA,EAAG,SACf,SAAUA,EAAG,SACb,UAAWA,EAAG,aAAe,IAC7B,GAAIA,EAAG,SAAWK,EAAYJ,EAC9B,OAAQ,CACN,CACE,QAAS,KAAK,IAAID,EAAG,MAAM,EAAI,IAAMI,EAAa,UAAU,SAAS,EACrE,QAASA,EAAa,SAAS,SAAS,EACxC,KAAMA,EAAa,KACnB,OAAQA,EAAa,OACrB,KAAMP,GAAU,MAClB,CACF,EACA,OAAQG,EAAG,SAAWF,EAAgB,KAAOA,EAAgB,OAC/D,CACF,ECvBO,IAAMQ,EAAwB,MAAO,CAAE,QAAAL,EAAS,QAAAC,EAAS,YAAAX,CAAY,KAEvD,MADFF,EAAY,CAAE,UAAW,EAAQa,EAAQ,UAAY,YAAAX,CAAY,CAAC,EACjD,aAAaU,CAAO,GAEpC,IAAKD,GACrBD,EAAsBC,EAAI,CACxB,QAAAC,EACA,QAAAC,CACF,CAAC,CACH,ECrBF,OAAS,aAAAL,OAAmE,2BAC5E,OAAS,WAAAU,EAAS,yBAAAC,MAA6B,0BAE/C,OAAOC,MAAS,SCHhB,OACE,kBAAAC,EACA,yBAAAC,GACA,eAAAC,GACA,oBAAAC,OAEK,8BCsBA,IAAMC,EAAQ,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,EAAM,CACX,UAAYa,GAAuBZ,EAAUY,EAAa,CAAC,EAC3D,WAAY,EACZ,cAAeR,EAAmB,SAAS,CAAC,EAC5C,UAAYe,GACWA,GAAoB,QACrB,aAAe,GAEvC,CAAC,ECpBI,SAASC,EAAQC,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,EAAQK,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,EAAwBxD,GACnC,IAAImD,GACF,GAAGnD,CAAW,mBACd,CACE,CACE,OAAQ,OACR,KAAM,gBACN,WAAY,CACV,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQuD,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,IAAMI,EAAuBrC,GAAsB,EAZnDsC,EAAAC,EAcaC,EAAN,KAAmB,CAIxB,YAAY,CAAE,QAAAC,EAAS,YAAA7D,CAAY,EAA+C,CAHlF8D,EAAA,KAAAJ,EAAA,QACAI,EAAA,KAAAH,EAAA,QAuJAI,EAAA,KAAQ,+BAA+B,CACrCC,EACAC,EAAa,CAAC9C,EAAe,GAAG,IACR,CACxB,IAAM+C,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,KAAKZ,EAAWG,GAChBS,EAAA,KAAKX,EAAe3D,EACtB,CAOA,MAAM,eAAe,CACnB,QAAAuE,EAAU,CAAC,EACX,WAAAN,EAAa,CAAC9C,EAAe,GAAG,CAClC,EAAgE,CAC9D,IAAI6C,EAIEQ,EAAU,kBAFJD,EAAU,GAAGvB,EAAUuB,CAAO,CAAC,IAAIN,EAAW,SAAS,CAAC,GAAK,GAAGA,EAAW,SAAS,CAAC,EAE5D,GAIrC,GAFAD,EAAOS,EAAA,KAAKf,IAAU,MAA2Bc,CAAO,EAEpDR,EAAM,OAAOA,EAEjB,GAAI,CACFA,EAAO,MAAMtB,EAAgBgC,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,KAAKf,IAAU,MAAMc,EAASR,CAAI,EAC3BA,CACT,CASA,MAAM,qBACJW,EACAC,EACAP,EAA2BlD,EAAe,IACA,CAC1C,IAAI6C,EAIEQ,EAAU,sCAFJ,GAAGxB,EAAU2B,CAAc,CAAC,IAAIC,CAAe,IAAIP,CAAQ,EAEd,GAGzD,GAFAL,EAAOS,EAAA,KAAKf,IAAU,MAA2Bc,CAAO,EAEpDR,EAAM,OAAOA,EAEjB,GAAI,CACFA,EAAO,MAAMtB,EAAgBgC,GAC3B,KAAK,uBAAuB,CAC1B,gBAAAE,EACA,eAAAD,EACA,SAAAN,EACA,kBAAAK,CACF,CAAC,CACH,CACF,MAAQ,CACNV,EAAO,MACT,CACA,OAAAS,EAAA,KAAKf,IAAU,MAAMc,EAASR,CAAI,EAC3BA,CACT,CAEA,MAAc,uBAAuB,CACnC,gBAAAY,EACA,eAAAD,EACA,SAAAN,EAAWlD,EAAe,IAC1B,kBAAAuD,EAAoB,EACtB,EAKiC,CAC/B,OAAIA,EACKlB,EAAqBiB,EAAA,KAAKd,EAAY,EAAE,+BAA+B,OAAW,CACvF,OAAQ,CACN,GAAIiB,CACN,EACA,QAAS,CACP,mBAAoBD,EACpB,cAAe,CAACN,CAAQ,EACxB,mBAAoB,GACpB,iBAAkB,GAClB,oBAAqB,EACvB,CACF,CAAC,EAGI/C,GAAiBmC,EAAsB,CAC5C,gBAAAmB,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,CAAC9C,EAAe,GAAG,EAChC,UAAA0D,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,KAAKd,EAAY,EAAE,YAAY,OAAW,CACnF,QAAS,CACP,IAAKY,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,OAAO5C,GAAYoC,EAAsB,CACvC,QAAAc,EACA,WAAAN,EACA,UAAAY,EACA,MAAAC,EACA,SAAAC,EACA,YAAAC,EACA,YAAAC,CACF,CAAC,CACH,CAuBF,EA7KEvB,EAAA,YACAC,EAAA,YMdK,IAAMwB,EAAyB,CACpCC,EACAf,EACAL,IACoB,CACpB,IAAMqB,EAAWrB,IAAOoB,CAAM,IAAIf,GAAY,EAAE,GAAK,CAAC,EAEtD,MAAO,CACL,gBAAiBgB,EAAS,OAAS,OACnC,UAAWA,EAAS,WAAa,OACjC,MAAOA,EAAS,OAAS,OACzB,SAAUA,EAAS,UAAY,MACjC,CACF,EPGO,IAAMC,EAAc,MAAO,CAChC,UAAAC,EACA,SAAAlB,EACA,QAAA1D,EACA,YAAA6E,EACA,YAAAxF,EACA,QAAA6D,CACF,IAA6D,CAC3D,IAAM3D,EAAWJ,EAAY,CAC3B,UAAW,EAAQa,EAAQ,UAC3B,YAAAX,CACF,CAAC,EAEKyF,EAAe,IAAI7B,EAAa,CAAE,YAAA5D,EAAa,QAAA6D,CAAQ,CAAC,EACxD6B,EAAmB/E,EAAQ,kBAAkB,UAAU,cAEvDgF,GADa,OAAOtB,GAAa,UAAY,OAAOqB,GAAqB,SAE3E,MAAMD,EAAa,eAAe,CAChC,QAAS,CAACC,CAAgB,EAC1B,WAAY,CAACrB,CAAQ,CACvB,CAAC,EACD,OACEuB,EAAejF,EAAQ,aAAa,SACpC,CAAE,gBAAAkF,EAAiB,SAAAd,GAAU,UAAAF,GAAW,MAAAC,EAAM,EAAIK,EACtDO,GAAoB,GACpBrB,EACAsB,EACF,EAsDA,OApDiB,MAAM,QAAQ,WAC7BJ,EAAU,IAAI,MAAO7E,GAAY,CAC/B,GAAM,CACJ,QAASoF,EACT,MAAAC,GACA,mBAAoBC,GACpB,iBAAAC,EACF,EAAI,MAAM/F,EAAS,eAAeQ,EAAS8E,CAAW,EAEhDU,EAAa,IAAIhF,EAAI4E,CAAiB,EAAE,IAAI,IAAMF,CAAY,EAC9DO,EAAUnF,EAAQkF,EAAYN,CAAY,EAC1CQ,GAAsBnF,EAAsBkF,EAASP,CAAY,EACjES,EACJR,IAAoB,OAAY,OAAYK,EAAW,MAAML,CAAe,EAAE,SAAS,EAEnFS,GAA8BD,GAAmB,QAAQ,CAAC,EAE1DE,EAAwB,IAAIrF,EAAI8E,EAA4B,EAAE,IAAI,IAAMJ,CAAY,EACpFY,EAAqBxF,EAAQuF,EAAuBX,CAAY,EAChEa,GAAiCxF,EAAsBuF,EAAoBZ,CAAY,EACvFc,EACJb,IAAoB,OAAY,OAAYU,EAAsB,MAAMV,CAAe,EAAE,SAAS,EAC9Fc,GAAyCD,GAA8B,QAAQ,CAAC,EAEhFE,GAASjG,EAAQ,aAAa,OAEpC,MAAO,CACL,CAACD,CAAO,EAAG,CACT,CAACkG,EAAM,EAAG,CACR,GAAGjG,EAAQ,aACX,MAAAoF,GACA,iBAAAE,GACA,YAAaP,GAAoB,GACjC,KAAMpF,GAAU,OAChB,QAAA6F,EACA,oBAAAC,GACA,kBAAAC,EACA,4BAAAC,GACA,gBAAAT,EACA,UAAAhB,GACA,MAAAC,GACA,SAAAC,GACA,mBAAAyB,EACA,+BAAAC,GACA,6BAAAC,EACA,uCAAAC,EACF,CACF,CACF,CACF,CAAC,CACH,GAEgB,OAAO,CAACE,EAAKC,IACvBA,EAAe,SAAW,WACrBD,EAGF,CACL,GAAGA,EACH,GAAGC,EAAe,KACpB,EACC,CAAC,CAAC,CACP,EQ5GA,OAAS,4BAAAC,GAA0B,2BAAAC,OAA+B,4BAClE,OAAS,YAAAC,MAAgB,gBACzB,OAAS,iBAAAC,GAAe,cAAAC,MAAkB,2BAC1C,OAAS,aAAA7H,OAAiB,uBAInB,IAAM8H,GAAa,MAAO,CAC/B,aAAAC,EACA,KAAAC,EACA,UAAAvH,EACA,WAAAwH,CACF,IAA+C,CAC7C,OAAQA,EAAY,CAClB,KAAKJ,EAAW,SAChB,KAAKA,EAAW,OAChB,KAAKA,EAAW,SACd,MAAO,CACL,CAACD,GAAc,OAAO,EAAGH,GACvBO,EACAD,EACAtH,EAAYkH,EAAS,QAAUA,EAAS,OAC1C,CACF,EAEF,KAAKE,EAAW,WAChB,KAAKA,EAAW,SAAU,CACxB,IAAMK,EAAe,OAAO,KAAKF,EAAM,KAAK,EAC5C,MAAO,CACL,CAACJ,GAAc,OAAO,EAAGF,GAAwBQ,EAAczH,EAAYkH,EAAS,QAAUA,EAAS,OAAO,CAChH,CACF,CACA,QACE,MAAM3H,GAAU,cAAc,4BAA4BiI,CAAU,EAAE,CAC1E,CACF,EfpCA,IAAA5D,EAsBa8D,GAAN,KAAsC,CAG3C,YAAY,CAAE,YAAA9H,CAAY,EAAiC,CAF3DmE,EAAA,KAAAH,EAAA,QAGE,GAAM,CAAE,YAAA3D,CAAY,EAAIN,EAAOC,CAAW,EAC1C2E,EAAA,KAAKX,EAAe3D,EACtB,CAEA,WAAW,CAAE,aAAAqH,EAAc,KAAAC,EAAM,UAAAvH,EAAW,WAAAwH,CAAW,EAAkD,CACvG,OAAOH,GAAW,CAAE,aAAAC,EAAc,KAAAC,EAAM,UAAAvH,EAAW,WAAAwH,CAAW,CAAC,CACjE,CAEA,YAAY,CAAE,UAAAhC,EAAW,SAAAlB,EAAU,QAAA1D,EAAS,QAAAkD,CAAQ,EAAsB,CACxE,OAAOyB,EAAY,CACjB,UAAAC,EACA,SAAAlB,EACA,QAAA1D,EACA,YAAa8D,EAAA,KAAKd,GAClB,QAAAE,CACF,CAAC,CACH,CAEA,aAAoC,CAClC,IAAM5B,EAAS5C,GAAcO,CAAY,EACzC,OAAOqC,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,cAActB,EAAwC,CACpD,OAAOV,EAAc,CACnB,UAAW,EAAQU,EAAQ,UAC3B,YAAa8D,EAAA,KAAKd,EACpB,CAAC,CACH,CAEA,MAAM,sBAAsB,CAAE,QAAAjD,EAAS,QAAAC,CAAQ,EAA0B,CACvE,MAAO,CACL,aAAc,MAAMI,EAAsB,CACxC,QAAAL,EACA,QAAAC,EACA,YAAa8D,EAAA,KAAKd,EACpB,CAAC,CACH,CACF,CAEA,UAAUrB,EAAY,CACpB,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAC3B,CAEA,MAAM,aAAaoF,EAAqBC,EAAmB,CACzD,OAAQD,EAAQ,OAAQ,CACtB,QACE,MAAO,CAAE,MAAOpI,GAAU,mBAAmB,UAAUoI,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CACF,EArDE/D,EAAA","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n Environment,\n GetBalancesParams,\n GetAddressParams,\n GetAddressResponse,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { getEnv } from './env';\n\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history';\nimport { getBalances } from './handlers/get-balances';\nimport { getAddress } from './handlers/get-address/get-address';\n\nexport class BitcoinModule implements Module {\n #proxyApiUrl: string;\n\n constructor({ environment }: { environment: Environment }) {\n const { proxyApiUrl } = getEnv(environment);\n this.#proxyApiUrl = proxyApiUrl;\n }\n\n getAddress({ accountIndex, xpub, isTestnet, walletType }: GetAddressParams): Promise<GetAddressResponse> {\n return getAddress({ accountIndex, xpub, isTestnet, walletType });\n }\n\n getBalances({ addresses, currency, network, storage }: GetBalancesParams) {\n return getBalances({\n addresses,\n currency,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n storage,\n });\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(network: Network): Promise<NetworkFees> {\n return getNetworkFee({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl: this.#proxyApiUrl,\n });\n }\n\n async getTransactionHistory({ address, network }: GetTransactionHistory) {\n return {\n transactions: await getTransactionHistory({\n address,\n network,\n proxyApiUrl: this.#proxyApiUrl,\n }),\n };\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","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","{\n \"name\": \"Bitcoin\",\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/bitcoin-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/bitcoin-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"bip122:000000000019d6689c085ae165831e93\", \"bip122:000000000933ea01ad0ee984209779ba\"],\n \"namespaces\": [\"bip122\"]\n },\n \"cointype\": \"0\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"bitcoin_sendTransaction\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import { BitcoinProvider } from '@avalabs/core-wallets-sdk';\n\ntype ProviderParams = {\n isTestnet: boolean;\n proxyApiUrl: string;\n};\n\nexport const getProvider = ({ isTestnet, proxyApiUrl }: ProviderParams): BitcoinProvider =>\n new BitcoinProvider(\n !isTestnet,\n undefined,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btcbook-testnet' : 'btcbook'}`,\n `${proxyApiUrl}/proxy/nownodes/${isTestnet ? 'btc-testnet' : 'btc'}`,\n\n // The Glacier API key is only needed in development to bypass rate limits.\n // It should never be used in production.\n process.env.GLACIER_API_KEY ? { token: process.env.GLACIER_API_KEY } : {},\n );\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\n/**\n * Returns {@link NetworkFees} based on `estimatesmartfee` RPC call\n */\nexport async function getNetworkFee({\n isTestnet,\n proxyApiUrl,\n}: {\n isTestnet: boolean;\n proxyApiUrl: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n isTestnet,\n proxyApiUrl,\n });\n\n const { high, low, medium } = await provider.getFeeRates();\n\n return {\n low: {\n maxFeePerGas: BigInt(low),\n },\n medium: {\n maxFeePerGas: BigInt(medium),\n },\n high: {\n maxFeePerGas: BigInt(high),\n },\n isFixedFee: false,\n };\n}\n","import { TokenType, TransactionType, type Network, type Transaction } from '@avalabs/vm-module-types';\nimport type { BitcoinHistoryTx } from '@avalabs/core-wallets-sdk';\n\ntype ConverterOptions = {\n address: string;\n network: Network;\n};\n\nexport const convertBtcTransaction = (tx: BitcoinHistoryTx, { address, network }: ConverterOptions): Transaction => {\n const { explorerUrl, isTestnet, networkToken } = network;\n const txAddress = tx.addresses[0] ?? '';\n\n return {\n chainId: network.chainId.toString(),\n explorerLink: `${explorerUrl}/${isTestnet ? 'btc-testnet' : 'btc'}/tx/${tx.hash}`,\n from: tx.isSender ? address : txAddress,\n gasUsed: tx.fee.toString(),\n hash: tx.hash,\n isContractCall: false,\n isIncoming: !tx.isSender,\n isOutgoing: tx.isSender,\n isSender: tx.isSender,\n timestamp: tx.receivedTime * 1000,\n to: tx.isSender ? txAddress : address,\n tokens: [\n {\n amount: (Math.abs(tx.amount) / 10 ** networkToken.decimals).toString(),\n decimal: networkToken.decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n type: TokenType.NATIVE,\n },\n ],\n txType: tx.isSender ? TransactionType.SEND : TransactionType.RECEIVE,\n };\n};\n","import type { Network } from '@avalabs/vm-module-types';\n\nimport { getProvider } from '../../utils/get-provider';\n\nimport { convertBtcTransaction } from './convert-btc-transaction';\n\ntype GetBtcTransactionHistoryOptions = {\n network: Network;\n address: string;\n proxyApiUrl: string;\n};\n\nexport const getTransactionHistory = async ({ address, network, proxyApiUrl }: GetBtcTransactionHistoryOptions) => {\n const provider = getProvider({ isTestnet: Boolean(network.isTestnet), proxyApiUrl });\n const rawHistory = await provider.getTxHistory(address);\n\n return rawHistory.map((tx) =>\n convertBtcTransaction(tx, {\n address,\n network,\n }),\n );\n};\n","import { TokenType, type GetBalancesParams, type TokenWithBalanceBTC } from '@avalabs/vm-module-types';\nimport { bigToBN, balanceToDisplayValue } from '@avalabs/core-utils-sdk';\nimport type { VsCurrencyType } from '@avalabs/core-coingecko-sdk';\nimport Big from 'big.js';\n\nimport { TokenService } from '@internal/utils';\n\nimport { getProvider } from '../../utils/get-provider';\nimport { extractTokenMarketData } from '../../utils/extract-token-market-data';\n\ntype GetBtcBalancesResponse = Record<string, Record<string, TokenWithBalanceBTC>>;\n\ntype GetBTCBalancesParams = Omit<GetBalancesParams, 'currency'> & {\n proxyApiUrl: string;\n withScripts?: boolean;\n currency?: string;\n};\n\nexport const getBalances = async ({\n addresses,\n currency,\n network,\n withScripts,\n proxyApiUrl,\n storage,\n}: GetBTCBalancesParams): Promise<GetBtcBalancesResponse> => {\n const provider = getProvider({\n isTestnet: Boolean(network.isTestnet),\n proxyApiUrl,\n });\n\n const tokenService = new TokenService({ proxyApiUrl, storage });\n const coingeckoTokenId = network.pricingProviders?.coingecko.nativeTokenId;\n const withPrices = typeof currency === 'string' && typeof coingeckoTokenId === 'string';\n const marketData = withPrices\n ? await tokenService.getSimplePrice({\n coinIds: [coingeckoTokenId],\n currencies: [currency] as VsCurrencyType[],\n })\n : undefined;\n const denomination = network.networkToken.decimals;\n const { priceInCurrency, change24, marketCap, vol24 } = extractTokenMarketData(\n coingeckoTokenId ?? '',\n currency,\n marketData,\n );\n\n const balances = await Promise.allSettled(\n addresses.map(async (address) => {\n const {\n balance: balanceInSatoshis,\n utxos,\n balanceUnconfirmed: unconfirmedBalanceInSatoshis,\n utxosUnconfirmed,\n } = await provider.getUtxoBalance(address, withScripts);\n\n const balanceBig = new Big(balanceInSatoshis).div(10 ** denomination);\n const balance = bigToBN(balanceBig, denomination);\n const balanceDisplayValue = balanceToDisplayValue(balance, denomination);\n const balanceInCurrency =\n priceInCurrency === undefined ? undefined : balanceBig.times(priceInCurrency).toNumber();\n\n const balanceCurrencyDisplayValue = balanceInCurrency?.toFixed(2);\n\n const unconfirmedBalanceBig = new Big(unconfirmedBalanceInSatoshis).div(10 ** denomination);\n const unconfirmedBalance = bigToBN(unconfirmedBalanceBig, denomination);\n const unconfirmedBalanceDisplayValue = balanceToDisplayValue(unconfirmedBalance, denomination);\n const unconfirmedBalanceInCurrency =\n priceInCurrency === undefined ? undefined : unconfirmedBalanceBig.times(priceInCurrency).toNumber();\n const unconfirmedBalanceCurrencyDisplayValue = unconfirmedBalanceInCurrency?.toFixed(2);\n\n const symbol = network.networkToken.symbol;\n\n return {\n [address]: {\n [symbol]: {\n ...network.networkToken,\n utxos,\n utxosUnconfirmed,\n coingeckoId: coingeckoTokenId ?? '',\n type: TokenType.NATIVE,\n balance,\n balanceDisplayValue,\n balanceInCurrency,\n balanceCurrencyDisplayValue,\n priceInCurrency,\n marketCap,\n vol24,\n change24,\n unconfirmedBalance,\n unconfirmedBalanceDisplayValue,\n unconfirmedBalanceInCurrency,\n unconfirmedBalanceCurrencyDisplayValue,\n },\n },\n };\n }),\n );\n\n return balances.reduce((acc, accountBalance) => {\n if (accountBalance.status === 'rejected') {\n return acc;\n }\n\n return {\n ...acc,\n ...accountBalance.value,\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 type { SimplePriceResponse, TokenMarketData } from '@avalabs/vm-module-types';\n\nexport const extractTokenMarketData = (\n coinId: string,\n currency?: string,\n data?: SimplePriceResponse,\n): TokenMarketData => {\n const coinData = data?.[coinId]?.[currency ?? ''] ?? {};\n\n return {\n priceInCurrency: coinData.price ?? undefined,\n marketCap: coinData.marketCap ?? undefined,\n vol24: coinData.vol24 ?? undefined,\n change24: coinData.change24 ?? undefined,\n };\n};\n","import type { GetAddressParams, GetAddressResponse } from '@avalabs/vm-module-types';\nimport { getBech32AddressFromXPub, getBtcAddressFromPubKey } from '@avalabs/core-wallets-sdk';\nimport { networks } from 'bitcoinjs-lib';\nimport { NetworkVMType, WalletType } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\n\ntype GetAddress = Omit<GetAddressParams, 'xpubXP'>;\n\nexport const getAddress = async ({\n accountIndex,\n xpub,\n isTestnet,\n walletType,\n}: GetAddress): Promise<GetAddressResponse> => {\n switch (walletType) {\n case WalletType.Mnemonic:\n case WalletType.Ledger:\n case WalletType.Keystone: {\n return {\n [NetworkVMType.BITCOIN]: getBech32AddressFromXPub(\n xpub,\n accountIndex,\n isTestnet ? networks.testnet : networks.bitcoin,\n ),\n };\n }\n case WalletType.LedgerLive:\n case WalletType.Seedless: {\n const pubKeyBuffer = Buffer.from(xpub, 'hex');\n return {\n [NetworkVMType.BITCOIN]: getBtcAddressFromPubKey(pubKeyBuffer, isTestnet ? networks.testnet : networks.bitcoin),\n };\n }\n default:\n throw rpcErrors.invalidParams(`Unsupported wallet type: ${walletType}`);\n }\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avalabs/bitcoin-module",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"main": "dist/index.cjs",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"manifest.json"
|
|
11
|
+
],
|
|
12
|
+
"license": "Limited Ecosystem License",
|
|
8
13
|
"dependencies": {
|
|
9
|
-
"@avalabs/vm-module-types": "0.
|
|
10
|
-
"@avalabs/wallets-sdk": "
|
|
11
|
-
"@avalabs/coingecko-sdk": "
|
|
12
|
-
"@avalabs/utils-sdk": "
|
|
14
|
+
"@avalabs/vm-module-types": "0.1.1",
|
|
15
|
+
"@avalabs/core-wallets-sdk": "3.0.0",
|
|
16
|
+
"@avalabs/core-coingecko-sdk": "3.0.0",
|
|
17
|
+
"@avalabs/core-utils-sdk": "3.0.0",
|
|
13
18
|
"@metamask/rpc-errors": "6.3.0",
|
|
14
19
|
"big.js": "6.2.1",
|
|
15
20
|
"bn.js": "5.2.1",
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @avalabs/bitcoin-module@0.0.23 build /home/runner/work/vm-modules/vm-modules/packages/bitcoin-module
|
|
3
|
-
> tsup
|
|
4
|
-
|
|
5
|
-
[34mCLI[39m Building entry: ./src/index.ts
|
|
6
|
-
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
-
[34mCLI[39m tsup v7.2.0
|
|
8
|
-
[34mCLI[39m Using tsup config: /home/runner/work/vm-modules/vm-modules/packages/bitcoin-module/tsup.config.ts
|
|
9
|
-
[34mCLI[39m Target: es2021
|
|
10
|
-
[34mCLI[39m Cleaning output folder
|
|
11
|
-
[34mCJS[39m Build start
|
|
12
|
-
[34mESM[39m Build start
|
|
13
|
-
[32mCJS[39m [1mdist/index.cjs [22m[32m10.20 KB[39m
|
|
14
|
-
[32mCJS[39m [1mdist/index.cjs.map [22m[32m36.40 KB[39m
|
|
15
|
-
[32mCJS[39m ⚡️ Build success in 1672ms
|
|
16
|
-
[32mESM[39m [1mdist/index.js [22m[32m9.79 KB[39m
|
|
17
|
-
[32mESM[39m [1mdist/index.js.map [22m[32m36.40 KB[39m
|
|
18
|
-
[32mESM[39m ⚡️ Build success in 1676ms
|
|
19
|
-
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in 24466ms
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.cts [22m[32m1.40 KB[39m
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.40 KB[39m
|
package/.turbo/turbo-lint.log
DELETED
package/.turbo/turbo-test.log
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @avalabs/bitcoin-module@0.0.23 test /home/runner/work/vm-modules/vm-modules/packages/bitcoin-module
|
|
3
|
-
> jest
|
|
4
|
-
|
|
5
|
-
PASS src/handlers/get-balances/get-balances.test.ts (33.52 s)
|
|
6
|
-
PASS src/handlers/get-transaction-history/convert-btc-transaction.test.ts
|
|
7
|
-
PASS src/handlers/get-transaction-history/get-transaction-history.test.ts
|
|
8
|
-
PASS src/module.test.ts
|
|
9
|
-
PASS src/utils/get-provider.test.ts
|
|
10
|
-
PASS src/handlers/get-network-fee/get-network-fee.test.ts
|
|
11
|
-
|
|
12
|
-
Test Suites: 6 passed, 6 total
|
|
13
|
-
Tests: 20 passed, 20 total
|
|
14
|
-
Snapshots: 0 total
|
|
15
|
-
Time: 40.598 s
|
|
16
|
-
Ran all test suites.
|