From b210b6f71313bd8207f676c5bfb093b8755f1f32 Mon Sep 17 00:00:00 2001 From: Derek Brans Date: Wed, 5 Jun 2024 05:09:39 -0400 Subject: [PATCH 1/3] fix: upgrade transaction-controller to 32.0.0 to fix mmi (#24947) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > [!NOTE] > This PR is intended to be cherry-picked into RC 11.17.0 after being merged into develop ## **Description** Upgrade transaction-controller to get this fix: https://github.com/MetaMask/core/pull/4343 [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/24947?quickstart=1) ## **Related issues** Fixes: A recent update to the transaction-controller has made the TransactionMeta object passed to the afterSign hook frozen. This change prevents adding new properties, leading to the error: “Cannot add property custodyId, object is not extensible.” This bug is breaking all transactions for MMI as the original txMeta cannot store required properties like custodyId. Blocked by https://github.com/MetaMask/metamask-extension/pull/24861 Blocked by https://github.com/MetaMask/metamask-extension/pull/24913 ## **Manual testing steps** I followed these steps to test the fix: 1. yarn && yarn start:mmi 2. create a new wallet 3. visit https://saturn-custody-ui.dev.metamask-institutional.io/ and add two custodial addresses 4. send 0ETH from one custodial address to the other You should see a popup with an Approve button. Before this fix, the transaction would appear in the activity tab with an error. ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [ ] I’ve followed [MetaMask Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --------- Co-authored-by: MetaMask Bot Co-authored-by: Antonio Regadas --- lavamoat/browserify/beta/policy.json | 148 +++++++++++++++++++++--- lavamoat/browserify/desktop/policy.json | 148 +++++++++++++++++++++--- lavamoat/browserify/flask/policy.json | 148 +++++++++++++++++++++--- lavamoat/browserify/main/policy.json | 148 +++++++++++++++++++++--- lavamoat/browserify/mmi/policy.json | 148 +++++++++++++++++++++--- package.json | 4 +- yarn.lock | 114 +++++++++++++++--- 7 files changed, 772 insertions(+), 86 deletions(-) diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index d2d33794b42e..ce6801c27316 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -2026,14 +2026,6 @@ "TextEncoder": true } }, - "@metamask/smart-transactions-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { "globals": { "crypto.getRandomValues": true @@ -2051,16 +2043,16 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, - "@metamask/smart-transactions-controller>@metamask/base-controller": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/tx": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, "@metamask/utils": true, @@ -2095,6 +2087,107 @@ "webpack>events": true } }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": { + "globals": { + "clearInterval": true, + "console.error": true, + "setInterval": true + }, + "packages": { + "@metamask/eth-query": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": true, + "bn.js": true, + "browserify>buffer": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": { + "globals": { + "console.warn": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "webpack>events": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": { "packages": { "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry>@metamask/ethjs-contract": true, @@ -2311,15 +2404,15 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, "@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/transaction-controller>@metamask/controller-utils": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/transaction-controller>async-mutex": true, "@metamask/utils": true, "bn.js": true, "browserify>buffer": true, @@ -2338,6 +2431,24 @@ "immer": true } }, + "@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, "@metamask/transaction-controller>@metamask/nonce-tracker": { "packages": { "@ethersproject/providers": true, @@ -2354,6 +2465,15 @@ "@trezor/connect-web>tslib": true } }, + "@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/user-operation-controller": { "globals": { "fetch": true diff --git a/lavamoat/browserify/desktop/policy.json b/lavamoat/browserify/desktop/policy.json index f8783008cb8f..509a433a34a7 100644 --- a/lavamoat/browserify/desktop/policy.json +++ b/lavamoat/browserify/desktop/policy.json @@ -2216,14 +2216,6 @@ "TextEncoder": true } }, - "@metamask/smart-transactions-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { "globals": { "crypto.getRandomValues": true @@ -2241,16 +2233,16 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, - "@metamask/smart-transactions-controller>@metamask/base-controller": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/tx": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, "@metamask/utils": true, @@ -2285,6 +2277,107 @@ "webpack>events": true } }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": { + "globals": { + "clearInterval": true, + "console.error": true, + "setInterval": true + }, + "packages": { + "@metamask/eth-query": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": true, + "bn.js": true, + "browserify>buffer": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": { + "globals": { + "console.warn": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "webpack>events": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": { "packages": { "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry>@metamask/ethjs-contract": true, @@ -2602,15 +2695,15 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, "@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/transaction-controller>@metamask/controller-utils": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/transaction-controller>async-mutex": true, "@metamask/utils": true, "bn.js": true, "browserify>buffer": true, @@ -2629,6 +2722,24 @@ "immer": true } }, + "@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, "@metamask/transaction-controller>@metamask/nonce-tracker": { "packages": { "@ethersproject/providers": true, @@ -2645,6 +2756,15 @@ "@trezor/connect-web>tslib": true } }, + "@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/user-operation-controller": { "globals": { "fetch": true diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 3819cdaa0407..6f03ebe50a86 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -2268,14 +2268,6 @@ "TextEncoder": true } }, - "@metamask/smart-transactions-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { "globals": { "crypto.getRandomValues": true @@ -2293,16 +2285,16 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, - "@metamask/smart-transactions-controller>@metamask/base-controller": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/tx": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, "@metamask/utils": true, @@ -2337,6 +2329,107 @@ "webpack>events": true } }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": { + "globals": { + "clearInterval": true, + "console.error": true, + "setInterval": true + }, + "packages": { + "@metamask/eth-query": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": true, + "bn.js": true, + "browserify>buffer": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": { + "globals": { + "console.warn": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "webpack>events": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": { "packages": { "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry>@metamask/ethjs-contract": true, @@ -2654,15 +2747,15 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, "@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/transaction-controller>@metamask/controller-utils": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/transaction-controller>async-mutex": true, "@metamask/utils": true, "bn.js": true, "browserify>buffer": true, @@ -2681,6 +2774,24 @@ "immer": true } }, + "@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, "@metamask/transaction-controller>@metamask/nonce-tracker": { "packages": { "@ethersproject/providers": true, @@ -2697,6 +2808,15 @@ "@trezor/connect-web>tslib": true } }, + "@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/user-operation-controller": { "globals": { "fetch": true diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index c0d371a59a36..9d2f8ab3e046 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -2123,14 +2123,6 @@ "TextEncoder": true } }, - "@metamask/smart-transactions-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { "globals": { "crypto.getRandomValues": true @@ -2148,16 +2140,16 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, - "@metamask/smart-transactions-controller>@metamask/base-controller": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/tx": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, "@metamask/utils": true, @@ -2192,6 +2184,107 @@ "webpack>events": true } }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": { + "globals": { + "clearInterval": true, + "console.error": true, + "setInterval": true + }, + "packages": { + "@metamask/eth-query": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": true, + "bn.js": true, + "browserify>buffer": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": { + "globals": { + "console.warn": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "webpack>events": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": { "packages": { "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry>@metamask/ethjs-contract": true, @@ -2509,15 +2602,15 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, "@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/transaction-controller>@metamask/controller-utils": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/transaction-controller>async-mutex": true, "@metamask/utils": true, "bn.js": true, "browserify>buffer": true, @@ -2536,6 +2629,24 @@ "immer": true } }, + "@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, "@metamask/transaction-controller>@metamask/nonce-tracker": { "packages": { "@ethersproject/providers": true, @@ -2552,6 +2663,15 @@ "@trezor/connect-web>tslib": true } }, + "@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/user-operation-controller": { "globals": { "fetch": true diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index dcbe1d079ca4..c2663b409c36 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -2408,14 +2408,6 @@ "TextEncoder": true } }, - "@metamask/smart-transactions-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { "globals": { "crypto.getRandomValues": true @@ -2433,16 +2425,16 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, - "@metamask/smart-transactions-controller>@metamask/base-controller": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/tx": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": true, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, "@metamask/utils": true, @@ -2477,6 +2469,107 @@ "webpack>events": true } }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller": { + "globals": { + "clearInterval": true, + "console.error": true, + "setInterval": true + }, + "packages": { + "@metamask/eth-query": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": true, + "bn.js": true, + "browserify>buffer": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, + "packages": { + "immer": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/controller-utils>@ethereumjs/util": { + "globals": { + "console.warn": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "webpack>events": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/polling-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/transaction-controller>@metamask/gas-fee-controller>@metamask/base-controller": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry": { "packages": { "@metamask/smart-transactions-controller>@metamask/transaction-controller>eth-method-registry>@metamask/ethjs-contract": true, @@ -2794,15 +2887,15 @@ "@ethersproject/abi": true, "@ethersproject/contracts": true, "@ethersproject/providers": true, - "@metamask/controller-utils": true, "@metamask/eth-query": true, "@metamask/gas-fee-controller": true, "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, "@metamask/network-controller": true, "@metamask/providers>@metamask/rpc-errors": true, "@metamask/transaction-controller>@metamask/base-controller": true, + "@metamask/transaction-controller>@metamask/controller-utils": true, "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/transaction-controller>async-mutex": true, "@metamask/utils": true, "bn.js": true, "browserify>buffer": true, @@ -2821,6 +2914,24 @@ "immer": true } }, + "@metamask/transaction-controller>@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/utils": true, + "bn.js": true, + "browserify>buffer": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true + } + }, "@metamask/transaction-controller>@metamask/nonce-tracker": { "packages": { "@ethersproject/providers": true, @@ -2837,6 +2948,15 @@ "@trezor/connect-web>tslib": true } }, + "@metamask/transaction-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@trezor/connect-web>tslib": true + } + }, "@metamask/user-operation-controller": { "globals": { "fetch": true diff --git a/package.json b/package.json index fe291fb7dc54..8b74b6eaae62 100644 --- a/package.json +++ b/package.json @@ -219,7 +219,7 @@ "@trezor/schema-utils@npm:1.0.2": "patch:@trezor/schema-utils@npm%3A1.0.2#~/.yarn/patches/@trezor-schema-utils-npm-1.0.2-7dd48689b2.patch", "lavamoat-core@npm:^15.1.1": "patch:lavamoat-core@npm%3A15.1.1#~/.yarn/patches/lavamoat-core-npm-15.1.1-51fbe39988.patch", "@metamask/snaps-sdk": "^4.3.0", - "@metamask/transaction-controller": "^30.0.0", + "@metamask/transaction-controller": "^32.0.0", "@babel/runtime@npm:^7.7.6": "patch:@babel/runtime@npm%3A7.24.0#~/.yarn/patches/@babel-runtime-npm-7.24.0-7eb1dd11a2.patch", "@babel/runtime@npm:^7.9.2": "patch:@babel/runtime@npm%3A7.24.0#~/.yarn/patches/@babel-runtime-npm-7.24.0-7eb1dd11a2.patch", "@babel/runtime@npm:^7.12.5": "patch:@babel/runtime@npm%3A7.24.0#~/.yarn/patches/@babel-runtime-npm-7.24.0-7eb1dd11a2.patch", @@ -334,7 +334,7 @@ "@metamask/snaps-rpc-methods": "^9.1.0", "@metamask/snaps-sdk": "^4.3.0", "@metamask/snaps-utils": "^7.4.0", - "@metamask/transaction-controller": "^30.0.0", + "@metamask/transaction-controller": "^32.0.0", "@metamask/user-operation-controller": "^10.0.0", "@metamask/utils": "^8.2.1", "@ngraveio/bc-ur": "^1.1.12", diff --git a/yarn.lock b/yarn.lock index 593b4a1e3b1d..997b90f3079d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4655,6 +4655,18 @@ __metadata: languageName: node linkType: hard +"@metamask/approval-controller@npm:^7.0.0": + version: 7.0.0 + resolution: "@metamask/approval-controller@npm:7.0.0" + dependencies: + "@metamask/base-controller": "npm:^6.0.0" + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/utils": "npm:^8.3.0" + nanoid: "npm:^3.1.31" + checksum: 10/a7d4e721de1676e1a7d284d10c0c21e21f724e1ad9365048398396eb7cd4f1359a99d18e667669dad1432537340d978b9d7bfe7cdf353453988580637d230204 + languageName: node + linkType: hard + "@metamask/assets-controllers@npm:^29.0.0": version: 29.0.0 resolution: "@metamask/assets-controllers@npm:29.0.0" @@ -4741,6 +4753,16 @@ __metadata: languageName: node linkType: hard +"@metamask/base-controller@npm:^6.0.0": + version: 6.0.0 + resolution: "@metamask/base-controller@npm:6.0.0" + dependencies: + "@metamask/utils": "npm:^8.3.0" + immer: "npm:^9.0.6" + checksum: 10/569ecd28499c0353930471db6be6625629407f6c3e4409a96243caaf515b4db78041a8d8aa6185b82d83095ceb0f7b521e4023bad663b021ab04bb64870b21d1 + languageName: node + linkType: hard + "@metamask/browser-passworder@npm:^4.3.0": version: 4.3.0 resolution: "@metamask/browser-passworder@npm:4.3.0" @@ -4767,6 +4789,23 @@ __metadata: languageName: node linkType: hard +"@metamask/controller-utils@npm:^11.0.0": + version: 11.0.0 + resolution: "@metamask/controller-utils@npm:11.0.0" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + "@metamask/eth-query": "npm:^4.0.0" + "@metamask/ethjs-unit": "npm:^0.3.0" + "@metamask/utils": "npm:^8.3.0" + "@spruceid/siwe-parser": "npm:2.1.0" + "@types/bn.js": "npm:^5.1.5" + bn.js: "npm:^5.2.1" + eth-ens-namehash: "npm:^2.0.8" + fast-deep-equal: "npm:^3.1.3" + checksum: 10/3bb18d6dbac04b1b2566b0c207614d216829a1ab77d1192e3d02f2c3c3a658c6a4d200a285433b8e583c1f33fddb9e07043af7d05a7cb88fd055a90ad52ee843 + languageName: node + linkType: hard + "@metamask/controller-utils@npm:^8.0.1, @metamask/controller-utils@npm:^8.0.4": version: 8.0.4 resolution: "@metamask/controller-utils@npm:8.0.4" @@ -5267,6 +5306,27 @@ __metadata: languageName: node linkType: hard +"@metamask/gas-fee-controller@npm:^17.0.0": + version: 17.0.0 + resolution: "@metamask/gas-fee-controller@npm:17.0.0" + dependencies: + "@metamask/base-controller": "npm:^6.0.0" + "@metamask/controller-utils": "npm:^11.0.0" + "@metamask/eth-query": "npm:^4.0.0" + "@metamask/ethjs-unit": "npm:^0.3.0" + "@metamask/network-controller": "npm:^19.0.0" + "@metamask/polling-controller": "npm:^8.0.0" + "@metamask/utils": "npm:^8.3.0" + "@types/bn.js": "npm:^5.1.5" + "@types/uuid": "npm:^8.3.0" + bn.js: "npm:^5.2.1" + uuid: "npm:^8.3.2" + peerDependencies: + "@metamask/network-controller": ^19.0.0 + checksum: 10/673cbea0d2eb696815a6608303667cc81ba432aeb903c52a78ac71884715dc165db71daea25fc368c68c60ab39ffbefe5191d4faa6ca31d52020cf2ae49d55e4 + languageName: node + linkType: hard + "@metamask/jazzicon@npm:^2.0.0": version: 2.0.0 resolution: "@metamask/jazzicon@npm:2.0.0" @@ -5707,6 +5767,23 @@ __metadata: languageName: node linkType: hard +"@metamask/polling-controller@npm:^8.0.0": + version: 8.0.0 + resolution: "@metamask/polling-controller@npm:8.0.0" + dependencies: + "@metamask/base-controller": "npm:^6.0.0" + "@metamask/controller-utils": "npm:^11.0.0" + "@metamask/network-controller": "npm:^19.0.0" + "@metamask/utils": "npm:^8.3.0" + "@types/uuid": "npm:^8.3.0" + fast-json-stable-stringify: "npm:^2.1.0" + uuid: "npm:^8.3.2" + peerDependencies: + "@metamask/network-controller": ^19.0.0 + checksum: 10/440abc7848a2f01af21acc9c0afee46898ecdce71b02e6525c1571eda30d33e3d4cf005f6af1179ed60ec2859a7afd79f0bfcac703cad67b83d7fcc871d31b5b + languageName: node + linkType: hard + "@metamask/post-message-stream@npm:^7.0.0": version: 7.0.0 resolution: "@metamask/post-message-stream@npm:7.0.0" @@ -6090,9 +6167,9 @@ __metadata: languageName: node linkType: hard -"@metamask/transaction-controller@npm:^30.0.0": - version: 30.0.0 - resolution: "@metamask/transaction-controller@npm:30.0.0" +"@metamask/transaction-controller@npm:^32.0.0": + version: 32.0.0 + resolution: "@metamask/transaction-controller@npm:32.0.0" dependencies: "@ethereumjs/common": "npm:^3.2.0" "@ethereumjs/tx": "npm:^4.2.0" @@ -6100,17 +6177,17 @@ __metadata: "@ethersproject/abi": "npm:^5.7.0" "@ethersproject/contracts": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.0" - "@metamask/approval-controller": "npm:^6.0.2" - "@metamask/base-controller": "npm:^5.0.2" - "@metamask/controller-utils": "npm:^9.1.0" + "@metamask/approval-controller": "npm:^7.0.0" + "@metamask/base-controller": "npm:^6.0.0" + "@metamask/controller-utils": "npm:^11.0.0" "@metamask/eth-query": "npm:^4.0.0" - "@metamask/gas-fee-controller": "npm:^15.1.2" + "@metamask/gas-fee-controller": "npm:^17.0.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/network-controller": "npm:^18.1.2" + "@metamask/network-controller": "npm:^19.0.0" "@metamask/nonce-tracker": "npm:^5.0.0" "@metamask/rpc-errors": "npm:^6.2.1" "@metamask/utils": "npm:^8.3.0" - async-mutex: "npm:^0.2.6" + async-mutex: "npm:^0.5.0" bn.js: "npm:^5.2.1" eth-method-registry: "npm:^4.0.0" fast-json-patch: "npm:^3.1.1" @@ -6118,10 +6195,10 @@ __metadata: uuid: "npm:^8.3.2" peerDependencies: "@babel/runtime": ^7.23.9 - "@metamask/approval-controller": ^6.0.0 - "@metamask/gas-fee-controller": ^15.0.0 - "@metamask/network-controller": ^18.1.2 - checksum: 10/549dd7c703993a23edc0cb711f7684c98b75bf187ecfd1f7bcc3b4fe038116a06e4385a2f6e03b1556703ce0d0e4c9ba9787250c016a746778ebdbb52e0331ea + "@metamask/approval-controller": ^7.0.0 + "@metamask/gas-fee-controller": ^17.0.0 + "@metamask/network-controller": ^19.0.0 + checksum: 10/90c2f48883f325ba44ef4070d6f25f98dd369fdd2d1c862b45aa7ad5406a17884ea1e6a7a08203f93b4b4f02779f0d4e2ab1c3120f8a0e991c3ca67af91fe7c4 languageName: node linkType: hard @@ -12001,6 +12078,15 @@ __metadata: languageName: node linkType: hard +"async-mutex@npm:^0.5.0": + version: 0.5.0 + resolution: "async-mutex@npm:0.5.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/4c6bfce1cc9cd43f723c4d96403ac5f4757f885c953b839cde6956ec8817ff39623b82d67614de10c7933e21626925882fb9bac367db7d15d7cb4f84228722c9 + languageName: node + linkType: hard + "async-settle@npm:^1.0.0": version: 1.0.0 resolution: "async-settle@npm:1.0.0" @@ -24770,7 +24856,7 @@ __metadata: "@metamask/snaps-utils": "npm:^7.4.0" "@metamask/test-bundler": "npm:^1.0.0" "@metamask/test-dapp": "npm:^8.4.0" - "@metamask/transaction-controller": "npm:^30.0.0" + "@metamask/transaction-controller": "npm:^32.0.0" "@metamask/user-operation-controller": "npm:^10.0.0" "@metamask/utils": "npm:^8.2.1" "@ngraveio/bc-ur": "npm:^1.1.12" From af6a75f91c937f5b19671bf084e5aa7a5d06dc50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Oliv=C3=A9?= Date: Wed, 5 Jun 2024 11:13:48 +0200 Subject: [PATCH 2/3] fix(mmi): improve mmi controller unit tests (#25031) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** Add more unit tests in the mmi controller to increase coverage ## **Related issues** Fixes: ## **Manual testing steps** 1. Go to this page... 2. 3. ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [x] I’ve followed [MetaMask Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- .../controllers/mmi-controller.test.ts | 512 ++++++++++++++---- app/scripts/controllers/mmi-controller.ts | 4 +- 2 files changed, 420 insertions(+), 96 deletions(-) diff --git a/app/scripts/controllers/mmi-controller.test.ts b/app/scripts/controllers/mmi-controller.test.ts index e30e9a44aa00..3616c7ae29fe 100644 --- a/app/scripts/controllers/mmi-controller.test.ts +++ b/app/scripts/controllers/mmi-controller.test.ts @@ -7,31 +7,27 @@ import { } from '@metamask-institutional/custody-keyring'; import { TransactionUpdateController } from '@metamask-institutional/transaction-update'; import { SignatureController } from '@metamask/signature-controller'; - import { NetworkController } from '@metamask/network-controller'; import { AccountsController } from '@metamask/accounts-controller'; import { EthAccountType } from '@metamask/keyring-api'; - import { CustodyController } from '@metamask-institutional/custody-controller'; +import * as PortfolioDashboard from '@metamask-institutional/portfolio-dashboard'; import { CHAIN_IDS, NETWORK_TYPES, TEST_NETWORK_TICKER_MAP, } from '../../../shared/constants/network'; - import MMIController from './mmi-controller'; import AppStateController from './app-state'; import { ControllerMessenger } from '@metamask/base-controller'; import { mmiKeyringBuilderFactory } from '../mmi-keyring-builder-factory'; import MetaMetricsController from './metametrics'; +import { ETH_EOA_METHODS } from '../../../shared/constants/eth-methods'; jest.mock('@metamask-institutional/portfolio-dashboard', () => ({ handleMmiPortfolio: jest.fn(), })); -import * as PortfolioDashboard from '@metamask-institutional/portfolio-dashboard'; -import { ETH_EOA_METHODS } from '../../../shared/constants/eth-methods'; - jest.mock('./permissions', () => ({ getPermissionBackgroundApiMethods: jest.fn().mockImplementation(() => { return { @@ -78,7 +74,6 @@ describe('MMIController', function () { keyringController, metaMetricsController, custodyController; - let handleMmiPortfolioSpy, controllerMessengerSpy; beforeEach(async function () { const mockMessenger = { @@ -279,6 +274,10 @@ describe('MMIController', function () { extension: { runtime: { id: 'mock-extension-id' } }, }); + mmiController.getState = jest.fn(); + mmiController.captureException = jest.fn(); + mmiController.accountTracker = { syncWithAddresses: jest.fn() }; + jest.spyOn(metaMetricsController.store, 'getState').mockReturnValue({ metaMetricsId: mockMetaMetricsId, }); @@ -288,69 +287,384 @@ describe('MMIController', function () { jest.clearAllMocks(); }); - describe('mmiController constructor', function () { - it('should instantiate correctly', function () { - expect(mmiController).toBeInstanceOf(MMIController); + describe('addKeyringIfNotExists', () => { + it('should add a new keyring if it does not exist', async () => { + const type = 'mock-keyring-type'; + mmiController.keyringController.getKeyringsByType = jest + .fn() + .mockReturnValue([]); + mmiController.keyringController.addNewKeyring = jest + .fn() + .mockResolvedValue('new-keyring'); + + const result = await mmiController.addKeyringIfNotExists(type); + + expect(mmiController.keyringController.getKeyringsByType).toHaveBeenCalledWith( + type + ); + expect(mmiController.keyringController.addNewKeyring).toHaveBeenCalledWith( + type + ); + expect(result).toBe('new-keyring'); + }); + + it('should return existing keyring if it exists', async () => { + const type = 'mock-keyring-type'; + const existingKeyring = 'existing-keyring'; + mmiController.keyringController.getKeyringsByType = jest + .fn() + .mockReturnValue([existingKeyring]); + mmiController.keyringController.addNewKeyring = jest.fn(); + + const result = await mmiController.addKeyringIfNotExists(type); + + expect(mmiController.keyringController.getKeyringsByType).toHaveBeenCalledWith( + type + ); + expect(mmiController.keyringController.addNewKeyring).not.toHaveBeenCalled(); + expect(result).toBe(existingKeyring); }); + }); - it('should have all required properties', function () { - expect(mmiController.opts).toBeDefined(); - expect(mmiController.mmiConfigurationController).toBeDefined(); - expect(mmiController.transactionUpdateController).toBeDefined(); + describe('onSubmitPassword', () => { + it('should add keyrings and handle refresh tokens and events', async () => { + mmiController.custodyController.getAllCustodyTypes = jest + .fn() + .mockReturnValue(['mock-custody-type']); + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + on: jest.fn(), + getAccounts: jest.fn().mockResolvedValue(['0x1']), + getSupportedChains: jest.fn().mockResolvedValue({}), + }); + mmiController.storeCustodianSupportedChains = jest.fn(); + mmiController.txStateManager = { + getTransactions: jest.fn().mockReturnValue([]), + }; + mmiController.transactionUpdateController.subscribeToEvents = jest.fn(); + mmiController.mmiConfigurationController.storeConfiguration = jest.fn(); + mmiController.transactionUpdateController.getCustomerProofForAddresses = jest.fn(); + + await mmiController.onSubmitPassword(); + + expect(mmiController.addKeyringIfNotExists).toHaveBeenCalled(); + expect(mmiController.storeCustodianSupportedChains).toHaveBeenCalled(); + expect(mmiController.transactionUpdateController.subscribeToEvents).toHaveBeenCalled(); + expect(mmiController.mmiConfigurationController.storeConfiguration).toHaveBeenCalled(); }); }); - describe('persistKeyringsAfterRefreshTokenChange', function () { - it('should call keyringController.persistAllKeyrings', async function () { - mmiController.keyringController.persistAllKeyrings = jest.fn(); + describe('connectCustodyAddresses', () => { + it('should connect new addresses to custodian', async () => { + const custodianType = 'mock-custodian-type'; + const custodianName = 'mock-custodian-name'; + const accounts = { + '0x1': { + name: 'Account 1', + custodianDetails: {}, + labels: [], + token: 'token', + chainId: 1, + }, + }; + CUSTODIAN_TYPES['MOCK-CUSTODIAN-TYPE'] = { keyringClass: { type: 'mock-keyring-class' } }; + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + on: jest.fn(), + setSelectedAddresses: jest.fn(), + addAccounts: jest.fn(), + addNewAccountForKeyring: jest.fn(), + getStatusMap: jest.fn(), + }); + mmiController.keyringController.getAccounts = jest + .fn() + .mockResolvedValue(['0x2']); + mmiController.keyringController.addNewAccountForKeyring = jest.fn() - await mmiController.persistKeyringsAfterRefreshTokenChange(); + mmiController.custodyController.setAccountDetails = jest.fn(); + mmiController.accountTracker.syncWithAddresses = jest.fn(); + mmiController.storeCustodianSupportedChains = jest.fn(); + mmiController.custodyController.storeCustodyStatusMap = jest.fn(); - expect( - mmiController.keyringController.persistAllKeyrings, - ).toHaveBeenCalled(); + const result = await mmiController.connectCustodyAddresses( + custodianType, + custodianName, + accounts + ); + + expect(mmiController.addKeyringIfNotExists).toHaveBeenCalled(); + expect(mmiController.keyringController.getAccounts).toHaveBeenCalled(); + expect(mmiController.custodyController.setAccountDetails).toHaveBeenCalled(); + expect(mmiController.accountTracker.syncWithAddresses).toHaveBeenCalled(); + expect(mmiController.storeCustodianSupportedChains).toHaveBeenCalled(); + expect(mmiController.custodyController.storeCustodyStatusMap).toHaveBeenCalled(); + expect(result).toEqual(['0x1']); }); }); - describe('trackTransactionEventFromCustodianEvent', function () { - it('should call trackTransactionEvents', function () { - const event = 'event'; + describe('getCustodianAccounts', () => { + it('should return custodian accounts', async () => { + CUSTODIAN_TYPES['MOCK-CUSTODIAN-TYPE'] = { keyringClass: { type: 'mock-keyring-class' } }; + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + getCustodianAccounts: jest.fn().mockResolvedValue(['account1']), + }); - mmiController.trackTransactionEventFromCustodianEvent({}, event); + const result = await mmiController.getCustodianAccounts( + 'token', + 'neptune-custody', + 'ECA3', + true + ); - expect(mmiController.trackTransactionEvents).toHaveBeenCalledWith( - { - transactionMeta: {}, - }, - event, + expect(result).toEqual(['account1']); + }); + + it('should return custodian accounts when custodianType is not provided', async () => { + CUSTODIAN_TYPES['CUSTODIAN-TYPE'] = { keyringClass: { type: 'mock-keyring-class' } }; + mmiController.messenger.call = jest + .fn() + .mockReturnValue({ address: '0x1' }); + mmiController.custodyController.getCustodyTypeByAddress = jest + .fn() + .mockReturnValue('custodian-type'); + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + getCustodianAccounts: jest.fn().mockResolvedValue(['account1']), + }); + + const result = await mmiController.getCustodianAccounts( + 'token', + 'neptune-custody', ); + + expect(result).toEqual(['account1']); }); }); - describe('custodianEventHandlerFactory', function () { - it('should call custodianEventHandlerFactory', async function () { - mmiController.custodianEventHandlerFactory = jest.fn(); + describe('getCustodianAccountsByAddress', () => { + it('should return custodian accounts by address', async () => { + CUSTODIAN_TYPES['MOCK-CUSTODIAN-TYPE'] = { keyringClass: { type: 'mock-keyring-class' } }; + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + getCustodianAccounts: jest.fn().mockResolvedValue(['account1']), + }); - mmiController.custodianEventHandlerFactory(); + const result = await mmiController.getCustodianAccountsByAddress( + 'token', + 'envName', + 'address', + 'mock-custodian-type' + ); - expect(mmiController.custodianEventHandlerFactory).toHaveBeenCalled(); + expect(result).toEqual(['account1']); }); }); - describe('storeCustodianSupportedChains', function () { - it('should call storeCustodianSupportedChains', async function () { - mmiController.storeCustodianSupportedChains = jest.fn(); + describe('getCustodianTransactionDeepLink', () => { + it('should return a transaction deep link', async () => { + mmiController.custodyController.getCustodyTypeByAddress = jest + .fn() + .mockReturnValue('custodyType'); + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + getTransactionDeepLink: jest + .fn() + .mockResolvedValue('transactionDeepLink'), + }); + + const result = await mmiController.getCustodianTransactionDeepLink( + 'address', + 'txId' + ); + + expect(result).toEqual('transactionDeepLink'); + }); + }); - mmiController.storeCustodianSupportedChains('0x1'); + describe('getCustodianConfirmDeepLink', () => { + it('should return a confirmation deep link', async () => { + mmiController.txStateManager = { + getTransactions: jest.fn().mockReturnValue([ + { + id: 'txId', + txParams: { from: '0x1' }, + custodyId: 'custodyId', + }, + ]), + }; + mmiController.custodyController.getCustodyTypeByAddress = jest + .fn() + .mockReturnValue('custodyType'); + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + getTransactionDeepLink: jest + .fn() + .mockResolvedValue('transactionDeepLink'), + }); + + const result = await mmiController.getCustodianConfirmDeepLink('txId'); - expect(mmiController.storeCustodianSupportedChains).toHaveBeenCalledWith( - '0x1', + expect(result).toEqual({ + deepLink: 'transactionDeepLink', + custodyId: 'custodyId', + }); + }); + }); + + describe('getCustodianSignMessageDeepLink', () => { + it('should return a sign message deep link', async () => { + mmiController.custodyController.getCustodyTypeByAddress = jest + .fn() + .mockReturnValue('custodyType'); + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue({ + getTransactionDeepLink: jest + .fn() + .mockResolvedValue('transactionDeepLink'), + }); + + const result = await mmiController.getCustodianSignMessageDeepLink( + 'address', + 'custodyTxId' ); + + expect(result).toEqual('transactionDeepLink'); + }); + }); + + describe('getCustodianToken', () => { + it('should return a custodian token', async () => { + mmiController.keyringController.getKeyringForAccount = jest + .fn() + .mockResolvedValue({ + getAccountDetails: jest.fn().mockReturnValue({ + authDetails: { jwt: 'jwtToken' }, + }), + }); + + const result = await mmiController.getCustodianToken('address'); + + expect(result).toEqual('jwtToken'); + }); + + it('should return an empty string if authDetails are undefined', async () => { + mmiController.keyringController.getKeyringForAccount = jest + .fn() + .mockResolvedValue({ + getAccountDetails: jest.fn().mockReturnValue({}), + }); + + const result = await mmiController.getCustodianToken('address'); + + expect(result).toEqual(''); + }); + }); + + describe('getCustodianJWTList', () => { + it('should return a list of JWTs for a custodian', async () => { + mmiController.custodyController.getAccountDetails = jest + .fn() + .mockReturnValue({}); + mmiController.messenger.call = jest + .fn() + .mockReturnValue([mockAccount, mockAccount2]); + mmiController.mmiConfigurationController.store.getState = jest + .fn() + .mockReturnValue({ + mmiConfiguration: { + custodians: [{ envName: 'custodianEnvName', type: 'ECA3' }], + }, + }); + mmiController.keyringController.getKeyringsByType = jest + .fn() + .mockReturnValue([ + { + getAccountDetails: jest.fn().mockReturnValue({ + authDetails: { jwt: 'jwtToken' }, + }), + }, + ]); + + const result = await mmiController.getCustodianJWTList( + 'custodianEnvName' + ); + + expect(result).toEqual([]); }); }); describe('getAllCustodianAccountsWithToken', () => { - it('should return custodian accounts with tokens', async () => {}); + it('should return all custodian accounts with a token', async () => { + mmiController.keyringController.getKeyringsByType = jest + .fn() + .mockReturnValue([ + { + getAllAccountsWithToken: jest.fn().mockReturnValue(['account1']), + }, + ]); + + const result = await mmiController.getAllCustodianAccountsWithToken( + 'custodyType', + 'token' + ); + + expect(result).toEqual(['account1']); + }); + }); + + describe('setCustodianNewRefreshToken', () => { + it('should set a new refresh token for a custodian account', async () => { + mmiController.custodyController.getCustodyTypeByAddress = jest + .fn() + .mockReturnValue('custodyType'); + const keyringMock = { + replaceRefreshTokenAuthDetails: jest.fn(), + }; + mmiController.addKeyringIfNotExists = jest.fn().mockResolvedValue(keyringMock); + + await mmiController.setCustodianNewRefreshToken({ + address: 'address', + refreshToken: 'refreshToken', + }); + + expect(keyringMock.replaceRefreshTokenAuthDetails).toHaveBeenCalledWith('address', 'refreshToken'); + }); + }); + + describe('handleMmiCheckIfTokenIsPresent', () => { + it('should check if a token is present', async () => { + mmiController.messenger.call = jest + .fn() + .mockReturnValue({ address: '0x1' }); + mmiController.custodyController.getCustodyTypeByAddress = jest + .fn() + .mockReturnValue('custodyType'); + mmiController.addKeyringIfNotExists = jest + .fn() + .mockResolvedValue('keyring'); + mmiController.appStateController.getUnlockPromise = jest.fn(); + mmiController.custodyController.handleMmiCheckIfTokenIsPresent = jest.fn(); + + await mmiController.handleMmiCheckIfTokenIsPresent({ + params: { + token: 'token', + envName: 'envName', + address: 'address', + }, + }); + + expect(mmiController.appStateController.getUnlockPromise).toHaveBeenCalled(); + expect(mmiController.custodyController.handleMmiCheckIfTokenIsPresent).toHaveBeenCalled(); + }); }); describe('handleMmiDashboardData', () => { @@ -359,7 +673,7 @@ describe('MMIController', function () { await mmiController.handleMmiDashboardData(); expect(controllerMessengerSpy).toHaveBeenCalledWith( - 'AccountsController:listAccounts', + 'AccountsController:listAccounts' ); expect(controllerMessengerSpy).toHaveReturnedWith([ mockAccount, @@ -375,39 +689,75 @@ describe('MMIController', function () { networks: expect.anything(), getAccountDetails: expect.anything(), extensionId: expect.anything(), - }), + }) ); }); }); - describe('getCustodianJWTList', () => { - it('should call the controller messenger to get internalAccounts', async () => { - const controllerMessengerSpy = jest.spyOn(controllerMessenger, 'call'); - await mmiController.getCustodianJWTList(); + describe('newUnsignedMessage', () => { + it('should create a new unsigned message', async () => { + mmiController.custodyController.getAccountDetails = jest + .fn() + .mockReturnValue({}); - expect(controllerMessengerSpy).toHaveBeenCalledWith( - 'AccountsController:listAccounts', + const message = { from: '0x1' }; + const request = { method: 'eth_signTypedData' }; + + mmiController.signatureController.newUnsignedTypedMessage = jest + .fn() + .mockResolvedValue('unsignedTypedMessage'); + + const result = await mmiController.newUnsignedMessage( + message, + request, + 'v4' ); - expect(controllerMessengerSpy).toHaveReturnedWith([ - mockAccount, - mockAccount2, - ]); + expect(result).toEqual('unsignedTypedMessage'); }); }); - describe('setAccountAndNetwork', function () { + describe('handleSigningEvents', () => { + it('should handle signing events', async () => { + mmiController.transactionUpdateController.addTransactionToWatchList = jest + .fn() + .mockResolvedValue('added'); + mmiController.signatureController.setMessageMetadata = jest.fn(); + + const signature = { + custodian_transactionId: 'custodianTxId', + from: '0x1', + }; + const messageId = 'messageId'; + + await mmiController.handleSigningEvents( + signature, + messageId, + 'signOperation' + ); + + expect( + mmiController.transactionUpdateController.addTransactionToWatchList + ).toHaveBeenCalledWith('custodianTxId', '0x1', 'signOperation', true); + expect(mmiController.signatureController.setMessageMetadata).toHaveBeenCalledWith( + messageId, + signature + ); + }); + }); + + describe('setAccountAndNetwork', () => { it('should set a new selected account if the selectedAddress and the address from the arguments is different', async () => { const selectedAccountSpy = jest.spyOn(controllerMessenger, 'call'); await mmiController.setAccountAndNetwork( 'mock-origin', mockAccount2.address, - '0x1', + '0x1' ); expect(selectedAccountSpy).toHaveBeenCalledWith( 'AccountsController:setSelectedAccount', - mockAccount2.id, + mockAccount2.id ); const selectedAccount = accountsController.getSelectedAccount(); @@ -420,54 +770,26 @@ describe('MMIController', function () { await mmiController.setAccountAndNetwork( 'mock-origin', mockAccount.address, - '0x1', + '0x1' ); - // only getSelectedAccount + expect(selectedAccountSpy).toHaveBeenCalledTimes(1); const selectedAccount = accountsController.getSelectedAccount(); expect(selectedAccount.id).toBe(mockAccount.id); }); }); - describe('getCustodianAccounts', () => { - const mockCustodialKeyring = jest.fn(); - it('returns custodian accounts', async () => { - const selectedAccountSpy = jest.spyOn(controllerMessenger, 'call'); - const keyringControllerSpy = jest - .spyOn(keyringController, 'addNewKeyring') - .mockReturnValue({ - getCustodianAccounts: mockCustodialKeyring, - }); - - await mmiController.getCustodianAccounts( - 'token', - 'neptune-custody', - 'ECA3', - ); - - expect(selectedAccountSpy).toHaveBeenCalledTimes(0); - - expect(keyringControllerSpy).toHaveBeenCalledWith('Custody - ECA3'); - expect(mockCustodialKeyring).toHaveBeenCalled(); - }); - - it("returns custodian accounts when custodyType isn't set", async () => { - const selectedAccountSpy = jest.spyOn(controllerMessenger, 'call'); - const keyringControllerSpy = jest - .spyOn(keyringController, 'addNewKeyring') - .mockReturnValue({ - getCustodianAccounts: mockCustodialKeyring, - }); + describe('handleMmiOpenAddHardwareWallet', () => { + it('should open add hardware wallet interface', async () => { + mmiController.appStateController.getUnlockPromise = jest.fn(); + mmiController.platform = { openExtensionInBrowser: jest.fn() }; - await mmiController.getCustodianAccounts('token', 'neptune-custody'); + await mmiController.handleMmiOpenAddHardwareWallet(); - expect(selectedAccountSpy).toHaveBeenCalledWith( - 'AccountsController:getSelectedAccount', + expect(mmiController.appStateController.getUnlockPromise).toHaveBeenCalled(); + expect(mmiController.platform.openExtensionInBrowser).toHaveBeenCalledWith( + '/new-account/connect' ); - expect(selectedAccountSpy).toHaveReturnedWith(mockAccount); - - expect(keyringControllerSpy).toHaveBeenCalledWith('Custody - ECA3'); - expect(mockCustodialKeyring).toHaveBeenCalled(); }); }); }); diff --git a/app/scripts/controllers/mmi-controller.ts b/app/scripts/controllers/mmi-controller.ts index 31de78659952..6089019e23c4 100644 --- a/app/scripts/controllers/mmi-controller.ts +++ b/app/scripts/controllers/mmi-controller.ts @@ -641,7 +641,9 @@ export default class MMIController extends EventEmitter { async getCustodianToken(address: string) { const keyring = await this.keyringController.getKeyringForAccount(address); const { authDetails } = keyring.getAccountDetails(address); - return keyring ? authDetails.jwt || authDetails.refreshToken : ''; + return keyring + ? (authDetails && (authDetails.jwt || authDetails.refreshToken)) || '' + : ''; } // Based on a custodian name, get all the tokens associated with that custodian From 98385ff51b0f71e850e3cc76ed3f07780decaba1 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Wed, 5 Jun 2024 11:28:15 +0200 Subject: [PATCH 3/3] fix: iframe injection in MV3 (#25051) ## **Description** Fixes injection into iframes in the MV3 build by enabling `allFrames`. This is also currently enabled in MV2: https://github.com/MetaMask/metamask-extension/blob/13bd82914d1ac2c584fb799e6eee9b90fe889fe2/app/manifest/v2/_base.json#L42 [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/25051?quickstart=1) ## **Manual testing steps** 1. Go to https://jup.ag/ 2. Try connecting with MetaMask, this will use Solflare snap 3. You should be able to fully connect to the site --- app/scripts/app-init.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/scripts/app-init.js b/app/scripts/app-init.js index af3c9bb6b3af..275595beafed 100644 --- a/app/scripts/app-init.js +++ b/app/scripts/app-init.js @@ -169,6 +169,7 @@ const registerInPageContentScript = async () => { js: ['scripts/inpage.js'], runAt: 'document_start', world: 'MAIN', + allFrames: true, }, ]); } catch (err) {