Search projects, hackathons, sponsors and tech

    ← All projects

    Strikeline

    Name a price to sell your ETH at and get paid to wait. Covered calls on 1inch Aqua.

    Demo

    About

    Strikeline lets anyone holding ETH name a price they'd sell at, pick an expiry, and earn while they wait, without the ETH ever leaving their wallet. Each offer is a covered call written as a pricing curve on 1inch Aqua. With nothing locked, one wallet can back many offers: in the demo, a wallet holding 10.4 ETH backs offers for 15.4 ETH at once, and every trade checks the real balance so it can never owe more than it holds. Example: ETH trades at $2,440 and you hold 10 ETH. You'd happily sell 5 of them at $2,600. In Strikeline you pick that price, an expiry one week out and a volatility, then publish the offer in one click. All 10 ETH stay in your wallet. The offer is a quote registered on 1inch Aqua that traders can fill. Volatility (IV) is how much you expect ETH to move, as a yearly percentage, and it sets the shape of the curve. A higher IV prices each trade further from the market, so trades are rarer but earn more. A lower IV gives tighter pricing and more frequent, smaller trades. The app pre-fills it from how much ETH has actually moved recently. While the offer is live, nobody pays more than the market price. If ETH moves on other exchanges by more than your offer's spread, 1inch resolvers trade with it. When ETH rises, the offer sells a little ETH. When it falls, the offer buys some back. The spread widens in both directions every day, so small wiggles don't trigger trades. Your result is the P&L of a covered call. It works like selling insurance: you come out ahead if ETH moves less than the volatility you chose, and behind if it moves more. At expiry, if ETH is above $2,600, whatever remains of the 5 ETH sells at exactly $2,600. If ETH is below, nothing more sells and you keep your ETH. One wallet, many offers: every trade checks your real wallet balance and your approval to Aqua. A fill on one offer immediately shrinks what the others can deliver, with no keeper, so you can post more offers than you could fill at once and never owe a trade you can't pay. There is no vault, no option token, no oracle and no settlement transaction. There is also a buy side: an offer to buy ETH below today's price with USDC. Every fill pays a 0.10% protocol fee. The app shows each offer's fill progress and average sale price, how its spread widens over time, and its payoff at expiry compared with just holding. It also notifies you when an offer is filled or withdrawn. Withdrawing takes one click and moves no tokens. Limits: you earn only when someone trades, and you end up behind holding when ETH moves more than you priced. I replayed a week of real Base ETH prices on a four-offer book of about $50k. It beat holding by $201. When the offers were written far below realised volatility (15% vs 46.6%), a plain 5 bp liquidity pool beat it. What's next: a mainnet launch on Base with a real audit; more pairs beyond ETH/USDC (cbBTC, LSTs); ladders, where one click writes a spread of strikes and expiries from a single wallet; automatic rolling into the next expiry when an offer ends; and routing so Strikeline offers show up directly inside 1inch swaps for regular traders.

    How it's made

    Strikeline is built on 1inch Aqua and SwapVM. Every offer is a SwapVM program shipped to the official, unmodified Aqua registry (0x1111113CCf1426A8E30e2bfF5E005d929bF6a90a): Deadline, FeeProtocol, Coverage, RmmSwap, Salt. I chose Aqua because the liquidity stays in the maker's wallet and one balance can back many strategies at once. That lets one wallet quote a whole ladder of strikes and expiries. SwapVM doesn't ship an option curve or a check against the wallet's real balance, so I wrote both as custom instructions. Strikeline's offers fill through a redeployed StrikelineRouter that includes them. RmmSwap (opcode 0x55) implements RMM-01 from Angeris, Evans & Chitra ("Replicating Market Makers", arXiv:2103.14769; "Replicating Monotonic Payoffs Without Oracles", arXiv:2111.13740): Y = L·K·Φ(Φ⁻¹(1 − X/L) − σ√τ). Time to expiry τ comes from block.timestamp, so the curve ages without any transaction. At τ = 0 it becomes a constant-sum order at the strike. The normal CDF and its inverse are fixed-point on Solady, with error around 5e-12. Why it works: under arbitrage, reserves held on this curve track the value of long spot plus a short Black-Scholes call at strike K and volatility σ. Each trade by an arbitrageur moves the reserves toward the call's delta, so resolver fills perform the delta hedge. As τ shrinks, the curve's no-trade band widens on both sides. That band is how the curve collects the option's time decay (theta) from the traders who fill it. The maker ends up with covered-call P&L: ahead when realised volatility stays below σ, behind when it's above. Coverage (opcode 0x93) wraps the curve. It prices the trade, then rejects any output larger than the maker's live balanceOf and their allowance to Aqua. Aqua allows a maker to allocate more than they hold, and this check turns that into safe portfolio margin across offers, enforced inside every trade. The 0.10% fee uses SwapVM's own FeeProtocol instruction and is taken from the taker's input, so the curve prices the net amount exactly. The router is 23,851 bytes, under the EIP-170 limit, and a fill costs about 211k gas. The contracts are Solidity 0.8.30 with Foundry. The frontend is Next.js 16, React 19, wagmi and viem. It uses a TypeScript SwapVM encoder checked byte-for-byte against Solidity. The app has no option maths of its own: every quote and chart point is a call to the router. Positions, fill progress and average sale price come from Aqua's Shipped logs. The demo runs on an anvil fork of Base mainnet, so it uses the real Aqua registry and the real WETH and USDC contracts. The fork runs on a small Google Cloud VM behind a JSON-RPC relay that forwards only safe methods. Anyone can publish, fill and withdraw offers with a built-in demo wallet and no funds.