Trade your own flight on Arbitrum: scan your boarding pass, then hedge a delay or trade the arrival time. Settles in USDG from real arrival data. Passengers only, so outsiders can't game it.




About one in four flights on Southeast Asia's biggest airlines lands late (Singapore Airlines arrived within 15 minutes of schedule 76.3% of the time in May 2025, per Cirium). When it happens the traveller pays: the extra meal, the missed transfer, the hotel night. Airline compensation in the region is small and has to be claimed by hand, and travel insurance pays weeks later after a claim form.
Prediction markets showed people want to price flights, but in July 2026 Kalshi's open flight-cancellation markets were sued within weeks, with a warning that anyone who can bet on a delay has a reason to cause one. I wanted the opposite design: a flight market only the people on board can trade, where they can hedge their own delay or back their own read of the arrival time, and get paid automatically.
Gathæro is a flight market on Arbitrum where passengers trade their own flight, in two ways: protect against a delay, or predict the arrival time.
A traveller scans their boarding pass (camera or photo). A verifier checks the flight, route and date against the on-chain schedule and signs an EIP-712 attestation for their wallet; they register it in PassRegistry with one transaction.
Protect: buy the Delayed side of their flight's protection pool at the market's live delay probability. More than 30 minutes late pays 1 USDG per share.
Predict: trade Yes or No on arrival windows (for example 10 to 30 minutes late). The window the flight arrives in pays 1 USDG per Yes share.
About 30 minutes after arrival, the gate arrival time from AeroDataBox is written on-chain once and every market for the flight settles. The resolver then pushes every payout to the winner's wallet with redeemFor, which can only pay the holder. Nothing to claim.
A traveller can leave an email at the kiosk and gets their result (landed time, each position, the payout and its Arbiscan link); the address is deleted afterwards.
Liquidity providers back each flight's pools and earn from the other side of every trade.
Fairness is enforced in the contracts: passengers only with no operator exception, one pass per wallet, a 200 USDG cap per wallet per flight, non-transferable positions, and trading that closes at scheduled departure.
A kiosk mode lets an airport sell it at the gate: the traveller picks protection or a window on the public screen, shows their wallet QR, and confirms on their phone. The kiosk never holds a wallet, and the traveller never has to open the app again.






