@avalabs/avalanche-module 0.0.12 → 0.0.13

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @avalabs/avalanche-module@0.0.12 build /home/runner/work/vm-modules/vm-modules/packages/avalanche-module
2
+ > @avalabs/avalanche-module@0.0.13 build /home/runner/work/vm-modules/vm-modules/packages/avalanche-module
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: ./src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  CJS Build start
12
12
  ESM Build start
13
- CJS dist/index.cjs 1.55 KB
14
- CJS dist/index.cjs.map 3.80 KB
15
- CJS ⚡️ Build success in 428ms
16
- ESM dist/index.js 1.52 KB
17
- ESM dist/index.js.map 3.80 KB
18
- ESM ⚡️ Build success in 427ms
13
+ CJS dist/index.cjs 1.50 KB
14
+ CJS dist/index.cjs.map 4.25 KB
15
+ CJS ⚡️ Build success in 392ms
16
+ ESM dist/index.js 1.47 KB
17
+ ESM dist/index.js.map 4.25 KB
18
+ ESM ⚡️ Build success in 393ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 5944ms
20
+ DTS ⚡️ Build success in 7411ms
21
21
  DTS dist/index.d.cts 752.00 B
22
22
  DTS dist/index.d.ts 752.00 B
@@ -1,4 +1,4 @@
1
1
 
2
- > @avalabs/avalanche-module@0.0.12 lint /home/runner/work/vm-modules/vm-modules/packages/avalanche-module
2
+ > @avalabs/avalanche-module@0.0.13 lint /home/runner/work/vm-modules/vm-modules/packages/avalanche-module
3
3
  > eslint "src/**/*.ts"
4
4
 
@@ -1,5 +1,13 @@
1
1
 
2
- > @avalabs/avalanche-module@0.0.12 test /home/runner/work/vm-modules/vm-modules/packages/avalanche-module
2
+ > @avalabs/avalanche-module@0.0.13 test /home/runner/work/vm-modules/vm-modules/packages/avalanche-module
3
3
  > jest
4
4
 
5
- No tests found, exiting with code 0
5
+ PASS src/handlers/get-network-fee.test.ts (11.96 s)
6
+ get-network-fee
7
+ ✓ should return fixed network fees (3 ms)
8
+
9
+ Test Suites: 1 passed, 1 total
10
+ Tests: 1 passed, 1 total
11
+ Snapshots: 0 total
12
+ Time: 12.168 s
13
+ Ran all test suites.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @avalabs/avalanche-module
2
2
 
3
+ ## 0.0.13
4
+
5
+ ### Patch Changes
6
+
7
+ - af68c81: Add getTransactionHistory to avalanche module
8
+ - d9fa0f5: added getNetworkFee to avalanche module
9
+ - Updated dependencies [af68c81]
10
+ - Updated dependencies [d9fa0f5]
11
+ - @avalabs/vm-module-types@0.0.13
12
+
3
13
  ## 0.0.12
4
14
 
5
15
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  var vmModuleTypes = require('@avalabs/vm-module-types');
4
4
  var rpcErrors = require('@metamask/rpc-errors');
5
5
 
