@avalabs/hvm-module 0.0.0-CP-9420-20250129154656

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ Copyright (C) 2021, Ava Labs, Inc. All rights reserved.
2
+
3
+ Subject to the limited license below (**”License””), you may not, and you may not permit anyone else to, copy, reproduce, aggregate, republish, download, post, distribute, license, sublicense, reverse engineer, modify, or create derivative works based on this software (collectively, **“Software”**).
4
+
5
+ You are hereby granted a limited, non-exclusive, non-sublicensable and non-transferable license to download and use the Software as-is solely (i) for use in connection with the Avalanche Public Blockchain platform, having a NetworkID of 1 (Mainnet) or 5 (Fuji), and associated blockchains, comprised exclusively of the Avalanche X-Chain, C-Chain, P-Chain and any subnets linked to the P-Chain (**“Avalanche Authorized Platform”**) or (ii) for non-production, testing or research purposes without any commercial application within the Avalanche ecosystem (**“Non-Commercial Use”**); provided that, in each case, you may not use or allow use of the Software (a) in connection with any forks of the Avalanche Authorized Platform, (b) in any manner not operationally connected to the Avalanche Authorized Platform other than for Non-Commercial Use, or (c) to the extent the number of monthly active users or the number of total installs of any software that uses the Software across all versions thereof exceeds 10,000 at any time. You may not modify or alter the Software in any way.
6
+
7
+ You hereby acknowledge and agree to the terms set forth at www.avalabs.org/important-notice.
8
+
9
+ **TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED ON AN “AS IS” BASIS, AND AVA LABS EXPRESSLY DISCLAIMS AND EXCLUDES ALL REPRESENTATIONS, WARRANTIES AND OTHER TERMS AND CONDITIONS, WHETHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION BY OPERATION OF LAW OR BY CUSTOM, STATUTE OR OTHERWISE, AND INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTY, TERM, OR CONDITION OF NON-INFRINGEMENT, MERCHANTABILITY, TITLE, OR FITNESS FOR PARTICULAR PURPOSE. YOU USE THE SOFTWARE AT YOUR OWN RISK. AVA LABS EXPRESSLY DISCLAIMS ALL LIABILITY (INCLUDING FOR ALL DIRECT, CONSEQUENTIAL OR OTHER DAMAGES OR LOSSES) RELATED TO ANY USE OF THE SOFTWARE.**
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # HVM Module
2
+
3
+ ## Overview
4
+
5
+ This package implements the core logic for the Hvm (Hyper Virtual Machine) module.
6
+
7
+ ## Installation
8
+
9
+ The module is available on NPM as `@avalabs/hvm-module`
package/dist/index.cjs ADDED
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var vmModuleTypes = require('@avalabs/vm-module-types');
4
+ var hypersdkClient = require('hypersdk-client');
5
+ var coreUtilsSdk = require('@avalabs/core-utils-sdk');
6
+ var rpcErrors = require('@metamask/rpc-errors');
7
+ var zod = require('zod');
8
+
9
+ var u=(t,e,a)=>{if(!e.has(t))throw TypeError("Cannot "+a)};var g=(t,e,a)=>(u(t,e,"read from private field"),a?a.call(t):e.get(t)),f=(t,e,a)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,a);},h=(t,e,a,s)=>(u(t,e,"write to private field"),s?s.call(t,a):e.set(t,a),a);var P={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:"60",permissions:{rpc:{dapps:!0,methods:["hvm_signTransaction"]}},manifestVersion:"0.0"};var l=({rpcUrl:t,chainName:e,vmRpcPrefix:a})=>{if(!a)throw new Error("There is no vm rpc prefix");return new hypersdkClient.HyperSDKClient(t,e,a)};var R=async t=>{let{addresses:e,network:a}=t,s=l(a),i=e.map(async n=>{try{let o=await s.getBalance(n),p=a.networkToken,d=new coreUtilsSdk.TokenUnit(o,p.decimals,p.symbol),c={...p,coingeckoId:"",type:vmModuleTypes.TokenType.NATIVE,balance:o,balanceDisplayValue:d.toDisplay()};return {[n]:{[p.symbol]:c}}}catch(o){return {[n]:{error:o.toString()}}}});return (await Promise.allSettled(i)).reduce((n,o)=>({...n,...o.status==="fulfilled"?o.value:o.reason}),{})};var A=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()}),S=zod.z.array(A).length(1),v=t=>S.safeParse(t);var I=t=>t.length?t.map(e=>({title:e.actionName,items:[...Object.entries(e.data).map(([a,s])=>typeof s=="string"&&/^0x[0-9a-f]{74}$/i.test(s)?{label:a,type:vmModuleTypes.DetailItemType.ADDRESS,value:s}:{label:a,type:vmModuleTypes.DetailItemType.TEXT,value:typeof s=="string"?s:JSON.stringify(s),alignment:"vertical"})]})):[],k=async({request:t,network:e,approvalController:a})=>{let{params:s}=t,i=v(s);if(!i.success)return {error:rpcErrors.rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:i.error.format()}})};let n=i.data[0];if(!n)return {error:rpcErrors.rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:"No transaction found"}})};let o=I(n.tx.actions),p={title:"Sign Transaction",dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} requests you to sign the following message`,logoUri:t.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:o},d={type:vmModuleTypes.RpcMethod.HVM_SIGN_TRANSACTION,data:{abi:n.abi,txPayload:n.tx}},c=await a.requestApproval({request:t,displayData:p,signingData:d});return "error"in c?{error:c.error}:"signedData"in c?{result:c.signedData}:{error:rpcErrors.rpcErrors.internal("No signed data returned")}};var m,N=class{constructor({approvalController:e}){f(this,m,void 0);h(this,m,e);}getProvider(e){try{return Promise.resolve(l(e))}catch(a){return Promise.reject(a)}}getManifest(){let e=vmModuleTypes.parseManifest(P);return e.success?e.data:void 0}getAddress(e){throw new Error("not implemented")}async getBalances(e){return R(e)}async onRpcRequest(e,a){switch(e.method){case vmModuleTypes.RpcMethod.HVM_SIGN_TRANSACTION:return k({request:e,network:a,approvalController:g(this,m)});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"))}getGaslessApi(){}};m=new WeakMap;
10
+
11
+ exports.HvmModule = N;
12
+ //# sourceMappingURL=out.js.map
13
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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","../src/handlers/sign-transaction/schema.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","z","transactionSchema","paramsSchema","parseRequestParams","parseDetails","txPayloadActions","action","key","value","hvmSign","request","approvalController","result","transaction","details","displayData","signingData","response","_approvalController","HvmModule","__privateAdd","__privateSet","e","_params","__privateGet","_"],"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 GaslessApi,\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';\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 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 getGaslessApi(): GaslessApi | undefined {\n return undefined;\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\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"hvm_signTransaction\"]\n }\n },\n \"manifestVersion\": \"0.0\"\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 { 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({\n message: 'Transaction params are invalid',\n data: { cause: result.error.format() },\n }),\n };\n }\n\n const transaction = result.data[0];\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams({\n message: 'Transaction params are invalid',\n data: { cause: 'No transaction found' },\n }),\n };\n }\n\n const details = parseDetails(transaction.tx.actions);\n const displayData: DisplayData = {\n title: 'Sign Transaction',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n 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 { 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"]}
@@ -0,0 +1,18 @@
1
+ import * as hypersdk_client from 'hypersdk-client';
2
+ import { Module, ConstructorParams, Network, Manifest, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, RpcRequest, RpcResponse, GetTransactionHistory, TransactionHistoryResponse, NetworkFees, GaslessApi } from '@avalabs/vm-module-types';
3
+
4
+ declare class HvmModule implements Module {
5
+ #private;
6
+ constructor({ approvalController }: ConstructorParams);
7
+ getProvider(network: Network): Promise<hypersdk_client.HyperSDKClient>;
8
+ getManifest(): Manifest | undefined;
9
+ getAddress(_params: GetAddressParams): Promise<GetAddressResponse>;
10
+ getBalances(params: GetBalancesParams): Promise<GetBalancesResponse>;
11
+ onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse>;
12
+ getTransactionHistory(_: GetTransactionHistory): Promise<TransactionHistoryResponse>;
13
+ getTokens(_: Network): Promise<never[]>;
14
+ getNetworkFee(_: Network): Promise<NetworkFees>;
15
+ getGaslessApi(): GaslessApi | undefined;
16
+ }
17
+
18
+ export { HvmModule };
@@ -0,0 +1,18 @@
1
+ import * as hypersdk_client from 'hypersdk-client';
2
+ import { Module, ConstructorParams, Network, Manifest, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, RpcRequest, RpcResponse, GetTransactionHistory, TransactionHistoryResponse, NetworkFees, GaslessApi } from '@avalabs/vm-module-types';
3
+
4
+ declare class HvmModule implements Module {
5
+ #private;
6
+ constructor({ approvalController }: ConstructorParams);
7
+ getProvider(network: Network): Promise<hypersdk_client.HyperSDKClient>;
8
+ getManifest(): Manifest | undefined;
9
+ getAddress(_params: GetAddressParams): Promise<GetAddressResponse>;
10
+ getBalances(params: GetBalancesParams): Promise<GetBalancesResponse>;
11
+ onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse>;
12
+ getTransactionHistory(_: GetTransactionHistory): Promise<TransactionHistoryResponse>;
13
+ getTokens(_: Network): Promise<never[]>;
14
+ getNetworkFee(_: Network): Promise<NetworkFees>;
15
+ getGaslessApi(): GaslessApi | undefined;
16
+ }
17
+
18
+ export { HvmModule };
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ import { parseManifest, RpcMethod, TokenType, DetailItemType } from '@avalabs/vm-module-types';
2
+ import { HyperSDKClient } from 'hypersdk-client';
3
+ import { TokenUnit } from '@avalabs/core-utils-sdk';
4
+ import { rpcErrors } from '@metamask/rpc-errors';
5
+ import { z } from 'zod';
6
+
7
+ var u=(t,e,a)=>{if(!e.has(t))throw TypeError("Cannot "+a)};var g=(t,e,a)=>(u(t,e,"read from private field"),a?a.call(t):e.get(t)),f=(t,e,a)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,a);},h=(t,e,a,s)=>(u(t,e,"write to private field"),s?s.call(t,a):e.set(t,a),a);var P={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:"60",permissions:{rpc:{dapps:!0,methods:["hvm_signTransaction"]}},manifestVersion:"0.0"};var l=({rpcUrl:t,chainName:e,vmRpcPrefix:a})=>{if(!a)throw new Error("There is no vm rpc prefix");return new HyperSDKClient(t,e,a)};var R=async t=>{let{addresses:e,network:a}=t,s=l(a),i=e.map(async n=>{try{let o=await s.getBalance(n),p=a.networkToken,d=new TokenUnit(o,p.decimals,p.symbol),c={...p,coingeckoId:"",type:TokenType.NATIVE,balance:o,balanceDisplayValue:d.toDisplay()};return {[n]:{[p.symbol]:c}}}catch(o){return {[n]:{error:o.toString()}}}});return (await Promise.allSettled(i)).reduce((n,o)=>({...n,...o.status==="fulfilled"?o.value:o.reason}),{})};var A=z.object({abi:z.object({actions:z.array(z.object({id:z.number(),name:z.string()})),outputs:z.array(z.object({id:z.number(),name:z.string()})),types:z.array(z.object({name:z.string(),fields:z.array(z.object({name:z.string(),type:z.string()}))}))}),tx:z.object({base:z.object({timestamp:z.string(),chainId:z.string(),maxFee:z.string()}),actions:z.array(z.object({actionName:z.string(),data:z.record(z.string(),z.unknown())}))}).required()}),S=z.array(A).length(1),v=t=>S.safeParse(t);var I=t=>t.length?t.map(e=>({title:e.actionName,items:[...Object.entries(e.data).map(([a,s])=>typeof s=="string"&&/^0x[0-9a-f]{74}$/i.test(s)?{label:a,type:DetailItemType.ADDRESS,value:s}:{label:a,type:DetailItemType.TEXT,value:typeof s=="string"?s:JSON.stringify(s),alignment:"vertical"})]})):[],k=async({request:t,network:e,approvalController:a})=>{let{params:s}=t,i=v(s);if(!i.success)return {error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:i.error.format()}})};let n=i.data[0];if(!n)return {error:rpcErrors.invalidParams({message:"Transaction params are invalid",data:{cause:"No transaction found"}})};let o=I(n.tx.actions),p={title:"Sign Transaction",dAppInfo:{name:t.dappInfo.name,action:`${t.dappInfo.name} requests you to sign the following message`,logoUri:t.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:o},d={type:RpcMethod.HVM_SIGN_TRANSACTION,data:{abi:n.abi,txPayload:n.tx}},c=await a.requestApproval({request:t,displayData:p,signingData:d});return "error"in c?{error:c.error}:"signedData"in c?{result:c.signedData}:{error:rpcErrors.internal("No signed data returned")}};var m,N=class{constructor({approvalController:e}){f(this,m,void 0);h(this,m,e);}getProvider(e){try{return Promise.resolve(l(e))}catch(a){return Promise.reject(a)}}getManifest(){let e=parseManifest(P);return e.success?e.data:void 0}getAddress(e){throw new Error("not implemented")}async getBalances(e){return R(e)}async onRpcRequest(e,a){switch(e.method){case RpcMethod.HVM_SIGN_TRANSACTION:return k({request:e,network:a,approvalController:g(this,m)});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"))}getGaslessApi(){}};m=new WeakMap;
8
+
9
+ export { N as HvmModule };
10
+ //# sourceMappingURL=out.js.map
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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","../src/handlers/sign-transaction/schema.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","z","transactionSchema","paramsSchema","parseRequestParams","parseDetails","txPayloadActions","action","key","value","hvmSign","request","approvalController","result","transaction","details","displayData","signingData","response","_approvalController","HvmModule","__privateAdd","__privateSet","e","_params","__privateGet","_"],"mappings":"mVAAA,OAGE,iBAAAA,EAYA,aAAAC,MAGK,2BClBP,IAAAC,EAAA,CACE,KAAQ,UACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,gBACZ,YAAe,sBACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CAAC,EACb,WAAc,CAAC,KAAK,CACtB,EACA,SAAY,KACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,qBAAqB,CACnC,CACF,EACA,gBAAmB,KACrB,EC5BA,OAAS,kBAAAC,MAAsB,kBAQxB,IAAMC,EAAc,CAAC,CAAE,OAAAC,EAAQ,UAAAC,EAAW,YAAAC,CAAY,IAAsC,CACjG,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,2BAA2B,EAE7C,OAAO,IAAIJ,EAAeE,EAAQC,EAAWC,CAAW,CAC1D,ECbA,OAIE,aAAAC,MACK,2BACP,OAAS,aAAAC,MAAiB,0BAGnB,IAAMC,EAAiB,MAAOC,GAA4D,CAC/F,GAAM,CAAE,UAAAC,EAAW,QAAAC,CAAQ,EAAIF,EAEzBG,EAAWV,EAAYS,CAAO,EAE9BE,EAAWH,EAAU,IAAI,MAAOI,GAAY,CAChD,GAAI,CACF,IAAMC,EAAgB,MAAMH,EAAS,WAAWE,CAAO,EACjDE,EAAeL,EAAQ,aACvBM,EAAe,IAAIV,EAAUQ,EAAeC,EAAa,SAAUA,EAAa,MAAM,EAEtFE,EAAyC,CAC7C,GAAGF,EACH,YAAa,GACb,KAAMV,EAAU,OAChB,QAASS,EACT,oBAAqBE,EAAa,UAAU,CAC9C,EAEA,MAAO,CAAE,CAACH,CAAO,EAAG,CAAE,CAACE,EAAa,MAAM,EAAGE,CAAc,CAAE,CAC/D,OAASC,EAAK,CACZ,MAAO,CAAE,CAACL,CAAO,EAAG,CAAE,MAAQK,EAAc,SAAS,CAAE,CAAE,CAC3D,CACF,CAAC,EAED,OAAQ,MAAM,QAAQ,WAAWN,CAAQ,GAAG,OAAO,CAACO,EAAKC,KAChD,CACL,GAAGD,EACH,GAAIC,EAAK,SAAW,YAAcA,EAAK,MAAQA,EAAK,MACtD,GACC,CAAC,CAAwB,CAC9B,EHjBA,OAAS,aAAAC,MAAiB,uBIvB1B,OACE,kBAAAC,EACA,aAAAxB,MAQK,2BACP,OAAS,aAAAuB,MAAiB,uBCX1B,OAAS,KAAAE,MAAS,MAElB,IAAMC,EAAoBD,EAAE,OAAO,CACjC,IAAKA,EAAE,OAAO,CACZ,QAASA,EAAE,MACTA,EAAE,OAAO,CACP,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,OAAO,CACjB,CAAC,CACH,EACA,QAASA,EAAE,MACTA,EAAE,OAAO,CACP,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,OAAO,CACjB,CAAC,CACH,EACA,MAAOA,EAAE,MACPA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EACf,OAAQA,EAAE,MACRA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,CACjB,CAAC,CACH,CACF,CAAC,CACH,CACF,CAAC,EACD,GAAIA,EACD,OAAO,CACN,KAAMA,EAAE,OAAO,CACb,UAAWA,EAAE,OAAO,EACpB,QAASA,EAAE,OAAO,EAClB,OAAQA,EAAE,OAAO,CACnB,CAAC,EACD,QAASA,EAAE,MACTA,EAAE,OAAO,CACP,WAAYA,EAAE,OAAO,EACrB,KAAMA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,QAAQ,CAAC,CACxC,CAAC,CACH,CACF,CAAC,EACA,SAAS,CACd,CAAC,EAEKE,EAAeF,EAAE,MAAMC,CAAiB,EAAE,OAAO,CAAC,EAE3CE,EAAsBlB,GAC1BiB,EAAa,UAAUjB,CAAM,EDjCtC,IAAMmB,EAAgBC,GACfA,EAAiB,OAIfA,EAAiB,IAAKC,IACpB,CACL,MAAOA,EAAO,WACd,MAAO,CACL,GAAG,OAAO,QAAQA,EAAO,IAAI,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAK,IAGzC,OAAOA,GAAU,UAFA,oBAEyB,KAAKA,CAAK,EAC/C,CACL,MAAOD,EACP,KAAMR,EAAe,QACrB,MAAOS,CACT,EAGK,CACL,MAAOD,EACP,KAAMR,EAAe,KACrB,MAAO,OAAOS,GAAU,SAAWA,EAAQ,KAAK,UAAUA,CAAK,EAC/D,UAAW,UACb,CACD,CACH,CACF,EACD,EA3BQ,CAAC,EA8BCC,EAAU,MAAO,CAC5B,QAAAC,EACA,QAAAvB,EACA,mBAAAwB,CACF,IAIM,CACJ,GAAM,CAAE,OAAA1B,CAAO,EAAIyB,EAGbE,EAAST,EAAmBlB,CAAM,EACxC,GAAI,CAAC2B,EAAO,QACV,MAAO,CACL,MAAOd,EAAU,cAAc,CAC7B,QAAS,iCACT,KAAM,CAAE,MAAOc,EAAO,MAAM,OAAO,CAAE,CACvC,CAAC,CACH,EAGF,IAAMC,EAAcD,EAAO,KAAK,CAAC,EACjC,GAAI,CAACC,EACH,MAAO,CACL,MAAOf,EAAU,cAAc,CAC7B,QAAS,iCACT,KAAM,CAAE,MAAO,sBAAuB,CACxC,CAAC,CACH,EAGF,IAAMgB,EAAUV,EAAaS,EAAY,GAAG,OAAO,EAC7CE,EAA2B,CAC/B,MAAO,mBACP,SAAU,CACR,KAAML,EAAQ,SAAS,KACvB,OAAQ,GAAGA,EAAQ,SAAS,IAAI,8CAChC,QAASA,EAAQ,SAAS,IAC5B,EACA,QAAS,CACP,QAASvB,EAAQ,QACjB,KAAMA,EAAQ,UACd,QAASA,EAAQ,OACnB,EACA,QAAA2B,CACF,EACME,EAA2B,CAC/B,KAAMzC,EAAU,qBAChB,KAAM,CAAE,IAAKsC,EAAY,IAAK,UAAWA,EAAY,EAAG,CAC1D,EACMI,EAAW,MAAMN,EAAmB,gBAAgB,CAAE,QAAAD,EAAS,YAAAK,EAAa,YAAAC,CAAY,CAAC,EAC/F,MAAI,UAAWC,EACN,CACL,MAAOA,EAAS,KAClB,EAGI,eAAgBA,EAMf,CAAE,OAAQA,EAAS,UAAW,EAL5B,CACL,MAAOnB,EAAU,SAAS,yBAAyB,CACrD,CAIJ,EJhHA,IAAAoB,EA0BaC,EAAN,KAAkC,CAGvC,YAAY,CAAE,mBAAAR,CAAmB,EAAsB,CAFvDS,EAAA,KAAAF,EAAA,QAGEG,EAAA,KAAKH,EAAsBP,EAC7B,CAEA,YAAYxB,EAAkB,CAC5B,GAAI,CACF,OAAO,QAAQ,QAAQT,EAAYS,CAAO,CAAC,CAC7C,OAASmC,EAAG,CACV,OAAO,QAAQ,OAAOA,CAAC,CACzB,CACF,CAEA,aAAoC,CAClC,IAAMV,EAAStC,EAAcE,CAAY,EACzC,OAAOoC,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,WAAWW,EAAwD,CAEjE,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,MAAM,YAAYtC,EAAyD,CACzE,OAAOD,EAAeC,CAAM,CAC9B,CAEA,MAAM,aAAayB,EAAqBvB,EAAwC,CAC9E,OAAQuB,EAAQ,OAAQ,CACtB,KAAKnC,EAAU,qBACb,OAAOkC,EAAQ,CAAE,QAAAC,EAAS,QAAAvB,EAAS,mBAAoBqC,EAAA,KAAKN,EAAoB,CAAC,EACnF,QACE,MAAO,CAAE,MAAOpB,EAAU,mBAAmB,UAAUY,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CAEA,sBAAsBe,EAA+D,CACnF,OAAO,QAAQ,QAAQ,CAAE,aAAc,CAAC,CAAE,CAAC,CAC7C,CAEA,UAAUA,EAAY,CACpB,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAC3B,CAEA,cAAcA,EAAkC,CAC9C,OAAO,QAAQ,OAAO,IAAI,MAAM,iBAAiB,CAAC,CACpD,CAEA,eAAwC,CAExC,CACF,EApDEP,EAAA","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 GaslessApi,\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';\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 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 getGaslessApi(): GaslessApi | undefined {\n return undefined;\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\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"hvm_signTransaction\"]\n }\n },\n \"manifestVersion\": \"0.0\"\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 { 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({\n message: 'Transaction params are invalid',\n data: { cause: result.error.format() },\n }),\n };\n }\n\n const transaction = result.data[0];\n if (!transaction) {\n return {\n error: rpcErrors.invalidParams({\n message: 'Transaction params are invalid',\n data: { cause: 'No transaction found' },\n }),\n };\n }\n\n const details = parseDetails(transaction.tx.actions);\n const displayData: DisplayData = {\n title: 'Sign Transaction',\n dAppInfo: {\n name: request.dappInfo.name,\n action: `${request.dappInfo.name} requests you to sign the following message`,\n logoUri: request.dappInfo.icon,\n },\n network: {\n chainId: network.chainId,\n name: network.chainName,\n logoUri: network.logoUri,\n },\n 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 { 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"]}
package/manifest.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "HyperVM",
3
+ "description": "",
4
+ "version": "0.0.1",
5
+ "sources": {
6
+ "module": {
7
+ "checksum": "",
8
+ "location": {
9
+ "npm": {
10
+ "filePath": "dist/index.js",
11
+ "packageName": "@avalabs/hvm-module",
12
+ "registry": "https://registry.npmjs.org"
13
+ }
14
+ }
15
+ }
16
+ },
17
+ "network": {
18
+ "chainIds": [],
19
+ "namespaces": ["hvm"]
20
+ },
21
+ "cointype": "60",
22
+ "permissions": {
23
+ "rpc": {
24
+ "dapps": true,
25
+ "methods": ["hvm_signTransaction"]
26
+ }
27
+ },
28
+ "manifestVersion": "0.0"
29
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@avalabs/hvm-module",
3
+ "version": "0.0.0-CP-9420-20250129154656",
4
+ "main": "dist/index.cjs",
5
+ "module": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist",
10
+ "manifest.json"
11
+ ],
12
+ "license": "Limited Ecosystem License",
13
+ "dependencies": {
14
+ "hypersdk-client": "0.4.16",
15
+ "@noble/hashes": "^1.5.0",
16
+ "@avalabs/core-utils-sdk": "3.1.0-alpha.19",
17
+ "@metamask/rpc-errors": "6.3.0",
18
+ "zod": "3.23.8",
19
+ "@avalabs/vm-module-types": "0.0.0-CP-9420-20250129154656"
20
+ },
21
+ "devDependencies": {
22
+ "@types/big.js": "6.2.2",
23
+ "@types/bn.js": "5.1.5",
24
+ "@types/jest": "29.5.7",
25
+ "jest": "29.7.0",
26
+ "ts-jest": "29.1.1",
27
+ "tsup": "7.2.0",
28
+ "@internal/tsup-config": "0.0.1",
29
+ "@internal/utils": "0.3.4",
30
+ "eslint-config-custom": "0.0.1"
31
+ },
32
+ "volta": {
33
+ "node": "20.11.0",
34
+ "yarn": "1.22.19"
35
+ },
36
+ "scripts": {
37
+ "build": "tsup",
38
+ "dev": "tsup --watch",
39
+ "lint": "eslint \"src/**/*.ts\"",
40
+ "test": "jest",
41
+ "test:watch": "jest --watch"
42
+ }
43
+ }