After shipping ERC-4337 to testnet, we hit a wall. Not a technical limitation — an architectural one. Standard account abstraction assumed the account was a black box. Modular accounts turn it inside out.
The problem wasn't that smart accounts couldn't sign transactions. They could. The problem was how they signed, who could authorize different types of actions, and what those actions could do. A corporate entity with an accountant, an ops lead, and the C-suite shouldn't share a single unified validation logic. An AI agent shouldn't have the same permissions as a human holding a private key. A DAO shouldn't be locked into one voting mechanism forever.
Static account abstraction left all of this on the table.
The Architecture That Gave Up on Flexibility
ERC-4337 was right about userops, bundlers, paymasters, and decoupling execution from validation. But it baked one assumption deep into the protocol: the account is a contract with one validation logic. You deploy it, it works, and when you need something new, you deploy a new account.
That's like selling operating systems where you can't install new drivers.
Modular accounts fix this with a simple idea: the account becomes a container, and everything else becomes a plugin. The ERC-7579 standard gives you the shape. Three interfaces that matter:
- Execution — how the account actually calls other contracts
- Configuration management — how modules get added, removed, enabled
- Module management — the registry and dispatcher for each module type
At the core: execute(mode, calldata). A universal function that routes calls through whatever execution model is installed. For most accounts, that's a wrapped CALL opcode. For atomic transactions that need to roll back together, it could be a flash loan executor. For DAO treasuries, it could be a governance voting gate that checks the proposal passed before executing anything.
This is where the metaphor holds: your account isn't a transaction signer anymore. It's a programmable container with pluggable rules.
Four Module Types, Four Vectors of Control
Validators make decisions about whether a transaction should happen. This is where your signing keys live. In a standard EOA, there's one. In a modular account, you have multiple validators, each with independent logic:
- Root ECDSA validator (sign with your private key)
- WebAuthn validator (biometric, hardware key)
- Multisig validator (3-of-5 approval required)
- Time-lock validator (after 48 hours, this signer has full authority)
They don't interfere. Each can authorize different transaction types.
Execution modules define the mechanics of doing something. Most accounts use the trivial case — call another contract with your message. But you could install an execution module that:
- Batches up to 50 transactions, hashes them, and executes them atomically (fail all or succeed all)
- Routes calls through a DEX aggregator to minimize slippage
- Decomposes complex transactions into smaller pieces and sequences them
Hooks intercept the transaction lifecycle. Pre-execution hooks can enforce constraints (never send more than $10k in a day). Post-execution hooks can trigger side effects (if a trade profits > 10%, auto-sweep gains to a savings vault).
Fallback handlers catch function calls that don't match any other route. Useful for integrating legacy contracts that expect certain interface patterns, or for adding custom query functions.
Most accounts deploy with a validator and an execution module. The power comes from what happens next.
How AI Agents Actually Get Unsafe Permissions (and How Scoped Modules Fix It)
The pitch for AI agents in blockchain is seductive: give an LLM your private key, it signs transactions, you profit. The reality is catastrophic. An LLM with your private key can drain every asset you own, in any order, to any address.
Modular accounts solve the trust problem with granular scoping. Instead of a binary "can I sign or not?", you create a validator module with conditional logic.
Example: Your AI agent needs to manage hedging positions. You create a validator that says:
IF (transaction calls LendingProtocol.borrow
AND amount <= 100 ETH
AND collateral >= 150%
AND sender is agent address)
THEN allow
ELSE
DENY
The validator sees the full transaction structure. It can check the price oracle, validate the collateral ratio, inspect the receiver address. It allows the specific action (borrow with adequate collateral) while blocking everything else (withdraw, transfer, selfdestruct).
Layer on a hook that monitors the position:
POST-EXECUTION:
IF profit > 10% of initial capital
THEN sweep to cold storage
Now your agent can act autonomously within bounds. It can't rug you because it can't access you. The scope of its permissions is auditable. If you revoke the validator module, it stops working immediately.
This is where the architecture scales to institutions. Accountants need to pay operational bills. Operations leads coordinate liquidity. The C-suite approves large transfers. Same account, three different validators with different scope. Each signs independently. No permission creep, no single point of failure.
DAOs get similar density. Delegated voting validators for quorum-less snapshot voting. Adaptive voting validators that adjust voting weight based on governance participation history. Limit validators that prevent rage-quits by slashing votes if reversed within 24 hours.
The DeFi Integration Wall: Where Smart Accounts Crash Into Reality
Here's what breaks in production: DeFi frontends assume address = signer.
The user connects their wallet. MetaMask shows an address. The dApp calls eth_signMessage or eth_signTypedData. It receives a signature back. The dApp does ecrecover(messageHash, v, r, s) and expects to get back the same address the user connected.
With smart accounts, this assumption shatters.
A Kernel-based account works like this:
- Your account has root ECDSA validator
- The validator holds the real signer (your private key)
- You call
eth_signTypedDatathrough the account layer - The account prepends a validator mode prefix to the signature
- You send it to the DeFi protocol
The DeFi frontend does ecrecover on the raw signature and gets... the ECDSA validator contract address, not your account address. The protocol rejects it as invalid.
This is the signature compatibility problem. It's not a bug. It's structural.
We hit this hard with 1inch Fusion+. The protocol itself supports smart account orders at the contract level. The smart contract would validate the signature, execute the trade, everything works. But the frontend? The frontend validates signatures client-side before even posting to the relayer network. Kernel signatures failed verification. Users would see "Invalid Signature" in the UI, even though the contract would have accepted the transaction.
The 1inch Adapter: Turning Broken Signatures Into Working Ones
The fix: build a signature adapter.
The adapter works by reverse-engineering what the DeFi frontend expects:
- Kernel account receives order
- Kernel asks its ECDSA validator to sign
- Validator returns a signature (with Kernel's mode prefix)
- Adapter intercepts this
- Adapter reconstructs the EIP-712 digest that 1inch expects (correct domain separator, correct typed data structure)
- Adapter uses the owner's EOA to sign that digest directly (ECDSA, no prefix)
- Adapter wraps it back into Kernel format
- Frontend sees a signature it can verify, calls
ecrecover, gets the Kernel account address - Kernel's validator checks the wrapped signature, verifies it was signed by the owner
- Everything validates
It's not elegant. But it works. The Kernel validator holds the owner's key. We sign with that key directly (outside Kernel), get a clean signature, then rewrap it.
The deeper solution: contracts need to support ERC-1271.
ERC-1271 as the Long-Term Path
ERC-1271 is a callback interface. Instead of relying on ecrecover, a contract can implement isValidSignature(hash, signature) and a DeFi protocol can call it to ask: "Is this signature actually valid for this account?"
The flow changes:
- Kernel account receives order
- Kernel signs with its validator
- Frontend sends signature to the contract
- Contract calls
isValidSignatureon the Kernel account - Kernel routes the call to its ECDSA validator
- Validator checks the signature against the owner's key
- Validator returns "valid" or "invalid"
- Contract proceeds or rejects
No reverse-engineering. No adapter layer. No mode prefixes causing confusion. The validator logic is opaque to the frontend. The frontend doesn't care how the account decides whether a signature is valid.
Adoption is growing. Most modern DEX routers now check isValidSignature as a fallback. Some paymasters do. But many older protocols and frontends still assume ecrecover works directly.
The transitional period is frustrating. You're building advanced account logic but stuck with adapter layers because the DeFi ecosystem hasn't converged on ERC-1271.
The Practical Win: Why This Architecture Actually Matters
Strip away the module names and interfaces. What you're really getting:
Granular permission boundaries. Not "this app has my private key" but "this app can do X when Y is true". You can audit those boundaries. You can revoke them instantly.
Multi-role support without fragmentation. Your ops team doesn't need a separate wallet. Your DAO doesn't need to redeploy every time the governance mechanics change. One address, pluggable logic.
AI agent integration that doesn't require blind faith. Agents can execute complex strategies (borrow, provide liquidity, buy hedging) within strict computational and financial bounds. They can't go rogue because they don't have the keys to the kingdom — they have the keys to a specific room.
Future-proofing. Standards change. New execution models matter. New security primitives emerge. With modular accounts, you install a new module. You don't migrate all your assets to a new contract.
The best comparison we had: after shipping the IBM PC with modular architecture, it outperformed locked-down competitors like the Macintosh in capability and adaptability. Not because PCs were better at any single task. Because you could swap out the video card, add more RAM, install new software, and the machine evolved with you.
Modular smart accounts do the same for blockchain wallets.
Where We Are Now
ERC-7579 is the emerging standard. ERC-6900 adds declarative modules and automated state management. The ecosystem is fragmenting across implementations (Kernel, Safe, ZeroDev, others), which creates friction, but it also means the best ideas spread quickly.
The DeFi integration wall remains. ERC-1271 adoption is growing but uneven. Until it's universal, you'll either accept adapter layers or stick to protocols that natively support smart accounts.
But that wall is crumbling. Every new protocol adds ERC-1271 support. Every new frontend library bakes in the fallback check. In 18 months, the compatibility problem goes from "you need an adapter" to "support is automatic."
For enterprise use cases (corporate treasury, DAO governance), MSAs are production-ready today. For consumer AI agents, we're hitting limitations on execution speed and cost — not on the modular architecture itself.
The architecture won. Now it's a race to make it fluid enough that users never think about modules at all.