6
- var r={name:"AVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM","avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm","avax:11111111111111111111111111111111LpoYY","avax:fuji-11111111111111111111111111111111LpoYY"],namespaces:["avax"]},cointype:"",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_*"]}},manifestVersion:"0.0"};var s=class{getAddress(){return Promise.resolve("Avalanche address")}getBalances(){return Promise.resolve("Avalanche balances")}getManifest(){let e=vmModuleTypes.parseManifest(r);return e.success?e.data:void 0}getNetworkFee(e){return Promise.resolve({low:{maxPriorityFeePerGas:0n,maxFeePerGas:0n},medium:{maxPriorityFeePerGas:0n,maxFeePerGas:0n},high:{maxPriorityFeePerGas:0n,maxFeePerGas:0n},baseFee:0n})}getTransactionHistory(e){return Promise.resolve({transactions:[]})}getTokens(e){return Promise.resolve([])}async onRpcRequest(e,i){switch(e.method){default:return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};
6
+ var r={name:"Avalanche",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM","avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm","avax:11111111111111111111111111111111LpoYY"],namespaces:["avax"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_*"]}},manifestVersion:"0.0"};async function t(){return {baseFee:BigInt(1e6),low:{maxFeePerGas:BigInt(1e6)},medium:{maxFeePerGas:BigInt(1e6)},high:{maxFeePerGas:BigInt(1e6)},isFixedFee:!0}}var s=class{getAddress(){return Promise.resolve("Avalanche address")}getBalances(){return Promise.resolve("Avalanche balances")}getManifest(){let e=vmModuleTypes.parseManifest(r);return e.success?e.data:void 0}getNetworkFee(e){return t()}getTransactionHistory(e){return Promise.resolve({transactions:[]})}getTokens(e){return Promise.resolve([])}async onRpcRequest(e,m){switch(e.method){default:return {error:rpcErrors.rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};
7
7
 
8
8
  exports.AvalancheModule = s;
9
9
  //# sourceMappingURL=out.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/module.ts","../src/manifest.json"],"names":["parseManifest","rpcErrors","manifest_default","AvalancheModule","result","_","request","_network"],"mappings":"AAQA,OAAS,iBAAAA,MAAqB,2BAC9B,OAAS,aAAAC,MAAiB,uBCT1B,IAAAC,EAAA,CACE,KAAQ,MACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CACV,0DACA,0DACA,6CACA,iDACF,EACA,WAAc,CAAC,MAAM,CACvB,EACA,SAAY,GACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,4BAA6B,aAAa,CACxD,CACF,EACA,gBAAmB,KACrB,ED/BO,IAAMC,EAAN,KAAwC,CAC7C,YAA8B,CAC5B,OAAO,QAAQ,QAAQ,mBAAmB,CAC5C,CAEA,aAA+B,CAC7B,OAAO,QAAQ,QAAQ,oBAAoB,CAC7C,CAEA,aAAoC,CAClC,IAAMC,EAASJ,EAAcE,CAAY,EACzC,OAAOE,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,cAAcC,EAAkC,CAC9C,OAAO,QAAQ,QAAQ,CACrB,IAAK,CAAE,qBAAsB,GAAI,aAAc,EAAG,EAClD,OAAQ,CAAE,qBAAsB,GAAI,aAAc,EAAG,EACrD,KAAM,CAAE,qBAAsB,GAAI,aAAc,EAAG,EACnD,QAAS,EACX,CAAC,CACH,CAEA,sBAAsBA,EAA0B,CAC9C,OAAO,QAAQ,QAAQ,CAAE,aAAc,CAAC,CAAE,CAAC,CAC7C,CAEA,UAAUA,EAAY,CACpB,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAC3B,CAEA,MAAM,aAAaC,EAAqBC,EAAmB,CACzD,OAAQD,EAAQ,OAAQ,CACtB,QACE,MAAO,CAAE,MAAOL,EAAU,mBAAmB,UAAUK,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CACF","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from './manifest.json';\n\nexport class AvalancheModule implements Module {\n getAddress(): Promise<string> {\n return Promise.resolve('Avalanche address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('Avalanche balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return Promise.resolve({\n low: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },\n medium: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },\n high: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },\n baseFee: 0n,\n });\n }\n\n getTransactionHistory(_: GetTransactionHistory) {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, _network: Network) {\n switch (request.method) {\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n","{\n \"name\": \"AVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM\",\n \"avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm\",\n \"avax:11111111111111111111111111111111LpoYY\",\n \"avax:fuji-11111111111111111111111111111111LpoYY\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_*\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n"]}
1
+ {"version":3,"sources":["../src/module.ts","../manifest.json","../src/handlers/get-network-fee.ts"],"names":["parseManifest","rpcErrors","manifest_default","getNetworkFee","AvalancheModule","result","_","request","_network"],"mappings":"AAQA,OAAS,iBAAAA,MAAqB,2BAC9B,OAAS,aAAAC,MAAiB,uBCT1B,IAAAC,EAAA,CACE,KAAQ,YACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CACV,0DACA,0DACA,4CACF,EACA,WAAc,CAAC,MAAM,CACvB,EACA,SAAY,KACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,4BAA6B,aAAa,CACxD,CACF,EACA,gBAAmB,KACrB,ECrCA,eAAsBC,GAAsC,CAE1D,MAAO,CACL,QAAS,OAAO,GAAO,EACvB,IAAK,CACH,aAAc,OAAO,GAAO,CAC9B,EACA,OAAQ,CACN,aAAc,OAAO,GAAO,CAC9B,EACA,KAAM,CACJ,aAAc,OAAO,GAAO,CAC9B,EACA,WAAY,EACd,CACF,CFPO,IAAMC,EAAN,KAAwC,CAC7C,YAA8B,CAC5B,OAAO,QAAQ,QAAQ,mBAAmB,CAC5C,CAEA,aAA+B,CAC7B,OAAO,QAAQ,QAAQ,oBAAoB,CAC7C,CAEA,aAAoC,CAClC,IAAMC,EAASL,EAAcE,CAAY,EACzC,OAAOG,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,cAAcC,EAAkC,CAC9C,OAAOH,EAAc,CACvB,CAEA,sBAAsBG,EAA0B,CAC9C,OAAO,QAAQ,QAAQ,CAAE,aAAc,CAAC,CAAE,CAAC,CAC7C,CAEA,UAAUA,EAAY,CACpB,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAC3B,CAEA,MAAM,aAAaC,EAAqBC,EAAmB,CACzD,OAAQD,EAAQ,OAAQ,CACtB,QACE,MAAO,CAAE,MAAON,EAAU,mBAAmB,UAAUM,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CACF","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee';\n\nexport class AvalancheModule implements Module {\n getAddress(): Promise<string> {\n return Promise.resolve('Avalanche address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('Avalanche balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return getNetworkFee();\n }\n\n getTransactionHistory(_: GetTransactionHistory) {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, _network: Network) {\n switch (request.method) {\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM\",\n \"avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm\",\n \"avax:11111111111111111111111111111111LpoYY\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_*\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n}\n"]}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { parseManifest } from '@avalabs/vm-module-types';
2
2
  import { rpcErrors } from '@metamask/rpc-errors';
3
3
 
4
- var r={name:"AVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM","avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm","avax:11111111111111111111111111111111LpoYY","avax:fuji-11111111111111111111111111111111LpoYY"],namespaces:["avax"]},cointype:"",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_*"]}},manifestVersion:"0.0"};var s=class{getAddress(){return Promise.resolve("Avalanche address")}getBalances(){return Promise.resolve("Avalanche balances")}getManifest(){let e=parseManifest(r);return e.success?e.data:void 0}getNetworkFee(e){return Promise.resolve({low:{maxPriorityFeePerGas:0n,maxFeePerGas:0n},medium:{maxPriorityFeePerGas:0n,maxFeePerGas:0n},high:{maxPriorityFeePerGas:0n,maxFeePerGas:0n},baseFee:0n})}getTransactionHistory(e){return Promise.resolve({transactions:[]})}getTokens(e){return Promise.resolve([])}async onRpcRequest(e,i){switch(e.method){default:return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};
4
+ var r={name:"Avalanche",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/avalanche-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM","avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm","avax:11111111111111111111111111111111LpoYY"],namespaces:["avax"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["avalanche_sendTransaction","avalanche_*"]}},manifestVersion:"0.0"};async function t(){return {baseFee:BigInt(1e6),low:{maxFeePerGas:BigInt(1e6)},medium:{maxFeePerGas:BigInt(1e6)},high:{maxFeePerGas:BigInt(1e6)},isFixedFee:!0}}var s=class{getAddress(){return Promise.resolve("Avalanche address")}getBalances(){return Promise.resolve("Avalanche balances")}getManifest(){let e=parseManifest(r);return e.success?e.data:void 0}getNetworkFee(e){return t()}getTransactionHistory(e){return Promise.resolve({transactions:[]})}getTokens(e){return Promise.resolve([])}async onRpcRequest(e,m){switch(e.method){default:return {error:rpcErrors.methodNotSupported(`Method ${e.method} not supported`)}}}};
5
5
 
6
6
  export { s as AvalancheModule };
7
7
  //# sourceMappingURL=out.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/module.ts","../src/manifest.json"],"names":["parseManifest","rpcErrors","manifest_default","AvalancheModule","result","_","request","_network"],"mappings":"AAQA,OAAS,iBAAAA,MAAqB,2BAC9B,OAAS,aAAAC,MAAiB,uBCT1B,IAAAC,EAAA,CACE,KAAQ,MACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CACV,0DACA,0DACA,6CACA,iDACF,EACA,WAAc,CAAC,MAAM,CACvB,EACA,SAAY,GACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,4BAA6B,aAAa,CACxD,CACF,EACA,gBAAmB,KACrB,ED/BO,IAAMC,EAAN,KAAwC,CAC7C,YAA8B,CAC5B,OAAO,QAAQ,QAAQ,mBAAmB,CAC5C,CAEA,aAA+B,CAC7B,OAAO,QAAQ,QAAQ,oBAAoB,CAC7C,CAEA,aAAoC,CAClC,IAAMC,EAASJ,EAAcE,CAAY,EACzC,OAAOE,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,cAAcC,EAAkC,CAC9C,OAAO,QAAQ,QAAQ,CACrB,IAAK,CAAE,qBAAsB,GAAI,aAAc,EAAG,EAClD,OAAQ,CAAE,qBAAsB,GAAI,aAAc,EAAG,EACrD,KAAM,CAAE,qBAAsB,GAAI,aAAc,EAAG,EACnD,QAAS,EACX,CAAC,CACH,CAEA,sBAAsBA,EAA0B,CAC9C,OAAO,QAAQ,QAAQ,CAAE,aAAc,CAAC,CAAE,CAAC,CAC7C,CAEA,UAAUA,EAAY,CACpB,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAC3B,CAEA,MAAM,aAAaC,EAAqBC,EAAmB,CACzD,OAAQD,EAAQ,OAAQ,CACtB,QACE,MAAO,CAAE,MAAOL,EAAU,mBAAmB,UAAUK,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CACF","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from './manifest.json';\n\nexport class AvalancheModule implements Module {\n getAddress(): Promise<string> {\n return Promise.resolve('Avalanche address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('Avalanche balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return Promise.resolve({\n low: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },\n medium: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },\n high: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },\n baseFee: 0n,\n });\n }\n\n getTransactionHistory(_: GetTransactionHistory) {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, _network: Network) {\n switch (request.method) {\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n","{\n \"name\": \"AVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM\",\n \"avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm\",\n \"avax:11111111111111111111111111111111LpoYY\",\n \"avax:fuji-11111111111111111111111111111111LpoYY\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_*\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n"]}
1
+ {"version":3,"sources":["../src/module.ts","../manifest.json","../src/handlers/get-network-fee.ts"],"names":["parseManifest","rpcErrors","manifest_default","getNetworkFee","AvalancheModule","result","_","request","_network"],"mappings":"AAQA,OAAS,iBAAAA,MAAqB,2BAC9B,OAAS,aAAAC,MAAiB,uBCT1B,IAAAC,EAAA,CACE,KAAQ,YACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,4BACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CACV,0DACA,0DACA,4CACF,EACA,WAAc,CAAC,MAAM,CACvB,EACA,SAAY,KACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,4BAA6B,aAAa,CACxD,CACF,EACA,gBAAmB,KACrB,ECrCA,eAAsBC,GAAsC,CAE1D,MAAO,CACL,QAAS,OAAO,GAAO,EACvB,IAAK,CACH,aAAc,OAAO,GAAO,CAC9B,EACA,OAAQ,CACN,aAAc,OAAO,GAAO,CAC9B,EACA,KAAM,CACJ,aAAc,OAAO,GAAO,CAC9B,EACA,WAAY,EACd,CACF,CFPO,IAAMC,EAAN,KAAwC,CAC7C,YAA8B,CAC5B,OAAO,QAAQ,QAAQ,mBAAmB,CAC5C,CAEA,aAA+B,CAC7B,OAAO,QAAQ,QAAQ,oBAAoB,CAC7C,CAEA,aAAoC,CAClC,IAAMC,EAASL,EAAcE,CAAY,EACzC,OAAOG,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,cAAcC,EAAkC,CAC9C,OAAOH,EAAc,CACvB,CAEA,sBAAsBG,EAA0B,CAC9C,OAAO,QAAQ,QAAQ,CAAE,aAAc,CAAC,CAAE,CAAC,CAC7C,CAEA,UAAUA,EAAY,CACpB,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAC3B,CAEA,MAAM,aAAaC,EAAqBC,EAAmB,CACzD,OAAQD,EAAQ,OAAQ,CACtB,QACE,MAAO,CAAE,MAAON,EAAU,mBAAmB,UAAUM,EAAQ,MAAM,gBAAgB,CAAE,CAC3F,CACF,CACF","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n Network,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport ManifestJson from '../manifest.json';\nimport { getNetworkFee } from './handlers/get-network-fee';\n\nexport class AvalancheModule implements Module {\n getAddress(): Promise<string> {\n return Promise.resolve('Avalanche address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('Avalanche balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(_: Network): Promise<NetworkFees> {\n return getNetworkFee();\n }\n\n getTransactionHistory(_: GetTransactionHistory) {\n return Promise.resolve({ transactions: [] });\n }\n\n getTokens(_: Network) {\n return Promise.resolve([]);\n }\n\n async onRpcRequest(request: RpcRequest, _network: Network) {\n switch (request.method) {\n default:\n return { error: rpcErrors.methodNotSupported(`Method ${request.method} not supported`) };\n }\n }\n}\n","{\n \"name\": \"Avalanche\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/avalanche-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\n \"avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM\",\n \"avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm\",\n \"avax:11111111111111111111111111111111LpoYY\"\n ],\n \"namespaces\": [\"avax\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"avalanche_sendTransaction\", \"avalanche_*\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n","import type { NetworkFees } from '@avalabs/vm-module-types';\n\n/**\n * Returns {@link NetworkFees} based on a fixed fee.\n */\nexport async function getNetworkFee(): Promise<NetworkFees> {\n // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule\n return {\n baseFee: BigInt(1000000),\n low: {\n maxFeePerGas: BigInt(1000000),\n },\n medium: {\n maxFeePerGas: BigInt(1000000),\n },\n high: {\n maxFeePerGas: BigInt(1000000),\n },\n isFixedFee: true,\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "AVM",
2
+ "name": "Avalanche",
3
3
  "description": "",
4
4
  "version": "0.0.1",
5
5
  "sources": {
@@ -28,12 +28,11 @@
28
28
  "chainIds": [
29
29
  "avax:2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM",
30
30
  "avax:2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm",
31
- "avax:11111111111111111111111111111111LpoYY",
32
- "avax:fuji-11111111111111111111111111111111LpoYY"
31
+ "avax:11111111111111111111111111111111LpoYY"
33
32
  ],
34
33
  "namespaces": ["avax"]
35
34
  },
36
- "cointype": "",
35
+ "cointype": "60",
37
36
  "permissions": {
38
37
  "rpc": {
39
38
  "dapps": true,
package/package.json CHANGED
@@ -1,19 +1,26 @@
1
1
  {
2
2
  "name": "@avalabs/avalanche-module",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "main": "dist/index.cjs",
5
5
  "module": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
7
7
  "type": "module",
8
8
  "dependencies": {
9
- "@avalabs/vm-module-types": "0.0.12",
10
- "@metamask/rpc-errors": "6.3.0"
9
+ "@avalabs/vm-module-types": "0.0.13",
10
+ "@metamask/rpc-errors": "6.3.0",
11
+ "@avalabs/utils-sdk": "v2.8.0-alpha.187",
12
+ "@avalabs/chains-sdk": "v2.8.0-alpha.187",
13
+ "@avalabs/etherscan-sdk": "v2.8.0-alpha.187",
14
+ "@avalabs/glacier-sdk": "v2.8.0-alpha.187",
15
+ "@avalabs/wallets-sdk": "v2.8.0-alpha.187",
16
+ "big.js": "6.2.1"
11
17
  },
12
18
  "devDependencies": {
13
19
  "@types/jest": "29.5.7",
14
20
  "jest": "29.7.0",
15
21
  "ts-jest": "29.1.1",
16
22
  "tsup": "7.2.0",
23
+ "@types/big.js": "6.2.2",
17
24
  "@internal/tsup-config": "0.0.1",
18
25
  "eslint-config-custom": "0.0.2"
19
26
  },
@@ -0,0 +1,19 @@
1
+ import { getNetworkFee } from './get-network-fee';
2
+
3
+ describe('get-network-fee', () => {
4
+ it('should return fixed network fees', async () => {
5
+ await expect(getNetworkFee()).resolves.toEqual({
6
+ baseFee: 1000000n,
7
+ low: {
8
+ maxFeePerGas: 1000000n,
9
+ },
10
+ medium: {
11
+ maxFeePerGas: 1000000n,
12
+ },
13
+ high: {
14
+ maxFeePerGas: 1000000n,
15
+ },
16
+ isFixedFee: true,
17
+ });
18
+ });
19
+ });
@@ -0,0 +1,21 @@
1
+ import type { NetworkFees } from '@avalabs/vm-module-types';
2
+
3
+ /**
4
+ * Returns {@link NetworkFees} based on a fixed fee.
5
+ */
6
+ export async function getNetworkFee(): Promise<NetworkFees> {
7
+ // this is 0.001 Avax denominated in nAvax, taken from https://docs.avax.network/reference/standards/guides/txn-fees#fee-schedule
8
+ return {
9
+ baseFee: BigInt(1000000),
10
+ low: {
11
+ maxFeePerGas: BigInt(1000000),
12
+ },
13
+ medium: {
14
+ maxFeePerGas: BigInt(1000000),
15
+ },
16
+ high: {
17
+ maxFeePerGas: BigInt(1000000),
18
+ },
19
+ isFixedFee: true,
20
+ };
21
+ }
@@ -0,0 +1,125 @@
1
+ import { type PChainTransaction, type NetworkToken } from '@avalabs/glacier-sdk';
2
+ import Big from 'big.js';
3
+ import { Avalanche } from '@avalabs/wallets-sdk';
4
+ import { TokenType, type Transaction } from '@avalabs/vm-module-types';
5
+ import { getExplorerAddressByNetwork, getTokenValue } from './utils';
6
+
7
+ export function convertPChainTransaction(
8
+ tx: PChainTransaction,
9
+ isTestnet: boolean,
10
+ address: string,
11
+ networkToken: NetworkToken,
12
+ explorerUrl: string,
13
+ chainId: number,
14
+ ): Transaction {
15
+ const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);
16
+ const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);
17
+
18
+ const amount = getAmount({
19
+ tx,
20
+ isTestnet,
21
+ networkToken,
22
+ froms,
23
+ });
24
+
25
+ const avaxBurnedAmount = getBurnedAmount({ tx, isTestnet, networkToken });
26
+ const chainAddress = address.toLowerCase().startsWith('p-') ? address.slice(2) : address;
27
+ const isSender = froms.has(chainAddress);
28
+
29
+ return {
30
+ hash: tx.txHash,
31
+ isContractCall: false,
32
+ isIncoming: !isSender,
33
+ isOutgoing: isSender,
34
+ from: [...froms.values()].join(','),
35
+ to: [...tos.values()].join(','),
36
+ isSender,
37
+ timestamp: tx.blockTimestamp * 1000, // to millis
38
+ tokens: [
39
+ {
40
+ decimal: networkToken.decimals.toString(),
41
+ name: networkToken.name,
42
+ symbol: networkToken.symbol,
43
+ type: TokenType.NATIVE,
44
+ amount: amount.toString(),
45
+ },
46
+ ],
47
+ gasUsed: avaxBurnedAmount.toString(),
48
+ explorerLink: getExplorerAddressByNetwork(explorerUrl, tx.txHash, 'tx'),
49
+ txType: tx.txType,
50
+ chainId: chainId.toString(),
51
+ };
52
+ }
53
+
54
+ function getAmount({
55
+ tx,
56
+ isTestnet,
57
+ networkToken,
58
+ froms,
59
+ }: {
60
+ tx: PChainTransaction;
61
+ isTestnet: boolean;
62
+ networkToken: NetworkToken;
63
+ froms: Set<string>;
64
+ }): Big {
65
+ const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);
66
+ const isBaseTx = tx.txType === 'BaseTx';
67
+
68
+ const nonChangeEmittedUtxosAmt = tx.emittedUtxos
69
+ .filter(
70
+ (utxo) => utxo.asset.assetId === getAvaxAssetId(!!isTestnet) && !utxo.addresses.some((addr) => froms.has(addr)),
71
+ )
72
+ .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));
73
+ const txValue = tx.value.find((val) => val.assetId === getAvaxAssetId(!!isTestnet))?.amount;
74
+ // This ternary attempts to cover the case where users send themselves AVAX
75
+ // in which case the senders are the recipients and we should use the total tx value.
76
+ const baseTxValue = nonChangeEmittedUtxosAmt.gt(new Big(0))
77
+ ? nonChangeEmittedUtxosAmt
78
+ : txValue
79
+ ? new Big(txValue)
80
+ : new Big(0) ?? new Big(0);
81
+
82
+ const pBlockchainId = isTestnet ? Avalanche.FujiContext.pBlockchainID : Avalanche.MainnetContext.pBlockchainID;
83
+
84
+ const importExportAmount = tx.emittedUtxos
85
+ .filter(
86
+ (utxo) =>
87
+ utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&
88
+ ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === pBlockchainId) ||
89
+ (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== pBlockchainId)),
90
+ )
91
+ .reduce((agg, utxo) => agg.add(utxo.amount), new Big(0));
92
+ const nAvaxAmount = isBaseTx
93
+ ? baseTxValue
94
+ : isImportExport
95
+ ? importExportAmount
96
+ : tx.amountStaked.length === 0
97
+ ? aggregateValue(tx.value, !!isTestnet)
98
+ : aggregateValue(tx.amountStaked, !!isTestnet);
99
+ return getTokenValue({ amount: nAvaxAmount?.toNumber(), decimals: networkToken.decimals });
100
+ }
101
+
102
+ function getBurnedAmount({
103
+ tx,
104
+ isTestnet,
105
+ networkToken,
106
+ }: {
107
+ tx: PChainTransaction;
108
+ isTestnet: boolean;
109
+ networkToken: NetworkToken;
110
+ }): Big {
111
+ const nAvaxFee = tx.amountBurned
112
+ ?.filter((value) => value.assetId === getAvaxAssetId(!!isTestnet))
113
+ .reduce((accumulator, value) => accumulator.add(value.amount), new Big(0));
114
+ return getTokenValue({ amount: nAvaxFee?.toNumber(), decimals: networkToken.decimals });
115
+ }
116
+
117
+ function aggregateValue(value: PChainTransaction['value'], isTestnet: boolean): Big | undefined {
118
+ return value
119
+ .filter((value_) => value_.assetId === getAvaxAssetId(isTestnet))
120
+ .reduce((accumulator, value_) => accumulator.add(value_.amount), new Big(0));
121
+ }
122
+
123
+ function getAvaxAssetId(isTestnet: boolean): string {
124
+ return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;
125
+ }
@@ -0,0 +1,99 @@
1
+ import { type NetworkToken, XChainNonLinearTransaction, XChainLinearTransaction } from '@avalabs/glacier-sdk';
2
+ import Big from 'big.js';
3
+ import { Avalanche } from '@avalabs/wallets-sdk';
4
+ import { TokenType, type Transaction } from '@avalabs/vm-module-types';
5
+ import { getExplorerAddressByNetwork, getTokenValue } from './utils';
6
+
7
+ export function convertXChainTransaction(
8
+ tx: XChainNonLinearTransaction | XChainLinearTransaction,
9
+ isTestnet: boolean,
10
+ address: string,
11
+ networkToken: NetworkToken,
12
+ explorerUrl: string,
13
+ chainId: number,
14
+ ): Transaction {
15
+ const froms = new Set(tx.consumedUtxos.flatMap((utxo) => utxo.addresses) || []);
16
+ const tos = new Set(tx.emittedUtxos.flatMap((utxo) => utxo.addresses) || []);
17
+
18
+ const amount = getAmount({
19
+ tx,
20
+ isTestnet,
21
+ networkToken,
22
+ });
23
+ const avaxBurnedAmount = getBurnedAmount({ isTestnet, tx, totalAmountCreated: amount, networkToken });
24
+ const chainAddress = address.toLowerCase().startsWith('x-') ? address.slice(2) : address;
25
+ const isSender = froms.has(chainAddress);
26
+
27
+ return {
28
+ hash: tx.txHash,
29
+ isContractCall: false,
30
+ isIncoming: !isSender,
31
+ isOutgoing: isSender,
32
+ from: [...froms.values()].join(','),
33
+ to: [...tos.values()].join(','),
34
+ isSender,
35
+ timestamp: tx.timestamp * 1000, // to millis
36
+ tokens: [
37
+ {
38
+ decimal: networkToken.decimals.toString(),
39
+ name: networkToken.name,
40
+ symbol: networkToken.symbol,
41
+ type: TokenType.NATIVE,
42
+ amount: amount.toString(),
43
+ },
44
+ ],
45
+ gasUsed: avaxBurnedAmount.toString(),
46
+ explorerLink: getExplorerAddressByNetwork(explorerUrl, tx.txHash, 'tx'),
47
+ txType: tx.txType,
48
+ chainId: chainId.toString(),
49
+ };
50
+ }
51
+
52
+ function getAmount({
53
+ tx,
54
+ isTestnet,
55
+ networkToken,
56
+ }: {
57
+ tx: XChainNonLinearTransaction | XChainLinearTransaction;
58
+ isTestnet: boolean;
59
+ networkToken: NetworkToken;
60
+ }): Big {
61
+ const isImportExport = ['ImportTx', 'ExportTx'].includes(tx.txType);
62
+ const xBlockchainId = isTestnet ? Avalanche.FujiContext.xBlockchainID : Avalanche.MainnetContext.xBlockchainID;
63
+ const importExportAmount = tx.emittedUtxos
64
+ .filter(
65
+ (utxo) =>
66
+ utxo.asset.assetId === getAvaxAssetId(!!isTestnet) &&
67
+ ((tx.txType === 'ImportTx' && utxo.consumedOnChainId === xBlockchainId) ||
68
+ (tx.txType === 'ExportTx' && utxo.consumedOnChainId !== xBlockchainId)),
69
+ )
70
+ .reduce((agg, utxo) => agg.add(utxo.asset.amount), new Big(0));
71
+
72
+ const totalAmountCreated = tx.amountCreated
73
+ .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))
74
+ .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));
75
+ const nAvaxAmt = isImportExport ? importExportAmount : totalAmountCreated;
76
+ return getTokenValue({ amount: nAvaxAmt.toNumber(), decimals: networkToken.decimals });
77
+ }
78
+
79
+ function getBurnedAmount({
80
+ isTestnet,
81
+ tx,
82
+ totalAmountCreated,
83
+ networkToken,
84
+ }: {
85
+ isTestnet: boolean;
86
+ tx: XChainNonLinearTransaction | XChainLinearTransaction;
87
+ totalAmountCreated: Big;
88
+ networkToken: NetworkToken;
89
+ }): Big {
90
+ const totalAmountUnlocked = tx.amountUnlocked
91
+ .filter((asset) => asset.assetId === getAvaxAssetId(!!isTestnet))
92
+ .reduce((accumulator, asset) => accumulator.add(asset.amount), new Big(0));
93
+ const nAvaxFee = totalAmountUnlocked.minus(totalAmountCreated);
94
+ return getTokenValue({ amount: nAvaxFee.toNumber(), decimals: networkToken.decimals });
95
+ }
96
+
97
+ function getAvaxAssetId(isTestnet: boolean): string {
98
+ return isTestnet ? Avalanche.FujiContext.avaxAssetID : Avalanche.MainnetContext.avaxAssetID;
99
+ }
@@ -0,0 +1,54 @@
1
+ import type { GetTransactionHistory, Transaction, TransactionHistoryResponse } from '@avalabs/vm-module-types';
2
+ import { BlockchainId, Network, SortOrder, Glacier } from '@avalabs/glacier-sdk';
3
+ import { isPChainTransactions, isXChainTransactions } from './utils';
4
+ import { convertPChainTransaction } from './convert-p-chain-transaction';
5
+ import { convertXChainTransaction } from './convert-x-chain-transaction';
6
+
7
+ export const getTransactionHistory = async ({
8
+ isTestnet,
9
+ address,
10
+ nextPageToken,
11
+ offset,
12
+ glacierApiUrl,
13
+ networkToken,
14
+ explorerUrl,
15
+ chainId,
16
+ }: GetTransactionHistory): Promise<TransactionHistoryResponse> => {
17
+ const glacierSdk = new Glacier({ BASE: glacierApiUrl });
18
+
19
+ const response = await glacierSdk.primaryNetworkTransactions.listLatestPrimaryNetworkTransactions({
20
+ addresses: address,
21
+ blockchainId: getBlockchainIdByAddress(address),
22
+ network: isTestnet ? Network.FUJI : Network.MAINNET,
23
+ pageSize: offset,
24
+ pageToken: nextPageToken,
25
+ sortOrder: SortOrder.DESC,
26
+ });
27
+
28
+ let transactions: Transaction[] = [];
29
+ if (isPChainTransactions(response)) {
30
+ transactions = response.transactions.map((value) =>
31
+ convertPChainTransaction(value, isTestnet, address, networkToken, explorerUrl, chainId),
32
+ );
33
+ }
34
+ if (isXChainTransactions(response)) {
35
+ transactions = response.transactions.map((value) =>
36
+ convertXChainTransaction(value, isTestnet, address, networkToken, explorerUrl, chainId),
37
+ );
38
+ }
39
+
40
+ return {
41
+ transactions,
42
+ nextPageToken: response.nextPageToken,
43
+ };
44
+ };
45
+
46
+ const getBlockchainIdByAddress = (address: string) => {
47
+ // A comma separated list of X-Chain or P-Chain wallet addresses,
48
+ // starting with "avax"/"fuji", "P-avax"/"P-fuji" or "X-avax"/"X-fuji"
49
+ const firstAddress = address.split(',')[0];
50
+ if (firstAddress?.toLowerCase().startsWith('p-')) {
51
+ return BlockchainId.P_CHAIN;
52
+ }
53
+ return BlockchainId.X_CHAIN;
54
+ };
@@ -0,0 +1,31 @@
1
+ import {
2
+ PrimaryNetworkChainName,
3
+ type ListCChainAtomicTransactionsResponse,
4
+ type ListPChainTransactionsResponse,
5
+ type ListXChainTransactionsResponse,
6
+ } from '@avalabs/glacier-sdk';
7
+ import Big from 'big.js';
8
+
9
+ export const isPChainTransactions = (
10
+ value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,
11
+ ): value is ListPChainTransactionsResponse => {
12
+ return value.chainInfo.chainName === PrimaryNetworkChainName.P_CHAIN;
13
+ };
14
+
15
+ export const isXChainTransactions = (
16
+ value: ListPChainTransactionsResponse | ListXChainTransactionsResponse | ListCChainAtomicTransactionsResponse,
17
+ ): value is ListXChainTransactionsResponse => {
18
+ return value.chainInfo.chainName === PrimaryNetworkChainName.X_CHAIN;
19
+ };
20
+
21
+ export function getExplorerAddressByNetwork(
22
+ explorerUrl: string,
23
+ hash: string,
24
+ hashType: 'address' | 'tx' = 'tx',
25
+ ): string {
26
+ return `${explorerUrl}/${hashType}/${hash}`;
27
+ }
28
+
29
+ export function getTokenValue({ amount, decimals }: { decimals: number; amount?: number }): Big {
30
+ return amount === undefined ? new Big(0) : new Big(amount / 10 ** decimals);
31
+ }
package/src/module.ts CHANGED
@@ -8,7 +8,8 @@ import type {
8
8
  } from '@avalabs/vm-module-types';
9
9
  import { parseManifest } from '@avalabs/vm-module-types';
10
10
  import { rpcErrors } from '@metamask/rpc-errors';
11
- import ManifestJson from './manifest.json';
11
+ import ManifestJson from '../manifest.json';
12
+ import { getNetworkFee } from './handlers/get-network-fee';
12
13
 
13
14
  export class AvalancheModule implements Module {
14
15
  getAddress(): Promise<string> {
@@ -25,12 +26,7 @@ export class AvalancheModule implements Module {
25
26
  }
26
27
 
27
28
  getNetworkFee(_: Network): Promise<NetworkFees> {
28
- return Promise.resolve({
29
- low: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },
30
- medium: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },
31
- high: { maxPriorityFeePerGas: 0n, maxFeePerGas: 0n },
32
- baseFee: 0n,
33
- });
29
+ return getNetworkFee();
34
30
  }
35
31
 
36
32
  getTransactionHistory(_: GetTransactionHistory) {