From 6efa1f0b70c8d3768b59169c534a88702b4b9bf0 Mon Sep 17 00:00:00 2001 From: Marco Peereboom Date: Wed, 22 Apr 2026 05:28:56 -0700 Subject: [PATCH] feat(btc-provider): accept P2TR accounts and add testnet4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Widen BtcAccountProvider to recognize P2TR (taproot) accounts as compatible Bitcoin accounts alongside P2WPKH. Add BtcScope.Testnet4 to the provider capabilities and account discovery scopes. Default account creation remains P2WPKH — no behavioral change for existing callers. P2TR accounts created through discovery or future UI options are now correctly tracked by the provider. Depends on MetaMask/snap-bitcoin-wallet P2TR support for the snap to serve P2TR accounts via keyring_createAccount. --- packages/multichain-account-service/CHANGELOG.md | 5 +++++ .../src/providers/BtcAccountProvider.test.ts | 8 ++++++++ .../src/providers/BtcAccountProvider.ts | 7 ++++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/multichain-account-service/CHANGELOG.md b/packages/multichain-account-service/CHANGELOG.md index 428e0be92f7..22262b7ae4b 100644 --- a/packages/multichain-account-service/CHANGELOG.md +++ b/packages/multichain-account-service/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Accept P2TR (taproot) accounts as compatible Bitcoin accounts in `BtcAccountProvider` +- Add testnet4 (`BtcScope.Testnet4`) to Bitcoin provider capabilities and account discovery + ### Changed - Bump `@metamask/accounts-controller` from `^37.1.1` to `^37.2.0` ([#8363](https://github.com/MetaMask/core/pull/8363)) diff --git a/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts b/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts index 98dc3a8dd7b..f2a2a89fc72 100644 --- a/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts @@ -295,6 +295,14 @@ describe('BtcAccountProvider', () => { expect(provider.isAccountCompatible(account)).toBe(true); }); + it('returns true if a P2TR account is compatible', () => { + const account = MOCK_BTC_P2TR_ACCOUNT_1; + const { provider } = setup({ + accounts: [account], + }); + expect(provider.isAccountCompatible(account)).toBe(true); + }); + it('returns false if an account is not compatible', () => { const account = MOCK_HD_ACCOUNT_1; const { provider } = setup({ diff --git a/packages/multichain-account-service/src/providers/BtcAccountProvider.ts b/packages/multichain-account-service/src/providers/BtcAccountProvider.ts index 5661dbaa30d..8aa6c5619ff 100644 --- a/packages/multichain-account-service/src/providers/BtcAccountProvider.ts +++ b/packages/multichain-account-service/src/providers/BtcAccountProvider.ts @@ -47,7 +47,7 @@ export class BtcAccountProvider extends SnapAccountProvider { static BTC_SNAP_ID = 'npm:@metamask/bitcoin-wallet-snap' as SnapId; readonly capabilities: KeyringCapabilities = { - scopes: [BtcScope.Mainnet, BtcScope.Testnet], + scopes: [BtcScope.Mainnet, BtcScope.Testnet, BtcScope.Testnet4], bip44: { deriveIndex: true, deriveIndexRange: true, @@ -68,7 +68,8 @@ export class BtcAccountProvider extends SnapAccountProvider { isAccountCompatible(account: Bip44Account): boolean { return ( - account.type === BtcAccountType.P2wpkh && + (account.type === BtcAccountType.P2wpkh || + account.type === BtcAccountType.P2tr) && Object.values(BtcAccountType).includes(account.type) ); } @@ -113,7 +114,7 @@ export class BtcAccountProvider extends SnapAccountProvider { withTimeout( () => client.discoverAccounts( - [BtcScope.Mainnet], + [BtcScope.Mainnet, BtcScope.Testnet4], entropySource, groupIndex, ),