<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Semantic-Sentry</title>
    <description>The latest articles on DEV Community by Semantic-Sentry (@semanticsentry).</description>
    <link>https://dev.to/semanticsentry</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4173594%2F0b43bc62-54cd-4263-863c-474a618fd0e3.jpg</url>
      <title>DEV Community: Semantic-Sentry</title>
      <link>https://dev.to/semanticsentry</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/semanticsentry"/>
    <language>en</language>
    <item>
      <title>EIP-7702 in practice: testing three browser extension wallets</title>
      <dc:creator>Semantic-Sentry</dc:creator>
      <pubDate>Fri, 09 Oct 2026 14:08:47 +0000</pubDate>
      <link>https://dev.to/semanticsentry/eip-7702-in-practice-testing-three-browser-extension-wallets-5g8e</link>
      <guid>https://dev.to/semanticsentry/eip-7702-in-practice-testing-three-browser-extension-wallets-5g8e</guid>
      <description>&lt;p&gt;EIP-7702 shipped with Ethereum's Pectra upgrade. It lets an EOA &lt;br&gt;
delegate its code to a smart contract via an authorization_list &lt;br&gt;
in a type-4 transaction. If a user signs an authorization to &lt;br&gt;
an attacker-controlled delegate, the attacker gains full control &lt;br&gt;
over the EOA — all tokens, NFTs, staking positions, and approvals.&lt;/p&gt;

