Pricing walkthrough
One USD/GHS Up cover priced from start to finish. Each step says what happens, which approach is used, what BlockFinaX decided and why, and where that decision appears in the formula. The figures are an example computed with the engine's formulas; live quotes use live data.
The approach in brief
The contract is valued as an option spread with the standard currency option formula, Garman-Kohlhagen, extended with Merton jumps for sudden devaluations. Where the standard method reads inputs from forward and options markets that frontier currencies lack, the engine estimates them from the pair's own history and adds safety margins. The pricing engine signs the resulting fair rate; the currency-pool contract then applies the pool's markup and the protocol fees, and later pays out from the oracles' agreed rate.
In the formulas below, values in teal are BlockFinaX decisions; everything else follows the standard model.
Decisions at a glance
| Decision | BlockFinaX choice | Standard practice | Why | Step |
|---|---|---|---|---|
| Valuation model | Garman-Kohlhagen spread with Merton jumps | Garman-Kohlhagen with a volatility smile | Frontier currencies move in steps; jumps price that tail | 6 |
| End time | 14:00 UTC on the end date, weekends moved to Monday; time counted to the second | The fixing time of the currency's official rate | One rule for every pair; exact time keeps short contracts fair | 3 |
| Expected drift | The pair's own five-year trend , capped at ±50% | Interest-rate gap or forward points | No reliable forward market or usable local rate | 4 |
| Volatility | Historical (EWMA, = 0.94) × (1 + margin ), at least a minimum | Implied by the options market | No options market; the margin and minimum cover risks history understates | 5 |
| Volatility over the contract | GARCH average with persistence fitted, or 0.93 for frontier | Implied volatility for that expiry | Today's level fades toward the long-run level | 5 |
| Jump settings | By market type (frontier: 2 a year, 8% average, 12% spread) | Rarely used for major currencies | Too few events per pair to fit reliably | 6 |
| Quote checks | Refuse if maximum payout is over 100× or under 1.5× the premium | Dealer judgement | Stops quotes that are too cheap to be real or too dear to be useful | 8 |
| Price to the buyer | Fair rate × pool markup (0.9 to 5), plus 5% purchase fee | Dealer's spread | Underwriters set their own margin; the protocol fee is fixed per pool | 9 |
| Payout | Measured from today's rate, capped at the limit, 2% payout fee | Fixed in the contract terms | Known maximum payout, fully backed | 2, 10 |
Example inputs
| Input | Value |
|---|---|
| Notional | 100,000 USDC |
| Duration | 30 days |
| Today's rate, | 11.20 GHS per USD |
| Strike , limit | 11.60, 12.50 |
| USD interest rate, | 4.20% |
| Five-year trend, | 12.0% a year |
| Recent volatility (EWMA) | 9.0% |
| Long-run volatility, | 18.0% |
| Market type | Frontier |
| Pool markup | 1.16 |
| Fees | 5% purchase, 2% payout (testnet settings) |
Part 1: what the protection pays
1. Today's rate
What happens. The engine reads today's rate for the pair. It is the starting point for the price and for the payout.
Approach. The protocol's market data feed (server/fx-oracle.ts). Institutions price and settle against a recognised fixing for each currency, set out in EMTA templates [8].
| Value | |
|---|---|
| 11.20 |
2. The payout rule
What happens. The contract pays nothing unless the rate ends past the strike; beyond it, each step in the rate pays a fixed amount until the limit.
Approach. A call spread for an Up cover, a put spread for a Down cover [6]. Decision: the move is converted to USDC at today's rate and capped at the limit, so the maximum payout is known when the contract is bought and can be reserved in full.
| Value | |
|---|---|
| Most it can pay | 100,000 × 0.90 ÷ 11.20 = 8,035.71 USDC |
| Payout if the rate ends at 12.00 | 3,571.43 USDC |
Part 2: how likely each outcome is
3. Time to expiry
What happens. The engine measures how long the rate has to move.
Approach. Time in years, as in every option model [6]. Decision: the contract ends at 14:00 UTC on the end date, weekends moved to Monday, and time is counted to the second from the quote, so a short contract bought earlier in the day costs slightly more.
| Value | |
|---|---|
| for exactly 30 days | 0.082136 years |
4. Expected drift
What happens. The engine sets which way the rate is expected to move, which shifts the centre of the likely outcomes.
Approach. In the standard method the gap between the two currencies' interest rates sets the forward rate (covered interest parity) [1]. Decision: frontier currencies have no reliable forward market or usable local rate, so the pair's own five-year trend replaces the gap, capped at ±50% a year.
| Value | |
|---|---|
| −7.80% | |
| Expected rate at expiry, | 11.3109 |
5. Volatility
What happens. The engine estimates how much the rate swings, the input that moves the price most.
Approach. Recent volatility by the RiskMetrics average [4], blended toward the long-run level with the GARCH(1,1) forecast [5]. Decision: with no options market to read volatility from, the engine raises the historical figure by a margin for the market type and holds it above a minimum, because history understates the risk in thin markets. Persistence is fitted per pair, or a default by market type.
| Value | |
|---|---|
| Frontier margin , minimum | 75%, 15% |
| 9.0% × 1.75, so | 15.75% |
| Trading days , persistence | 21, 0.93 |
| Weight | 0.5321 |
| Volatility used, | 16.84% |
6. Jump risk
What happens. The engine adds the chance of sudden steps, such as devaluations, that everyday volatility misses.
Approach. Merton jump diffusion [3]. Decision: jump frequency and size are set by market type rather than fitted per pair, because a single currency has too few jumps to estimate them reliably; they can be set for one pair when there is better information.
| Value | |
|---|---|
| Frontier settings , , | 2 a year, 8%, 12% |
| Expected jumps before expiry, | 0.1792 |
| Chance of 0, 1, 2 jumps | 83.59%, 14.98%, 1.34% |
Part 3: the fair price
7. Option values
What happens. The engine values an option at the strike and one at the limit; the contract is worth the difference.
Approach. Garman-Kohlhagen [1], evaluated for each possible number of jumps and weighted by its chance (Merton). Every decision above enters here: from step 4, from step 5, and the jump terms from step 6.
| Value | |
|---|---|
| , at the strike | −0.4987, −0.5470 |
| Call(11.60) without jumps, with jumps | 0.105120, 0.206256 GHS |
| Call(12.50) with jumps | 0.084845 GHS |
| Spread value | 0.121411 GHS per USD |
8. Fair premium and checks
What happens. The spread value becomes a premium in USDC and a fair rate, and the quote is checked before it is signed.
Approach. Convert the value at today's rate. Decision: refuse quotes whose maximum payout is over 100 times the premium (too cheap to be real, usually volatility at its minimum) or under 1.5 times (the buyer could not come out ahead after fees).
| Value | |
|---|---|
| Fair premium | 1,084.03 USDC |
| Fair rate, signed in millionths | 1.0840% (10,840) |
| Most it can pay ÷ fair premium | 7.41, so the quote is allowed |
| Chance it pays something, pays in full (pricing model) | 26.7%, 7.4% |
Part 4: what the buyer pays and receives
9. Premium
What happens. The contract turns the signed fair rate into what the buyer pays.
Approach. Decision: each pool's underwriters set a markup on the fair rate for each duration, between 0.9 and 5 times, and the protocol adds a purchase fee fixed for the pool. Amounts round down.
| Value | |
|---|---|
| Premium rate: 10,840 × 1.16 | 12,574 millionths (1.2574%) |
| Premium | 1,257.40 USDC |
| Purchase fee | 62.87 USDC |
| Buyer pays | 1,320.27 USDC |
10. Settlement
What happens. After the end time the oracles report the rate; the contract settles once enough of them agree within 1%, and the buyer claims the payout less the payout fee.
| If the rate ends at 12.00 | Value |
|---|---|
| Payout | 3,571.43 USDC |
| Payout fee | 71.43 USDC |
| Buyer receives | 3,500.00 USDC |
| Result after the premium and fee | +2,179.73 USDC |
How much each decision matters
The fair rate for the example with one decision changed at a time:
| Change | Fair rate | Change in price |
|---|---|---|
| None (as above) | 1.0840% | |
| No jump allowance ( = 0) | 0.9028% | −16.7% |
| No expected drift ( = 0) | 0.9046% | −16.6% |
| No market-type margin ( = 0; the 15% minimum then applies) | 1.0610% | −2.1% |
| No margin and no minimum (raw 9% volatility) | 0.9093% | −16.1% |
| Slower return to normal ( = 0.97) | 1.0528% | −2.9% |
| Twice the jumps ( = 4) | 1.3100% | +20.8% |
Conclusion
The price rests on a standard valuation, Garman-Kohlhagen with Merton jumps, so the method can be checked against the published models. What makes it work for frontier currencies is the set of inputs above: the pair's trend in place of a forward market, historical volatility with a margin and a minimum in place of an options market, and a jump allowance for sudden devaluations. Each of those adds roughly 15 to 20% to this example's price, and together they are what separates a frontier quote from a standard one. They are also where judgement enters, so they are the values to review as more market data becomes available. On-chain, the contract adds only the pool's markup and the protocol fees, and pays out by a fixed formula from a fully reserved amount.
For how each formula works, see the formula handbook. For the functions that implement them, see the pricing engine.