Repository navigation
Description
Summary
wallet_requestExecutionPermissions on Robinhood Chain (chain id 4663) shows the permission screen correctly, but fails when the user clicks Grant:
code -32603 | An internal error was received. | External signature requests cannot sign delegations for internal accounts.
The same request on Base (8453), from the same account and the same dapp, succeeds.
wallet_getSupportedExecutionPermissions lists 4663 for every permission type, so the wallet advertises a chain on which it cannot sign.
Environment
- MetaMask extension v13.48.0 (Chrome), software (imported) account, already upgraded to
EIP7702StatelessDeleGator(0x63c0c19a282a1B52b07dD5a65b58948A07DAE32B) - Resolved in the extension's
yarn.lockat tagv13.48.0:@metamask/gator-permissions-controller4.2.2,@metamask/signature-controller39.2.10,@metamask/gator-permissions-snap2.4.0,@metamask/delegation-deployments1.4.0 - The latest release, v13.50.0, resolves the same
@metamask/gator-permissions-controller4.2.2 and@metamask/delegation-deployments1.4.0 in itsyarn.lock. - Dapp:
@metamask/smart-accounts-kit2.0.0, viem 2.57.2 - Origin:
http://localhost:3000
Steps to reproduce
- Switch MetaMask to Robinhood Chain (4663).
- Call
wallet_getSupportedExecutionPermissions.erc20-token-allowancelists chain 4663 with rule typesexpiry,redeemer,payee. - Call
wallet_requestExecutionPermissionswith:
await walletClient.requestExecutionPermissions([
{
chainId: 4663,
from: account,
to: "0xd9eeA7fA73e4Ed58FDe08cF543e370ECceB491Ed",
expiry: now + 86400,
redeemer: ["0xd9eeA7fA73e4Ed58FDe08cF543e370ECceB491Ed"],
payee: ["0xd9eeA7fA73e4Ed58FDe08cF543e370ECceB491Ed"],
permission: {
type: "erc20-token-allowance",
isAdjustmentAllowed: false,
data: {
tokenAddress: "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168", // USDG
allowanceAmount: 1000000n,
justification: "test",
},
},
},
]);- The permission screen renders correctly (network "Robinhood Chain", token USDG, redeemers, payees).
- Click Grant.
Expected
The permission is granted, as it is on Base with the same parameters (chain id 8453, USDC).
Actual
The request rejects with External signature requests cannot sign delegations for internal accounts.
Analysis
This is from reading the source, the published packages and the lock files. I did not capture the extension's internal logs, so the root cause is inferred, not observed. File paths are on core main; the published 4.2.2 and 39.2.10 builds contain the same logic.
- The snap asks the extension to sign the
Delegationtyped data.SignatureController.#tryGetDecodedPermissionIfDelegationcallsGatorPermissionsController:decodePermissionFromPermissionContextForOrigin. Any error there is caught and only logged (Failed to decode permission), anddecodedPermissionstaysundefined(packages/signature-controller/src/SignatureController.ts). - With no decoded permission,
validateDelegationtreats the request as a raw delegation from an external origin for an internal account, and throws (packages/signature-controller/src/utils/validation.ts). - The decode fails because
decodePermissionFromPermissionContextForOriginlooks upDELEGATOR_CONTRACTS['1.3.0'][chainId]from@metamask/delegation-deploymentsand throwsContracts not found for chainId: 4663when the chain is missing (packages/gator-permissions-controller/src/GatorPermissionsController.ts,src/decodePermission/enforcerAddresses.ts). @metamask/delegation-deployments1.4.0 has no entry for 4663. Versions 2.0.0 and 2.1.0 do:
require("@metamask/delegation-deployments@1.4.0").DELEGATOR_CONTRACTS["1.3.0"][4663] // undefined
require("@metamask/delegation-deployments@2.0.0").DELEGATOR_CONTRACTS["1.3.0"][4663] // defined@metamask/gator-permissions-controllerdepends on@metamask/delegation-deployments^1.4.0in every published version from 4.2.1 to 6.0.1, and oncoremain. The range^1.4.0cannot resolve to 2.x.
Why the merged extension change does not fix it
metamask-extension PR #46194 ("chore: Bump @metamask/delegation-deployments from ^1.3.0 to ^2.0.0", merged 2026-09-22, not yet in a release; its description says it brings the Robinhood chain deployments) bumps the extension's own direct dependency. The controller keeps its own copy. As of 2026-10-02, yarn.lock on release/13.51.0, release/13.52.0 and main has both:
"@metamask/delegation-deployments@npm:^1.4.0":
version: 1.4.0
"@metamask/delegation-deployments@npm:^2.0.0":
version: 2.0.0
"@metamask/gator-permissions-controller@npm:^4.2.1":
version: 4.2.2
dependencies:
"@metamask/delegation-deployments": "npm:^1.4.0"
So the signature path in 13.51.0 and 13.52.0 still reads the 1.4.0 chain list. I have not run a 13.51.0 build to confirm the behaviour.
metamask-extension PR #46777 (open, "chore: Bump @metamask/delegation-deployments from ^2.0.0 to ^2.1.0") changes the same direct dependency only, so it has the same limit.
Other chains with the same gap
On v13.48.0, wallet_getSupportedExecutionPermissions returns 43 chain ids. I compared that list with DELEGATOR_CONTRACTS['1.3.0'] in each published version:
@metamask/delegation-deployments |
Advertised chain ids with no entry |
|---|---|
| 1.4.0 | 4663, 5042, 5042002, 25, 338, 6342 |
| 2.0.0 | 5042, 25, 338, 6342 |
| 2.1.0 | 25, 338, 6342 |
I tested only 4663. By the same code path, I expect the other chains in the 1.4.0 row to fail in the same way.
Suggested fix
- Bump
@metamask/delegation-deploymentsto^2.1.0in@metamask/gator-permissions-controller, release it, and bump the controller in the extension. The Dependency Dashboard (Dependency Dashboard #10300) lists this update under "Pending Approval" ("update dependency @metamask/delegation-deployments to v2"); no PR exists for it yet. metamask-mobilemaindepends on the controller at^5.0.1. Itsyarn.lockresolves that to 5.0.2 with@metamask/delegation-deployments1.4.0, so mobile needs the controller bump too.- Optional: surface the decode error. The user-facing message says "External signature requests cannot sign delegations for internal accounts", which hides the real cause ("Contracts not found for chainId: 4663").
- Optional: derive the advertised chain list and the controller's decodable chain list from the same source, so
wallet_getSupportedExecutionPermissionscannot list a chain that the extension cannot sign for. The table above shows that a version bump alone does not close the gap for 25, 338 and 6342.
Related
- [Bug]: Money account deposit quotes fail on Robinhood Chain (4663) — "No contracts found for version 1.3.0 chain 4663" metamask-mobile#35681 (closed): the same missing chain 4663 in
@metamask/delegation-deployments1.4.0, on a different code path (getDeleGatorEnvironment). The fix there bumped mobile's direct dependency (chore: Upgrade @metamask/delegation-deployments from ^1.0.0 to ^2.0.0 cp-8.10.0 metamask-mobile#35678). That does not change the controller's copy. - Why are 712 delegation signatures disallowed in MM Core? #6125 and fix: validateDelegation should allow redelegation signing (non-root authority) #7917 report the same error message with a different cause.
Activity
WouterSls commentedon Oct 9, 2026
Update as of 2026-10-09:
@metamask/delegation-deploymentsto^2.1.0.yarn.lockon extensionmainandrelease/13.53.0, and on mobilemain, every resolved@metamask/gator-permissions-controller(4.2.2, 5.0.2, 6.0.0) still depends on@metamask/delegation-deployments^1.4.0, which resolves to 1.4.0. That version has no entry for chain 4663.@metamask/gator-permissions-controller6.0.1 oncoremainstill declares^1.4.0. The Dependency Dashboard (Dependency Dashboard #10300) still lists the v2 update under "Pending Approval", and no PR exists for it.So I expect the Grant step on Robinhood Chain to keep failing in 13.53.0. I have not run a 13.53.0 build to confirm this.
@MoMannn, you did the two app bumps. Could you also bump
@metamask/delegation-deploymentsto^2.1.0inpackages/gator-permissions-controller, or point me to the right owner? I can open the PR if that helps.MoMannn commentedon Oct 12, 2026
@WouterSls The
packages/gator-permissions-controlleris now in the scope of core team. Tho the exact owner was never really assigned. As per: https://www.figma.com/board/aPrAmXHvmY1Y63mjAsg95q/Delegations---Readable-Permissions-component-ownership?node-id=0-1&t=9IwvkTDUfxzq6E1s-0@McOso Maybe you can shed a bit more light on the ownership of this 👆
WouterSls commentedon Oct 30, 2026
I can see that the PR is up, thanks!