How it works
The index
index_pp = ( median(Upbit KRW-USDT, Bithumb USDT/KRW) / ECB USD/KRW ) - 1, times 100
Upbit KRW-USDT and
Bithumb USDT/KRW: the won price of one
USDT on the two largest Korean venues. With two venues, the median is their mean.ECB USD/KRW: the European Central Bank reference rate for the won against the dollar, published once each business day around 15:00 UTC (16:00 CET). It is free to read through public mirrors such as frankfurter.
- All three come from free public APIs. Anyone can recompute every value the market uses.
Why the USDT leg
We measured the bitcoin premium (
Upbit and
Bithumb KRW-BTC against
Coinbase and
Kraken BTC-USD) against the
USDT premium over 200 days: correlation 0.998, beta 1.01, residual standard deviation 0.07 pp. The bitcoin premium is the USDT premium plus a little noise from timing bitcoin's own price. The index therefore reads USDT directly. The bitcoin premium stays on the dashboard as a cross-check.
Venue agreement
Twelve simultaneous snapshots of both books:
Upbit minus
Bithumb on
USDT averaged −0.006% with a standard deviation of 0.036%. A two-venue median is defined to a few basis points.
The settlement value
S = ( median of the two venues' 24-hour average, ending at expiry )
/ ( ECB USD/KRW fix of the expiry day ) - 1
- The 24-hour average uses each venue's 1-minute closes, 1,440 per venue, ending at expiry (the app's live panel shows it from hourly closes).
- Expiry is 16:00 UTC (
EXPIRY_SECOND_OF_DAY = 57_600in the program), after theECB fix is out in both CET and CEST.
- Markets expiring at 17:00 UTC settle on the India index and those expiring at 20:00 UTC on the Argentina index, with the same arithmetic on other sources: see India and Argentina.
- The value is expressed in index basis points (ibp), 1 pp = 100 ibp, and clipped to the market band before it is reported (
ValueOutsideBandotherwise).
A trade, start to finish
| Step | Instruction | What moves |
|---|---|---|
| 1 | post_offer(nonce, side, price, units) | The maker locks margin for their side at price into the market vault |
| 2 | take_offer(maker_side, price, units) | The taker locks the opposite margin; both pay the fee; open interest grows |
| 3 | expiry passes | trading stops (Expired) |
| 4 | report(value) | anyone posts S with a bond |
| 5 | dispute(value) | optional, inside the dispute window, with an equal bond |
| 6 | vote(value) | only if disputed: arbiters post their recomputed value |
| 7 | settle() | the market fixes its settlement value |
| 8 | claim() | each position is paid long (S − floor) and short (cap − S) per unit |
Worked example
The index reads +0.50 pp. You buy 10 contracts long at +0.50 against someone selling them.
- Your margin: (0.50 − (−5.00)) × $10 × 10 = $550.00, plus a fee of $1.00.
- Their margin: (5.00 − 0.50) × $10 × 10 = $450.00, plus $1.00.
- The vault holds $1,000.00, exactly the band times the contracts.
- It settles at +1.50 pp. You receive (1.50 + 5.00) × $10 × 10 = $650.00. They receive (5.00 − 1.50) × $10 × 10 = $350.00. The vault is empty.
- It settles at +7.00 pp, beyond the cap. The value is clipped to +5.00 pp. You receive $1,000.00 and they receive $0.00. Neither of you ever owed more than you locked.
Units in the program
One unit locks one micro-USDC per ibp of distance. A $10-per-point contract is 100,000 units: $10 per pp = 1,000,000 micro-USDC per 100 ibp. The app shows contracts; the program counts units.