base / base/account-sdk

Bug: Base Sepolia transactions refused for newly-created 7702 accounts, while wallet_getCapabilities reports the chain as supported

Open
#363 5 comments 1 reaction 0 assignees View on GitHub
Dominant language
TypeScript
Stars
172
Forks
207
Avg merge
49m
Merged PRs (30d)
1

Description

### Describe the bug

Newly-created Base Accounts cannot send any transaction on Base Sepolia (84532). The `keys.coinbase.com` popup shows "This chain is not supported. Base Sepolia is not supported. Please try a different chain." and rejects the request with `{ code: 4001 }`. Accounts created before the ERC-4337 to EIP-7702 provisioning change still transact on Base Sepolia normally, through the same popup, from the same app.

### Steps

**Reproduction**

1. Create a **new** Base Account (any surface: base.app, or the popup's own email signup).
2. Connect from a dapp whose wagmi config lists `baseSepolia`.
3. Sign in with `personal_sign`. This succeeds.
4. Send any transaction on 84532 (`eth_sendTransaction` or `wallet_sendCalls`).
5. The popup renders the unsupported-chain screen and rejects.

A 20-line standalone harness reproduces it with no bundler. Happy to attach.

**What works and what does not, for a new account on 84532**

| method | result |
|---|---|
| `eth_requestAccounts`, `wallet_connect`, `wallet_switchEthereumChain` | ok |
| `personal_sign` | ok |
| `eth_sendTransaction` | refused |
| `wallet_sendCalls` | refused |
| `eth_signTypedData_v4` | refused |

**Where the refusal comes from**

In the popup bundle (`keys.coinbase.com/static/main..js`), the unsupported-chain copy
(message ids `Zhuq4r` and `2leMnv`) lives only inside the wallet-upgrade component, alongside
`"We need to set up your wallet to transact on {chainName}. Scan the QR code with the Base app."`
and a `https://base.app/sync?targetChainId=…` link. Its predicate is:

```js
var j = dt.fromChainId(BigInt(c)), // c = target chainId
w = !(null != j && j.isTestnet || !f[c]); // f = supportedChainsToNetworkMap
if (!w) return /* "…is not supported. Please try a different chain." */
```

Base Sepolia is present in `f` (its `displayName` is what fills the error copy), so `isTestnet`
is the operative term. The screen is reached only via a hook that short-circuits when the account
has `factoryAddress`/`factoryCalldata` (ERC-4337) and otherwise checks
`isDelegatedEOA(address, chainId)` against the designator above.

So the refusal is not a chain-support decision. It is delegation provisioning refusing to run on
a testnet, surfaced with chain-support copy.

**Two things that look inconsistent**

1. For the very account it refuses, `wallet_getCapabilities` returns Base Sepolia as capable:

```json
"0x14a34": { "paymasterService": {"supported": true}, "atomicBatch": {"supported": true},
"atomic": {"status": "supported"}, "auxiliaryFunds": {"supported": true},
"dataSuffix": {"supported": true} }
```

EIP-5792 says a wallet that does not support a requested chain "MUST NOT respond with an
error, and MUST instead not include a key for the unsupported chain(s)." The wallet includes
the key, and the one EIP-5792-defined capability present, `atomic: { status: "supported" }`,
is spec-defined to mean the wallet will execute the calls atomically. It then refuses them.
A dapp doing capability-based feature detection has no way to know the chain is unusable.

2. CDP's EIP-7702 documentation states that testnet delegation on Base Sepolia is supported and
simply unsponsored: *"On testnets (Base Sepolia, Ethereum Sepolia), the delegation transaction
requires ETH in the user's EOA. Use the CDP Faucet to fund accounts for testing."* I understand
that page describes CDP Wallets rather than Base Account, so this is not a direct
contradiction. But it does suggest the obstacle is sponsorship, not chain support, and the
popup never checks the account's balance before refusing.

**Also worth noting**

- `preference: 'smartWalletOnly'` no longer produces a 4337 account. Reading
`@coinbase/wallet-sdk@4.3.6`, `preference.options` is only consulted at `util/provider.js:37`
to choose the injected extension, and `createSmartAccount.js` `getFactoryArgs()` carries
`// TODO: support creating factory data` and only echoes what the popup supplies. So there is
no client-side way to opt into an account type that works on testnets.
- SDK version is not a factor: `keys.coinbase.com/connect` serves byte-identical HTML for
`sdkVersion=2.4.0` and `2.5.7`, and the predicate reads neither `sdkName` nor `sdkVersion`.
- The bundle contains a feature flag named `scw_native_delegation` that selects between two
upgrade-screen variants, which may be related.

**Questions**

1. Is refusing all testnets in the delegation-provisioning flow intended, or a gap?
2. Is there a timeline for enabling 7702 delegation provisioning on Base Sepolia?
3. In the meantime, is there any supported path for a dapp to develop and test against Base
Sepolia with newly-created Base Accounts? If not, could `wallet_getCapabilities` omit chains
the wallet will refuse, so dapps can detect this and degrade gracefully instead of walking
users into a dead-end popup?

### Expected behavior

7702 delegation provisioning on Base Sepolia

### Version

- `@base-org/account` 2.4.0 and 2.5.7 (identical behavior) - `@wagmi/connectors` 6.2.0 (`baseAccount` connector), wagmi 2.19.5, viem 2.45.2 - Chains: `[baseSepolia, base]`; also reproduced with `@coinbase/wallet-sdk` 4.3.6 and `preference: 'smartWalletOnly'`

### Additional info

_No response_

### Desktop

iOS Chrome and Safari

### Smartphone

_No response_

Contributor guide

Open the contributing guide

Research direction

Start with the @base-org/account and @coinbase/wallet-sdk integration points for eth_sendTransaction, wallet_sendCalls, and wallet_getCapabilities, then inspect the popup bundle's delegation-provisioning path and the scw_native_delegation variants. Reproduce the behavior on Base Sepolia with a newly-created account and compare the reported capabilities with the transaction outcome; done means the supported behavior and capability response are consistent.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
api, blockchain
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.