@avalabs/hvm-module 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -8,8 +8,8 @@ var zod = require('zod');
|
|
|
8
8
|
var sha256 = require('@noble/hashes/sha256');
|
|
9
9
|
var base = require('@scure/base');
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _=(t,e,n)=>{if(!e.has(t))throw TypeError("Cannot "+n)};var d=(t,e,n)=>(_(t,e,"read from private field"),n?n.call(t):e.get(t)),y=(t,e,n)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,n);},f=(t,e,n,s)=>(_(t,e,"write to private field"),s?s.call(t,n):e.set(t,n),n);var T={name:"HyperVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/hvm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:[],namespaces:["hvm"]},cointype:"9000",permissions:{rpc:{dapps:!0,methods:["hvm_signTransaction"],nonRestrictedMethods:[]}},manifestVersion:"0.1"};var h=({rpcUrl:t,chainName:e,vmRpcPrefix:n})=>{if(!n)throw new Error("There is no vm rpc prefix");return new hypersdkClient.HyperSDKClient(t,e,n)};var A=async t=>{let{addresses:e,network:n}=t,s=h(n),c=e.map(async i=>{try{let a=await s.getBalance(i),p=n.networkToken,u=new coreUtilsSdk.TokenUnit(a,p.decimals,p.symbol),m={...p,coingeckoId:"",type:vmModuleTypes.TokenType.NATIVE,balance:a,balanceDisplayValue:u.toDisplay()};return {[i]:{[p.symbol]:m}}}catch(a){return {[i]:{error:a.toString()}}}});return (await Promise.allSettled(c)).reduce((i,a)=>({...i,...a.status==="fulfilled"?a.value:a.reason}),{})};zod.z.array(zod.z.object({internalId:zod.z.string(),id:zod.z.string(),symbol:zod.z.string(),name:zod.z.string(),image:zod.z.string().optional().nullable(),current_price:zod.z.number().optional().nullable(),price_change_percentage_24h:zod.z.number().optional().nullable(),market_cap:zod.z.number().optional().nullable(),total_volume:zod.z.number().optional().nullable(),platforms:zod.z.record(zod.z.string(),zod.z.string())}));zod.object({date:zod.string(),usd:zod.record(zod.number())});process.env.GLACIER_API_KEY;var g=(t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}});var K=zod.z.object({abi:zod.z.object({actions:zod.z.array(zod.z.object({id:zod.z.number(),name:zod.z.string()})),outputs:zod.z.array(zod.z.object({id:zod.z.number(),name:zod.z.string()})),types:zod.z.array(zod.z.object({name:zod.z.string(),fields:zod.z.array(zod.z.object({name:zod.z.string(),type:zod.z.string()}))}))}),tx:zod.z.object({base:zod.z.object({timestamp:zod.z.string(),chainId:zod.z.string(),maxFee:zod.z.string()}),actions:zod.z.array(zod.z.object({actionName:zod.z.string(),data:zod.z.record(zod.z.string(),zod.z.unknown())}))}).required()}),z=zod.z.array(K).length(1),w=t=>z.safeParse(t);var W=t=>t.length?t.map(e=>({title:e.actionName,items:[...Object.entries(e.data).map(([n,s])=>typeof s=="string"&&/^0x[0-9a-f]{74}$/i.test(s)?{label:n,type:vmModuleTypes.DetailItemType.ADDRESS,value:s}:{label:n,type:vmModuleTypes.DetailItemType.TEXT,value:typeof s=="string"?s:JSON.stringify(s),alignment:"vertical"})]})):[],S=async({request:t,network:e,approvalController:n})=>{let{params:s}=t,c=w(s);if(!c.success)return {error:rpcErrors.rpcErrors.invalidParams(g("Transaction params are invalid",c.error))};let i=c.data[0];if(!i)return {error:rpcErrors.rpcErrors.invalidParams(g("Transaction params are invalid",new Error("No transaction found")))};let a=W(i.tx.actions),p={title:"Do you approve this transaction?",dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} is requesting to sign the following message`,logoUri:t.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:a},u={type:vmModuleTypes.RpcMethod.HVM_SIGN_TRANSACTION,data:{abi:i.abi,txPayload:i.tx}},m=await n.requestApproval({request:t,displayData:p,signingData:u});return "error"in m?{error:m.error}:"signedData"in m?{result:m.signedData}:{error:rpcErrors.rpcErrors.internal("No signed data returned")}};var E=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var P=({accountIndex:t,derivationPathType:e})=>{if(t<0)throw rpcErrors.rpcErrors.invalidParams("Account index must be a non-negative integer");switch(e){case"bip44":return {[vmModuleTypes.NetworkVMType.HVM]:`m/44'/9000'/0'/0'/${t}'`};case"ledger_live":return {[vmModuleTypes.NetworkVMType.HVM]:`m/44'/9000'/${t}'/0'/0'`};default:throw rpcErrors.rpcErrors.invalidParams(`Unsupported derivation path type: ${e}`)}};var J=0,M=async t=>{let{approvalController:e,secretId:n}=t,s=E(t)?P(t).HVM:void 0,c=await e.requestPublicKey({curve:"ed25519",secretId:n,derivationPath:s}),i=base.hex.decode(c),a=new Uint8Array([J,...sha256.sha256(i)]),u=sha256.sha256(a).slice(-4);return {[vmModuleTypes.NetworkVMType.HVM]:`0x${base.hex.encode(a)}${base.hex.encode(u)}`}};var l,U=class{constructor({approvalController:e}){y(this,l,void 0);f(this,l,e);}getProvider(e){try{return Promise.resolve(h(e))}catch(n){return Promise.reject(n)}}getManifest(){let e=vmModuleTypes.parseManifest(T);return e.success?e.data:void 0}buildDerivationPath(e){return P(e)}deriveAddress(e){return M({...e,approvalController:d(this,l)})}getAddress(e){throw new Error("not implemented")}async getBalances(e){return A(e)}async onRpcRequest(e,n){switch(e.method){case vmModuleTypes.RpcMethod.HVM_SIGN_TRANSACTION:return S({request:e,network:n,approvalController:d(this,l)});default:return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}getTransactionHistory(e){return Promise.resolve({transactions:[]})}getTokens(e){return Promise.resolve([])}getNetworkFee(e){return Promise.reject(new Error("not implemented"))}};l=new WeakMap;
|
|
12
12
|
|
|
13
|
-
exports.HvmModule =
|
|
13
|
+
exports.HvmModule = U;
|
|
14
14
|
//# sourceMappingURL=out.js.map
|
|
15
15
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-balances.ts","../src/handlers/sign-transaction/sign-transaction.ts","../../../node_modules/.pnpm/@avalabs+core-coingecko-sdk@3.1.0-alpha.79_big.js@6.2.1_bn.js@5.2.2_ethers@6.13.5_buffe_fc9ca45ae3e25869f6d1dced1a11e262/node_modules/@avalabs/core-coingecko-sdk/esm/constants.js","../../../node_modules/.pnpm/@avalabs+core-coingecko-sdk@3.1.0-alpha.79_big.js@6.2.1_bn.js@5.2.2_ethers@6.13.5_buffe_fc9ca45ae3e25869f6d1dced1a11e262/node_modules/@avalabs/core-coingecko-sdk/esm/http.js","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../src/handlers/sign-transaction/schema.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/build-derivation-path/build-derivation-path.ts"],"names":["parseManifest","RpcMethod","manifest_default","HyperSDKClient","getProvider","rpcUrl","chainName","vmRpcPrefix","TokenType","TokenUnit","hvmGetBalances","params","addresses","network","provider","requests","address","balanceResult","networkToken","totalBalance","returnBalance","err","acc","curr","rpcErrors","DetailItemType","o","t","c","a","i","n","e","f","RawSimplePriceResponseSchema","z","WatchlistTokenResponseSchema","coingeckoBasicClient","number","object","record","string","ExchangeRateSchema","AppName","GLACIER_API_KEY","getGlacierApiKey","GLOBAL_QUERY_PARAMS","rpcErrorOpts","message","cause","transactionSchema","paramsSchema","parseRequestParams","parseDetails","txPayloadActions","action","key","value","hvmSign","request","approvalController","result","transaction","details","displayData","signingData","response","NetworkVMType","sha256","hex","hasDerivationDetails","buildDerivationPath","accountIndex","derivationPathType","ED25519_AUTH_ID","deriveAddress","secretId","derivationPath","publicKeyHex","publicKeyBytes","addressBytes","checksum","_approvalController","HvmModule","__privateAdd","__privateSet","__privateGet","_params","_"],"mappings":"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","sourcesContent":["import {\n type Module,\n type Manifest,\n parseManifest,\n type ConstructorParams,\n type ApprovalController,\n type RpcRequest,\n type TransactionHistoryResponse,\n type GetTransactionHistory,\n type Network,\n type NetworkFees,\n type GetBalancesParams,\n type GetBalancesResponse,\n type GetAddressResponse,\n type RpcResponse,\n RpcMethod,\n type GetAddressParams,\n type DeriveAddressParams,\n type BuildDerivationPathParams,\n} from '@avalabs/vm-module-types';\n\nimport ManifestJson from '../manifest.json';\nimport { getProvider } from './utils/get-provider';\nimport { hvmGetBalances } from './handlers/get-balances';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { hvmSign } from './handlers/sign-transaction/sign-transaction';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\n\nexport class HvmModule implements Module {\n #approvalController: ApprovalController;\n\n constructor({ approvalController }: ConstructorParams) {\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network) {\n try {\n return Promise.resolve(getProvider(network));\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n deriveAddress(params: DeriveAddressParams) {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n getAddress(_params: GetAddressParams): Promise<GetAddressResponse> {\n // The current parameter set does not support ed25519 public keys and this method is not used yet in the clients\n throw new Error('not implemented');\n }\n\n async getBalances(params: GetBalancesParams): Promise<GetBalancesResponse> {\n return hvmGetBalances(params);\n }\n\n async onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse> {\n switch (request.method) {\n case RpcMethod.HVM_SIGN_TRANSACTION:\n return hvmSign({ request, network, approvalController: this.#approvalController });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n getTransactionHistory(_: GetTransactionHistory): Promise<TransactionHistoryResponse> {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return Promise.reject(new Error('not implemented'));\n }\n}\n","{\n \"name\": \"HyperVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/hvm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [],\n \"namespaces\": [\"hvm\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"hvm_signTransaction\"],\n \"nonRestrictedMethods\": []\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","import { HyperSDKClient } from 'hypersdk-client';\n\ntype ProviderParams = {\n rpcUrl: string;\n chainName: string;\n vmRpcPrefix?: string;\n};\n\nexport const getProvider = ({ rpcUrl, chainName, vmRpcPrefix }: ProviderParams): HyperSDKClient => {\n if (!vmRpcPrefix) {\n throw new Error('There is no vm rpc prefix');\n }\n return new HyperSDKClient(rpcUrl, chainName, vmRpcPrefix);\n};\n","import {\n type GetBalancesParams,\n type GetBalancesResponse,\n type NetworkTokenWithBalance,\n TokenType,\n} from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { getProvider } from '../utils/get-provider';\n\nexport const hvmGetBalances = async (params: GetBalancesParams): Promise<GetBalancesResponse> => {\n const { addresses, network } = params;\n\n const provider = getProvider(network);\n\n const requests = addresses.map(async (address) => {\n try {\n const balanceResult = await provider.getBalance(address);\n const networkToken = network.networkToken;\n const totalBalance = new TokenUnit(balanceResult, networkToken.decimals, networkToken.symbol);\n\n const returnBalance: NetworkTokenWithBalance = {\n ...networkToken,\n coingeckoId: '',\n type: TokenType.NATIVE,\n balance: balanceResult,\n balanceDisplayValue: totalBalance.toDisplay(),\n };\n\n return { [address]: { [networkToken.symbol]: returnBalance } };\n } catch (err) {\n return { [address]: { error: (err as Error).toString() } };\n }\n });\n\n return (await Promise.allSettled(requests)).reduce((acc, curr) => {\n return {\n ...acc,\n ...(curr.status === 'fulfilled' ? curr.value : curr.reason),\n };\n }, {} as GetBalancesResponse);\n};\n","import {\n DetailItemType,\n RpcMethod,\n type ApprovalController,\n type DetailItem,\n type DetailSection,\n type DisplayData,\n type Network,\n type RpcRequest,\n type SigningData,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { rpcErrorOpts } from '@internal/utils';\nimport { parseRequestParams } from './schema';\nimport type { ActionData } from 'hypersdk-client';\n\nconst parseDetails = (txPayloadActions: ActionData[]): DetailSection[] => {\n if (!txPayloadActions.length) {\n return [];\n }\n\n return txPayloadActions.map((action) => {\n return {\n title: action.actionName,\n items: [\n ...Object.entries(action.data).map(([key, value]): DetailItem => {\n const addressRegex = /^0x[0-9a-f]{74}$/i;\n\n if (typeof value === 'string' && addressRegex.test(value)) {\n return {\n label: key,\n type: DetailItemType.ADDRESS,\n value: value,\n };\n }\n\n return {\n label: key,\n type: DetailItemType.TEXT,\n value: typeof value === 'string' ? value : JSON.stringify(value),\n alignment: 'vertical',\n };\n }),\n ],\n };\n });\n};\n\nexport const hvmSign = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const { params } = request;\n\n // validate params\n const result = parseRequestParams(params);\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', result.error)),\n };\n }\n\n const transaction = result.data[0];\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', new Error('No transaction found'))),\n };\n }\n\n const details = parseDetails(transaction.tx.actions);\n const displayData: DisplayData = {\n title: 'Do you approve this transaction?',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n };\n const signingData: SigningData = {\n type: RpcMethod.HVM_SIGN_TRANSACTION,\n data: { abi: transaction.abi, txPayload: transaction.tx },\n };\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.internal('No signed data returned'),\n };\n }\n\n return { result: response.signedData };\n};\n","const o=\"https://api.coingecko.com/api/v3\",p=\"https://pro-api.coingecko.com/api/v3\",t=\"https://proxy-api-dev.avax.network\",c=\"https://proxy-api.avax.network\",a=`${c}/proxy/coingecko`,i=`${t}/proxy/coingecko`;export{a as COINGECKO_PROXY_URL,p as COINGECKO_PRO_URL,o as COINGECKO_URL,i as DEV_COINGECKO_PROXY_URL,t as DEV_PROXY_API_WORKER_URL,c as PROXY_API_WORKER_URL};\n","import{HttpClient as n}from\"@avalabs/core-utils-sdk\";import{COINGECKO_URL as t,DEV_COINGECKO_PROXY_URL as r,COINGECKO_PRO_URL as o,COINGECKO_PROXY_URL as u}from\"./constants.js\";function e(r=t,o={}){return new n(r,o)}function i(n={}){return e(u,{...n,method:\"POST\"})}function c(n={}){return e(r,{...n,method:\"POST\"})}function f(n={}){return e(t,n)}function m(n={}){return e(o,n)}export{f as getBasicCoingeckoHttp,e as getCoinGeckoHttp,c as getDevProxiedCoingeckoHttp,m as getProCoingeckoHttp,i as getProxiedCoingeckoHttp};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n );\n }\n}\n","import z from 'zod';\nimport type { ZodSchema } from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n): Promise<z.infer<T>> {\n const response = await fetch(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\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';\nimport { WatchlistProxyClient } from './watchlist-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 async getWatchlistDataForToken({\n tokenDetails,\n currency = VsCurrencyType.USD,\n }: {\n tokenDetails: {\n symbol: string;\n isNative: boolean;\n caip2Id: string;\n address?: string;\n };\n currency: VsCurrencyType;\n }): Promise<{\n priceInCurrency: number;\n change24: number;\n marketCap: number;\n vol24: number;\n }> {\n const data = (\n await new WatchlistProxyClient(this.#proxyApiUrl).watchlistToken({\n tokens: tokenDetails.symbol,\n currency: currency,\n })\n ).filter((token) => {\n return tokenDetails.isNative\n ? token.internalId === `NATIVE-${tokenDetails.symbol.toLowerCase()}`\n : token.platforms[tokenDetails.caip2Id] === tokenDetails.address;\n });\n\n const tokenInfo = data[0];\n\n if (!tokenInfo) {\n return {\n priceInCurrency: 0,\n change24: 0,\n marketCap: 0,\n vol24: 0,\n };\n }\n\n return {\n priceInCurrency: tokenInfo.current_price ?? 0,\n change24: tokenInfo.price_change_percentage_24h ?? 0,\n marketCap: tokenInfo.market_cap ?? 0,\n vol24: tokenInfo.total_volume ?? 0,\n };\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 (err) {\n console.error(err);\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 const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses({\n id: assetPlatformId,\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 return this.transformSimplePriceResponse(rawData, [currency]);\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 new CoingeckoProxyClient(this.#proxyApiUrl).simplePrice({\n ids: coinIds,\n vs_currencies: currencies,\n include_market_cap: marketCap,\n include_24hr_vol: vol24,\n include_24hr_change: change24,\n include_last_updated_at: lastUpdated,\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","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import { FetchHttpRequest, type OpenAPIConfig, type ApiRequestOptions, CancelablePromise } from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n // Call the base class's request method\n return super.request<T>(modifiedOptions);\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","import { z } from 'zod';\n\nconst transactionSchema = z.object({\n abi: z.object({\n actions: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n outputs: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n types: z.array(\n z.object({\n name: z.string(),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n }),\n ),\n }),\n ),\n }),\n tx: z\n .object({\n base: z.object({\n timestamp: z.string(),\n chainId: z.string(),\n maxFee: z.string(),\n }),\n actions: z.array(\n z.object({\n actionName: z.string(),\n data: z.record(z.string(), z.unknown()),\n }),\n ),\n })\n .required(),\n});\n\nconst paramsSchema = z.array(transactionSchema).length(1);\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import type { ApprovalController, DeriveAddressParams, DeriveAddressResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { hex } from '@scure/base';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nconst ED25519_AUTH_ID = 0x00;\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { approvalController, secretId } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const derivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).HVM : undefined;\n\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'ed25519',\n secretId,\n derivationPath,\n });\n const publicKeyBytes = hex.decode(publicKeyHex);\n const addressBytes = new Uint8Array([ED25519_AUTH_ID, ...sha256(publicKeyBytes)]);\n const hash = sha256(addressBytes);\n const checksum = hash.slice(-4);\n\n return {\n [NetworkVMType.HVM]: `0x${hex.encode(addressBytes)}${hex.encode(checksum)}`,\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\n\n/**\n * HyperVM shares the same derivation path as AVM and PVM,\n * with the exception that the path levels are hardened (required for Ed25519).\n *\n * We reuse \"9000\" coin index so we don't need to request more privileges\n * from hardware wallets users (like Ledger).\n */\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.HVM> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/0'/0'/${accountIndex}'`,\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/${accountIndex}'/0'/0'`,\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-balances.ts","../src/handlers/sign-transaction/sign-transaction.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../src/handlers/sign-transaction/schema.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/build-derivation-path/build-derivation-path.ts"],"names":["parseManifest","RpcMethod","manifest_default","HyperSDKClient","getProvider","rpcUrl","chainName","vmRpcPrefix","TokenType","TokenUnit","hvmGetBalances","params","addresses","network","provider","requests","address","balanceResult","networkToken","totalBalance","returnBalance","err","acc","curr","rpcErrors","DetailItemType","RawSimplePriceResponseSchema","z","WatchlistTokenResponseSchema","number","object","record","string","ExchangeRateSchema","AppName","GLACIER_API_KEY","getGlacierApiKey","GLOBAL_QUERY_PARAMS","rpcErrorOpts","message","cause","transactionSchema","paramsSchema","parseRequestParams","parseDetails","txPayloadActions","action","key","value","hvmSign","request","approvalController","result","transaction","details","displayData","signingData","response","NetworkVMType","sha256","hex","hasDerivationDetails","buildDerivationPath","accountIndex","derivationPathType","ED25519_AUTH_ID","deriveAddress","secretId","derivationPath","publicKeyHex","publicKeyBytes","addressBytes","checksum","_approvalController","HvmModule","__privateAdd","__privateSet","e","__privateGet","_params","_"],"mappings":"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","sourcesContent":["import {\n type Module,\n type Manifest,\n parseManifest,\n type ConstructorParams,\n type ApprovalController,\n type RpcRequest,\n type TransactionHistoryResponse,\n type GetTransactionHistory,\n type Network,\n type NetworkFees,\n type GetBalancesParams,\n type GetBalancesResponse,\n type GetAddressResponse,\n type RpcResponse,\n RpcMethod,\n type GetAddressParams,\n type DeriveAddressParams,\n type BuildDerivationPathParams,\n} from '@avalabs/vm-module-types';\n\nimport ManifestJson from '../manifest.json';\nimport { getProvider } from './utils/get-provider';\nimport { hvmGetBalances } from './handlers/get-balances';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { hvmSign } from './handlers/sign-transaction/sign-transaction';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\n\nexport class HvmModule implements Module {\n #approvalController: ApprovalController;\n\n constructor({ approvalController }: ConstructorParams) {\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network) {\n try {\n return Promise.resolve(getProvider(network));\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n deriveAddress(params: DeriveAddressParams) {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n getAddress(_params: GetAddressParams): Promise<GetAddressResponse> {\n // The current parameter set does not support ed25519 public keys and this method is not used yet in the clients\n throw new Error('not implemented');\n }\n\n async getBalances(params: GetBalancesParams): Promise<GetBalancesResponse> {\n return hvmGetBalances(params);\n }\n\n async onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse> {\n switch (request.method) {\n case RpcMethod.HVM_SIGN_TRANSACTION:\n return hvmSign({ request, network, approvalController: this.#approvalController });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n getTransactionHistory(_: GetTransactionHistory): Promise<TransactionHistoryResponse> {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return Promise.reject(new Error('not implemented'));\n }\n}\n","{\n \"name\": \"HyperVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/hvm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [],\n \"namespaces\": [\"hvm\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"hvm_signTransaction\"],\n \"nonRestrictedMethods\": []\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","import { HyperSDKClient } from 'hypersdk-client';\n\ntype ProviderParams = {\n rpcUrl: string;\n chainName: string;\n vmRpcPrefix?: string;\n};\n\nexport const getProvider = ({ rpcUrl, chainName, vmRpcPrefix }: ProviderParams): HyperSDKClient => {\n if (!vmRpcPrefix) {\n throw new Error('There is no vm rpc prefix');\n }\n return new HyperSDKClient(rpcUrl, chainName, vmRpcPrefix);\n};\n","import {\n type GetBalancesParams,\n type GetBalancesResponse,\n type NetworkTokenWithBalance,\n TokenType,\n} from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { getProvider } from '../utils/get-provider';\n\nexport const hvmGetBalances = async (params: GetBalancesParams): Promise<GetBalancesResponse> => {\n const { addresses, network } = params;\n\n const provider = getProvider(network);\n\n const requests = addresses.map(async (address) => {\n try {\n const balanceResult = await provider.getBalance(address);\n const networkToken = network.networkToken;\n const totalBalance = new TokenUnit(balanceResult, networkToken.decimals, networkToken.symbol);\n\n const returnBalance: NetworkTokenWithBalance = {\n ...networkToken,\n coingeckoId: '',\n type: TokenType.NATIVE,\n balance: balanceResult,\n balanceDisplayValue: totalBalance.toDisplay(),\n };\n\n return { [address]: { [networkToken.symbol]: returnBalance } };\n } catch (err) {\n return { [address]: { error: (err as Error).toString() } };\n }\n });\n\n return (await Promise.allSettled(requests)).reduce((acc, curr) => {\n return {\n ...acc,\n ...(curr.status === 'fulfilled' ? curr.value : curr.reason),\n };\n }, {} as GetBalancesResponse);\n};\n","import {\n DetailItemType,\n RpcMethod,\n type ApprovalController,\n type DetailItem,\n type DetailSection,\n type DisplayData,\n type Network,\n type RpcRequest,\n type SigningData,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { rpcErrorOpts } from '@internal/utils';\nimport { parseRequestParams } from './schema';\nimport type { ActionData } from 'hypersdk-client';\n\nconst parseDetails = (txPayloadActions: ActionData[]): DetailSection[] => {\n if (!txPayloadActions.length) {\n return [];\n }\n\n return txPayloadActions.map((action) => {\n return {\n title: action.actionName,\n items: [\n ...Object.entries(action.data).map(([key, value]): DetailItem => {\n const addressRegex = /^0x[0-9a-f]{74}$/i;\n\n if (typeof value === 'string' && addressRegex.test(value)) {\n return {\n label: key,\n type: DetailItemType.ADDRESS,\n value: value,\n };\n }\n\n return {\n label: key,\n type: DetailItemType.TEXT,\n value: typeof value === 'string' ? value : JSON.stringify(value),\n alignment: 'vertical',\n };\n }),\n ],\n };\n });\n};\n\nexport const hvmSign = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const { params } = request;\n\n // validate params\n const result = parseRequestParams(params);\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', result.error)),\n };\n }\n\n const transaction = result.data[0];\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', new Error('No transaction found'))),\n };\n }\n\n const details = parseDetails(transaction.tx.actions);\n const displayData: DisplayData = {\n title: 'Do you approve this transaction?',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n };\n const signingData: SigningData = {\n type: RpcMethod.HVM_SIGN_TRANSACTION,\n data: { abi: transaction.abi, txPayload: transaction.tx },\n };\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.internal('No signed data returned'),\n };\n }\n\n return { result: response.signedData };\n};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(\n private proxyApiUrl: string,\n private fetchFn?: typeof fetch,\n ) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\nimport z from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n fetchFn: typeof fetch = fetch,\n): Promise<z.infer<T>> {\n const response = await fetchFn(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\n );\n }\n}\n","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import {\n ApiError,\n type ApiRequestOptions,\n CancelablePromise,\n FetchHttpRequest,\n type OpenAPIConfig,\n} from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\nimport { RetryBackoffPolicy } from './retry';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n #failedRequests = 3;\n #getDelay = RetryBackoffPolicy.exponential();\n\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n const getRequest = () => super.request<T>(modifiedOptions);\n return this.#failedRequests > 0 ? this.#postponeRequest<T>(getRequest) : this.#request<T>(getRequest);\n }\n\n #request<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const inner = getRequest();\n return new CancelablePromise((resolve, reject, onCancel) => {\n onCancel(() => inner.cancel());\n inner\n .then((response) => {\n this.#failedRequests = 0;\n resolve(response);\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n const isHttpTooManyRequests = err.status === 429;\n const isHttpInternalServerError = err.status >= 500 && err.status < 600;\n this.#failedRequests += Number(isHttpTooManyRequests || isHttpInternalServerError);\n }\n reject(err);\n });\n });\n }\n\n #postponeRequest<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const delay = this.#getDelay(this.#failedRequests);\n return new CancelablePromise<T>((resolve, reject, onCancel) => {\n const timeout = setTimeout(() => {\n const inner = getRequest();\n onCancel(() => {\n inner.cancel();\n clearTimeout(timeout);\n });\n inner.then(resolve).catch(reject);\n }, delay);\n });\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","import { z } from 'zod';\n\nconst transactionSchema = z.object({\n abi: z.object({\n actions: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n outputs: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n types: z.array(\n z.object({\n name: z.string(),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n }),\n ),\n }),\n ),\n }),\n tx: z\n .object({\n base: z.object({\n timestamp: z.string(),\n chainId: z.string(),\n maxFee: z.string(),\n }),\n actions: z.array(\n z.object({\n actionName: z.string(),\n data: z.record(z.string(), z.unknown()),\n }),\n ),\n })\n .required(),\n});\n\nconst paramsSchema = z.array(transactionSchema).length(1);\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import type { ApprovalController, DeriveAddressParams, DeriveAddressResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { hex } from '@scure/base';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nconst ED25519_AUTH_ID = 0x00;\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { approvalController, secretId } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const derivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).HVM : undefined;\n\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'ed25519',\n secretId,\n derivationPath,\n });\n const publicKeyBytes = hex.decode(publicKeyHex);\n const addressBytes = new Uint8Array([ED25519_AUTH_ID, ...sha256(publicKeyBytes)]);\n const hash = sha256(addressBytes);\n const checksum = hash.slice(-4);\n\n return {\n [NetworkVMType.HVM]: `0x${hex.encode(addressBytes)}${hex.encode(checksum)}`,\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\n\n/**\n * HyperVM shares the same derivation path as AVM and PVM,\n * with the exception that the path levels are hardened (required for Ed25519).\n *\n * We reuse \"9000\" coin index so we don't need to request more privileges\n * from hardware wallets users (like Ledger).\n */\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.HVM> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/0'/0'/${accountIndex}'`,\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/${accountIndex}'/0'/0'`,\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { parseManifest, RpcMethod, TokenType, NetworkVMType, DetailItemType } from '@avalabs/vm-module-types';
|
|
2
2
|
import { HyperSDKClient } from 'hypersdk-client';
|
|
3
|
-
import { TokenUnit
|
|
3
|
+
import { TokenUnit } from '@avalabs/core-utils-sdk';
|
|
4
4
|
import { rpcErrors } from '@metamask/rpc-errors';
|
|
5
|
-
import { z, object, string, record, number } from 'zod';
|
|
5
|
+
import { z as z$1, object, string, record, number } from 'zod';
|
|
6
6
|
import { sha256 } from '@noble/hashes/sha256';
|
|
7
7
|
import { hex } from '@scure/base';
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _=(t,e,n)=>{if(!e.has(t))throw TypeError("Cannot "+n)};var d=(t,e,n)=>(_(t,e,"read from private field"),n?n.call(t):e.get(t)),y=(t,e,n)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,n);},f=(t,e,n,s)=>(_(t,e,"write to private field"),s?s.call(t,n):e.set(t,n),n);var T={name:"HyperVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/index.js",packageName:"@avalabs/hvm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:[],namespaces:["hvm"]},cointype:"9000",permissions:{rpc:{dapps:!0,methods:["hvm_signTransaction"],nonRestrictedMethods:[]}},manifestVersion:"0.1"};var h=({rpcUrl:t,chainName:e,vmRpcPrefix:n})=>{if(!n)throw new Error("There is no vm rpc prefix");return new HyperSDKClient(t,e,n)};var A=async t=>{let{addresses:e,network:n}=t,s=h(n),c=e.map(async i=>{try{let a=await s.getBalance(i),p=n.networkToken,u=new TokenUnit(a,p.decimals,p.symbol),m={...p,coingeckoId:"",type:TokenType.NATIVE,balance:a,balanceDisplayValue:u.toDisplay()};return {[i]:{[p.symbol]:m}}}catch(a){return {[i]:{error:a.toString()}}}});return (await Promise.allSettled(c)).reduce((i,a)=>({...i,...a.status==="fulfilled"?a.value:a.reason}),{})};z$1.array(z$1.object({internalId:z$1.string(),id:z$1.string(),symbol:z$1.string(),name:z$1.string(),image:z$1.string().optional().nullable(),current_price:z$1.number().optional().nullable(),price_change_percentage_24h:z$1.number().optional().nullable(),market_cap:z$1.number().optional().nullable(),total_volume:z$1.number().optional().nullable(),platforms:z$1.record(z$1.string(),z$1.string())}));object({date:string(),usd:record(number())});process.env.GLACIER_API_KEY;var g=(t,e)=>({message:`${t}${e instanceof Error?`: ${e.message}`:""}`,data:{cause:e}});var K=z$1.object({abi:z$1.object({actions:z$1.array(z$1.object({id:z$1.number(),name:z$1.string()})),outputs:z$1.array(z$1.object({id:z$1.number(),name:z$1.string()})),types:z$1.array(z$1.object({name:z$1.string(),fields:z$1.array(z$1.object({name:z$1.string(),type:z$1.string()}))}))}),tx:z$1.object({base:z$1.object({timestamp:z$1.string(),chainId:z$1.string(),maxFee:z$1.string()}),actions:z$1.array(z$1.object({actionName:z$1.string(),data:z$1.record(z$1.string(),z$1.unknown())}))}).required()}),z=z$1.array(K).length(1),w=t=>z.safeParse(t);var W=t=>t.length?t.map(e=>({title:e.actionName,items:[...Object.entries(e.data).map(([n,s])=>typeof s=="string"&&/^0x[0-9a-f]{74}$/i.test(s)?{label:n,type:DetailItemType.ADDRESS,value:s}:{label:n,type:DetailItemType.TEXT,value:typeof s=="string"?s:JSON.stringify(s),alignment:"vertical"})]})):[],S=async({request:t,network:e,approvalController:n})=>{let{params:s}=t,c=w(s);if(!c.success)return {error:rpcErrors.invalidParams(g("Transaction params are invalid",c.error))};let i=c.data[0];if(!i)return {error:rpcErrors.invalidParams(g("Transaction params are invalid",new Error("No transaction found")))};let a=W(i.tx.actions),p={title:"Do you approve this transaction?",dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} is requesting to sign the following message`,logoUri:t.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:a},u={type:RpcMethod.HVM_SIGN_TRANSACTION,data:{abi:i.abi,txPayload:i.tx}},m=await n.requestApproval({request:t,displayData:p,signingData:u});return "error"in m?{error:m.error}:"signedData"in m?{result:m.signedData}:{error:rpcErrors.internal("No signed data returned")}};var E=t=>"derivationPathType"in t&&"accountIndex"in t&&typeof t.accountIndex=="number"&&typeof t.derivationPathType=="string";var P=({accountIndex:t,derivationPathType:e})=>{if(t<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");switch(e){case"bip44":return {[NetworkVMType.HVM]:`m/44'/9000'/0'/0'/${t}'`};case"ledger_live":return {[NetworkVMType.HVM]:`m/44'/9000'/${t}'/0'/0'`};default:throw rpcErrors.invalidParams(`Unsupported derivation path type: ${e}`)}};var J=0,M=async t=>{let{approvalController:e,secretId:n}=t,s=E(t)?P(t).HVM:void 0,c=await e.requestPublicKey({curve:"ed25519",secretId:n,derivationPath:s}),i=hex.decode(c),a=new Uint8Array([J,...sha256(i)]),u=sha256(a).slice(-4);return {[NetworkVMType.HVM]:`0x${hex.encode(a)}${hex.encode(u)}`}};var l,U=class{constructor({approvalController:e}){y(this,l,void 0);f(this,l,e);}getProvider(e){try{return Promise.resolve(h(e))}catch(n){return Promise.reject(n)}}getManifest(){let e=parseManifest(T);return e.success?e.data:void 0}buildDerivationPath(e){return P(e)}deriveAddress(e){return M({...e,approvalController:d(this,l)})}getAddress(e){throw new Error("not implemented")}async getBalances(e){return A(e)}async onRpcRequest(e,n){switch(e.method){case RpcMethod.HVM_SIGN_TRANSACTION:return S({request:e,network:n,approvalController:d(this,l)});default:return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}getTransactionHistory(e){return Promise.resolve({transactions:[]})}getTokens(e){return Promise.resolve([])}getNetworkFee(e){return Promise.reject(new Error("not implemented"))}};l=new WeakMap;
|
|
10
10
|
|
|
11
|
-
export {
|
|
11
|
+
export { U as HvmModule };
|
|
12
12
|
//# sourceMappingURL=out.js.map
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-balances.ts","../src/handlers/sign-transaction/sign-transaction.ts","../../../node_modules/.pnpm/@avalabs+core-coingecko-sdk@3.1.0-alpha.79_big.js@6.2.1_bn.js@5.2.2_ethers@6.13.5_buffe_fc9ca45ae3e25869f6d1dced1a11e262/node_modules/@avalabs/core-coingecko-sdk/esm/constants.js","../../../node_modules/.pnpm/@avalabs+core-coingecko-sdk@3.1.0-alpha.79_big.js@6.2.1_bn.js@5.2.2_ethers@6.13.5_buffe_fc9ca45ae3e25869f6d1dced1a11e262/node_modules/@avalabs/core-coingecko-sdk/esm/http.js","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/token-service/token-service.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../src/handlers/sign-transaction/schema.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/build-derivation-path/build-derivation-path.ts"],"names":["parseManifest","RpcMethod","manifest_default","HyperSDKClient","getProvider","rpcUrl","chainName","vmRpcPrefix","TokenType","TokenUnit","hvmGetBalances","params","addresses","network","provider","requests","address","balanceResult","networkToken","totalBalance","returnBalance","err","acc","curr","rpcErrors","DetailItemType","o","t","c","a","i","n","e","f","RawSimplePriceResponseSchema","z","WatchlistTokenResponseSchema","coingeckoBasicClient","number","object","record","string","ExchangeRateSchema","AppName","GLACIER_API_KEY","getGlacierApiKey","GLOBAL_QUERY_PARAMS","rpcErrorOpts","message","cause","transactionSchema","paramsSchema","parseRequestParams","parseDetails","txPayloadActions","action","key","value","hvmSign","request","approvalController","result","transaction","details","displayData","signingData","response","NetworkVMType","sha256","hex","hasDerivationDetails","buildDerivationPath","accountIndex","derivationPathType","ED25519_AUTH_ID","deriveAddress","secretId","derivationPath","publicKeyHex","publicKeyBytes","addressBytes","checksum","_approvalController","HvmModule","__privateAdd","__privateSet","__privateGet","_params","_"],"mappings":"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","sourcesContent":["import {\n type Module,\n type Manifest,\n parseManifest,\n type ConstructorParams,\n type ApprovalController,\n type RpcRequest,\n type TransactionHistoryResponse,\n type GetTransactionHistory,\n type Network,\n type NetworkFees,\n type GetBalancesParams,\n type GetBalancesResponse,\n type GetAddressResponse,\n type RpcResponse,\n RpcMethod,\n type GetAddressParams,\n type DeriveAddressParams,\n type BuildDerivationPathParams,\n} from '@avalabs/vm-module-types';\n\nimport ManifestJson from '../manifest.json';\nimport { getProvider } from './utils/get-provider';\nimport { hvmGetBalances } from './handlers/get-balances';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { hvmSign } from './handlers/sign-transaction/sign-transaction';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\n\nexport class HvmModule implements Module {\n #approvalController: ApprovalController;\n\n constructor({ approvalController }: ConstructorParams) {\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network) {\n try {\n return Promise.resolve(getProvider(network));\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n deriveAddress(params: DeriveAddressParams) {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n getAddress(_params: GetAddressParams): Promise<GetAddressResponse> {\n // The current parameter set does not support ed25519 public keys and this method is not used yet in the clients\n throw new Error('not implemented');\n }\n\n async getBalances(params: GetBalancesParams): Promise<GetBalancesResponse> {\n return hvmGetBalances(params);\n }\n\n async onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse> {\n switch (request.method) {\n case RpcMethod.HVM_SIGN_TRANSACTION:\n return hvmSign({ request, network, approvalController: this.#approvalController });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n getTransactionHistory(_: GetTransactionHistory): Promise<TransactionHistoryResponse> {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return Promise.reject(new Error('not implemented'));\n }\n}\n","{\n \"name\": \"HyperVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/hvm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [],\n \"namespaces\": [\"hvm\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"hvm_signTransaction\"],\n \"nonRestrictedMethods\": []\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","import { HyperSDKClient } from 'hypersdk-client';\n\ntype ProviderParams = {\n rpcUrl: string;\n chainName: string;\n vmRpcPrefix?: string;\n};\n\nexport const getProvider = ({ rpcUrl, chainName, vmRpcPrefix }: ProviderParams): HyperSDKClient => {\n if (!vmRpcPrefix) {\n throw new Error('There is no vm rpc prefix');\n }\n return new HyperSDKClient(rpcUrl, chainName, vmRpcPrefix);\n};\n","import {\n type GetBalancesParams,\n type GetBalancesResponse,\n type NetworkTokenWithBalance,\n TokenType,\n} from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { getProvider } from '../utils/get-provider';\n\nexport const hvmGetBalances = async (params: GetBalancesParams): Promise<GetBalancesResponse> => {\n const { addresses, network } = params;\n\n const provider = getProvider(network);\n\n const requests = addresses.map(async (address) => {\n try {\n const balanceResult = await provider.getBalance(address);\n const networkToken = network.networkToken;\n const totalBalance = new TokenUnit(balanceResult, networkToken.decimals, networkToken.symbol);\n\n const returnBalance: NetworkTokenWithBalance = {\n ...networkToken,\n coingeckoId: '',\n type: TokenType.NATIVE,\n balance: balanceResult,\n balanceDisplayValue: totalBalance.toDisplay(),\n };\n\n return { [address]: { [networkToken.symbol]: returnBalance } };\n } catch (err) {\n return { [address]: { error: (err as Error).toString() } };\n }\n });\n\n return (await Promise.allSettled(requests)).reduce((acc, curr) => {\n return {\n ...acc,\n ...(curr.status === 'fulfilled' ? curr.value : curr.reason),\n };\n }, {} as GetBalancesResponse);\n};\n","import {\n DetailItemType,\n RpcMethod,\n type ApprovalController,\n type DetailItem,\n type DetailSection,\n type DisplayData,\n type Network,\n type RpcRequest,\n type SigningData,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { rpcErrorOpts } from '@internal/utils';\nimport { parseRequestParams } from './schema';\nimport type { ActionData } from 'hypersdk-client';\n\nconst parseDetails = (txPayloadActions: ActionData[]): DetailSection[] => {\n if (!txPayloadActions.length) {\n return [];\n }\n\n return txPayloadActions.map((action) => {\n return {\n title: action.actionName,\n items: [\n ...Object.entries(action.data).map(([key, value]): DetailItem => {\n const addressRegex = /^0x[0-9a-f]{74}$/i;\n\n if (typeof value === 'string' && addressRegex.test(value)) {\n return {\n label: key,\n type: DetailItemType.ADDRESS,\n value: value,\n };\n }\n\n return {\n label: key,\n type: DetailItemType.TEXT,\n value: typeof value === 'string' ? value : JSON.stringify(value),\n alignment: 'vertical',\n };\n }),\n ],\n };\n });\n};\n\nexport const hvmSign = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const { params } = request;\n\n // validate params\n const result = parseRequestParams(params);\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', result.error)),\n };\n }\n\n const transaction = result.data[0];\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', new Error('No transaction found'))),\n };\n }\n\n const details = parseDetails(transaction.tx.actions);\n const displayData: DisplayData = {\n title: 'Do you approve this transaction?',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n };\n const signingData: SigningData = {\n type: RpcMethod.HVM_SIGN_TRANSACTION,\n data: { abi: transaction.abi, txPayload: transaction.tx },\n };\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.internal('No signed data returned'),\n };\n }\n\n return { result: response.signedData };\n};\n","const o=\"https://api.coingecko.com/api/v3\",p=\"https://pro-api.coingecko.com/api/v3\",t=\"https://proxy-api-dev.avax.network\",c=\"https://proxy-api.avax.network\",a=`${c}/proxy/coingecko`,i=`${t}/proxy/coingecko`;export{a as COINGECKO_PROXY_URL,p as COINGECKO_PRO_URL,o as COINGECKO_URL,i as DEV_COINGECKO_PROXY_URL,t as DEV_PROXY_API_WORKER_URL,c as PROXY_API_WORKER_URL};\n","import{HttpClient as n}from\"@avalabs/core-utils-sdk\";import{COINGECKO_URL as t,DEV_COINGECKO_PROXY_URL as r,COINGECKO_PRO_URL as o,COINGECKO_PROXY_URL as u}from\"./constants.js\";function e(r=t,o={}){return new n(r,o)}function i(n={}){return e(u,{...n,method:\"POST\"})}function c(n={}){return e(r,{...n,method:\"POST\"})}function f(n={}){return e(t,n)}function m(n={}){return e(o,n)}export{f as getBasicCoingeckoHttp,e as getCoinGeckoHttp,c as getDevProxiedCoingeckoHttp,m as getProCoingeckoHttp,i as getProxiedCoingeckoHttp};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n );\n }\n}\n","import z from 'zod';\nimport type { ZodSchema } from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n): Promise<z.infer<T>> {\n const response = await fetch(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\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';\nimport { WatchlistProxyClient } from './watchlist-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 async getWatchlistDataForToken({\n tokenDetails,\n currency = VsCurrencyType.USD,\n }: {\n tokenDetails: {\n symbol: string;\n isNative: boolean;\n caip2Id: string;\n address?: string;\n };\n currency: VsCurrencyType;\n }): Promise<{\n priceInCurrency: number;\n change24: number;\n marketCap: number;\n vol24: number;\n }> {\n const data = (\n await new WatchlistProxyClient(this.#proxyApiUrl).watchlistToken({\n tokens: tokenDetails.symbol,\n currency: currency,\n })\n ).filter((token) => {\n return tokenDetails.isNative\n ? token.internalId === `NATIVE-${tokenDetails.symbol.toLowerCase()}`\n : token.platforms[tokenDetails.caip2Id] === tokenDetails.address;\n });\n\n const tokenInfo = data[0];\n\n if (!tokenInfo) {\n return {\n priceInCurrency: 0,\n change24: 0,\n marketCap: 0,\n vol24: 0,\n };\n }\n\n return {\n priceInCurrency: tokenInfo.current_price ?? 0,\n change24: tokenInfo.price_change_percentage_24h ?? 0,\n marketCap: tokenInfo.market_cap ?? 0,\n vol24: tokenInfo.total_volume ?? 0,\n };\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 (err) {\n console.error(err);\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 const rawData = await new CoingeckoProxyClient(this.#proxyApiUrl).simplePriceByContractAddresses({\n id: assetPlatformId,\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 return this.transformSimplePriceResponse(rawData, [currency]);\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 new CoingeckoProxyClient(this.#proxyApiUrl).simplePrice({\n ids: coinIds,\n vs_currencies: currencies,\n include_market_cap: marketCap,\n include_24hr_vol: vol24,\n include_24hr_change: change24,\n include_last_updated_at: lastUpdated,\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","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import { FetchHttpRequest, type OpenAPIConfig, type ApiRequestOptions, CancelablePromise } from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n // Call the base class's request method\n return super.request<T>(modifiedOptions);\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","import { z } from 'zod';\n\nconst transactionSchema = z.object({\n abi: z.object({\n actions: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n outputs: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n types: z.array(\n z.object({\n name: z.string(),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n }),\n ),\n }),\n ),\n }),\n tx: z\n .object({\n base: z.object({\n timestamp: z.string(),\n chainId: z.string(),\n maxFee: z.string(),\n }),\n actions: z.array(\n z.object({\n actionName: z.string(),\n data: z.record(z.string(), z.unknown()),\n }),\n ),\n })\n .required(),\n});\n\nconst paramsSchema = z.array(transactionSchema).length(1);\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import type { ApprovalController, DeriveAddressParams, DeriveAddressResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { hex } from '@scure/base';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nconst ED25519_AUTH_ID = 0x00;\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { approvalController, secretId } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const derivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).HVM : undefined;\n\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'ed25519',\n secretId,\n derivationPath,\n });\n const publicKeyBytes = hex.decode(publicKeyHex);\n const addressBytes = new Uint8Array([ED25519_AUTH_ID, ...sha256(publicKeyBytes)]);\n const hash = sha256(addressBytes);\n const checksum = hash.slice(-4);\n\n return {\n [NetworkVMType.HVM]: `0x${hex.encode(addressBytes)}${hex.encode(checksum)}`,\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\n\n/**\n * HyperVM shares the same derivation path as AVM and PVM,\n * with the exception that the path levels are hardened (required for Ed25519).\n *\n * We reuse \"9000\" coin index so we don't need to request more privileges\n * from hardware wallets users (like Ledger).\n */\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.HVM> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/0'/0'/${accountIndex}'`,\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/${accountIndex}'/0'/0'`,\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/module.ts","../manifest.json","../src/utils/get-provider.ts","../src/handlers/get-balances.ts","../src/handlers/sign-transaction/sign-transaction.ts","../../../packages-internal/utils/src/services/token-service/coingecko-proxy-client.ts","../../../packages-internal/utils/src/utils/fetch-and-verify.ts","../../../packages-internal/utils/src/services/token-service/watchlist-proxy-client.ts","../../../packages-internal/utils/src/services/pricing-service/exchange-rates.ts","../../../packages-internal/utils/src/utils/detail-item.ts","../../../packages-internal/utils/src/utils/get-core-headers.ts","../../../packages-internal/utils/src/consts.ts","../../../packages-internal/utils/src/utils/get-glacier-api-key.ts","../../../packages-internal/utils/src/utils/glacier-fetch-http-request.ts","../../../packages-internal/utils/src/utils/rpc-error-opts.ts","../src/handlers/sign-transaction/schema.ts","../src/handlers/derive-address/derive-address.ts","../../../packages-internal/utils/src/utils/address-derivation.ts","../src/handlers/build-derivation-path/build-derivation-path.ts"],"names":["parseManifest","RpcMethod","manifest_default","HyperSDKClient","getProvider","rpcUrl","chainName","vmRpcPrefix","TokenType","TokenUnit","hvmGetBalances","params","addresses","network","provider","requests","address","balanceResult","networkToken","totalBalance","returnBalance","err","acc","curr","rpcErrors","DetailItemType","RawSimplePriceResponseSchema","z","WatchlistTokenResponseSchema","number","object","record","string","ExchangeRateSchema","AppName","GLACIER_API_KEY","getGlacierApiKey","GLOBAL_QUERY_PARAMS","rpcErrorOpts","message","cause","transactionSchema","paramsSchema","parseRequestParams","parseDetails","txPayloadActions","action","key","value","hvmSign","request","approvalController","result","transaction","details","displayData","signingData","response","NetworkVMType","sha256","hex","hasDerivationDetails","buildDerivationPath","accountIndex","derivationPathType","ED25519_AUTH_ID","deriveAddress","secretId","derivationPath","publicKeyHex","publicKeyBytes","addressBytes","checksum","_approvalController","HvmModule","__privateAdd","__privateSet","e","__privateGet","_params","_"],"mappings":"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","sourcesContent":["import {\n type Module,\n type Manifest,\n parseManifest,\n type ConstructorParams,\n type ApprovalController,\n type RpcRequest,\n type TransactionHistoryResponse,\n type GetTransactionHistory,\n type Network,\n type NetworkFees,\n type GetBalancesParams,\n type GetBalancesResponse,\n type GetAddressResponse,\n type RpcResponse,\n RpcMethod,\n type GetAddressParams,\n type DeriveAddressParams,\n type BuildDerivationPathParams,\n} from '@avalabs/vm-module-types';\n\nimport ManifestJson from '../manifest.json';\nimport { getProvider } from './utils/get-provider';\nimport { hvmGetBalances } from './handlers/get-balances';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { hvmSign } from './handlers/sign-transaction/sign-transaction';\nimport { deriveAddress } from './handlers/derive-address/derive-address';\nimport { buildDerivationPath } from './handlers/build-derivation-path/build-derivation-path';\n\nexport class HvmModule implements Module {\n #approvalController: ApprovalController;\n\n constructor({ approvalController }: ConstructorParams) {\n this.#approvalController = approvalController;\n }\n\n getProvider(network: Network) {\n try {\n return Promise.resolve(getProvider(network));\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n buildDerivationPath(params: BuildDerivationPathParams) {\n return buildDerivationPath(params);\n }\n\n deriveAddress(params: DeriveAddressParams) {\n return deriveAddress({\n ...params,\n approvalController: this.#approvalController,\n });\n }\n\n getAddress(_params: GetAddressParams): Promise<GetAddressResponse> {\n // The current parameter set does not support ed25519 public keys and this method is not used yet in the clients\n throw new Error('not implemented');\n }\n\n async getBalances(params: GetBalancesParams): Promise<GetBalancesResponse> {\n return hvmGetBalances(params);\n }\n\n async onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse> {\n switch (request.method) {\n case RpcMethod.HVM_SIGN_TRANSACTION:\n return hvmSign({ request, network, approvalController: this.#approvalController });\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n\n getTransactionHistory(_: GetTransactionHistory): Promise<TransactionHistoryResponse> {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return Promise.reject(new Error('not implemented'));\n }\n}\n","{\n \"name\": \"HyperVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/index.js\",\n \"packageName\": \"@avalabs/hvm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [],\n \"namespaces\": [\"hvm\"]\n },\n \"cointype\": \"9000\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"hvm_signTransaction\"],\n \"nonRestrictedMethods\": []\n }\n },\n \"manifestVersion\": \"0.1\"\n}\n","import { HyperSDKClient } from 'hypersdk-client';\n\ntype ProviderParams = {\n rpcUrl: string;\n chainName: string;\n vmRpcPrefix?: string;\n};\n\nexport const getProvider = ({ rpcUrl, chainName, vmRpcPrefix }: ProviderParams): HyperSDKClient => {\n if (!vmRpcPrefix) {\n throw new Error('There is no vm rpc prefix');\n }\n return new HyperSDKClient(rpcUrl, chainName, vmRpcPrefix);\n};\n","import {\n type GetBalancesParams,\n type GetBalancesResponse,\n type NetworkTokenWithBalance,\n TokenType,\n} from '@avalabs/vm-module-types';\nimport { TokenUnit } from '@avalabs/core-utils-sdk';\nimport { getProvider } from '../utils/get-provider';\n\nexport const hvmGetBalances = async (params: GetBalancesParams): Promise<GetBalancesResponse> => {\n const { addresses, network } = params;\n\n const provider = getProvider(network);\n\n const requests = addresses.map(async (address) => {\n try {\n const balanceResult = await provider.getBalance(address);\n const networkToken = network.networkToken;\n const totalBalance = new TokenUnit(balanceResult, networkToken.decimals, networkToken.symbol);\n\n const returnBalance: NetworkTokenWithBalance = {\n ...networkToken,\n coingeckoId: '',\n type: TokenType.NATIVE,\n balance: balanceResult,\n balanceDisplayValue: totalBalance.toDisplay(),\n };\n\n return { [address]: { [networkToken.symbol]: returnBalance } };\n } catch (err) {\n return { [address]: { error: (err as Error).toString() } };\n }\n });\n\n return (await Promise.allSettled(requests)).reduce((acc, curr) => {\n return {\n ...acc,\n ...(curr.status === 'fulfilled' ? curr.value : curr.reason),\n };\n }, {} as GetBalancesResponse);\n};\n","import {\n DetailItemType,\n RpcMethod,\n type ApprovalController,\n type DetailItem,\n type DetailSection,\n type DisplayData,\n type Network,\n type RpcRequest,\n type SigningData,\n} from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { rpcErrorOpts } from '@internal/utils';\nimport { parseRequestParams } from './schema';\nimport type { ActionData } from 'hypersdk-client';\n\nconst parseDetails = (txPayloadActions: ActionData[]): DetailSection[] => {\n if (!txPayloadActions.length) {\n return [];\n }\n\n return txPayloadActions.map((action) => {\n return {\n title: action.actionName,\n items: [\n ...Object.entries(action.data).map(([key, value]): DetailItem => {\n const addressRegex = /^0x[0-9a-f]{74}$/i;\n\n if (typeof value === 'string' && addressRegex.test(value)) {\n return {\n label: key,\n type: DetailItemType.ADDRESS,\n value: value,\n };\n }\n\n return {\n label: key,\n type: DetailItemType.TEXT,\n value: typeof value === 'string' ? value : JSON.stringify(value),\n alignment: 'vertical',\n };\n }),\n ],\n };\n });\n};\n\nexport const hvmSign = async ({\n request,\n network,\n approvalController,\n}: {\n request: RpcRequest;\n network: Network;\n approvalController: ApprovalController;\n}) => {\n const { params } = request;\n\n // validate params\n const result = parseRequestParams(params);\n if (!result.success) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', result.error)),\n };\n }\n\n const transaction = result.data[0];\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams(rpcErrorOpts('Transaction params are invalid', new Error('No transaction found'))),\n };\n }\n\n const details = parseDetails(transaction.tx.actions);\n const displayData: DisplayData = {\n title: 'Do you approve this transaction?',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} is requesting to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n details,\n };\n const signingData: SigningData = {\n type: RpcMethod.HVM_SIGN_TRANSACTION,\n data: { abi: transaction.abi, txPayload: transaction.tx },\n };\n const response = await approvalController.requestApproval({ request, displayData, signingData });\n if ('error' in response) {\n return {\n error: response.error,\n };\n }\n\n if (!('signedData' in response)) {\n return {\n error: rpcErrors.internal('No signed data returned'),\n };\n }\n\n return { result: response.signedData };\n};\n","import { RawSimplePriceResponseSchema } from '@avalabs/vm-module-types';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nexport class CoingeckoProxyClient {\n constructor(\n private proxyApiUrl: string,\n private fetchFn?: typeof fetch,\n ) {}\n\n simplePrice(params: {\n ids: string[];\n vs_currencies: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n include_last_updated_at?: boolean;\n }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/price?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n\n simplePriceByContractAddresses(params: {\n id: string;\n contract_addresses: string[];\n vs_currencies?: string[];\n include_market_cap?: boolean;\n include_24hr_vol?: boolean;\n include_24hr_change?: boolean;\n }) {\n const { id, ...rawQueryParams } = params;\n\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(rawQueryParams as any);\n\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/proxy/coingecko/simple/token_price/${id}?${queryParams}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n RawSimplePriceResponseSchema,\n this.fetchFn,\n );\n }\n}\n","import type { ZodSchema } from 'zod';\nimport z from 'zod';\n\nexport async function fetchAndVerify<T extends ZodSchema>(\n fetchOptions: Parameters<typeof fetch>,\n schema: T,\n fetchFn: typeof fetch = fetch,\n): Promise<z.infer<T>> {\n const response = await fetchFn(...fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const responseJson = await response.json();\n return schema.parse(responseJson);\n}\n","import { fetchAndVerify } from '../../utils/fetch-and-verify';\nimport { z } from 'zod';\n\nconst WatchlistTokenResponseSchema = z.array(\n z.object({\n // the object has more properties than the ones listed here, but we only need these at the moment\n internalId: z.string(),\n id: z.string(),\n symbol: z.string(),\n name: z.string(),\n image: z.string().optional().nullable(),\n current_price: z.number().optional().nullable(),\n price_change_percentage_24h: z.number().optional().nullable(),\n market_cap: z.number().optional().nullable(),\n total_volume: z.number().optional().nullable(),\n platforms: z.record(z.string(), z.string()),\n }),\n);\n\nexport class WatchlistProxyClient {\n constructor(private proxyApiUrl: string) {}\n\n watchlistToken(params: { tokens: string; currency: string }) {\n // casting params as any since typing does not allow boolean and other non-string values\n // even though NodeJS does not have this restriction itself: https://nodejs.org/api/url.html#new-urlsearchparamsobj\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const queryParams = new URLSearchParams(params as any);\n return fetchAndVerify(\n [\n `${this.proxyApiUrl}/watchlist/tokens?${queryParams}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ],\n WatchlistTokenResponseSchema,\n );\n }\n}\n","import z, { number, object, record, string } from 'zod';\nimport { fetchAndVerify } from '../../utils/fetch-and-verify';\n\nconst CURRENCY_EXCHANGE_RATES_URL =\n 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.min.json';\n\nconst CURRENCY_EXCHANGE_RATES_FALLBACK_URL = 'https://latest.currency-api.pages.dev/v1/currencies/usd.min.json';\n\nconst ExchangeRateSchema = object({\n date: string(),\n usd: record(number()),\n});\n\ntype ExchangeRate = z.infer<typeof ExchangeRateSchema>;\n\nexport const getExchangeRates = async (): Promise<ExchangeRate> => {\n try {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_URL], ExchangeRateSchema);\n } catch {\n return await fetchAndVerify([CURRENCY_EXCHANGE_RATES_FALLBACK_URL], ExchangeRateSchema);\n }\n};\n","import {\n type AddressItem,\n type CurrencyItem,\n type NodeIDItem,\n type TextItem,\n type DataItem,\n type DateItem,\n type LinkItemValue,\n DetailItemType,\n type LinkItem,\n type FundsRecipientItem,\n type AddressListItem,\n type NetworkItemValue,\n type NetworkItem,\n} from '@avalabs/vm-module-types';\n\nexport const fundsRecipientItem = (\n address: string,\n amount: bigint,\n maxDecimals: number,\n symbol: string,\n): FundsRecipientItem => ({\n type: DetailItemType.FUNDS_RECIPIENT,\n label: address,\n amount,\n maxDecimals,\n symbol,\n});\n\nexport const currencyItem = (label: string, value: bigint, maxDecimals: number, symbol: string): CurrencyItem => ({\n label,\n type: DetailItemType.CURRENCY,\n value,\n maxDecimals,\n symbol,\n});\n\nexport const textItem = (\n label: string,\n value: string,\n alignment: 'horizontal' | 'vertical' = 'horizontal',\n): TextItem => ({\n label,\n alignment,\n type: DetailItemType.TEXT,\n value,\n});\n\nexport const linkItem = (label: string, value: LinkItemValue): LinkItem => ({\n label,\n value,\n type: DetailItemType.LINK,\n});\n\nexport const addressItem = (label: string, value: string): AddressItem => ({\n label,\n type: DetailItemType.ADDRESS,\n value,\n});\n\nexport const addressListItem = (label: string, value: string[]): AddressListItem => ({\n label,\n type: DetailItemType.ADDRESS_LIST,\n value,\n});\n\nexport const nodeIDItem = (label: string, value: string): NodeIDItem => ({\n label,\n type: DetailItemType.NODE_ID,\n value,\n});\n\nexport const dataItem = (label: string, value: string): DataItem => ({\n label,\n type: DetailItemType.DATA,\n value,\n});\n\nexport const dateItem = (label: string, value: string): DateItem => ({\n label,\n type: DetailItemType.DATE,\n value,\n});\n\nexport const networkItem = (label: string, value: NetworkItemValue): NetworkItem => ({\n label,\n type: DetailItemType.NETWORK,\n value,\n});\n","import { AppName, type AppInfo } from '@avalabs/vm-module-types';\n\nexport const getCoreHeaders = ({ name, version }: AppInfo): Record<string, string> | undefined => {\n switch (name) {\n case AppName.CORE_MOBILE_IOS:\n case AppName.CORE_MOBILE_ANDROID:\n case AppName.CORE_WEB:\n case AppName.CORE_EXTENSION:\n case AppName.EXPLORER:\n return {\n 'x-application-name': name,\n 'x-application-version': version,\n };\n case AppName.OTHER:\n return undefined;\n }\n};\n","export const GLACIER_API_KEY = process.env.GLACIER_API_KEY;\n","import { GLACIER_API_KEY } from '../consts';\n\n// this key is only needed in development to bypass rate limit\n// it should never be used in production\nexport const getGlacierApiKey = (): string | undefined => {\n return GLACIER_API_KEY;\n};\n","import {\n ApiError,\n type ApiRequestOptions,\n CancelablePromise,\n FetchHttpRequest,\n type OpenAPIConfig,\n} from '@avalabs/glacier-sdk';\nimport { getGlacierApiKey } from './get-glacier-api-key';\nimport { RetryBackoffPolicy } from './retry';\n\nconst GLOBAL_QUERY_PARAMS: Record<string, string | undefined> = {\n rltoken: getGlacierApiKey(),\n};\n\n/**\n * Custom HTTP request handler that automatically appends the Glacier API key (if present)\n * to bypass rate limits in development environments.\n */\nexport class GlacierFetchHttpRequest extends FetchHttpRequest {\n #failedRequests = 3;\n #getDelay = RetryBackoffPolicy.exponential();\n\n constructor(config: OpenAPIConfig) {\n super(config);\n }\n\n public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {\n // Merge global query parameters with request-specific ones\n const mergedQuery = {\n ...GLOBAL_QUERY_PARAMS,\n ...(options.query || {}), // Request-specific params (override globals if same key)\n };\n\n // Create modified options with merged query\n const modifiedOptions: ApiRequestOptions = {\n ...options,\n query: Object.keys(mergedQuery).length > 0 ? mergedQuery : undefined,\n };\n\n const getRequest = () => super.request<T>(modifiedOptions);\n return this.#failedRequests > 0 ? this.#postponeRequest<T>(getRequest) : this.#request<T>(getRequest);\n }\n\n #request<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const inner = getRequest();\n return new CancelablePromise((resolve, reject, onCancel) => {\n onCancel(() => inner.cancel());\n inner\n .then((response) => {\n this.#failedRequests = 0;\n resolve(response);\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n const isHttpTooManyRequests = err.status === 429;\n const isHttpInternalServerError = err.status >= 500 && err.status < 600;\n this.#failedRequests += Number(isHttpTooManyRequests || isHttpInternalServerError);\n }\n reject(err);\n });\n });\n }\n\n #postponeRequest<T>(getRequest: () => CancelablePromise<T>): CancelablePromise<T> {\n const delay = this.#getDelay(this.#failedRequests);\n return new CancelablePromise<T>((resolve, reject, onCancel) => {\n const timeout = setTimeout(() => {\n const inner = getRequest();\n onCancel(() => {\n inner.cancel();\n clearTimeout(timeout);\n });\n inner.then(resolve).catch(reject);\n }, delay);\n });\n }\n}\n","/**\n * Builds the options object for `rpcErrors.internal()` / `rpcErrors.invalidParams()` etc.\n * Ensures the actual error message appears in the top-level `message` field,\n * which is what viem exposes as `error.details` to dapps.\n */\nexport const rpcErrorOpts = (message: string, cause: unknown) => ({\n message: `${message}${cause instanceof Error ? `: ${cause.message}` : ''}`,\n data: { cause },\n});\n","import { z } from 'zod';\n\nconst transactionSchema = z.object({\n abi: z.object({\n actions: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n outputs: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n types: z.array(\n z.object({\n name: z.string(),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n }),\n ),\n }),\n ),\n }),\n tx: z\n .object({\n base: z.object({\n timestamp: z.string(),\n chainId: z.string(),\n maxFee: z.string(),\n }),\n actions: z.array(\n z.object({\n actionName: z.string(),\n data: z.record(z.string(), z.unknown()),\n }),\n ),\n })\n .required(),\n});\n\nconst paramsSchema = z.array(transactionSchema).length(1);\n\nexport const parseRequestParams = (params: unknown) => {\n return paramsSchema.safeParse(params);\n};\n","import type { ApprovalController, DeriveAddressParams, DeriveAddressResponse } from '@avalabs/vm-module-types';\nimport { NetworkVMType } from '@avalabs/vm-module-types';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { hex } from '@scure/base';\n\nimport { hasDerivationDetails } from '@internal/utils/src/utils/address-derivation';\n\nimport { buildDerivationPath } from '../build-derivation-path/build-derivation-path';\n\nconst ED25519_AUTH_ID = 0x00;\n\nexport const deriveAddress = async (\n params: DeriveAddressParams & { approvalController: ApprovalController },\n): Promise<DeriveAddressResponse> => {\n const { approvalController, secretId } = params;\n\n // When dealing with single-account private keys, we don't need the derivation path any more.\n const derivationPath = hasDerivationDetails(params) ? buildDerivationPath(params).HVM : undefined;\n\n const publicKeyHex = await approvalController.requestPublicKey({\n curve: 'ed25519',\n secretId,\n derivationPath,\n });\n const publicKeyBytes = hex.decode(publicKeyHex);\n const addressBytes = new Uint8Array([ED25519_AUTH_ID, ...sha256(publicKeyBytes)]);\n const hash = sha256(addressBytes);\n const checksum = hash.slice(-4);\n\n return {\n [NetworkVMType.HVM]: `0x${hex.encode(addressBytes)}${hex.encode(checksum)}`,\n };\n};\n","import type { DeriveAddressParams, DetailedDeriveAddressParams } from '@avalabs/vm-module-types';\n\nexport const hasDerivationDetails = (params: DeriveAddressParams): params is DetailedDeriveAddressParams =>\n 'derivationPathType' in params &&\n 'accountIndex' in params &&\n typeof params.accountIndex === 'number' &&\n typeof params.derivationPathType === 'string';\n","import { rpcErrors } from '@metamask/rpc-errors';\nimport {\n NetworkVMType,\n type BuildDerivationPathParams,\n type BuildDerivationPathResponse,\n} from '@avalabs/vm-module-types';\n\n/**\n * HyperVM shares the same derivation path as AVM and PVM,\n * with the exception that the path levels are hardened (required for Ed25519).\n *\n * We reuse \"9000\" coin index so we don't need to request more privileges\n * from hardware wallets users (like Ledger).\n */\nexport const buildDerivationPath = ({\n accountIndex,\n derivationPathType,\n}: BuildDerivationPathParams): Pick<BuildDerivationPathResponse, NetworkVMType.HVM> => {\n if (accountIndex < 0) {\n throw rpcErrors.invalidParams('Account index must be a non-negative integer');\n }\n\n switch (derivationPathType) {\n case 'bip44':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/0'/0'/${accountIndex}'`,\n };\n\n case 'ledger_live':\n return {\n [NetworkVMType.HVM]: `m/44'/9000'/${accountIndex}'/0'/0'`,\n };\n\n default:\n throw rpcErrors.invalidParams(`Unsupported derivation path type: ${derivationPathType}`);\n }\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avalabs/hvm-module",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/ava-labs/core-vm-modules",
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
"hypersdk-client": "0.4.16",
|
|
20
20
|
"@noble/hashes": "1.5.0",
|
|
21
21
|
"@scure/base": "1.2.4",
|
|
22
|
-
"@avalabs/core-utils-sdk": "3.1.0-alpha.
|
|
22
|
+
"@avalabs/core-utils-sdk": "3.1.0-alpha.80",
|
|
23
23
|
"@metamask/rpc-errors": "6.3.0",
|
|
24
24
|
"zod": "3.23.8",
|
|
25
|
-
"@avalabs/vm-module-types": "3.
|
|
25
|
+
"@avalabs/vm-module-types": "3.5.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/big.js": "6.2.2",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"ts-jest": "29.1.1",
|
|
33
33
|
"tsup": "7.2.0",
|
|
34
34
|
"@internal/tsup-config": "0.1.0",
|
|
35
|
-
"@internal/utils": "0.
|
|
35
|
+
"@internal/utils": "0.7.0",
|
|
36
36
|
"eslint-config-custom": "0.1.0"
|
|
37
37
|
},
|
|
38
38
|
"volta": {
|