diff --git a/packages/core-mobile/.env.example b/packages/core-mobile/.env.example index 2305346f6a..f3f69ba1d0 100644 --- a/packages/core-mobile/.env.example +++ b/packages/core-mobile/.env.example @@ -7,6 +7,8 @@ POSTHOG_FEATURE_FLAGS_KEY= PROXY_URL= GLACIER_URL= GLACIER_API_KEY= +# Core API key for core-proxy-api (dev/E2E: authorizes + bypasses rate limits; 1Password "front end eng" vault -> "Core API keys") +CORE_API_KEY= SENTRY_DSN= diff --git a/packages/core-mobile/app/hooks/browser/injectedProvider/approvalMethods.test.ts b/packages/core-mobile/app/hooks/browser/injectedProvider/approvalMethods.test.ts index 9558339f37..257aedef12 100644 --- a/packages/core-mobile/app/hooks/browser/injectedProvider/approvalMethods.test.ts +++ b/packages/core-mobile/app/hooks/browser/injectedProvider/approvalMethods.test.ts @@ -18,7 +18,9 @@ describe('approvalMethods', () => { const AVALANCHE_SIGNING = [ 'avalanche_sendTransaction', 'avalanche_signTransaction', - 'avalanche_signMessage' + 'avalanche_signMessage', + // added to the RpcMethod enum in vm-module-types 4.x (agent identity) + 'avalanche_declareAgentIdentity' ] const CROSS_NAMESPACE = [ 'solana_signTransaction', diff --git a/packages/core-mobile/app/hooks/networks/utils/getNetworkContractTokens.ts b/packages/core-mobile/app/hooks/networks/utils/getNetworkContractTokens.ts index 72aa9c4f60..1514747ef3 100644 --- a/packages/core-mobile/app/hooks/networks/utils/getNetworkContractTokens.ts +++ b/packages/core-mobile/app/hooks/networks/utils/getNetworkContractTokens.ts @@ -1,5 +1,5 @@ import { Network } from '@avalabs/core-chains-sdk' -import { NetworkContractToken } from '@avalabs/vm-module-types' +import { NetworkContractToken, TokenType } from '@avalabs/vm-module-types' import { runAfterInteractions } from 'utils/runAfterInteractions' import ModuleManager from 'vmModule/ModuleManager' import { mapToVmNetwork } from 'vmModule/utils/mapToVmNetwork' @@ -15,5 +15,10 @@ export const getNetworkContractTokens = async ( return module.getTokens(mapToVmNetwork(network)) }) - return tokens ?? [] + // Hypercore spot tokens are not contract tokens (no EVM address) and are + // not supported by this app's token pipeline. + return (tokens ?? []).filter( + (token): token is NetworkContractToken => + token.type !== TokenType.HYPERCORE_SPOT + ) } diff --git a/packages/core-mobile/app/new/features/swap/utils/buildLocalToken.ts b/packages/core-mobile/app/new/features/swap/utils/buildLocalToken.ts index 7ad26d7b38..3ffa6d18c6 100644 --- a/packages/core-mobile/app/new/features/swap/utils/buildLocalToken.ts +++ b/packages/core-mobile/app/new/features/swap/utils/buildLocalToken.ts @@ -23,6 +23,12 @@ const resolveDecimals = ( return DEFAULT_TOKEN_DECIMALS } +// Hypercore spot tokens carry no EVM address, hence the `in` guard. +const getBalanceDataAddress = ( + balanceData: LocalTokenWithBalance | undefined +): string | undefined => + balanceData && 'address' in balanceData ? balanceData.address : undefined + export const buildLocalToken = ({ accountTokens, tokenInfo, @@ -60,7 +66,7 @@ export const buildLocalToken = ({ const address = isNative ? '' - : balanceData?.address ?? tokenInfo.platforms?.[caip2Id] ?? '' + : getBalanceDataAddress(balanceData) ?? tokenInfo.platforms?.[caip2Id] ?? '' // NATIVE_DECIMALS keys AVAX at 18 (C-Chain), but native AVAX on P/X-Chain is // 9-decimal nAVAX. Override so balances/amounts render at the chain's actual diff --git a/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.test.ts b/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.test.ts index ca5974ddef..75666d0daa 100644 --- a/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.test.ts +++ b/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.test.ts @@ -163,5 +163,15 @@ describe('getTokenAddress', () => { '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7' ) }) + + it('should return empty string for hypercore spot tokens (no address field)', () => { + const hypercoreToken = { + type: TokenType.HYPERCORE_SPOT, + symbol: 'HYPE', + index: 150 + } as unknown as TokenWithBalance + + expect(getTokenAddress(hypercoreToken)).toBe('') + }) }) }) diff --git a/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.ts b/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.ts index 133fa999e0..06dbb557b7 100644 --- a/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.ts +++ b/packages/core-mobile/app/new/features/swap/utils/getTokenAddress.ts @@ -4,5 +4,9 @@ export const getTokenAddress = (token?: TokenWithBalance): string => { if (!token) { return '' } - return token.type === TokenType.NATIVE ? token.symbol : token.address + if (token.type === TokenType.NATIVE) { + return token.symbol + } + // Hypercore spot tokens have no EVM address and are not swappable. + return 'address' in token ? token.address : '' } diff --git a/packages/core-mobile/app/services/balance/utils/getLocalTokenId.ts b/packages/core-mobile/app/services/balance/utils/getLocalTokenId.ts index 3516adb84b..f540ad836f 100644 --- a/packages/core-mobile/app/services/balance/utils/getLocalTokenId.ts +++ b/packages/core-mobile/app/services/balance/utils/getLocalTokenId.ts @@ -13,7 +13,13 @@ export function getLocalTokenId( return fallbackTokenId } - if (!token.address) { + // Hypercore spot tokens carry no address by design (identified by index) — + // fall back without logging. + if (token.type === TokenType.HYPERCORE_SPOT) { + return fallbackTokenId + } + + if (!('address' in token) || !token.address) { Logger.error('Token address is missing', { token }) return fallbackTokenId } diff --git a/packages/core-mobile/app/services/balance/utils/getLocalTokenid.test.ts b/packages/core-mobile/app/services/balance/utils/getLocalTokenid.test.ts index 93f27d2432..fe345763e1 100644 --- a/packages/core-mobile/app/services/balance/utils/getLocalTokenid.test.ts +++ b/packages/core-mobile/app/services/balance/utils/getLocalTokenid.test.ts @@ -3,6 +3,7 @@ import { NetworkContractToken, TokenType } from '@avalabs/vm-module-types' +import Logger from 'utils/Logger' import { getLocalTokenId } from './getLocalTokenId' describe('getLocalTokenId', () => { @@ -26,4 +27,16 @@ describe('getLocalTokenId', () => { | NetworkContractToken expect(getLocalTokenId(token)).toBe('ERC20-USDC') }) + + it('falls back to type-symbol for hypercore spot tokens without logging an error', () => { + const errorSpy = jest.spyOn(Logger, 'error') + const token = { + type: TokenType.HYPERCORE_SPOT, + symbol: 'HYPE', + index: 150 + } as unknown as TokenWithBalance | NetworkContractToken + expect(getLocalTokenId(token)).toBe('HYPERCORE_SPOT-HYPE') + expect(errorSpy).not.toHaveBeenCalled() + errorSpy.mockRestore() + }) }) diff --git a/packages/core-mobile/app/services/glacier/GlacierService.ts b/packages/core-mobile/app/services/glacier/GlacierService.ts index 76ddc87748..68fb5fbb2a 100644 --- a/packages/core-mobile/app/services/glacier/GlacierService.ts +++ b/packages/core-mobile/app/services/glacier/GlacierService.ts @@ -14,6 +14,7 @@ import { import Config from 'react-native-config' import Logger from 'utils/Logger' import { CORE_HEADERS } from 'utils/api/constants' +import { getCoreAuthHeaders } from 'utils/api/common/getCoreAuthHeaders' import { GlacierFetchHttpRequest } from './GlacierFetchHttpRequest' /** @@ -36,7 +37,12 @@ class GlacierService { private glacierSdk = new Glacier( { BASE: Config.GLACIER_URL, - HEADERS: CORE_HEADERS + // Resolved per request: the Glacier proxy (core-proxy-api) requires an + // AppCheck token (or Core API key) on every call. + HEADERS: async () => ({ + ...CORE_HEADERS, + ...(await getCoreAuthHeaders()) + }) }, GlacierFetchHttpRequest ) diff --git a/packages/core-mobile/app/utils/api/common/appCheckFetch.ts b/packages/core-mobile/app/utils/api/common/appCheckFetch.ts index 32d888cbc6..c03a9d9c74 100644 --- a/packages/core-mobile/app/utils/api/common/appCheckFetch.ts +++ b/packages/core-mobile/app/utils/api/common/appCheckFetch.ts @@ -3,7 +3,7 @@ import { fetch as expoFetch } from 'expo/fetch' import AppCheckService from 'services/fcm/AppCheckService' import Logger from 'utils/Logger' -const APPCHECK_HEADER = 'X-Firebase-AppCheck' +export const APPCHECK_HEADER = 'X-Firebase-AppCheck' const shouldRetry = (status: number): boolean => status === 401 || status === 403 diff --git a/packages/core-mobile/app/utils/api/common/getCoreAuthHeaders.test.ts b/packages/core-mobile/app/utils/api/common/getCoreAuthHeaders.test.ts new file mode 100644 index 0000000000..5af0b26ed1 --- /dev/null +++ b/packages/core-mobile/app/utils/api/common/getCoreAuthHeaders.test.ts @@ -0,0 +1,62 @@ +import AppCheckService from 'services/fcm/AppCheckService' +import { getCoreAuthHeaders } from './getCoreAuthHeaders' + +jest.mock('services/fcm/AppCheckService', () => ({ + getToken: jest.fn() +})) + +jest.mock('react-native-config', () => ({ + CORE_API_KEY: undefined +})) + +const Config = require('react-native-config') + +const mockGetToken = AppCheckService.getToken as jest.MockedFunction< + typeof AppCheckService.getToken +> + +describe('getCoreAuthHeaders', () => { + beforeEach(() => { + jest.clearAllMocks() + Config.CORE_API_KEY = undefined + }) + + it('returns the AppCheck token header', async () => { + mockGetToken.mockResolvedValue({ token: 'appcheck-token' } as Awaited< + ReturnType + >) + + await expect(getCoreAuthHeaders()).resolves.toEqual({ + 'X-Firebase-AppCheck': 'appcheck-token' + }) + }) + + it('includes the Core API key header when configured', async () => { + Config.CORE_API_KEY = 'core-api-key' + mockGetToken.mockResolvedValue({ token: 'appcheck-token' } as Awaited< + ReturnType + >) + + await expect(getCoreAuthHeaders()).resolves.toEqual({ + 'X-Firebase-AppCheck': 'appcheck-token', + 'x-core-api-key': 'core-api-key' + }) + }) + + it('re-reads the token on every call', async () => { + mockGetToken + .mockResolvedValueOnce({ token: 'token-1' } as Awaited< + ReturnType + >) + .mockResolvedValueOnce({ token: 'token-2' } as Awaited< + ReturnType + >) + + await expect(getCoreAuthHeaders()).resolves.toEqual({ + 'X-Firebase-AppCheck': 'token-1' + }) + await expect(getCoreAuthHeaders()).resolves.toEqual({ + 'X-Firebase-AppCheck': 'token-2' + }) + }) +}) diff --git a/packages/core-mobile/app/utils/api/common/getCoreAuthHeaders.ts b/packages/core-mobile/app/utils/api/common/getCoreAuthHeaders.ts new file mode 100644 index 0000000000..4ad23ea0b9 --- /dev/null +++ b/packages/core-mobile/app/utils/api/common/getCoreAuthHeaders.ts @@ -0,0 +1,25 @@ +import Config from 'react-native-config' +import AppCheckService from 'services/fcm/AppCheckService' +import { APPCHECK_HEADER } from 'utils/api/common/appCheckFetch' + +const CORE_API_KEY_HEADER = 'x-core-api-key' + +/** + * Resolves the auth headers required by core-proxy-api (e.g. the Glacier + * proxy): a Firebase AppCheck token, plus the Core API key when one is + * configured (dev/E2E builds — it both authorizes and bypasses rate limits). + * + * Meant to be invoked per request (e.g. as a glacier-sdk HEADERS resolver or + * the vm-modules `runtime.getAuthHeaders`) so the short-lived AppCheck token + * is re-read on every call. Unlike appCheckFetch, callers of this resolver + * get no 401-retry-with-fresh-token — the token cache makes that rare. + */ +export const getCoreAuthHeaders = async (): Promise> => { + const { token } = await AppCheckService.getToken() + return { + [APPCHECK_HEADER]: token, + ...(Config.CORE_API_KEY + ? { [CORE_API_KEY_HEADER]: Config.CORE_API_KEY } + : {}) + } +} diff --git a/packages/core-mobile/app/utils/publicKeys.ts b/packages/core-mobile/app/utils/publicKeys.ts index 0e2a45f93a..c24efb0425 100644 --- a/packages/core-mobile/app/utils/publicKeys.ts +++ b/packages/core-mobile/app/utils/publicKeys.ts @@ -6,6 +6,7 @@ export const emptyAddresses = (): Record => ({ [NetworkVMType.CoreEth]: '', [NetworkVMType.EVM]: '', [NetworkVMType.HVM]: '', + [NetworkVMType.HYPERCORE]: '', [NetworkVMType.PVM]: '', [NetworkVMType.SVM]: '' }) diff --git a/packages/core-mobile/app/vmModule/ModuleManager.ts b/packages/core-mobile/app/vmModule/ModuleManager.ts index da7a2fae77..992a9c0669 100644 --- a/packages/core-mobile/app/vmModule/ModuleManager.ts +++ b/packages/core-mobile/app/vmModule/ModuleManager.ts @@ -4,8 +4,10 @@ import Logger from 'utils/Logger' import { Environment, Module, - ConstructorParams + ConstructorParams, + RuntimeParams } from '@avalabs/vm-module-types' +import { getCoreAuthHeaders } from 'utils/api/common/getCoreAuthHeaders' import { NetworkVMType, Network, @@ -88,7 +90,9 @@ class ModuleManager { const environment = isDev ? Environment.DEV : Environment.PRODUCTION - const moduleInitParams: ConstructorParams = { + const moduleInitParams: ConstructorParams & { + runtime: Required> + } = { environment, approvalController, appInfo: { @@ -97,7 +101,11 @@ class ModuleManager { }, runtime: { fetch: global.fetch, - httpAgent: new http.Agent() + httpAgent: new http.Agent(), + // Required by EvmModule/AvalancheModule: their internal Glacier calls + // go through core-proxy-api, which needs AppCheck (or a Core API key) + // on every request. + getAuthHeaders: getCoreAuthHeaders } } diff --git a/packages/core-mobile/package.json b/packages/core-mobile/package.json index 105acd35f6..3ece05c231 100644 --- a/packages/core-mobile/package.json +++ b/packages/core-mobile/package.json @@ -27,9 +27,9 @@ "appium:smokeAndroid": "IS_SMOKE=true PLATFORM=android wdio run ./e2e-appium/wdio.conf.ts --mochaOpts.grep='\\[(s|S)moke\\]'" }, "dependencies": { - "@avalabs/avalanche-module": "3.9.0", + "@avalabs/avalanche-module": "4.0.0", "@avalabs/avalanchejs": "5.1.0-alpha.5", - "@avalabs/bitcoin-module": "3.9.0", + "@avalabs/bitcoin-module": "4.0.0", "@avalabs/bridge-unified": "4.4.1", "@avalabs/core-chains-sdk": "3.1.0-canary.672f5c3.0", "@avalabs/core-coingecko-sdk": "3.1.0-canary.672f5c3.0", @@ -38,15 +38,15 @@ "@avalabs/core-wallets-sdk": "3.1.0-canary.672f5c3.0", "@avalabs/crypto-nitro": "0.3.2", "@avalabs/crypto-sdk": "1.0.2", - "@avalabs/evm-module": "3.9.0", + "@avalabs/evm-module": "4.0.0", "@avalabs/fusion-sdk": "0.0.0-feat-enable-hvm-big-blocks-20260720201517", "@avalabs/glacier-sdk": "3.1.0-canary.672f5c3.0", "@avalabs/k2-alpine": "workspace:*", "@avalabs/perps-sdk": "0.0.0-fix-perps-unified-portfolio-ba-20260716132651", "@avalabs/prediction-market-sdk": "0.3.0", - "@avalabs/svm-module": "3.9.0", + "@avalabs/svm-module": "4.0.0", "@avalabs/types": "3.1.0-canary.672f5c3.0", - "@avalabs/vm-module-types": "3.9.0", + "@avalabs/vm-module-types": "4.0.0", "@babel/runtime": "7.25.7", "@bitcoinerlab/secp256k1": "1.2.0", "@blockaid/client": "0.48.0", diff --git a/yarn.lock b/yarn.lock index f2136cb2a2..7b8c6a0c37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -326,9 +326,9 @@ __metadata: languageName: node linkType: hard -"@avalabs/avalanche-module@npm:3.9.0": - version: 3.9.0 - resolution: "@avalabs/avalanche-module@npm:3.9.0" +"@avalabs/avalanche-module@npm:4.0.0": + version: 4.0.0 + resolution: "@avalabs/avalanche-module@npm:4.0.0" dependencies: "@avalabs/avalanchejs": 5.1.0-alpha.4 "@avalabs/core-chains-sdk": 3.1.0-alpha.87 @@ -339,12 +339,12 @@ __metadata: "@avalabs/crypto-sdk": 1.0.0 "@avalabs/glacier-sdk": 3.1.0-alpha.87 "@avalabs/types": 3.1.0-alpha.87 - "@avalabs/vm-module-types": 3.9.0 + "@avalabs/vm-module-types": 4.0.0 "@metamask/rpc-errors": 6.3.0 big.js: 6.2.1 bn.js: 5.2.1 zod: 3.23.8 - checksum: 0a3bef1df73d062fc19cd950c26224e0fe1007010d17800b98a8b80056972b352a410be196641eff8ff93eb1e767ab537cc18e4fc8c4911eb028a46e589fc178 + checksum: 02f2ac5d290936f7b54fe644dc85271b44501118358f5e67c98c2dd96ca6293b005e20eadcd6b0bf320ea0b85ca0a57084f07c6a689ee584db8a4ac28104a25f languageName: node linkType: hard @@ -361,21 +361,21 @@ __metadata: languageName: node linkType: hard -"@avalabs/bitcoin-module@npm:3.9.0": - version: 3.9.0 - resolution: "@avalabs/bitcoin-module@npm:3.9.0" +"@avalabs/bitcoin-module@npm:4.0.0": + version: 4.0.0 + resolution: "@avalabs/bitcoin-module@npm:4.0.0" dependencies: "@avalabs/core-coingecko-sdk": 3.1.0-alpha.87 "@avalabs/core-utils-sdk": 3.1.0-alpha.87 "@avalabs/core-wallets-sdk": 3.1.0-alpha.87 "@avalabs/crypto-sdk": 1.0.0 - "@avalabs/vm-module-types": 3.9.0 + "@avalabs/vm-module-types": 4.0.0 "@metamask/rpc-errors": 6.3.0 big.js: 6.2.1 bitcoinjs-lib: 5.2.0 bn.js: 5.2.1 zod: 3.23.8 - checksum: d122d92f99d5ea8c7f96805fe2ab156068b581161a5ce0fa43ba7599f4839fab412101cfcaabeb180be499634414054c5c1b29a3b4ba45f57df562af3b333abb + checksum: bc7036a13ca4187d13d3aad0683655af7b164dda47993d6b9a2ccebfd7730a656a44d34d05d17ffdc7a95acd9d62d8d78f5141e7c082319f4012f2a6f0988e72 languageName: node linkType: hard @@ -466,9 +466,9 @@ __metadata: version: 0.0.0-use.local resolution: "@avalabs/core-mobile@workspace:packages/core-mobile" dependencies: - "@avalabs/avalanche-module": 3.9.0 + "@avalabs/avalanche-module": 4.0.0 "@avalabs/avalanchejs": 5.1.0-alpha.5 - "@avalabs/bitcoin-module": 3.9.0 + "@avalabs/bitcoin-module": 4.0.0 "@avalabs/bridge-unified": 4.4.1 "@avalabs/core-chains-sdk": 3.1.0-canary.672f5c3.0 "@avalabs/core-coingecko-sdk": 3.1.0-canary.672f5c3.0 @@ -477,16 +477,16 @@ __metadata: "@avalabs/core-wallets-sdk": 3.1.0-canary.672f5c3.0 "@avalabs/crypto-nitro": 0.3.2 "@avalabs/crypto-sdk": 1.0.2 - "@avalabs/evm-module": 3.9.0 + "@avalabs/evm-module": 4.0.0 "@avalabs/fusion-sdk": 0.0.0-feat-enable-hvm-big-blocks-20260720201517 "@avalabs/glacier-sdk": 3.1.0-canary.672f5c3.0 "@avalabs/k2-alpine": "workspace:*" "@avalabs/perps-sdk": 0.0.0-fix-perps-unified-portfolio-ba-20260716132651 "@avalabs/prediction-market-sdk": 0.3.0 - "@avalabs/svm-module": 3.9.0 + "@avalabs/svm-module": 4.0.0 "@avalabs/tsconfig-mobile": "workspace:*" "@avalabs/types": 3.1.0-canary.672f5c3.0 - "@avalabs/vm-module-types": 3.9.0 + "@avalabs/vm-module-types": 4.0.0 "@aws-sdk/client-device-farm": 3.986.0 "@babel/core": 7.29.7 "@babel/plugin-proposal-nullish-coalescing-operator": 7.18.6 @@ -916,9 +916,9 @@ __metadata: languageName: node linkType: hard -"@avalabs/evm-module@npm:3.9.0": - version: 3.9.0 - resolution: "@avalabs/evm-module@npm:3.9.0" +"@avalabs/evm-module@npm:4.0.0": + version: 4.0.0 + resolution: "@avalabs/evm-module@npm:4.0.0" dependencies: "@avalabs/core-chains-sdk": 3.1.0-alpha.87 "@avalabs/core-coingecko-sdk": 3.1.0-alpha.87 @@ -928,7 +928,7 @@ __metadata: "@avalabs/crypto-sdk": 1.0.0 "@avalabs/glacier-sdk": 3.1.0-alpha.87 "@avalabs/types": 3.1.0-alpha.87 - "@avalabs/vm-module-types": 3.9.0 + "@avalabs/vm-module-types": 4.0.0 "@blockaid/client": 0.48.0 "@metamask/rpc-errors": 6.3.0 "@openzeppelin/contracts": 4.9.6 @@ -938,7 +938,7 @@ __metadata: zod: 3.23.8 peerDependencies: ethers: 6.13.5 - checksum: cf12237473467b58ae01681cb01b192ae47786b379806e0470a6a7ffcb3f9289b9e85085f8edae5f7a118a37a34575ab101ce4648b3f592852b3745888513be8 + checksum: 137759862a6301fc0a9e66fc1414c1d1a4ff8d982f7c8dfbefc41309af9d5a6290cfe4d913675d08d689bdc17e309bfb7f387ea5652dc98f95f26be33b6f106f languageName: node linkType: hard @@ -1102,16 +1102,16 @@ __metadata: languageName: node linkType: hard -"@avalabs/svm-module@npm:3.9.0": - version: 3.9.0 - resolution: "@avalabs/svm-module@npm:3.9.0" +"@avalabs/svm-module@npm:4.0.0": + version: 4.0.0 + resolution: "@avalabs/svm-module@npm:4.0.0" dependencies: "@avalabs/core-chains-sdk": 3.1.0-alpha.87 "@avalabs/core-coingecko-sdk": 3.1.0-alpha.87 "@avalabs/core-utils-sdk": 3.1.0-alpha.87 "@avalabs/core-wallets-sdk": 3.1.0-alpha.87 "@avalabs/crypto-sdk": 1.0.0 - "@avalabs/vm-module-types": 3.9.0 + "@avalabs/vm-module-types": 4.0.0 "@blockaid/client": 0.48.0 "@metamask/rpc-errors": 6.3.0 "@scure/base": 1.2.4 @@ -1122,7 +1122,7 @@ __metadata: "@wallet-standard/base": 1.1.0 "@wallet-standard/features": 1.1.0 zod: 3.23.8 - checksum: ca99f6a4a2df500c2a0781428dc30d0862e28b0c47dc4276f47e25f68cc1fc61cbbe96829024ed613cf71a780dc0cd6190337ecb213b632e5d2264047e1fa6ee + checksum: b9d5029d829cc392ce568acc1308cd6205a201cd8680c98c7063157843c1702cb28f65f3d095026f1fd940199575ec77296773cab7acec0b154fd2154c800fac languageName: node linkType: hard @@ -1146,9 +1146,9 @@ __metadata: languageName: node linkType: hard -"@avalabs/vm-module-types@npm:3.9.0": - version: 3.9.0 - resolution: "@avalabs/vm-module-types@npm:3.9.0" +"@avalabs/vm-module-types@npm:4.0.0": + version: 4.0.0 + resolution: "@avalabs/vm-module-types@npm:4.0.0" dependencies: "@avalabs/core-wallets-sdk": 3.1.0-alpha.87 "@avalabs/glacier-sdk": 3.1.0-alpha.87 @@ -1159,7 +1159,7 @@ __metadata: zod: 3.23.8 peerDependencies: ethers: 6.13.5 - checksum: 169683012377926a710924476b653fbe840c576fc44a509109e30eedca9b9d5148dbc8ac61a60364366ee1b1e85b809148fa4613db75a2b9a5e2c73f8322bf9b + checksum: 708f65be377719df1f459cb4a6c1c878bcf3d3179a089dab1c7a8d6e540440e88c1fab7a59c8de9320b7a733ee8365d7fca1a8725770e7bf658b2b100f1a0d1f languageName: node linkType: hard @@ -37101,7 +37101,7 @@ react-native-webview@ava-labs/react-native-webview: peerDependencies: react: "*" react-native: "*" - checksum: e08d1254d04f3074970b63cdf0a363d6b189009270d457e868a26ef534addd69b320b85bef2a22e4eddb79006751bded431b56aaf2baf41976a6d0a5a2a2b91e + checksum: 57322e733d20b38881da9514a1ebb03a24a2457ed59683e4f714630c2a0ab29eb9981ad9acb02d7b7b32d7a0f5c02791146fc23c13a39c8254f7d0437844dcb4 languageName: node linkType: hard