DAI Permit UI revoke vs signed approve mismatch
This PoC sends a DAI Permit typed-data request where allowed is the string
"false". The UI can label this as a revoke, but the signing stack treats the
value as truthy and signs allowed=true. It also highlights the expiry
hex-parsing issue.
1) Wallet + status
Account (holder): -
2) DAI Permit inputs
Defaults: mainnet DAI contract + MetaMask Swap Router, allowed = "false",
expiry = 0xffff...ffff.
3) UI vs signed preview
UI classification mirrors the app behavior (allowed === "false"), while
signing uses Boolean(allowed) — so the string "false" is
treated as true (unlimited permit).
4) Signature result
Recovery uses normalized values: allowed = Boolean(value) and
expiry = BigInt(value).