HWAN

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_600 in the program), after the ECB 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 (ValueOutsideBand otherwise).

A trade, start to finish

StepInstructionWhat moves
1post_offer(nonce, side, price, units)The maker locks margin for their side at price into the market vault
2take_offer(maker_side, price, units)The taker locks the opposite margin; both pay the fee; open interest grows
3expiry passestrading stops (Expired)
4report(value)anyone posts S with a bond
5dispute(value)optional, inside the dispute window, with an equal bond
6vote(value)only if disputed: arbiters post their recomputed value
7settle()the market fixes its settlement value
8claim()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.