Pitch Deck:
https://drive.google.com/file/d/1cgFzuw6ZXeNaUOCTxeQ_DU2gE_mjD1G2/view?usp=sharing
Contracts in Solidity 0.8.28 with Foundry and OpenZeppelin: FlightRegistry, PassRegistry (EIP-712), MarketFactory, FlightMarket (a fixed-product market maker with proportional liquidity), ERC-1155 OutcomeToken, an oracle consumer, a Chainlink CRE receiver and MarketLens. 48 unit tests plus a solvency fuzz test, and a published self-audit whose eight findings are all fixed in v4 (README, Security review).
Node + viem services: a listing bot that registers real Changi departures from AeroDataBox and seeds opening odds, a resolver that settles flights from real arrival data, and the boarding pass verifier (IATA BCBP parser + EIP-712 signer).
A Chainlink CRE workflow (cre-sdk) that fetches AeroDataBox with node consensus and writes reports to the receiver.
A React 19 + wagmi PWA at gathaero.space, with kiosk and phone hand-off pages, served with the verifier behind one HTTPS origin.
Deployed four times to Arbitrum Sepolia, settling real flights: AirAsia AK714 arrived 5 minutes late and settled On time; Malaysia Airlines MH608 and Garuda GA823 arrived early and settled On time.
Use a wallet on Arbitrum Sepolia (MetaMask, Rabby or OKX) with a little test ETH for gas.
Open https://gathaero.space, tap Launch App and connect your wallet.
Tap "USDG +" in the top bar to get test USDG.
Go to Markets and open any flight marked "open".
Tap Scan boarding pass. No pass? Tap "Use a demo pass" in the scanner, or open https://gathaero.space/demo-pass on another screen and scan its QR.
Confirm the transaction that links the pass to your wallet.
Protection tab: buy protection against a delay. Predictions tab: pick an arrival window.
Open Positions to see your trades. After the flight lands, winnings are sent to your wallet automatically.
Kiosk (optional): open https://gathaero.space/kiosk on a laptop, scan a pass, then scan the kiosk's QR from your phone wallet to confirm.
My own audits found the holes that made earlier designs unsafe, each needing a redeploy. First: trading closed at arrival, so a passenger at the gate could see "DELAYED" and buy at stale odds (now closes at departure); stakes were unlimited, which rewards causing a delay (now 200 USDG); and outcome tokens could be transferred, letting non-passengers hold positions (now non-transferable). A second review found eight more, fixed in v4: the operator seeded odds by trading while also reporting arrivals (now it seeds as liquidity and cannot trade), a settled flight could still be voided, the stake cap was per market rather than per flight, and winners had to come back to claim (now payouts are pushed).
A second liquidity provider moved the price from 10% to 25%. I rewrote liquidity to be added in proportion, returning the excess shares and tracking each LP's principal for refunds.
Time is harder than it looks. AeroDataBox returned the previous day's leg for overnight flights, so I match legs by local departure date and route. Touchdown and gate arrival differ by minutes, so delay is measured at the gate, the airline on-time standard, and a flight never settles without an actual time.
Arbitrum gas: estimates sometimes equalled gas used exactly because of the L1 data component, and transactions ran out of gas. A 30% buffer on estimates fixed it.
Boarding pass barcodes carry no airline signature, and they contain names and booking references. Only a hash of the booking goes on-chain, nothing personal goes into URLs, and the remaining forgery risk is stated openly.
An HTTPS app could not call an HTTP verifier, and a public kiosk should never hold a wallet; both shaped the final architecture.
Fairness belongs in the contract. A rule enforced only in the UI is a suggestion.
Market design is mechanism design: when trading closes and how much one person can stake matter as much as the pricing curve.
Every definition of "late" hides a choice (gate or runway, local date or UTC), and settlement is only as trustworthy as those choices are explicit.
Small parametric products work when the price is live and the payout needs no claim; AXA's Fizzy failed with a 2-hour trigger and fixed pricing.
Mainnet on Arbitrum One with Paxos USDG, with a small trading fee.
Chainlink CRE reporting deployed to a DON, replacing the single resolver.
Booking checks with an airline partner, closing barcode forgery.
Kiosks at Changi gates: scan the pass, tap to buy, finish on the phone.
Cancellation markets, so a cancelled flight pays its passengers too.
Everything was built during the buildathon (86 commits, 1–4 Oct 2026):
Smart contracts: FlightRegistry, PassRegistry, MarketFactory, FlightMarket (FPMM with proportional liquidity), OutcomeToken (ERC1155, non-transferable), MarketLens, FlightOracleConsumer, FlightOracleReceiver (Chainlink CRE), MockFeeder. 48 Foundry unit tests plus a solvency fuzz test (5,000 runs).
Four deployments to Arbitrum Sepolia; v3 added passenger-only trading on every market, departure close, the stake cap and non-transferable positions; v4 adds pushed payouts, seeded odds with no operator exception, a per-flight cap and safer voids.
Payout automation and result emails: after settlement the resolver pays every winner and emails kiosk buyers their result (Resend).
Boarding pass verification: BCBP barcode parser, camera/photo scanner in the app, EIP-712 verifier service, on-chain registration.
Off-chain services on a VPS: listing bot (real Changi departures from AeroDataBox), resolver that settles flights from real arrival data, verifier.
Chainlink CRE workflow (cre-sdk 1.23) that reads AeroDataBox with node consensus and writes reports to FlightOracleReceiver (typechecked, not yet deployed to a DON).
Web app (PWA) at https://gathaero.space, with a testnet demo boarding pass generator so anyone can try it: wallet-gated app, per-wallet portfolio, market detail with protection and prediction tabs, positions with pushed payouts, LP vault, side panels with contract addresses and actual arrival times, plain-language errors, loading states.
Kiosk mode (/kiosk): choose, pick the window and amount, leave an email, confirm on the phone (/claim).
First real settlement: AirAsia AK714 SIN→KUL on 3 Oct arrived 5 minutes late at the gate (AeroDataBox), so it settled On time on-chain: https://sepolia.arbiscan.io/tx/0x43736bfe1a69ea6c388eed67e33b94e395175def81ad14df2e072deffca836c0
Known limits, stated openly:
Boarding pass barcodes carry no airline signature, so a forged barcode for a real flight can pass. Next: check bookings with an airline partner.
One resolver reports arrivals today, and the same key seeded the pools, so once passengers trade it is exposed to the outcome it reports. The arrival is public and checkable. Next: Chainlink CRE takes over reporting and outside LPs take over seeding through the vault.
A cancelled or diverted flight refunds everyone rather than paying out. Next: a separate cancellation market.
Not raised. Solo builder.