@avalabs/hvm-module 1.4.6 → 1.6.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 +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +6 -5
package/dist/index.cjs
CHANGED
|
@@ -5,9 +5,11 @@ var hypersdkClient = require('hypersdk-client');
|
|
|
5
5
|
var coreUtilsSdk = require('@avalabs/core-utils-sdk');
|
|
6
6
|
var rpcErrors = require('@metamask/rpc-errors');
|
|
7
7
|
var zod = require('zod');
|
|
8
|
+
var sha256 = require('@noble/hashes/sha256');
|
|
9
|
+
var base = require('@scure/base');
|
|
8
10
|
|
|
9
|
-
var
|
|
11
|
+
var f=(r,e,a)=>{if(!e.has(r))throw TypeError("Cannot "+a)};var y=(r,e,a)=>(f(r,e,"read from private field"),a?a.call(r):e.get(r)),g=(r,e,a)=>{if(e.has(r))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(r):e.set(r,a);},P=(r,e,a,o)=>(f(r,e,"write to private field"),o?o.call(r,a):e.set(r,a),a);var D={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 d=({rpcUrl:r,chainName:e,vmRpcPrefix:a})=>{if(!a)throw new Error("There is no vm rpc prefix");return new hypersdkClient.HyperSDKClient(r,e,a)};var w=async r=>{let{addresses:e,network:a}=r,o=d(a),i=e.map(async n=>{try{let s=await o.getBalance(n),p=a.networkToken,l=new coreUtilsSdk.TokenUnit(s,p.decimals,p.symbol),c={...p,coingeckoId:"",type:vmModuleTypes.TokenType.NATIVE,balance:s,balanceDisplayValue:l.toDisplay()};return {[n]:{[p.symbol]:c}}}catch(s){return {[n]:{error:s.toString()}}}});return (await Promise.allSettled(i)).reduce((n,s)=>({...n,...s.status==="fulfilled"?s.value:s.reason}),{})};var H=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()}),j=zod.z.array(H).length(1),R=r=>j.safeParse(r);var _=r=>r.length?r.map(e=>({title:e.actionName,items:[...Object.entries(e.data).map(([a,o])=>typeof o=="string"&&/^0x[0-9a-f]{74}$/i.test(o)?{label:a,type:vmModuleTypes.DetailItemType.ADDRESS,value:o}:{label:a,type:vmModuleTypes.DetailItemType.TEXT,value:typeof o=="string"?o:JSON.stringify(o),alignment:"vertical"})]})):[],A=async({request:r,network:e,approvalController:a})=>{let{params:o}=r,i=R(o);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 s=_(n.tx.actions),p={title:"Sign Transaction",dAppInfo:{name:r.dappInfo.name,action:`${r.dappInfo.name} requests you to sign the following message`,logoUri:r.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:s},l={type:vmModuleTypes.RpcMethod.HVM_SIGN_TRANSACTION,data:{abi:n.abi,txPayload:n.tx}},c=await a.requestApproval({request:r,displayData:p,signingData:l});return "error"in c?{error:c.error}:"signedData"in c?{result:c.signedData}:{error:rpcErrors.rpcErrors.internal("No signed data returned")}};var k=r=>"derivationPathType"in r&&"accountIndex"in r&&typeof r.accountIndex=="number"&&typeof r.derivationPathType=="string";var u=({accountIndex:r,derivationPathType:e})=>{if(r<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'/${r}'`};case"ledger_live":return {[vmModuleTypes.NetworkVMType.HVM]:`m/44'/9000'/${r}'/0'/0'`};default:throw rpcErrors.rpcErrors.invalidParams(`Unsupported derivation path type: ${e}`)}};var U=0,x=async r=>{let{approvalController:e,secretId:a}=r,o=k(r)?u(r).HVM:void 0,i=await e.requestPublicKey({curve:"ed25519",secretId:a,derivationPath:o}),n=base.hex.decode(i),s=new Uint8Array([U,...sha256.sha256(n)]),l=sha256.sha256(s).slice(-4);return {[vmModuleTypes.NetworkVMType.HVM]:`0x${base.hex.encode(s)}${base.hex.encode(l)}`}};var m,M=class{constructor({approvalController:e}){g(this,m,void 0);P(this,m,e);}getProvider(e){try{return Promise.resolve(d(e))}catch(a){return Promise.reject(a)}}getManifest(){let e=vmModuleTypes.parseManifest(D);return e.success?e.data:void 0}buildDerivationPath(e){return u(e)}deriveAddress(e){return x({...e,approvalController:y(this,m)})}getAddress(e){throw new Error("not implemented")}async getBalances(e){return w(e)}async onRpcRequest(e,a){switch(e.method){case vmModuleTypes.RpcMethod.HVM_SIGN_TRANSACTION:return A({request:e,network:a,approvalController:y(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"))}};m=new WeakMap;
|
|
10
12
|
|
|
11
|
-
exports.HvmModule =
|
|
13
|
+
exports.HvmModule = M;
|
|
12
14
|
//# sourceMappingURL=out.js.map
|
|
13
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","../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} 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","{\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 \"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 { 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"]}
|
|
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","../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","z","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 { 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","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.d.cts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import * as _avalabs_vm_module_types_dist_common from '@avalabs/vm-module-types/dist/common';
|
|
1
2
|
import * as hypersdk_client from 'hypersdk-client';
|
|
2
|
-
import { Module, ConstructorParams, Network, Manifest, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, RpcRequest, RpcResponse, GetTransactionHistory, TransactionHistoryResponse, NetworkFees } from '@avalabs/vm-module-types';
|
|
3
|
+
import { Module, ConstructorParams, Network, Manifest, BuildDerivationPathParams, DeriveAddressParams, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, RpcRequest, RpcResponse, GetTransactionHistory, TransactionHistoryResponse, NetworkFees } from '@avalabs/vm-module-types';
|
|
3
4
|
|
|
4
5
|
declare class HvmModule implements Module {
|
|
5
6
|
#private;
|
|
6
7
|
constructor({ approvalController }: ConstructorParams);
|
|
7
8
|
getProvider(network: Network): Promise<hypersdk_client.HyperSDKClient>;
|
|
8
9
|
getManifest(): Manifest | undefined;
|
|
10
|
+
buildDerivationPath(params: BuildDerivationPathParams): Pick<Partial<Record<_avalabs_vm_module_types_dist_common.NetworkVMType, string>>, _avalabs_vm_module_types_dist_common.NetworkVMType.HVM>;
|
|
11
|
+
deriveAddress(params: DeriveAddressParams): Promise<Partial<Record<_avalabs_vm_module_types_dist_common.NetworkVMType, string>>>;
|
|
9
12
|
getAddress(_params: GetAddressParams): Promise<GetAddressResponse>;
|
|
10
13
|
getBalances(params: GetBalancesParams): Promise<GetBalancesResponse>;
|
|
11
14
|
onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import * as _avalabs_vm_module_types_dist_common from '@avalabs/vm-module-types/dist/common';
|
|
1
2
|
import * as hypersdk_client from 'hypersdk-client';
|
|
2
|
-
import { Module, ConstructorParams, Network, Manifest, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, RpcRequest, RpcResponse, GetTransactionHistory, TransactionHistoryResponse, NetworkFees } from '@avalabs/vm-module-types';
|
|
3
|
+
import { Module, ConstructorParams, Network, Manifest, BuildDerivationPathParams, DeriveAddressParams, GetAddressParams, GetAddressResponse, GetBalancesParams, GetBalancesResponse, RpcRequest, RpcResponse, GetTransactionHistory, TransactionHistoryResponse, NetworkFees } from '@avalabs/vm-module-types';
|
|
3
4
|
|
|
4
5
|
declare class HvmModule implements Module {
|
|
5
6
|
#private;
|
|
6
7
|
constructor({ approvalController }: ConstructorParams);
|
|
7
8
|
getProvider(network: Network): Promise<hypersdk_client.HyperSDKClient>;
|
|
8
9
|
getManifest(): Manifest | undefined;
|
|
10
|
+
buildDerivationPath(params: BuildDerivationPathParams): Pick<Partial<Record<_avalabs_vm_module_types_dist_common.NetworkVMType, string>>, _avalabs_vm_module_types_dist_common.NetworkVMType.HVM>;
|
|
11
|
+
deriveAddress(params: DeriveAddressParams): Promise<Partial<Record<_avalabs_vm_module_types_dist_common.NetworkVMType, string>>>;
|
|
9
12
|
getAddress(_params: GetAddressParams): Promise<GetAddressResponse>;
|
|
10
13
|
getBalances(params: GetBalancesParams): Promise<GetBalancesResponse>;
|
|
11
14
|
onRpcRequest(request: RpcRequest, network: Network): Promise<RpcResponse>;
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { parseManifest, RpcMethod, TokenType, DetailItemType } from '@avalabs/vm-module-types';
|
|
1
|
+
import { parseManifest, RpcMethod, TokenType, NetworkVMType, DetailItemType } from '@avalabs/vm-module-types';
|
|
2
2
|
import { HyperSDKClient } from 'hypersdk-client';
|
|
3
3
|
import { TokenUnit } from '@avalabs/core-utils-sdk';
|
|
4
4
|
import { rpcErrors } from '@metamask/rpc-errors';
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
7
|
+
import { hex } from '@scure/base';
|
|
6
8
|
|
|
7
|
-
var
|
|
9
|
+
var f=(r,e,a)=>{if(!e.has(r))throw TypeError("Cannot "+a)};var y=(r,e,a)=>(f(r,e,"read from private field"),a?a.call(r):e.get(r)),g=(r,e,a)=>{if(e.has(r))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(r):e.set(r,a);},P=(r,e,a,o)=>(f(r,e,"write to private field"),o?o.call(r,a):e.set(r,a),a);var D={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 d=({rpcUrl:r,chainName:e,vmRpcPrefix:a})=>{if(!a)throw new Error("There is no vm rpc prefix");return new HyperSDKClient(r,e,a)};var w=async r=>{let{addresses:e,network:a}=r,o=d(a),i=e.map(async n=>{try{let s=await o.getBalance(n),p=a.networkToken,l=new TokenUnit(s,p.decimals,p.symbol),c={...p,coingeckoId:"",type:TokenType.NATIVE,balance:s,balanceDisplayValue:l.toDisplay()};return {[n]:{[p.symbol]:c}}}catch(s){return {[n]:{error:s.toString()}}}});return (await Promise.allSettled(i)).reduce((n,s)=>({...n,...s.status==="fulfilled"?s.value:s.reason}),{})};var H=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()}),j=z.array(H).length(1),R=r=>j.safeParse(r);var _=r=>r.length?r.map(e=>({title:e.actionName,items:[...Object.entries(e.data).map(([a,o])=>typeof o=="string"&&/^0x[0-9a-f]{74}$/i.test(o)?{label:a,type:DetailItemType.ADDRESS,value:o}:{label:a,type:DetailItemType.TEXT,value:typeof o=="string"?o:JSON.stringify(o),alignment:"vertical"})]})):[],A=async({request:r,network:e,approvalController:a})=>{let{params:o}=r,i=R(o);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 s=_(n.tx.actions),p={title:"Sign Transaction",dAppInfo:{name:r.dappInfo.name,action:`${r.dappInfo.name} requests you to sign the following message`,logoUri:r.dappInfo.icon},network:{chainId:e.chainId,name:e.chainName,logoUri:e.logoUri},details:s},l={type:RpcMethod.HVM_SIGN_TRANSACTION,data:{abi:n.abi,txPayload:n.tx}},c=await a.requestApproval({request:r,displayData:p,signingData:l});return "error"in c?{error:c.error}:"signedData"in c?{result:c.signedData}:{error:rpcErrors.internal("No signed data returned")}};var k=r=>"derivationPathType"in r&&"accountIndex"in r&&typeof r.accountIndex=="number"&&typeof r.derivationPathType=="string";var u=({accountIndex:r,derivationPathType:e})=>{if(r<0)throw rpcErrors.invalidParams("Account index must be a non-negative integer");switch(e){case"bip44":return {[NetworkVMType.HVM]:`m/44'/9000'/0'/0'/${r}'`};case"ledger_live":return {[NetworkVMType.HVM]:`m/44'/9000'/${r}'/0'/0'`};default:throw rpcErrors.invalidParams(`Unsupported derivation path type: ${e}`)}};var U=0,x=async r=>{let{approvalController:e,secretId:a}=r,o=k(r)?u(r).HVM:void 0,i=await e.requestPublicKey({curve:"ed25519",secretId:a,derivationPath:o}),n=hex.decode(i),s=new Uint8Array([U,...sha256(n)]),l=sha256(s).slice(-4);return {[NetworkVMType.HVM]:`0x${hex.encode(s)}${hex.encode(l)}`}};var m,M=class{constructor({approvalController:e}){g(this,m,void 0);P(this,m,e);}getProvider(e){try{return Promise.resolve(d(e))}catch(a){return Promise.reject(a)}}getManifest(){let e=parseManifest(D);return e.success?e.data:void 0}buildDerivationPath(e){return u(e)}deriveAddress(e){return x({...e,approvalController:y(this,m)})}getAddress(e){throw new Error("not implemented")}async getBalances(e){return w(e)}async onRpcRequest(e,a){switch(e.method){case RpcMethod.HVM_SIGN_TRANSACTION:return A({request:e,network:a,approvalController:y(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"))}};m=new WeakMap;
|
|
8
10
|
|
|
9
|
-
export {
|
|
11
|
+
export { M as HvmModule };
|
|
10
12
|
//# sourceMappingURL=out.js.map
|
|
11
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","../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} 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","{\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 \"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 { 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"]}
|
|
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","../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","z","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":"mVAAA,OAGE,iBAAAA,EAYA,aAAAC,MAIK,2BCnBP,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,OACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,qBAAqB,EACjC,qBAAwB,CAAC,CAC3B,CACF,EACA,gBAAmB,KACrB,EC7BA,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,EHhBA,OAAS,aAAAC,MAAiB,uBIxB1B,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,EE/GA,OAAS,iBAAAoB,MAAqB,2BAC9B,OAAS,UAAAC,MAAc,uBACvB,OAAS,OAAAC,MAAW,cCDb,IAAMC,EAAwBpC,GACnC,uBAAwBA,GACxB,iBAAkBA,GAClB,OAAOA,EAAO,cAAiB,UAC/B,OAAOA,EAAO,oBAAuB,SCNvC,OAAS,aAAAa,MAAiB,uBAC1B,OACE,iBAAAoB,MAGK,2BASA,IAAMI,EAAsB,CAAC,CAClC,aAAAC,EACA,mBAAAC,CACF,IAAuF,CACrF,GAAID,EAAe,EACjB,MAAMzB,EAAU,cAAc,8CAA8C,EAG9E,OAAQ0B,EAAoB,CAC1B,IAAK,QACH,MAAO,CACL,CAACN,EAAc,GAAG,EAAG,qBAAqBK,CAAY,GACxD,EAEF,IAAK,cACH,MAAO,CACL,CAACL,EAAc,GAAG,EAAG,eAAeK,CAAY,SAClD,EAEF,QACE,MAAMzB,EAAU,cAAc,qCAAqC0B,CAAkB,EAAE,CAC3F,CACF,EF3BA,IAAMC,EAAkB,EAEXC,EAAgB,MAC3BzC,GACmC,CACnC,GAAM,CAAE,mBAAA0B,EAAoB,SAAAgB,CAAS,EAAI1C,EAGnC2C,EAAiBP,EAAqBpC,CAAM,EAAIqC,EAAoBrC,CAAM,EAAE,IAAM,OAElF4C,EAAe,MAAMlB,EAAmB,iBAAiB,CAC7D,MAAO,UACP,SAAAgB,EACA,eAAAC,CACF,CAAC,EACKE,EAAiBV,EAAI,OAAOS,CAAY,EACxCE,EAAe,IAAI,WAAW,CAACN,EAAiB,GAAGN,EAAOW,CAAc,CAAC,CAAC,EAE1EE,EADOb,EAAOY,CAAY,EACV,MAAM,EAAE,EAE9B,MAAO,CACL,CAACb,EAAc,GAAG,EAAG,KAAKE,EAAI,OAAOW,CAAY,CAAC,GAAGX,EAAI,OAAOY,CAAQ,CAAC,EAC3E,CACF,ENhCA,IAAAC,EA6BaC,EAAN,KAAkC,CAGvC,YAAY,CAAE,mBAAAvB,CAAmB,EAAsB,CAFvDwB,EAAA,KAAAF,EAAA,QAGEG,EAAA,KAAKH,EAAsBtB,EAC7B,CAEA,YAAYxB,EAAkB,CAC5B,GAAI,CACF,OAAO,QAAQ,QAAQT,EAAYS,CAAO,CAAC,CAC7C,OAASkD,EAAG,CACV,OAAO,QAAQ,OAAOA,CAAC,CACzB,CACF,CAEA,aAAoC,CAClC,IAAMzB,EAAStC,EAAcE,CAAY,EACzC,OAAOoC,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,oBAAoB3B,EAAmC,CACrD,OAAOqC,EAAoBrC,CAAM,CACnC,CAEA,cAAcA,EAA6B,CACzC,OAAOyC,EAAc,CACnB,GAAGzC,EACH,mBAAoBqD,EAAA,KAAKL,EAC3B,CAAC,CACH,CAEA,WAAWM,EAAwD,CAEjE,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,MAAM,YAAYtD,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,mBAAoBmD,EAAA,KAAKL,EAAoB,CAAC,EACnF,QACE,MAAO,CAAE,MAAOnC,EAAU,mBAAmB,UAAUY,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CAEA,sBAAsB8B,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,CACF,EA3DEP,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 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 { 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","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/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avalabs/hvm-module",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"main": "dist/index.cjs",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -13,10 +13,11 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"hypersdk-client": "0.4.16",
|
|
15
15
|
"@noble/hashes": "1.5.0",
|
|
16
|
-
"@
|
|
16
|
+
"@scure/base": "1.2.4",
|
|
17
|
+
"@avalabs/core-utils-sdk": "3.1.0-alpha.44",
|
|
17
18
|
"@metamask/rpc-errors": "6.3.0",
|
|
18
19
|
"zod": "3.23.8",
|
|
19
|
-
"@avalabs/vm-module-types": "1.
|
|
20
|
+
"@avalabs/vm-module-types": "1.6.0"
|
|
20
21
|
},
|
|
21
22
|
"devDependencies": {
|
|
22
23
|
"@types/big.js": "6.2.2",
|
|
@@ -25,8 +26,8 @@
|
|
|
25
26
|
"jest": "29.7.0",
|
|
26
27
|
"ts-jest": "29.1.1",
|
|
27
28
|
"tsup": "7.2.0",
|
|
28
|
-
"@internal/tsup-config": "0.0.
|
|
29
|
-
"@internal/utils": "0.
|
|
29
|
+
"@internal/tsup-config": "0.0.2",
|
|
30
|
+
"@internal/utils": "0.5.0",
|
|
30
31
|
"eslint-config-custom": "0.0.1"
|
|
31
32
|
},
|
|
32
33
|
"volta": {
|