The On-chain Lock
Why it is in the ecosystem. The second lock. The chain refuses any transaction without a valid signed receipt for exactly that calldata.
What it is
DEMO- 1
bytes32 want = keccak256(op.callData);
recompute the hash over the exact calldata the account is about to execute - 2
require(r.actionHash == want, "no receipt for this calldata");
the receipt must name this calldata, byte for byte. one byte off, revert. - 3
require(r.verdict == ALLOW && ecrecover(digest(r), r.sig) == engineKey, "not our engine");
the verdict is ALLOW and the signature is the engine's, over an EIP-712 digest of the receipt fields - 4
require(!used[r.nonce] && r.expiresAt > block.timestamp, "stale");
one receipt, one execution, inside its window - 5
used[r.nonce] = true; return _validateOwner(ownerSig, userOpHash);
only then does the owner's own signature get checked. else: revert.
Line 2 is the whole product. The checker can be wrong, bribed or offline; the chain still refuses anything without a receipt for exactly these bytes. Two locks, not one.
Try it in this browser
calldata and hashes REAL verdict REALFire on chain · valid and invalid, side by side
The transfer above, submitted through the smart account with the ALLOW receipt in the signature field. The validator passes and the transfer executes. Basescan link shown here.
The ERC-7579 validator ships in build stage 4 (EntryPoint v0.7 on Base Sepolia). Until it is deployed this beat stays a designed placeholder rather than a staged revert, because a fake Basescan link would be worse than none.
The identical transfer, submitted with an empty receipt. The validator reverts on line 2 and the revert, with its reason string, is shown here with its Basescan link.
The ERC-7579 validator ships in build stage 4 (EntryPoint v0.7 on Base Sepolia). Until it is deployed this beat stays a designed placeholder rather than a staged revert, because a fake Basescan link would be worse than none.