Spark
Testnet

Curb

Curb is a wallet with a daily spending limit — the seatbelt your bank card has and your crypto wallet doesn't. You set a daily limit and deposit. Sending under it works normally and confirms in a few hundred milliseconds. Sending over it is rejected by the contract — not by a dialog you can click through. The vault custodies the funds, so your own key can't exceed your own limit: money leaves through send() or not at all. Lowering the limit is instant; raising it is timelocked, so a stolen key can't widen it and drain you in one move. What I learned: 1. EIP-7702 is the obvious tool for this and it does not work. A delegated EOA keeps its key — delegated code runs when the account is CALLED, not when the key signs a plain transaction, and delegation can be cleared at will. A 7702 spending limit is a switch the attacker flips off. You cannot limit a key you still hold; you have to not hold the money. That one finding reshaped the whole design. 2. Speed isn't the feature, it's the reason the feature survives. A limit works on any chain. But Curb puts a contract hop in front of every send, and on a 12-second chain you'd feel that tax and switch it off within a week. eth_sendRawTransactionSync returns the receipt in the same request, so the protection is invisible. That's what Monad bought. 3. Writing the honest threat model made the project better. A stolen key still takes a day's limit — and ~2x across a window boundary, which I pinned with a test rather than hiding. A security review found that lowerCap (the obvious panic move) didn't clear a pending raise, so the safe-looking action failed exactly when you'd need it. Fixed. Native MON only. One feature that genuinely works beats five that don't. Prior art credited: Argent v1 had daily limits; Safe has allowance modules. This is a missing default, not a new idea.

Discussion

Sign in to comment on this project.
0
N@nik-sapa·10d ago

I have $20 in crypto and I've opened a wallet exactly once. Not because I'm stupid. Because it's terrifying. My bank card has a daily limit. Someone steals it, they get one day — not my life savings. I never had to understand banking to be protected. The limit did the work. My crypto wallet has no limit. One bad click takes everything. So I'm building the missing default this week for @buildanythingso Spark.