diff --git a/packages/accounts-controller/CHANGELOG.md b/packages/accounts-controller/CHANGELOG.md index 63cffecab42..aa34c739877 100644 --- a/packages/accounts-controller/CHANGELOG.md +++ b/packages/accounts-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Bump `@metamask/keyring-internal-api` from `^4.0.1` to `^4.0.2` ([#5356](https://github.com/MetaMask/core/pull/5356)) + ## [24.0.0] ### Added diff --git a/packages/accounts-controller/package.json b/packages/accounts-controller/package.json index 1c7a002c13c..41b1280ebc0 100644 --- a/packages/accounts-controller/package.json +++ b/packages/accounts-controller/package.json @@ -51,7 +51,7 @@ "@metamask/base-controller": "^8.0.0", "@metamask/eth-snap-keyring": "^10.0.0", "@metamask/keyring-api": "^17.0.0", - "@metamask/keyring-internal-api": "^4.0.1", + "@metamask/keyring-internal-api": "^4.0.2", "@metamask/network-controller": "^22.2.1", "@metamask/snaps-sdk": "^6.17.1", "@metamask/snaps-utils": "^8.10.0", diff --git a/packages/assets-controllers/package.json b/packages/assets-controllers/package.json index 10c3e9b73a5..555f8e354a5 100644 --- a/packages/assets-controllers/package.json +++ b/packages/assets-controllers/package.json @@ -82,8 +82,8 @@ "@metamask/auto-changelog": "^3.4.4", "@metamask/ethjs-provider-http": "^0.3.0", "@metamask/keyring-controller": "^19.2.0", - "@metamask/keyring-internal-api": "^4.0.1", - "@metamask/keyring-snap-client": "^3.0.3", + "@metamask/keyring-internal-api": "^4.0.2", + "@metamask/keyring-snap-client": "^4.0.0", "@metamask/network-controller": "^22.2.1", "@metamask/permission-controller": "^11.0.6", "@metamask/preferences-controller": "^15.0.2", diff --git a/packages/keyring-controller/CHANGELOG.md b/packages/keyring-controller/CHANGELOG.md index 5bc4dc2266c..2efe9c3b844 100644 --- a/packages/keyring-controller/CHANGELOG.md +++ b/packages/keyring-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Bump `@metamask/keyring-internal-api` from `^4.0.1` to `^4.0.2` ([#5356](https://github.com/MetaMask/core/pull/5356)) + ## [19.2.0] ### Added diff --git a/packages/keyring-controller/package.json b/packages/keyring-controller/package.json index fb61016975c..12fc5ed935b 100644 --- a/packages/keyring-controller/package.json +++ b/packages/keyring-controller/package.json @@ -55,7 +55,7 @@ "@metamask/eth-sig-util": "^8.2.0", "@metamask/eth-simple-keyring": "^8.1.0", "@metamask/keyring-api": "^17.0.0", - "@metamask/keyring-internal-api": "^4.0.1", + "@metamask/keyring-internal-api": "^4.0.2", "@metamask/utils": "^11.2.0", "async-mutex": "^0.5.0", "ethereumjs-wallet": "^1.0.1", diff --git a/packages/multichain-transactions-controller/CHANGELOG.md b/packages/multichain-transactions-controller/CHANGELOG.md index 55ca0ede115..d4e537eaa6e 100644 --- a/packages/multichain-transactions-controller/CHANGELOG.md +++ b/packages/multichain-transactions-controller/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Bump `@metamask/keyring-internal-api` from `^4.0.1` to `^4.0.2` ([#5356](https://github.com/MetaMask/core/pull/5356)) +- Bump `@metamask/keyring-snap-client` from `^3.0.3` to `^4.0.0` ([#5356](https://github.com/MetaMask/core/pull/5356)) + ## [0.4.0] ### Changed diff --git a/packages/multichain-transactions-controller/package.json b/packages/multichain-transactions-controller/package.json index 6283583cd44..8ae95b7a174 100644 --- a/packages/multichain-transactions-controller/package.json +++ b/packages/multichain-transactions-controller/package.json @@ -49,8 +49,8 @@ "dependencies": { "@metamask/base-controller": "^8.0.0", "@metamask/keyring-api": "^17.0.0", - "@metamask/keyring-internal-api": "^4.0.1", - "@metamask/keyring-snap-client": "^3.0.3", + "@metamask/keyring-internal-api": "^4.0.2", + "@metamask/keyring-snap-client": "^4.0.0", "@metamask/polling-controller": "^12.0.3", "@metamask/snaps-controllers": "^9.19.0", "@metamask/snaps-sdk": "^6.17.1", diff --git a/packages/profile-sync-controller/package.json b/packages/profile-sync-controller/package.json index 787731e0fa1..20bf4152272 100644 --- a/packages/profile-sync-controller/package.json +++ b/packages/profile-sync-controller/package.json @@ -117,7 +117,7 @@ "@lavamoat/preinstall-always-fail": "^2.1.0", "@metamask/accounts-controller": "^24.0.0", "@metamask/auto-changelog": "^3.4.4", - "@metamask/keyring-internal-api": "^4.0.1", + "@metamask/keyring-internal-api": "^4.0.2", "@metamask/providers": "^18.1.1", "@metamask/snaps-controllers": "^9.19.0", "@types/jest": "^27.4.1", diff --git a/packages/token-search-discovery-controller/CHANGELOG.md b/packages/token-search-discovery-controller/CHANGELOG.md index 0176ad20743..ef9c1fad4d3 100644 --- a/packages/token-search-discovery-controller/CHANGELOG.md +++ b/packages/token-search-discovery-controller/CHANGELOG.md @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- All param types (e.g. `TokenSearchParams`, `TrendingTokensParams`, etc.) inherit from `ParamsBase` +- Add eponymous methods to the `TokenDiscoveryApiService` + - Add `getTopGainersByChains` + - Add `getTopLosersByChains` + +### Changed + +- **BREAKING:** Renamed `TokenTrendingResponseItem` name to `MoralisTokenResponseItem` + ## [2.1.0] ### Added diff --git a/packages/token-search-discovery-controller/src/index.ts b/packages/token-search-discovery-controller/src/index.ts index 1ac1c2f0287..b336d93605f 100644 --- a/packages/token-search-discovery-controller/src/index.ts +++ b/packages/token-search-discovery-controller/src/index.ts @@ -5,9 +5,11 @@ export type { } from './token-search-discovery-controller'; export type { TokenSearchResponseItem, - TokenTrendingResponseItem, + MoralisTokenResponseItem, TokenSearchParams, TrendingTokensParams, + TopGainersParams, + TopLosersParams, } from './types'; export { AbstractTokenSearchApiService } from './token-search-api-service/abstract-token-search-api-service'; diff --git a/packages/token-search-discovery-controller/src/token-discovery-api-service/abstract-token-discovery-api-service.ts b/packages/token-search-discovery-controller/src/token-discovery-api-service/abstract-token-discovery-api-service.ts index c676b91dd1d..9a4a8970475 100644 --- a/packages/token-search-discovery-controller/src/token-discovery-api-service/abstract-token-discovery-api-service.ts +++ b/packages/token-search-discovery-controller/src/token-discovery-api-service/abstract-token-discovery-api-service.ts @@ -1,4 +1,9 @@ -import type { TokenTrendingResponseItem } from '../types'; +import type { + MoralisTokenResponseItem, + TrendingTokensParams, + TopLosersParams, + TopGainersParams, +} from '../types'; /** * Abstract class for fetching token discovery results. @@ -10,8 +15,15 @@ export abstract class AbstractTokenDiscoveryApiService { * @param params - Optional parameters including chains and limit * @returns A promise resolving to an array of {@link TokenTrendingResponseItem} */ - abstract getTrendingTokensByChains(params: { - chains?: string[]; - limit?: string; - }): Promise; + abstract getTrendingTokensByChains( + params?: TrendingTokensParams, + ): Promise; + + abstract getTopLosersByChains( + params?: TopLosersParams, + ): Promise; + + abstract getTopGainersByChains( + params?: TopGainersParams, + ): Promise; } diff --git a/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.test.ts b/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.test.ts index 874f67463e1..60620114ac3 100644 --- a/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.test.ts +++ b/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.test.ts @@ -2,11 +2,11 @@ import nock, { cleanAll } from 'nock'; import { TokenDiscoveryApiService } from './token-discovery-api-service'; import { TEST_API_URLS } from '../test/constants'; -import type { TokenTrendingResponseItem } from '../types'; +import type { MoralisTokenResponseItem } from '../types'; describe('TokenDiscoveryApiService', () => { let service: TokenDiscoveryApiService; - const mockTrendingResponse: TokenTrendingResponseItem[] = [ + const mockTrendingResponse: MoralisTokenResponseItem[] = [ { chain_id: '1', token_address: '0x123', @@ -124,4 +124,110 @@ describe('TokenDiscoveryApiService', () => { expect(results).toStrictEqual(mockTrendingResponse); }); }); + + describe('getTopGainersByChains', () => { + it('should return top gainers results', async () => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get('/tokens-search/top-gainers-by-chains') + .reply(200, mockTrendingResponse); + + const results = await service.getTopGainersByChains({}); + expect(results).toStrictEqual(mockTrendingResponse); + }); + + it('should handle API errors', async () => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get('/tokens-search/top-gainers-by-chains') + .reply(500, 'Server Error'); + + await expect(service.getTopGainersByChains({})).rejects.toThrow( + 'Portfolio API request failed with status: 500', + ); + }); + + it.each([ + { + params: { chains: ['1'], limit: '5' }, + expectedPath: '/tokens-search/top-gainers-by-chains?chains=1&limit=5', + }, + { + params: { chains: ['1', '137'] }, + expectedPath: '/tokens-search/top-gainers-by-chains?chains=1,137', + }, + ])( + 'should construct correct URL for params: $params', + async ({ params, expectedPath }) => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get(expectedPath) + .reply(200, mockTrendingResponse); + + const result = await service.getTopGainersByChains(params); + expect(result).toStrictEqual(mockTrendingResponse); + }, + ); + }); + + describe('getTopLosersByChains', () => { + it('should return top losers results', async () => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get('/tokens-search/top-losers-by-chains') + .reply(200, mockTrendingResponse); + + const results = await service.getTopLosersByChains({}); + expect(results).toStrictEqual(mockTrendingResponse); + }); + + it('should handle API errors', async () => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get('/tokens-search/top-losers-by-chains') + .reply(500, 'Server Error'); + + await expect(service.getTopLosersByChains({})).rejects.toThrow( + 'Portfolio API request failed with status: 500', + ); + }); + + it.each([ + { + params: { chains: ['1'], limit: '5' }, + expectedPath: '/tokens-search/top-losers-by-chains?chains=1&limit=5', + }, + { + params: { chains: ['1', '137'] }, + expectedPath: '/tokens-search/top-losers-by-chains?chains=1,137', + }, + ])( + 'should construct correct URL for params: $params', + async ({ params, expectedPath }) => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get(expectedPath) + .reply(200, mockTrendingResponse); + + const result = await service.getTopLosersByChains(params); + expect(result).toStrictEqual(mockTrendingResponse); + }, + ); + }); + + describe('error handling', () => { + it('should handle network errors', async () => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get('/tokens-search/trending-by-chains') + .reply(500, 'Server Error'); + + await expect(service.getTrendingTokensByChains({})).rejects.toThrow( + 'Portfolio API request failed with status: 500', + ); + }); + + it('should handle malformed JSON responses', async () => { + nock(TEST_API_URLS.PORTFOLIO_API) + .get('/tokens-search/trending-by-chains') + .reply(200, 'invalid json'); + + await expect(service.getTrendingTokensByChains({})).rejects.toThrow( + 'invalid json response body at', + ); + }); + }); }); diff --git a/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.ts b/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.ts index c493dd6d80f..5a2d6e80570 100644 --- a/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.ts +++ b/packages/token-search-discovery-controller/src/token-discovery-api-service/token-discovery-api-service.ts @@ -1,5 +1,10 @@ import { AbstractTokenDiscoveryApiService } from './abstract-token-discovery-api-service'; -import type { TokenTrendingResponseItem, TrendingTokensParams } from '../types'; +import type { + MoralisTokenResponseItem, + TopGainersParams, + TopLosersParams, + TrendingTokensParams, +} from '../types'; export class TokenDiscoveryApiService extends AbstractTokenDiscoveryApiService { readonly #baseUrl: string; @@ -13,14 +18,17 @@ export class TokenDiscoveryApiService extends AbstractTokenDiscoveryApiService { } async getTrendingTokensByChains( - trendingTokensParams: TrendingTokensParams, - ): Promise { + trendingTokensParams?: TrendingTokensParams, + ): Promise { const url = new URL('/tokens-search/trending-by-chains', this.#baseUrl); - if (trendingTokensParams.chains && trendingTokensParams.chains.length > 0) { + if ( + trendingTokensParams?.chains && + trendingTokensParams.chains.length > 0 + ) { url.searchParams.append('chains', trendingTokensParams.chains.join()); } - if (trendingTokensParams.limit) { + if (trendingTokensParams?.limit) { url.searchParams.append('limit', trendingTokensParams.limit); } @@ -39,4 +47,60 @@ export class TokenDiscoveryApiService extends AbstractTokenDiscoveryApiService { return response.json(); } + + async getTopLosersByChains( + topLosersParams?: TopLosersParams, + ): Promise { + const url = new URL('/tokens-search/top-losers-by-chains', this.#baseUrl); + + if (topLosersParams?.chains && topLosersParams.chains.length > 0) { + url.searchParams.append('chains', topLosersParams.chains.join()); + } + if (topLosersParams?.limit) { + url.searchParams.append('limit', topLosersParams.limit); + } + + const response = await fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + throw new Error( + `Portfolio API request failed with status: ${response.status}`, + ); + } + + return response.json(); + } + + async getTopGainersByChains( + topGainersParams?: TopGainersParams, + ): Promise { + const url = new URL('/tokens-search/top-gainers-by-chains', this.#baseUrl); + + if (topGainersParams?.chains && topGainersParams.chains.length > 0) { + url.searchParams.append('chains', topGainersParams.chains.join()); + } + if (topGainersParams?.limit) { + url.searchParams.append('limit', topGainersParams.limit); + } + + const response = await fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + throw new Error( + `Portfolio API request failed with status: ${response.status}`, + ); + } + + return response.json(); + } } diff --git a/packages/token-search-discovery-controller/src/token-search-discovery-controller.test.ts b/packages/token-search-discovery-controller/src/token-search-discovery-controller.test.ts index aa75cab4071..fbd4f36f2a3 100644 --- a/packages/token-search-discovery-controller/src/token-search-discovery-controller.test.ts +++ b/packages/token-search-discovery-controller/src/token-search-discovery-controller.test.ts @@ -9,7 +9,7 @@ import { import type { TokenSearchDiscoveryControllerMessenger } from './token-search-discovery-controller'; import type { TokenSearchResponseItem, - TokenTrendingResponseItem, + MoralisTokenResponseItem, } from './types'; const controllerName = 'TokenSearchDiscoveryController'; @@ -42,7 +42,7 @@ describe('TokenSearchDiscoveryController', () => { }, ]; - const mockTrendingResults: TokenTrendingResponseItem[] = [ + const mockTrendingResults: MoralisTokenResponseItem[] = [ { chain_id: '1', token_address: '0x123', @@ -102,7 +102,15 @@ describe('TokenSearchDiscoveryController', () => { } class MockTokenDiscoveryService extends AbstractTokenDiscoveryApiService { - async getTrendingTokensByChains(): Promise { + async getTrendingTokensByChains(): Promise { + return mockTrendingResults; + } + + async getTopGainersByChains(): Promise { + return mockTrendingResults; + } + + async getTopLosersByChains(): Promise { return mockTrendingResults; } } @@ -161,6 +169,20 @@ describe('TokenSearchDiscoveryController', () => { }); }); + describe('getTopGainers', () => { + it('should return top gainers results', async () => { + const results = await mainController.getTopGainers({}); + expect(results).toStrictEqual(mockTrendingResults); + }); + }); + + describe('getTopLosers', () => { + it('should return top losers results', async () => { + const results = await mainController.getTopLosers({}); + expect(results).toStrictEqual(mockTrendingResults); + }); + }); + describe('error handling', () => { class ErrorTokenSearchService extends AbstractTokenSearchApiService { async searchTokens(): Promise { @@ -169,7 +191,15 @@ describe('TokenSearchDiscoveryController', () => { } class ErrorTokenDiscoveryService extends AbstractTokenDiscoveryApiService { - async getTrendingTokensByChains(): Promise { + async getTrendingTokensByChains(): Promise { + return []; + } + + async getTopGainersByChains(): Promise { + return []; + } + + async getTopLosersByChains(): Promise { return []; } } diff --git a/packages/token-search-discovery-controller/src/token-search-discovery-controller.ts b/packages/token-search-discovery-controller/src/token-search-discovery-controller.ts index cf38137072b..52769e44d5c 100644 --- a/packages/token-search-discovery-controller/src/token-search-discovery-controller.ts +++ b/packages/token-search-discovery-controller/src/token-search-discovery-controller.ts @@ -10,8 +10,10 @@ import type { AbstractTokenSearchApiService } from './token-search-api-service/a import type { TokenSearchParams, TokenSearchResponseItem, - TokenTrendingResponseItem, + MoralisTokenResponseItem, TrendingTokensParams, + TopGainersParams, + TopLosersParams, } from './types'; // === GENERAL === @@ -154,7 +156,19 @@ export class TokenSearchDiscoveryController extends BaseController< async getTrendingTokens( params: TrendingTokensParams, - ): Promise { + ): Promise { return this.#tokenDiscoveryService.getTrendingTokensByChains(params); } + + async getTopGainers( + params: TopGainersParams, + ): Promise { + return this.#tokenDiscoveryService.getTopGainersByChains(params); + } + + async getTopLosers( + params: TopLosersParams, + ): Promise { + return this.#tokenDiscoveryService.getTopLosersByChains(params); + } } diff --git a/packages/token-search-discovery-controller/src/types.ts b/packages/token-search-discovery-controller/src/types.ts index ff8757951ff..c814fae1e19 100644 --- a/packages/token-search-discovery-controller/src/types.ts +++ b/packages/token-search-discovery-controller/src/types.ts @@ -1,9 +1,22 @@ -export type TokenSearchParams = { +// Function params + +type ParamsBase = { chains?: string[]; - query?: string; limit?: string; }; +export type TokenSearchParams = ParamsBase & { + query?: string; +}; + +export type TrendingTokensParams = ParamsBase; + +export type TopLosersParams = ParamsBase; + +export type TopGainersParams = ParamsBase; + +// API response types + export type TokenSearchResponseItem = { tokenAddress: string; chainId: string; @@ -16,7 +29,7 @@ export type TokenSearchResponseItem = { logoUrl?: string; }; -export type TokenTrendingResponseItem = { +export type MoralisTokenResponseItem = { chain_id: string; token_address: string; token_logo: string; @@ -66,8 +79,3 @@ export type TokenTrendingResponseItem = { '1M': number | null; }; }; - -export type TrendingTokensParams = { - chains?: string[]; - limit?: string; -}; diff --git a/yarn.lock b/yarn.lock index 35ed23ce69c..86a3b4cfc3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2350,7 +2350,7 @@ __metadata: "@metamask/eth-snap-keyring": "npm:^10.0.0" "@metamask/keyring-api": "npm:^17.0.0" "@metamask/keyring-controller": "npm:^19.2.0" - "@metamask/keyring-internal-api": "npm:^4.0.1" + "@metamask/keyring-internal-api": "npm:^4.0.2" "@metamask/network-controller": "npm:^22.2.1" "@metamask/providers": "npm:^18.1.1" "@metamask/snaps-controllers": "npm:^9.19.0" @@ -2472,8 +2472,8 @@ __metadata: "@metamask/ethjs-provider-http": "npm:^0.3.0" "@metamask/keyring-api": "npm:^17.0.0" "@metamask/keyring-controller": "npm:^19.2.0" - "@metamask/keyring-internal-api": "npm:^4.0.1" - "@metamask/keyring-snap-client": "npm:^3.0.3" + "@metamask/keyring-internal-api": "npm:^4.0.2" + "@metamask/keyring-snap-client": "npm:^4.0.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" "@metamask/network-controller": "npm:^22.2.1" "@metamask/permission-controller": "npm:^11.0.6" @@ -3298,18 +3298,6 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-api@npm:^16.1.0": - version: 16.1.0 - resolution: "@metamask/keyring-api@npm:16.1.0" - dependencies: - "@metamask/keyring-utils": "npm:^2.0.0" - "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.1.0" - bech32: "npm:^2.0.0" - checksum: 10/6a3877e8e70b02728d4dc056a0eab5d961dd3089236539827ffb4194a3acdc9c71436cc3248ed1d6bf62d3dc0b6e69e2379177db6d690af1a77d4698767324fd - languageName: node - linkType: hard - "@metamask/keyring-api@npm:^17.0.0": version: 17.0.0 resolution: "@metamask/keyring-api@npm:17.0.0" @@ -3340,7 +3328,7 @@ __metadata: "@metamask/eth-sig-util": "npm:^8.2.0" "@metamask/eth-simple-keyring": "npm:^8.1.0" "@metamask/keyring-api": "npm:^17.0.0" - "@metamask/keyring-internal-api": "npm:^4.0.1" + "@metamask/keyring-internal-api": "npm:^4.0.2" "@metamask/scure-bip39": "npm:^2.1.1" "@metamask/utils": "npm:^11.2.0" "@types/jest": "npm:^27.4.1" @@ -3360,7 +3348,7 @@ __metadata: languageName: unknown linkType: soft -"@metamask/keyring-internal-api@npm:^4.0.1, @metamask/keyring-internal-api@npm:^4.0.2": +"@metamask/keyring-internal-api@npm:^4.0.2": version: 4.0.2 resolution: "@metamask/keyring-internal-api@npm:4.0.2" dependencies: @@ -3384,22 +3372,6 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-snap-client@npm:^3.0.3": - version: 3.0.3 - resolution: "@metamask/keyring-snap-client@npm:3.0.3" - dependencies: - "@metamask/keyring-api": "npm:^16.1.0" - "@metamask/keyring-utils": "npm:^2.0.0" - "@metamask/superstruct": "npm:^3.1.0" - "@types/uuid": "npm:^9.0.8" - uuid: "npm:^9.0.1" - webextension-polyfill: "npm:^0.12.0" - peerDependencies: - "@metamask/providers": ^18.3.1 - checksum: 10/f408b587380216b77ca0ff4d6f37c64d933392c6bac950c77a9df4a858dbc61c981a41b2cf3870b9041cb210566087e83398f3e7bbc82f39c0eb952eb990a3c8 - languageName: node - linkType: hard - "@metamask/keyring-snap-client@npm:^4.0.0": version: 4.0.0 resolution: "@metamask/keyring-snap-client@npm:4.0.0" @@ -3510,8 +3482,8 @@ __metadata: "@metamask/base-controller": "npm:^8.0.0" "@metamask/keyring-api": "npm:^17.0.0" "@metamask/keyring-controller": "npm:^19.2.0" - "@metamask/keyring-internal-api": "npm:^4.0.1" - "@metamask/keyring-snap-client": "npm:^3.0.3" + "@metamask/keyring-internal-api": "npm:^4.0.2" + "@metamask/keyring-snap-client": "npm:^4.0.0" "@metamask/polling-controller": "npm:^12.0.3" "@metamask/snaps-controllers": "npm:^9.19.0" "@metamask/snaps-sdk": "npm:^6.17.1" @@ -3840,7 +3812,7 @@ __metadata: "@metamask/base-controller": "npm:^8.0.0" "@metamask/keyring-api": "npm:^17.0.0" "@metamask/keyring-controller": "npm:^19.2.0" - "@metamask/keyring-internal-api": "npm:^4.0.1" + "@metamask/keyring-internal-api": "npm:^4.0.2" "@metamask/network-controller": "npm:^22.2.1" "@metamask/providers": "npm:^18.1.1" "@metamask/snaps-controllers": "npm:^9.19.0"