From 47c7310446d04bfd2bf57be648ad83a47100ec1b Mon Sep 17 00:00:00 2001 From: gantunesr <17601467+gantunesr@users.noreply.github.com> Date: Fri, 24 Jan 2025 09:56:21 -0300 Subject: [PATCH 1/9] feat add multichain-network-controller package --- .../CHANGELOG.md | 10 + .../multichain-network-controller/LICENSE | 20 ++ .../multichain-network-controller/README.md | 15 ++ .../jest.config.js | 26 +++ .../package.json | 71 +++++++ .../src/constants.ts | 45 ++++ .../src/index.ts | 25 +++ .../src/multichain-network-controller.ts | 193 ++++++++++++++++++ .../tsconfig.build.json | 12 ++ .../tsconfig.json | 25 +++ .../typedoc.json | 7 + yarn.lock | 22 ++ 12 files changed, 471 insertions(+) create mode 100644 packages/multichain-network-controller/CHANGELOG.md create mode 100644 packages/multichain-network-controller/LICENSE create mode 100644 packages/multichain-network-controller/README.md create mode 100644 packages/multichain-network-controller/jest.config.js create mode 100644 packages/multichain-network-controller/package.json create mode 100644 packages/multichain-network-controller/src/constants.ts create mode 100644 packages/multichain-network-controller/src/index.ts create mode 100644 packages/multichain-network-controller/src/multichain-network-controller.ts create mode 100644 packages/multichain-network-controller/tsconfig.build.json create mode 100644 packages/multichain-network-controller/tsconfig.json create mode 100644 packages/multichain-network-controller/typedoc.json diff --git a/packages/multichain-network-controller/CHANGELOG.md b/packages/multichain-network-controller/CHANGELOG.md new file mode 100644 index 00000000000..b518709c7b8 --- /dev/null +++ b/packages/multichain-network-controller/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +[Unreleased]: https://github.com/MetaMask/core/ diff --git a/packages/multichain-network-controller/LICENSE b/packages/multichain-network-controller/LICENSE new file mode 100644 index 00000000000..6f8bff03fc4 --- /dev/null +++ b/packages/multichain-network-controller/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2024 MetaMask + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE diff --git a/packages/multichain-network-controller/README.md b/packages/multichain-network-controller/README.md new file mode 100644 index 00000000000..6bdb2c13233 --- /dev/null +++ b/packages/multichain-network-controller/README.md @@ -0,0 +1,15 @@ +# `@metamask/multichain-network-controller` + +... + +## Installation + +`yarn add @metamask/multichain-network-controller` + +or + +`npm install @metamask/multichain-network-controller` + +## Contributing + +This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/core#readme). diff --git a/packages/multichain-network-controller/jest.config.js b/packages/multichain-network-controller/jest.config.js new file mode 100644 index 00000000000..ca084133399 --- /dev/null +++ b/packages/multichain-network-controller/jest.config.js @@ -0,0 +1,26 @@ +/* + * For a detailed explanation regarding each configuration property and type check, visit: + * https://jestjs.io/docs/configuration + */ + +const merge = require('deepmerge'); +const path = require('path'); + +const baseConfig = require('../../jest.config.packages'); + +const displayName = path.basename(__dirname); + +module.exports = merge(baseConfig, { + // The display name when running multiple projects + displayName, + + // An object that configures minimum threshold enforcement for coverage results + coverageThreshold: { + global: { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, +}); diff --git a/packages/multichain-network-controller/package.json b/packages/multichain-network-controller/package.json new file mode 100644 index 00000000000..b95e9453ec6 --- /dev/null +++ b/packages/multichain-network-controller/package.json @@ -0,0 +1,71 @@ +{ + "name": "@metamask/multichain-network-controller", + "version": "0.0.0", + "private": true, + "description": "Multichain network controller", + "keywords": [ + "MetaMask", + "Ethereum" + ], + "homepage": "https://github.com/MetaMask/core/tree/main/packages/multichain-network-controller#readme", + "bugs": { + "url": "https://github.com/MetaMask/core/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/MetaMask/core.git" + }, + "license": "MIT", + "sideEffects": false, + "exports": { + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.cts", + "files": [ + "dist/" + ], + "scripts": { + "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references", + "build:docs": "typedoc", + "changelog:update": "../../scripts/update-changelog.sh @metamask/multichain-network-controller", + "changelog:validate": "../../scripts/validate-changelog.sh @metamask/multichain-network-controller", + "since-latest-release": "../../scripts/since-latest-release.sh", + "test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter", + "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache", + "test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose", + "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch" + }, + "dependencies": { + "@metamask/base-controller": "^7.1.1", + "@metamask/utils": "^11.0.1" + }, + "devDependencies": { + "@metamask/accounts-controller": "^21.0.1", + "@metamask/auto-changelog": "^3.4.4", + "@metamask/controller-utils": "^11.4.5", + "@metamask/network-controller": "^22.1.1", + "@types/jest": "^27.4.1", + "deepmerge": "^4.2.2", + "immer": "^9.0.6", + "jest": "^27.5.1", + "nock": "^13.3.1", + "ts-jest": "^27.1.4", + "typedoc": "^0.24.8", + "typedoc-plugin-missing-exports": "^2.0.0", + "typescript": "~5.2.2" + }, + "engines": { + "node": "^18.18 || >=20" + } +} diff --git a/packages/multichain-network-controller/src/constants.ts b/packages/multichain-network-controller/src/constants.ts new file mode 100644 index 00000000000..7c45a68e2f5 --- /dev/null +++ b/packages/multichain-network-controller/src/constants.ts @@ -0,0 +1,45 @@ +import { NetworkStatus } from '@metamask/network-controller'; + +import type { + MultichainNetworkConfiguration, + MultichainNetworkMetadata, +} from './multichain-network-controller'; + +export const bitcoinCaip2ChainId = 'bip122:000000000019d6689c085ae165831e93'; +export const solanaCaip2ChainId = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'; + +export const multichainNetworkConfigurations: Record = { + bitcoinCaip2ChainId: { + chainId: bitcoinCaip2ChainId, + + name: 'Bitcoin Mainnet', + + blockExplorerUrls: [], + + nativeCurrency: 'BTC', + + isEvm: false, + }, + solanaCaip2ChainId: { + chainId: solanaCaip2ChainId, + + name: 'Solana Mainnet', + + blockExplorerUrls: [], + + nativeCurrency: 'SOL', + + isEvm: false, + }, +}; + +export const networksMetadata: Record = { + bitcoinCaip2ChainId: { + features: [], + status: NetworkStatus.Available, + }, + solanaCaip2ChainId: { + features: [], + status: NetworkStatus.Available, + }, +}; diff --git a/packages/multichain-network-controller/src/index.ts b/packages/multichain-network-controller/src/index.ts new file mode 100644 index 00000000000..a6741ec62c0 --- /dev/null +++ b/packages/multichain-network-controller/src/index.ts @@ -0,0 +1,25 @@ +export type { + GasPricesControllerActions, + GasPricesControllerEvents, + GasPricesControllerGetStateAction, + GasPricesControllerMessenger, + GasPricesControllerState, + GasPricesControllerStateChangeEvent, +} from './gas-prices-controller'; +export { + getDefaultGasPricesControllerState, + GasPricesController, +} from './gas-prices-controller'; +export type { + PetNamesControllerActions, + PetNamesControllerEvents, + PetNamesControllerGetStateAction, + PetNamesControllerMessenger, + PetNamesControllerState, + PetNamesControllerStateChangeEvent, +} from './multichain-network-controller'; +export { + getDefaultPetNamesControllerState, + PetNamesController, +} from './multichain-network-controller'; +export { GasPricesService } from './gas-prices-service/gas-prices-service'; diff --git a/packages/multichain-network-controller/src/multichain-network-controller.ts b/packages/multichain-network-controller/src/multichain-network-controller.ts new file mode 100644 index 00000000000..7389a2eb848 --- /dev/null +++ b/packages/multichain-network-controller/src/multichain-network-controller.ts @@ -0,0 +1,193 @@ +import type { AccountsControllerSetSelectedAccountAction } from '@metamask/accounts-controller'; +import { + BaseController, + type ControllerGetStateAction, + type ControllerStateChangeEvent, + type RestrictedControllerMessenger, +} from '@metamask/base-controller'; +import type { + NetworkStatus, + NetworkControllerGetNetworkConfigurationByNetworkClientId, + NetworkControllerSetActiveNetworkAction, + NetworkControllerGetStateAction, + NetworkControllerStateChangeEvent, +} from '@metamask/network-controller'; +import type { Draft } from 'immer'; + +import { + bitcoinCaip2ChainId, + multichainNetworkConfigurations, + networksMetadata, +} from './constants'; + +const controllerName = 'MultichainNetworkController'; + +export type MultichainNetworkMetadata = { + features: string[]; + status: NetworkStatus; +}; + +export type MultichainNetworkConfiguration = { + chainId: string; // Should be Caip2 type + name: string; + nativeCurrency: string; // Should be Caip19 type + blockExplorerUrls: string[]; + defaultBlockExplorerUrlIndex?: number; + lastUpdated?: number; + isEvm?: false; +}; + +/** + * State used by the {@link MultichainNetworkController} to cache network configurations. + */ +export type MultichainNetworkControllerState = { + multichainNetworkConfigurationsByChainId: Record< + string, + MultichainNetworkConfiguration + >; + selectedMultichainNetworkChainId: string; + multichainNetworksMetadata: Record; +}; + +/** + * Default state of the {@link MultichainNetworkController}. + */ +export const defaultState: MultichainNetworkControllerState = { + multichainNetworkConfigurationsByChainId: multichainNetworkConfigurations, + selectedMultichainNetworkChainId: bitcoinCaip2ChainId, + multichainNetworksMetadata: networksMetadata, +}; + +/** + * Returns the state of the {@link MultichainNetworkController}. + */ +export type MultichainNetworkControllerGetStateAction = + ControllerGetStateAction< + typeof controllerName, + MultichainNetworkControllerState + >; + +/** + * Event emitted when the state of the {@link MultichainNetworkController} changes. + */ +export type MultichainNetworkStateControllerStateChange = + ControllerStateChangeEvent< + typeof controllerName, + MultichainNetworkControllerState + >; + +/** + * Actions exposed by the {@link MultichainNetworkController}. + */ +export type MultichainNetworkStateControllerActions = + MultichainNetworkControllerGetStateAction; + +/** + * Events emitted by {@link MultichainNetworkController}. + */ +export type MultichainNetworkControllerEvents = + MultichainNetworkStateControllerStateChange; + +/** + * Actions that this controller is allowed to call. + */ +export type AllowedActions = + | NetworkControllerGetStateAction + | NetworkControllerSetActiveNetworkAction + | AccountsControllerSetSelectedAccountAction + | NetworkControllerGetNetworkConfigurationByNetworkClientId; + +/** + * Events that this controller is allowed to subscribe. + */ +export type AllowedEvents = NetworkControllerStateChangeEvent; + +/** + * Messenger type for the MultichainNetworkController. + */ +export type MultichainNetworkControllerMessenger = + RestrictedControllerMessenger< + typeof controllerName, + MultichainNetworkStateControllerActions | AllowedActions, + MultichainNetworkControllerEvents | AllowedEvents, + AllowedActions['type'], + AllowedEvents['type'] + >; + +/** + * {@link MultichainNetworkController}'s metadata. + * + * This allows us to choose if fields of the state should be persisted or not + * using the `persist` flag; and if they can be sent to Sentry or not, using + * the `anonymous` flag. + */ +const multichainNetworkControllerMetadata = { + multichainNetworkConfigurationsByChainId: { persist: true, anonymous: false }, + selectedMultichainNetworkChainId: { persist: true, anonymous: false }, + multichainNetworksMetadata: { persist: true, anonymous: false }, +}; + +/** + * The MultichainNetworkController is responsible for fetching and caching account + * balances. + */ +export class MultichainNetworkController extends BaseController< + typeof controllerName, + MultichainNetworkControllerState, + MultichainNetworkControllerMessenger +> { + constructor({ + messenger, + state, + }: { + messenger: MultichainNetworkControllerMessenger; + state: MultichainNetworkControllerState; + }) { + super({ + messenger, + name: controllerName, + metadata: multichainNetworkControllerMetadata, + state: { + ...defaultState, + ...state, + }, + }); + } + + async setActiveNetwork( + networkConfigurationId: string, + chainId?: string, + ): Promise { + console.log( + 'start setActiveNetwork in MultichainNetworkController', + networkConfigurationId, + chainId, + ); + if (chainId && Object.keys(this.state).includes(chainId)) { + console.log( + 'MultichainNetworkController: update network configuration', + networkConfigurationId, + chainId, + ); + this.update((state: Draft) => { + state.selectedMultichainNetworkChainId = chainId; + // state.nonEvmSelected = true; + }); + return; + } + + console.log( + 'MultichainNetworkController: update network configuration on NetworkController', + networkConfigurationId, + chainId, + ); + // this.update((state: Draft) => { + // state.nonEvmSelected = false; + // }); + + await this.messagingSystem.call( + 'NetworkController:setActiveNetwork', + networkConfigurationId, + ); + } +} diff --git a/packages/multichain-network-controller/tsconfig.build.json b/packages/multichain-network-controller/tsconfig.build.json new file mode 100644 index 00000000000..7211fee8918 --- /dev/null +++ b/packages/multichain-network-controller/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.packages.build.json", + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/types", + "rootDir": "./src" + }, + "references": [ + { "path": "../../packages/base-controller/tsconfig.build.json" } + ], + "include": ["../../types", "./src"] +} diff --git a/packages/multichain-network-controller/tsconfig.json b/packages/multichain-network-controller/tsconfig.json new file mode 100644 index 00000000000..55667c1f975 --- /dev/null +++ b/packages/multichain-network-controller/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../tsconfig.packages.json", + "compilerOptions": { + "baseUrl": "./" + }, + "references": [ + { "path": "../base-controller" }, + { "path": "../controller-utils" }, + { "path": "../accounts-controller" }, + { "path": "../network-controller" } + ], + "include": ["../../types", "./src"], + /** + * Here we ensure that TypeScript resolves `@metamask/*` imports to the + * uncompiled source code for packages that live in this repo. + * + * NOTE: This must be synchronized with the `moduleNameMapper` option in + * `jest.config.packages.js`. + * + * NOTE 2: This is not necessary when copying this package to `packages/`. + */ + "paths": { + "@metamask/*": ["../../packages/*/src", "../*/src"] + } +} diff --git a/packages/multichain-network-controller/typedoc.json b/packages/multichain-network-controller/typedoc.json new file mode 100644 index 00000000000..c9da015dbf8 --- /dev/null +++ b/packages/multichain-network-controller/typedoc.json @@ -0,0 +1,7 @@ +{ + "entryPoints": ["./src/index.ts"], + "excludePrivate": true, + "hideGenerator": true, + "out": "docs", + "tsconfig": "./tsconfig.build.json" +} diff --git a/yarn.lock b/yarn.lock index c78d34c1204..f5c1174bd2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3309,6 +3309,28 @@ __metadata: languageName: node linkType: hard +"@metamask/multichain-network-controller@workspace:packages/multichain-network-controller": + version: 0.0.0-use.local + resolution: "@metamask/multichain-network-controller@workspace:packages/multichain-network-controller" + dependencies: + "@metamask/accounts-controller": "npm:^21.0.1" + "@metamask/auto-changelog": "npm:^3.4.4" + "@metamask/base-controller": "npm:^7.1.1" + "@metamask/controller-utils": "npm:^11.4.5" + "@metamask/network-controller": "npm:^22.1.1" + "@metamask/utils": "npm:^11.0.1" + "@types/jest": "npm:^27.4.1" + deepmerge: "npm:^4.2.2" + immer: "npm:^9.0.6" + jest: "npm:^27.5.1" + nock: "npm:^13.3.1" + ts-jest: "npm:^27.1.4" + typedoc: "npm:^0.24.8" + typedoc-plugin-missing-exports: "npm:^2.0.0" + typescript: "npm:~5.2.2" + languageName: unknown + linkType: soft + "@metamask/multichain@workspace:packages/multichain": version: 0.0.0-use.local resolution: "@metamask/multichain@workspace:packages/multichain" From 7b64a8cc2861be4476de8270767786b99de614e3 Mon Sep 17 00:00:00 2001 From: gantunesr <17601467+gantunesr@users.noreply.github.com> Date: Fri, 24 Jan 2025 09:58:21 -0300 Subject: [PATCH 2/9] chore: update exports --- .../src/index.ts | 27 ++----------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/packages/multichain-network-controller/src/index.ts b/packages/multichain-network-controller/src/index.ts index a6741ec62c0..e2128ca49d9 100644 --- a/packages/multichain-network-controller/src/index.ts +++ b/packages/multichain-network-controller/src/index.ts @@ -1,25 +1,2 @@ -export type { - GasPricesControllerActions, - GasPricesControllerEvents, - GasPricesControllerGetStateAction, - GasPricesControllerMessenger, - GasPricesControllerState, - GasPricesControllerStateChangeEvent, -} from './gas-prices-controller'; -export { - getDefaultGasPricesControllerState, - GasPricesController, -} from './gas-prices-controller'; -export type { - PetNamesControllerActions, - PetNamesControllerEvents, - PetNamesControllerGetStateAction, - PetNamesControllerMessenger, - PetNamesControllerState, - PetNamesControllerStateChangeEvent, -} from './multichain-network-controller'; -export { - getDefaultPetNamesControllerState, - PetNamesController, -} from './multichain-network-controller'; -export { GasPricesService } from './gas-prices-service/gas-prices-service'; +export * from './multichain-network-controller'; +export * from './constants'; From 37dc7c52464fd77e497a61ebd1f5d3d67b363a4e Mon Sep 17 00:00:00 2001 From: gantunesr <17601467+gantunesr@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:38:45 -0300 Subject: [PATCH 3/9] fix: build --- .../multichain-network-controller/package.json | 3 +-- ...oller.ts => MultichainNetworkController.ts} | 0 .../src/constants.ts | 2 +- .../multichain-network-controller/src/index.ts | 18 ++++++++++++++++-- .../tsconfig.build.json | 6 ++++-- .../tsconfig.json | 1 - tsconfig.build.json | 3 ++- 7 files changed, 24 insertions(+), 9 deletions(-) rename packages/multichain-network-controller/src/{multichain-network-controller.ts => MultichainNetworkController.ts} (100%) diff --git a/packages/multichain-network-controller/package.json b/packages/multichain-network-controller/package.json index b95e9453ec6..1e50b1bed4e 100644 --- a/packages/multichain-network-controller/package.json +++ b/packages/multichain-network-controller/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/multichain-network-controller", - "version": "0.0.0", + "version": "0.0.1", "private": true, "description": "Multichain network controller", "keywords": [ @@ -53,7 +53,6 @@ "devDependencies": { "@metamask/accounts-controller": "^21.0.1", "@metamask/auto-changelog": "^3.4.4", - "@metamask/controller-utils": "^11.4.5", "@metamask/network-controller": "^22.1.1", "@types/jest": "^27.4.1", "deepmerge": "^4.2.2", diff --git a/packages/multichain-network-controller/src/multichain-network-controller.ts b/packages/multichain-network-controller/src/MultichainNetworkController.ts similarity index 100% rename from packages/multichain-network-controller/src/multichain-network-controller.ts rename to packages/multichain-network-controller/src/MultichainNetworkController.ts diff --git a/packages/multichain-network-controller/src/constants.ts b/packages/multichain-network-controller/src/constants.ts index 7c45a68e2f5..b371dba2477 100644 --- a/packages/multichain-network-controller/src/constants.ts +++ b/packages/multichain-network-controller/src/constants.ts @@ -3,7 +3,7 @@ import { NetworkStatus } from '@metamask/network-controller'; import type { MultichainNetworkConfiguration, MultichainNetworkMetadata, -} from './multichain-network-controller'; +} from './MultichainNetworkController'; export const bitcoinCaip2ChainId = 'bip122:000000000019d6689c085ae165831e93'; export const solanaCaip2ChainId = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'; diff --git a/packages/multichain-network-controller/src/index.ts b/packages/multichain-network-controller/src/index.ts index e2128ca49d9..abb722b27ae 100644 --- a/packages/multichain-network-controller/src/index.ts +++ b/packages/multichain-network-controller/src/index.ts @@ -1,2 +1,16 @@ -export * from './multichain-network-controller'; -export * from './constants'; +export type { + MultichainNetworkConfiguration, + MultichainNetworkMetadata, + MultichainNetworkControllerState, + MultichainNetworkControllerGetStateAction, + AllowedActions, + AllowedEvents, + MultichainNetworkControllerMessenger, +} from './MultichainNetworkController'; +export { MultichainNetworkController } from './MultichainNetworkController'; +export { + bitcoinCaip2ChainId, + solanaCaip2ChainId, + multichainNetworkConfigurations, + networksMetadata, +} from './constants'; diff --git a/packages/multichain-network-controller/tsconfig.build.json b/packages/multichain-network-controller/tsconfig.build.json index 7211fee8918..7609b693a3b 100644 --- a/packages/multichain-network-controller/tsconfig.build.json +++ b/packages/multichain-network-controller/tsconfig.build.json @@ -2,11 +2,13 @@ "extends": "../../tsconfig.packages.build.json", "compilerOptions": { "baseUrl": "./", - "outDir": "./dist/types", + "outDir": "./dist", "rootDir": "./src" }, "references": [ - { "path": "../../packages/base-controller/tsconfig.build.json" } + { "path": "../base-controller/tsconfig.build.json" }, + { "path": "../network-controller/tsconfig.build.json" }, + { "path": "../accounts-controller/tsconfig.build.json" } ], "include": ["../../types", "./src"] } diff --git a/packages/multichain-network-controller/tsconfig.json b/packages/multichain-network-controller/tsconfig.json index 55667c1f975..d1a5db81ec3 100644 --- a/packages/multichain-network-controller/tsconfig.json +++ b/packages/multichain-network-controller/tsconfig.json @@ -5,7 +5,6 @@ }, "references": [ { "path": "../base-controller" }, - { "path": "../controller-utils" }, { "path": "../accounts-controller" }, { "path": "../network-controller" } ], diff --git a/tsconfig.build.json b/tsconfig.build.json index a5ac14a68ca..cdc9f000373 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -38,7 +38,8 @@ "path": "./packages/token-search-discovery-controller/tsconfig.build.json" }, { "path": "./packages/transaction-controller/tsconfig.build.json" }, - { "path": "./packages/user-operation-controller/tsconfig.build.json" } + { "path": "./packages/user-operation-controller/tsconfig.build.json" }, + { "path": "./packages/multichain-network-controller/tsconfig.build.json" } ], "files": [], "include": [] From 454c3dbcff68e5b099d0d621531e1ea9db728c11 Mon Sep 17 00:00:00 2001 From: gantunesr <17601467+gantunesr@users.noreply.github.com> Date: Mon, 27 Jan 2025 01:34:07 -0300 Subject: [PATCH 4/9] chore: update initial state --- .../src/MultichainNetworkController.ts | 40 +++++++------------ 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.ts b/packages/multichain-network-controller/src/MultichainNetworkController.ts index 7389a2eb848..d9bbe3f0730 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.ts @@ -47,15 +47,17 @@ export type MultichainNetworkControllerState = { >; selectedMultichainNetworkChainId: string; multichainNetworksMetadata: Record; + nonEvmSelected: boolean; }; /** * Default state of the {@link MultichainNetworkController}. */ export const defaultState: MultichainNetworkControllerState = { - multichainNetworkConfigurationsByChainId: multichainNetworkConfigurations, + multichainNetworkConfigurationsByChainId: {}, selectedMultichainNetworkChainId: bitcoinCaip2ChainId, - multichainNetworksMetadata: networksMetadata, + multichainNetworksMetadata: {}, + nonEvmSelected: false, }; /** @@ -125,6 +127,7 @@ const multichainNetworkControllerMetadata = { multichainNetworkConfigurationsByChainId: { persist: true, anonymous: false }, selectedMultichainNetworkChainId: { persist: true, anonymous: false }, multichainNetworksMetadata: { persist: true, anonymous: false }, + nonEvmSelected: { persist: true, anonymous: false }, }; /** @@ -154,40 +157,25 @@ export class MultichainNetworkController extends BaseController< }); } - async setActiveNetwork( - networkConfigurationId: string, - chainId?: string, - ): Promise { - console.log( - 'start setActiveNetwork in MultichainNetworkController', - networkConfigurationId, - chainId, - ); + async setActiveNetwork(clientId: string, chainId?: string): Promise { if (chainId && Object.keys(this.state).includes(chainId)) { - console.log( - 'MultichainNetworkController: update network configuration', - networkConfigurationId, - chainId, - ); this.update((state: Draft) => { state.selectedMultichainNetworkChainId = chainId; - // state.nonEvmSelected = true; + state.nonEvmSelected = true; }); return; } - console.log( - 'MultichainNetworkController: update network configuration on NetworkController', - networkConfigurationId, - chainId, - ); - // this.update((state: Draft) => { - // state.nonEvmSelected = false; - // }); + this.update((state: Draft) => { + state.nonEvmSelected = false; + }); await this.messagingSystem.call( 'NetworkController:setActiveNetwork', - networkConfigurationId, + clientId, ); + + // TO DO: Should emit event to notify that the network has changed + // so the accounts-controller can update the selected account } } From 2f4d06c31cdf189a6b7f41e77ce75642fe6750fb Mon Sep 17 00:00:00 2001 From: tommasini Date: Wed, 29 Jan 2025 00:15:57 +0000 Subject: [PATCH 5/9] add setter for update nonEvmNetwork state variable to true and setter to update nonEvmNetwork state variable to false; added unit tests for setActiveNetwork and both new setters --- .../src/MultichainNetworkController.test.ts | 154 ++++++++++++++++++ .../src/MultichainNetworkController.ts | 20 ++- 2 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 packages/multichain-network-controller/src/MultichainNetworkController.test.ts diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.test.ts b/packages/multichain-network-controller/src/MultichainNetworkController.test.ts new file mode 100644 index 00000000000..f8afc5e7ceb --- /dev/null +++ b/packages/multichain-network-controller/src/MultichainNetworkController.test.ts @@ -0,0 +1,154 @@ +import { ControllerMessenger } from '@metamask/base-controller'; +import type { + MultichainNetworkStateControllerActions, + MultichainNetworkControllerEvents, +} from './MultichainNetworkController'; +import { MultichainNetworkController } from './MultichainNetworkController'; +import { bitcoinCaip2ChainId } from './constants'; + +const name = 'MultichainNetworkController'; + +type AllowedActions = MultichainNetworkStateControllerActions | { + type: 'NetworkController:setActiveNetwork'; + handler: (clientId: string) => void; +}; + +type AllowedEvents = MultichainNetworkControllerEvents; + +const buildMessenger = () => { + return new ControllerMessenger(); +}; + +const buildMultichainNetworkControllerMessenger = ( + messenger: ControllerMessenger, +) => { + return messenger.getRestricted({ + name, + allowedActions: ['NetworkController:setActiveNetwork'], + allowedEvents: [], + }); +}; + +describe('MultichainNetworkController', () => { + let controller: MultichainNetworkController; + let messenger: ControllerMessenger; + + beforeEach(() => { + messenger = buildMessenger(); + messenger.registerActionHandler( + 'NetworkController:setActiveNetwork', + jest.fn(), + ); + + jest.spyOn(messenger, 'call'); + + const restrictedMessenger = buildMultichainNetworkControllerMessenger(messenger); + + controller = new MultichainNetworkController({ + messenger: restrictedMessenger, + state: { + multichainNetworkConfigurationsByChainId: {}, + selectedMultichainNetworkChainId: bitcoinCaip2ChainId, + multichainNetworksMetadata: {}, + nonEvmSelected: false, + }, + }); + }); + + describe('setActiveNetwork', () => { + it('should set non-EVM network when valid chainId is provided', async () => { + const clientId = 'testClient'; + const chainId = 'bip122:000000000019d6689c085ae165831e93'; + messenger = buildMessenger(); + messenger.registerActionHandler( + 'NetworkController:setActiveNetwork', + jest.fn(), + ); + + jest.spyOn(messenger, 'call'); + + const restrictedMessenger = buildMultichainNetworkControllerMessenger(messenger); + + const multiChainController = new MultichainNetworkController({ + messenger: restrictedMessenger, + state: { + multichainNetworkConfigurationsByChainId: { + [chainId]: { + chainId, + name: 'Bitcoin', + nativeCurrency: 'BTC', + blockExplorerUrls: ['https://blockstream.info/'], + }, + }, + selectedMultichainNetworkChainId: bitcoinCaip2ChainId, + multichainNetworksMetadata: {}, + nonEvmSelected: false, + }, + }); + + await multiChainController.setActiveNetwork(clientId, chainId); + + expect(multiChainController.state.selectedMultichainNetworkChainId).toBe(chainId); + expect(multiChainController.state.nonEvmSelected).toBe(true); + expect(messenger.call).not.toHaveBeenCalled(); + }); + + it('should set EVM network when chainId is not provided', async () => { + const clientId = 'testClient'; + + await controller.setActiveNetwork(clientId); + + expect(controller.state.nonEvmSelected).toBe(false); + expect(messenger.call).toHaveBeenCalledWith( + 'NetworkController:setActiveNetwork', + clientId, + ); + }); + + it('should set EVM network when invalid chainId is provided', async () => { + const clientId = 'testClient'; + const invalidChainId = 'invalid-chain-id'; + + await controller.setActiveNetwork(clientId, invalidChainId); + + expect(controller.state.nonEvmSelected).toBe(false); + expect(messenger.call).toHaveBeenCalledWith( + 'NetworkController:setActiveNetwork', + clientId, + ); + }); + }); + + describe('setNonEvmSelected', () => { + it('should set nonEvmSelected to true', () => { + controller.setNonEvmSelected(); + expect(controller.state.nonEvmSelected).toBe(true); + }); + }); + + describe('setEvmSelected', () => { + it('should set nonEvmSelected to false', () => { + messenger = buildMessenger(); + messenger.registerActionHandler( + 'NetworkController:setActiveNetwork', + jest.fn(), + ); + + jest.spyOn(messenger, 'call'); + + const restrictedMessenger = buildMultichainNetworkControllerMessenger(messenger); + const multiChainController = new MultichainNetworkController({ + messenger: restrictedMessenger, + state: { + multichainNetworkConfigurationsByChainId: {}, + selectedMultichainNetworkChainId: bitcoinCaip2ChainId, + multichainNetworksMetadata: {}, + nonEvmSelected: true, + }, + }); + + multiChainController.setEvmSelected(); + expect(multiChainController.state.nonEvmSelected).toBe(false); + }); + }); +}); diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.ts b/packages/multichain-network-controller/src/MultichainNetworkController.ts index d9bbe3f0730..66f51456bdd 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.ts @@ -158,7 +158,7 @@ export class MultichainNetworkController extends BaseController< } async setActiveNetwork(clientId: string, chainId?: string): Promise { - if (chainId && Object.keys(this.state).includes(chainId)) { + if (chainId && Object.keys(this.state.multichainNetworkConfigurationsByChainId).includes(chainId)) { this.update((state: Draft) => { state.selectedMultichainNetworkChainId = chainId; state.nonEvmSelected = true; @@ -175,7 +175,21 @@ export class MultichainNetworkController extends BaseController< clientId, ); - // TO DO: Should emit event to notify that the network has changed - // so the accounts-controller can update the selected account + } + /** + * Sets the non-EVM selected network. + */ + setNonEvmSelected() { + this.update((state: Draft) => { + state.nonEvmSelected = true; + }); + } + /** + * Sets the EVM selected network. + */ + setEvmSelected() { + this.update((state: Draft) => { + state.nonEvmSelected = false; + }); } } From 2f8058a77a0e0aba45853faf4878fc3df0653caa Mon Sep 17 00:00:00 2001 From: tommasini Date: Wed, 29 Jan 2025 00:44:21 +0000 Subject: [PATCH 6/9] added blank line between functions --- .../src/MultichainNetworkController.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.ts b/packages/multichain-network-controller/src/MultichainNetworkController.ts index 66f51456bdd..ac6124b2ec2 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.ts @@ -176,6 +176,7 @@ export class MultichainNetworkController extends BaseController< ); } + /** * Sets the non-EVM selected network. */ @@ -184,6 +185,7 @@ export class MultichainNetworkController extends BaseController< state.nonEvmSelected = true; }); } + /** * Sets the EVM selected network. */ From 6b7b3b60adc2b95c3744e7b7b528ea95211ed1d5 Mon Sep 17 00:00:00 2001 From: tommasini Date: Wed, 29 Jan 2025 00:56:46 +0000 Subject: [PATCH 7/9] removed unused import and re order imports, to fix lint warnings --- .../src/MultichainNetworkController.test.ts | 3 ++- .../src/MultichainNetworkController.ts | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.test.ts b/packages/multichain-network-controller/src/MultichainNetworkController.test.ts index f8afc5e7ceb..80b968c7fc7 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.test.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.test.ts @@ -1,10 +1,11 @@ import { ControllerMessenger } from '@metamask/base-controller'; + import type { MultichainNetworkStateControllerActions, MultichainNetworkControllerEvents, } from './MultichainNetworkController'; -import { MultichainNetworkController } from './MultichainNetworkController'; import { bitcoinCaip2ChainId } from './constants'; +import { MultichainNetworkController } from './MultichainNetworkController'; const name = 'MultichainNetworkController'; diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.ts b/packages/multichain-network-controller/src/MultichainNetworkController.ts index ac6124b2ec2..bfda573c40c 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.ts @@ -16,8 +16,6 @@ import type { Draft } from 'immer'; import { bitcoinCaip2ChainId, - multichainNetworkConfigurations, - networksMetadata, } from './constants'; const controllerName = 'MultichainNetworkController'; @@ -185,7 +183,7 @@ export class MultichainNetworkController extends BaseController< state.nonEvmSelected = true; }); } - + /** * Sets the EVM selected network. */ From a89bff469aaa0622108d8b1193e65c70d731429b Mon Sep 17 00:00:00 2001 From: tommasini Date: Thu, 30 Jan 2025 21:46:33 +0000 Subject: [PATCH 8/9] btc and solana chain id from keyring api, update types and added javascript documentation, and solve most of the review comments --- .../multichain-network-controller/LICENSE | 2 +- .../package.json | 9 +- .../src/MultichainNetworkController.test.ts | 14 +- .../src/MultichainNetworkController.ts | 124 +++++++++++------- .../src/constants.ts | 22 ++-- .../src/index.ts | 4 - .../tsconfig.json | 12 -- yarn.lock | 48 ++++++- 8 files changed, 142 insertions(+), 93 deletions(-) diff --git a/packages/multichain-network-controller/LICENSE b/packages/multichain-network-controller/LICENSE index 6f8bff03fc4..7d002dced3a 100644 --- a/packages/multichain-network-controller/LICENSE +++ b/packages/multichain-network-controller/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 MetaMask +Copyright (c) 2025 MetaMask Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/multichain-network-controller/package.json b/packages/multichain-network-controller/package.json index 1e50b1bed4e..e9fb31c0408 100644 --- a/packages/multichain-network-controller/package.json +++ b/packages/multichain-network-controller/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/multichain-network-controller", - "version": "0.0.1", + "version": "0.0.0", "private": true, "description": "Multichain network controller", "keywords": [ @@ -48,12 +48,11 @@ }, "dependencies": { "@metamask/base-controller": "^7.1.1", + "@metamask/keyring-api": "^16.1.0", "@metamask/utils": "^11.0.1" }, "devDependencies": { - "@metamask/accounts-controller": "^21.0.1", "@metamask/auto-changelog": "^3.4.4", - "@metamask/network-controller": "^22.1.1", "@types/jest": "^27.4.1", "deepmerge": "^4.2.2", "immer": "^9.0.6", @@ -64,6 +63,10 @@ "typedoc-plugin-missing-exports": "^2.0.0", "typescript": "~5.2.2" }, + "peerDependencies": { + "@metamask/accounts-controller": "^21.0.1", + "@metamask/network-controller": "^22.1.1" + }, "engines": { "node": "^18.18 || >=20" } diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.test.ts b/packages/multichain-network-controller/src/MultichainNetworkController.test.ts index 80b968c7fc7..529468c104e 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.test.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.test.ts @@ -1,21 +1,13 @@ import { ControllerMessenger } from '@metamask/base-controller'; - import type { - MultichainNetworkStateControllerActions, - MultichainNetworkControllerEvents, + AllowedActions, + AllowedEvents, } from './MultichainNetworkController'; -import { bitcoinCaip2ChainId } from './constants'; + import { MultichainNetworkController } from './MultichainNetworkController'; const name = 'MultichainNetworkController'; -type AllowedActions = MultichainNetworkStateControllerActions | { - type: 'NetworkController:setActiveNetwork'; - handler: (clientId: string) => void; -}; - -type AllowedEvents = MultichainNetworkControllerEvents; - const buildMessenger = () => { return new ControllerMessenger(); }; diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.ts b/packages/multichain-network-controller/src/MultichainNetworkController.ts index bfda573c40c..52c310556fe 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.ts @@ -1,10 +1,13 @@ import type { AccountsControllerSetSelectedAccountAction } from '@metamask/accounts-controller'; import { BaseController, + StateMetadata, type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedControllerMessenger, } from '@metamask/base-controller'; +import { BtcScope } from '@metamask/keyring-api'; + import type { NetworkStatus, NetworkControllerGetNetworkConfigurationByNetworkClientId, @@ -12,11 +15,9 @@ import type { NetworkControllerGetStateAction, NetworkControllerStateChangeEvent, } from '@metamask/network-controller'; -import type { Draft } from 'immer'; -import { - bitcoinCaip2ChainId, -} from './constants'; + +import { CaipAssetType, CaipChainId, KnownCaipNamespace, parseCaipChainId } from '@metamask/utils'; const controllerName = 'MultichainNetworkController'; @@ -26,37 +27,70 @@ export type MultichainNetworkMetadata = { }; export type MultichainNetworkConfiguration = { - chainId: string; // Should be Caip2 type + /** + * The chain ID of the network. + */ + chainId: CaipChainId; + /** + * The name of the network. + */ name: string; - nativeCurrency: string; // Should be Caip19 type + /** + * The native asset type of the network. + */ + nativeAsset: CaipAssetType; + /** + * The block explorer URLs of the network. + */ blockExplorerUrls: string[]; + /** + * The default block explorer URL index of the network. + */ defaultBlockExplorerUrlIndex?: number; + /** + * The last updated timestamp of the network. + */ lastUpdated?: number; - isEvm?: false; + /** + * Whether the network is an EVM network or non-evm network. + */ + isEvm: boolean; }; /** * State used by the {@link MultichainNetworkController} to cache network configurations. */ export type MultichainNetworkControllerState = { + /** + * The network configurations by chain ID. + */ multichainNetworkConfigurationsByChainId: Record< string, MultichainNetworkConfiguration >; - selectedMultichainNetworkChainId: string; + /** + * The chain ID of the selected network. + */ + selectedMultichainNetworkChainId: CaipChainId; + /** + * The metadata of the networks. + */ multichainNetworksMetadata: Record; + /** + * Whether the non-EVM network is selected by the wallet. + */ nonEvmSelected: boolean; }; /** * Default state of the {@link MultichainNetworkController}. */ -export const defaultState: MultichainNetworkControllerState = { +export const getDefaultMultichainNetworkControllerState = (): MultichainNetworkControllerState => ({ multichainNetworkConfigurationsByChainId: {}, - selectedMultichainNetworkChainId: bitcoinCaip2ChainId, + selectedMultichainNetworkChainId: BtcScope.Mainnet, multichainNetworksMetadata: {}, nonEvmSelected: false, -}; +}); /** * Returns the state of the {@link MultichainNetworkController}. @@ -70,7 +104,7 @@ export type MultichainNetworkControllerGetStateAction = /** * Event emitted when the state of the {@link MultichainNetworkController} changes. */ -export type MultichainNetworkStateControllerStateChange = +export type MultichainNetworkControllerStateChange = ControllerStateChangeEvent< typeof controllerName, MultichainNetworkControllerState @@ -79,14 +113,19 @@ export type MultichainNetworkStateControllerStateChange = /** * Actions exposed by the {@link MultichainNetworkController}. */ -export type MultichainNetworkStateControllerActions = +export type MultichainNetworkControllerActions = MultichainNetworkControllerGetStateAction; /** * Events emitted by {@link MultichainNetworkController}. */ export type MultichainNetworkControllerEvents = - MultichainNetworkStateControllerStateChange; + MultichainNetworkControllerStateChange; + +export type MultichainNetworkControllerAllowedActions = MultichainNetworkControllerActions | AllowedActions; + +export type MultichainNetworkControllerAllowedEvents = MultichainNetworkControllerEvents | AllowedEvents; + /** * Actions that this controller is allowed to call. @@ -108,8 +147,8 @@ export type AllowedEvents = NetworkControllerStateChangeEvent; export type MultichainNetworkControllerMessenger = RestrictedControllerMessenger< typeof controllerName, - MultichainNetworkStateControllerActions | AllowedActions, - MultichainNetworkControllerEvents | AllowedEvents, + MultichainNetworkControllerAllowedActions, + MultichainNetworkControllerAllowedEvents, AllowedActions['type'], AllowedEvents['type'] >; @@ -122,11 +161,11 @@ export type MultichainNetworkControllerMessenger = * the `anonymous` flag. */ const multichainNetworkControllerMetadata = { - multichainNetworkConfigurationsByChainId: { persist: true, anonymous: false }, - selectedMultichainNetworkChainId: { persist: true, anonymous: false }, - multichainNetworksMetadata: { persist: true, anonymous: false }, - nonEvmSelected: { persist: true, anonymous: false }, -}; + multichainNetworkConfigurationsByChainId: { persist: true, anonymous: true }, + selectedMultichainNetworkChainId: { persist: true, anonymous: true }, + multichainNetworksMetadata: { persist: true, anonymous: true }, + nonEvmSelected: { persist: true, anonymous: true }, +} satisfies StateMetadata; /** * The MultichainNetworkController is responsible for fetching and caching account @@ -139,57 +178,44 @@ export class MultichainNetworkController extends BaseController< > { constructor({ messenger, - state, + state = {}, }: { messenger: MultichainNetworkControllerMessenger; - state: MultichainNetworkControllerState; + state?: Partial; }) { super({ messenger, name: controllerName, metadata: multichainNetworkControllerMetadata, state: { - ...defaultState, + ...getDefaultMultichainNetworkControllerState(), ...state, }, }); } - - async setActiveNetwork(clientId: string, chainId?: string): Promise { - if (chainId && Object.keys(this.state.multichainNetworkConfigurationsByChainId).includes(chainId)) { - this.update((state: Draft) => { - state.selectedMultichainNetworkChainId = chainId; + /** + * Sets the active network. + * + * @param clientId - The client ID of the evm network. + * @param caipChainId - The chain ID of the non-evm network. + */ + async setActiveNetwork(clientId: string, caipChainId?: CaipChainId): Promise { + if (caipChainId && Object.keys(this.state.multichainNetworkConfigurationsByChainId).includes(caipChainId)) { + this.update((state) => { + state.selectedMultichainNetworkChainId = caipChainId; state.nonEvmSelected = true; }); return; } - this.update((state: Draft) => { - state.nonEvmSelected = false; - }); - await this.messagingSystem.call( 'NetworkController:setActiveNetwork', clientId, ); - } - - /** - * Sets the non-EVM selected network. - */ - setNonEvmSelected() { - this.update((state: Draft) => { - state.nonEvmSelected = true; - }); - } - - /** - * Sets the EVM selected network. - */ - setEvmSelected() { - this.update((state: Draft) => { + this.update((state) => { state.nonEvmSelected = false; }); } } + diff --git a/packages/multichain-network-controller/src/constants.ts b/packages/multichain-network-controller/src/constants.ts index b371dba2477..fe7934215bd 100644 --- a/packages/multichain-network-controller/src/constants.ts +++ b/packages/multichain-network-controller/src/constants.ts @@ -4,41 +4,43 @@ import type { MultichainNetworkConfiguration, MultichainNetworkMetadata, } from './MultichainNetworkController'; +import { BtcScope, SolScope } from '@metamask/keyring-api'; -export const bitcoinCaip2ChainId = 'bip122:000000000019d6689c085ae165831e93'; -export const solanaCaip2ChainId = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'; + +export const btcNativeAsset = `${BtcScope.Mainnet}/slip44:0`; +export const solNativeAsset = `${SolScope.Mainnet}/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`; export const multichainNetworkConfigurations: Record = { - bitcoinCaip2ChainId: { - chainId: bitcoinCaip2ChainId, + [BtcScope.Mainnet] : { + chainId: BtcScope.Mainnet, name: 'Bitcoin Mainnet', blockExplorerUrls: [], - nativeCurrency: 'BTC', + nativeAsset: btcNativeAsset, isEvm: false, }, - solanaCaip2ChainId: { - chainId: solanaCaip2ChainId, + [SolScope.Mainnet]: { + chainId: SolScope.Mainnet, name: 'Solana Mainnet', blockExplorerUrls: [], - nativeCurrency: 'SOL', + nativeAsset: solNativeAsset, isEvm: false, }, }; export const networksMetadata: Record = { - bitcoinCaip2ChainId: { + [BtcScope.Mainnet]: { features: [], status: NetworkStatus.Available, }, - solanaCaip2ChainId: { + [SolScope.Mainnet]: { features: [], status: NetworkStatus.Available, }, diff --git a/packages/multichain-network-controller/src/index.ts b/packages/multichain-network-controller/src/index.ts index abb722b27ae..07cd878b4f9 100644 --- a/packages/multichain-network-controller/src/index.ts +++ b/packages/multichain-network-controller/src/index.ts @@ -3,14 +3,10 @@ export type { MultichainNetworkMetadata, MultichainNetworkControllerState, MultichainNetworkControllerGetStateAction, - AllowedActions, - AllowedEvents, MultichainNetworkControllerMessenger, } from './MultichainNetworkController'; export { MultichainNetworkController } from './MultichainNetworkController'; export { - bitcoinCaip2ChainId, - solanaCaip2ChainId, multichainNetworkConfigurations, networksMetadata, } from './constants'; diff --git a/packages/multichain-network-controller/tsconfig.json b/packages/multichain-network-controller/tsconfig.json index d1a5db81ec3..1646207284c 100644 --- a/packages/multichain-network-controller/tsconfig.json +++ b/packages/multichain-network-controller/tsconfig.json @@ -9,16 +9,4 @@ { "path": "../network-controller" } ], "include": ["../../types", "./src"], - /** - * Here we ensure that TypeScript resolves `@metamask/*` imports to the - * uncompiled source code for packages that live in this repo. - * - * NOTE: This must be synchronized with the `moduleNameMapper` option in - * `jest.config.packages.js`. - * - * NOTE 2: This is not necessary when copying this package to `packages/`. - */ - "paths": { - "@metamask/*": ["../../packages/*/src", "../*/src"] - } } diff --git a/yarn.lock b/yarn.lock index 3a6b48f4de9..32c4206f985 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2300,7 +2300,7 @@ __metadata: languageName: node linkType: hard -"@metamask/accounts-controller@npm:^21.0.1, @metamask/accounts-controller@npm:^21.0.2, @metamask/accounts-controller@workspace:packages/accounts-controller": +"@metamask/accounts-controller@npm:^21.0.2, @metamask/accounts-controller@workspace:packages/accounts-controller": version: 0.0.0-use.local resolution: "@metamask/accounts-controller@workspace:packages/accounts-controller" dependencies: @@ -3208,6 +3208,18 @@ __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-controller@npm:^19.0.4, @metamask/keyring-controller@workspace:packages/keyring-controller": version: 0.0.0-use.local resolution: "@metamask/keyring-controller@workspace:packages/keyring-controller" @@ -3297,6 +3309,17 @@ __metadata: languageName: node linkType: hard +"@metamask/keyring-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "@metamask/keyring-utils@npm:2.0.0" + dependencies: + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.1.0" + bitcoin-address-validation: "npm:^2.2.3" + checksum: 10/f7514821fb3bd5f5be575e0d74d5cf8becbdeac35a3e13dcd9e8bf789ba34aa2072783bdc3d0ddac479b97c986bcb54d77cdccedf5945d1c33ef310790e90efb + languageName: node + linkType: hard + "@metamask/logging-controller@npm:^6.0.3, @metamask/logging-controller@workspace:packages/logging-controller": version: 0.0.0-use.local resolution: "@metamask/logging-controller@workspace:packages/logging-controller" @@ -3348,10 +3371,9 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/multichain-network-controller@workspace:packages/multichain-network-controller" dependencies: - "@metamask/accounts-controller": "npm:^21.0.1" "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^7.1.1" - "@metamask/network-controller": "npm:^22.1.1" + "@metamask/keyring-api": "npm:^16.1.0" "@metamask/utils": "npm:^11.0.1" "@types/jest": "npm:^27.4.1" deepmerge: "npm:^4.2.2" @@ -3362,6 +3384,9 @@ __metadata: typedoc: "npm:^0.24.8" typedoc-plugin-missing-exports: "npm:^2.0.0" typescript: "npm:~5.2.2" + peerDependencies: + "@metamask/accounts-controller": ^21.0.1 + "@metamask/network-controller": ^22.1.1 languageName: unknown linkType: soft @@ -4185,6 +4210,23 @@ __metadata: languageName: node linkType: hard +"@metamask/utils@npm:^11.1.0": + version: 11.1.0 + resolution: "@metamask/utils@npm:11.1.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/756f13987881fe26adaa0a54354bc5af20cedee4dd228a736d481697dc634adb9e6e54d8f1dcc1d487b2376ab4ba8c576ecbb24beab2fb63aff721d0d5c0f5fe + languageName: node + linkType: hard + "@metamask/utils@npm:^8.2.0": version: 8.5.0 resolution: "@metamask/utils@npm:8.5.0" From 20a1dbc16c1178e15567868a5403e27d484cb3f8 Mon Sep 17 00:00:00 2001 From: tommasini Date: Fri, 31 Jan 2025 20:46:16 +0000 Subject: [PATCH 9/9] replace nativeAsset name varialbe for nativeCurrency name variable --- .../src/MultichainNetworkController.ts | 2 +- packages/multichain-network-controller/src/constants.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/multichain-network-controller/src/MultichainNetworkController.ts b/packages/multichain-network-controller/src/MultichainNetworkController.ts index 52c310556fe..1906453eab4 100644 --- a/packages/multichain-network-controller/src/MultichainNetworkController.ts +++ b/packages/multichain-network-controller/src/MultichainNetworkController.ts @@ -38,7 +38,7 @@ export type MultichainNetworkConfiguration = { /** * The native asset type of the network. */ - nativeAsset: CaipAssetType; + nativeCurrency: CaipAssetType; /** * The block explorer URLs of the network. */ diff --git a/packages/multichain-network-controller/src/constants.ts b/packages/multichain-network-controller/src/constants.ts index fe7934215bd..ed40524a993 100644 --- a/packages/multichain-network-controller/src/constants.ts +++ b/packages/multichain-network-controller/src/constants.ts @@ -18,7 +18,7 @@ export const multichainNetworkConfigurations: Record