&lt;p&gt;The security model depends entirely on the wallet. And most of the &lt;br&gt;
writing about 7702 falls into two camps: hype ("this changes &lt;br&gt;
everything") or speculation ("wallets might not handle this"). &lt;br&gt;
Nobody, as far as I could find, had actually tested what the &lt;br&gt;
major extension wallets do when a dApp throws a type-4 transaction &lt;br&gt;
at them.&lt;/p&gt;

&lt;p&gt;So I did.&lt;/p&gt;

&lt;p&gt;This is a negative finding. I didn't find a bug. But I did find &lt;br&gt;
that the three most-used browser extension wallets each handle &lt;br&gt;
EIP-7702 differently — and that the current attack surface is &lt;br&gt;
effectively closed on extensions. Here's the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;p&gt;I set up a local Anvil node with --hardfork prague --chain-id 31337 &lt;br&gt;
and a minimal dApp served over HTTP to Chrome. The dApp has no &lt;br&gt;
access to the user's private key and can only interact via the &lt;br&gt;
injected window.ethereum provider.&lt;/p&gt;

&lt;p&gt;The "victim" is Anvil account #0 &lt;br&gt;
(0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266), whose private key is &lt;br&gt;
publicly known from Foundry documentation. This is intentional — &lt;br&gt;
it removes "did the attacker have the key?" as a variable. Every &lt;br&gt;
delegation attempt uses this address as authority.&lt;/p&gt;

&lt;p&gt;I tested three vectors against each wallet:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;eth_sendTransaction with an authorizationList field (baseline 
and non-empty variants)&lt;/li&gt;
&lt;li&gt;eth_sign on a computed authorization hash: 
keccak256(0x05 || rlp([chain_id, address, nonce]))&lt;/li&gt;
&lt;li&gt;wallet_signAuthorization — the RPC method specified in the 
7702 spec for wallets to sign authorization tuples on behalf 
of the user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal for each: determine whether a malicious dApp can obtain &lt;br&gt;
a valid authorization from a user without the user understanding &lt;br&gt;
what they are signing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  MetaMask Extension 13.47.0
&lt;/h3&gt;

&lt;p&gt;Vector 1 (eth_sendTransaction type-4):&lt;br&gt;
Error returned to the dApp: "External EIP-7702 transactions are &lt;br&gt;
not supported." MetaMask recognizes type-4 and rejects it before &lt;br&gt;
signing. This aligns with the "Added Protection" feature they &lt;br&gt;
shipped in September 2026.&lt;/p&gt;

&lt;p&gt;Vector 2 (eth_sign on auth hash):&lt;br&gt;
MetaMask shows a warning on eth_sign — this is well-documented &lt;br&gt;
behavior on recent versions.&lt;/p&gt;

&lt;p&gt;Vector 3 (wallet_signAuthorization):&lt;br&gt;
{ "code": -32601, "message": "method not found" }&lt;/p&gt;

&lt;p&gt;Verdict: MetaMask has explicitly closed the surface. The wallet &lt;br&gt;
will not sign 7702 authorizations from dApps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trust Wallet Extension
&lt;/h3&gt;

&lt;p&gt;Vector 1 (eth_sendTransaction type-4):&lt;br&gt;
No error surfaced to the dApp. On-chain receipt shows type: 0, &lt;br&gt;
gasUsed: 21000, code: 0x. The wallet silently downgraded the &lt;br&gt;
type-4 transaction to a type-0 transaction and stripped the &lt;br&gt;
authorizationList before broadcasting.&lt;/p&gt;

&lt;p&gt;Verdict: Safe degradation. The user gets the same simple transfer &lt;br&gt;
they would have gotten without 7702 fields. No delegation applied, &lt;br&gt;
no funds at risk.&lt;/p&gt;

&lt;p&gt;The tradeoff: the wallet changed the transaction type without &lt;br&gt;
telling the user. That's arguably a UX issue, but it's not a &lt;br&gt;
security issue — the user's intent (send X to Y) is preserved, &lt;br&gt;
and nothing extra happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rabby Extension
&lt;/h3&gt;

&lt;p&gt;Vector 1: Not tested directly (skipped in favor of the other two).&lt;/p&gt;

&lt;p&gt;Vector 2 (eth_sign on auth hash):&lt;br&gt;
Rabby shows a dialog: "Signing with 'eth_sign' can lead to loss &lt;br&gt;
of assets. For your safety, Rabby does not support this method."&lt;/p&gt;

&lt;p&gt;If the user dismisses that and proceeds, the confirmation screen &lt;br&gt;
shows: "Unknown signature type" with the raw hex payload.&lt;/p&gt;

&lt;p&gt;Verdict: Correct behavior. Rabby flags both the method and the &lt;br&gt;
payload. A user who reads the warnings and still signs is making &lt;br&gt;
an informed decision.&lt;/p&gt;

&lt;p&gt;Vector 3 (wallet_signAuthorization):&lt;br&gt;
{ "code": -32601, "message": "method not found" }&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means
&lt;/h2&gt;

&lt;p&gt;Two independent conclusions:&lt;/p&gt;

&lt;p&gt;First, on extensions: the attack surface is closed. Three wallets, &lt;br&gt;
three different protection mechanisms (refusal, degradation, &lt;br&gt;
warning), same result — no dApp can obtain a valid 7702 &lt;br&gt;
authorization through a user. This is a good outcome for users, &lt;br&gt;
and it's a direct consequence of the vendors having thought &lt;br&gt;
about this before Pectra went live.&lt;/p&gt;

&lt;p&gt;Second, on infrastructure: the entire class of EIP-7702 integrations &lt;br&gt;
that assume wallet_signAuthorization is available currently has &lt;br&gt;
no place to land. Account abstraction SDKs that help users &lt;br&gt;
"upgrade" their EOA to a smart account cannot actually do so via &lt;br&gt;
extensions today.&lt;/p&gt;

&lt;h2&gt;
  
  
  A side note on AA SDKs
&lt;/h2&gt;

&lt;p&gt;While researching this, I noticed something worth flagging for &lt;br&gt;
the future.&lt;/p&gt;

&lt;p&gt;The ZeroDev SDK's createKernelAccount accepts accountImplementationAddress &lt;br&gt;
and factoryAddress as parameters without validating them against &lt;br&gt;
a known-allowlist (packages/core/accounts/kernel/createKernelAccount.ts, &lt;br&gt;
lines 135-137 and 367-371).&lt;/p&gt;

&lt;p&gt;This is not exploitable today. ZeroDev can't sign authorizations &lt;br&gt;
itself — it must call wallet_signAuthorization on the user's wallet, &lt;br&gt;
and no extension wallet implements that method. A malicious dApp &lt;br&gt;
cannot deliver a valid authorization to the SDK, so the parameter &lt;br&gt;
is never reached.&lt;/p&gt;

&lt;p&gt;But it will matter. When a wallet adds wallet_signAuthorization &lt;br&gt;
support, this code path becomes reachable. At that point, whether &lt;br&gt;
it's a vulnerability depends entirely on the wallet's UI: if the &lt;br&gt;
confirmation screen shows the delegate address, the SDK's &lt;br&gt;
parameter is still safe. If the wallet doesn't show it, the SDK &lt;br&gt;
parameter becomes a real vector.&lt;/p&gt;

&lt;p&gt;I've documented this as a "future risk" finding rather than a &lt;br&gt;
current vulnerability. It's an early warning for both ZeroDev &lt;br&gt;
(to add an allowlist) and wallet vendors (to render delegations &lt;br&gt;
in the UI).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The extension surface is closed. The remaining surfaces are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile wallets: different codebases than extensions, may lag 
behind on protections.&lt;/li&gt;
&lt;li&gt;AA SDKs, once wallet_signAuthorization becomes available in 
consumer wallets.&lt;/li&gt;
&lt;li&gt;On-chain consumers of EIP-7702 in smart contracts — but that's 
a much broader topic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain a wallet or an AA SDK and want to talk about &lt;br&gt;
this, my contact info is in the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Artifacts
&lt;/h2&gt;

&lt;p&gt;Everything is open source:&lt;br&gt;
github.com/Semantic-Sentry/eip7702-wallet-research&lt;/p&gt;

&lt;p&gt;Includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encoder.py — working EIP-7702 type-4 transaction encoder&lt;/li&gt;
&lt;li&gt;sponsoring_test.py — sponsoring pattern test (sender ≠ authority)&lt;/li&gt;
&lt;li&gt;wallet_harness.html — dApp harness for testing wallet rendering&lt;/li&gt;
&lt;li&gt;FINDINGS.md — full methodology and raw results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. Use it, fork it, improve it.&lt;/p&gt;

&lt;p&gt;Thanks to the teams at MetaMask, Trust Wallet, and Rabby for &lt;br&gt;
building protections into their products before users needed them.&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>security</category>
      <category>web3</category>
      <category>eip7702</category>
    </item>
  </channel>
</rss>
