Skip to main content

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​

DecisionBlockFinaX choiceStandard practiceWhyStep
Valuation modelGarman-Kohlhagen spread with Merton jumpsGarman-Kohlhagen with a volatility smileFrontier currencies move in steps; jumps price that tail6
End time14:00 UTC on the end date, weekends moved to Monday; time counted to the secondThe fixing time of the currency's official rateOne rule for every pair; exact time keeps short contracts fair3
Expected driftThe pair's own five-year trend μ\mu, capped at ±50%Interest-rate gap or forward pointsNo reliable forward market or usable local rate4
VolatilityHistorical (EWMA, λ\lambda = 0.94) × (1 + margin mm), at least a minimumImplied by the options marketNo options market; the margin and minimum cover risks history understates5
Volatility over the contractGARCH average with persistence pp fitted, or 0.93 for frontierImplied volatility for that expiryToday's level fades toward the long-run level5
Jump settingsBy market type (frontier: 2 a year, 8% average, 12% spread)Rarely used for major currenciesToo few events per pair to fit reliably6
Quote checksRefuse if maximum payout is over 100× or under 1.5× the premiumDealer judgementStops quotes that are too cheap to be real or too dear to be useful8
Price to the buyerFair rate × pool markup (0.9 to 5), plus 5% purchase feeDealer's spreadUnderwriters set their own margin; the protocol fee is fixed per pool9
PayoutMeasured from today's rate, capped at the limit, 2% payout feeFixed in the contract termsKnown maximum payout, fully backed2, 10

Example inputs​

InputValue
Notional100,000 USDC
Duration30 days
Today's rate, SS11.20 GHS per USD
Strike KK, limit CC11.60, 12.50
USD interest rate, rr4.20%
Five-year trend, μ\mu12.0% a year
Recent volatility (EWMA)9.0%
Long-run volatility, σL\sigma_L18.0%
Market typeFrontier
Pool markup1.16
Fees5% purchase, 2% payout (testnet settings)

Part 1: what the protection pays​

1. Today's rate​

What happens. The engine reads today's rate SS 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
SS11.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.

payout=notional×max⁡(0, min⁡(R, C)−K)Smost it can pay=notional×∣C−K∣S\text{payout} = \text{notional} \times \frac{\max\big(0,\ \min(R,\,C) - K\big)}{\textcolor{teal}{S}} \qquad \text{most it can pay} = \text{notional} \times \frac{|C - K|}{\textcolor{teal}{S}}
Value
Most it can pay100,000 × 0.90 ÷ 11.20 = 8,035.71 USDC
Payout if the rate ends at 12.003,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.

T=seconds until 14:00 UTC on the end date31,557,600T = \frac{\text{seconds until } \textcolor{teal}{14{:}00\ \text{UTC}} \text{ on the end date}}{31{,}557{,}600}
Value
TT for exactly 30 days0.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.

μ=1Yln⁡StodaySY years agoq=r−μF=S e(r−q)T=S eμT\textcolor{teal}{\mu = \frac{1}{Y}\ln\frac{S_{\text{today}}}{S_{Y\ \text{years ago}}}} \qquad q = r - \textcolor{teal}{\mu} \qquad F = S\,e^{(r-q)T} = S\,e^{\textcolor{teal}{\mu} T}
Value
q=4.20%−12.0%q = 4.20\% - 12.0\%−7.80%
Expected rate at expiry, FF11.3109

Handbook chapter 5.

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 mm for the market type and holds it above a minimum, because history understates the risk in thin markets. Persistence pp is fitted per pair, or a default by market type.

σ0=min⁡ ⁣(300%, max⁡(5%, σfloor, σrecent(1+m)))w=1−pNN(1−p)σ=σL2+w (σ02−σL2)\sigma_0 = \min\!\Big(300\%,\ \max\big(5\%,\ \textcolor{teal}{\sigma_{\text{floor}}},\ \sigma_{\text{recent}}(1+\textcolor{teal}{m})\big)\Big) \qquad w = \frac{1-\textcolor{teal}{p}^{N}}{N(1-\textcolor{teal}{p})} \qquad \sigma = \sqrt{\sigma_L^2 + w\,(\sigma_0^2 - \sigma_L^2)}
Value
Frontier margin mm, minimum σfloor\sigma_{\text{floor}}75%, 15%
9.0% × 1.75, so σ0\sigma_015.75%
Trading days NN, persistence pp21, 0.93
Weight ww0.5321
Volatility used, σ\sigma16.84%

Handbook chapters 3 and 4.

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.

k=eμJ+σJ2/2−1λ′=λ(1+k)P(n jumps)=e−λ′T(λ′T)nn!k = e^{\textcolor{teal}{\mu_J} + \textcolor{teal}{\sigma_J}^2/2} - 1 \qquad \lambda' = \textcolor{teal}{\lambda}(1+k) \qquad P(n\ \text{jumps}) = \frac{e^{-\lambda' T}(\lambda' T)^n}{n!}
Value
Frontier settings λ\lambda, μJ\mu_J, σJ\sigma_J2 a year, 8%, 12%
Expected jumps before expiry, λ′T\lambda' T0.1792
Chance of 0, 1, 2 jumps83.59%, 14.98%, 1.34%

Handbook chapter 8.

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: qq from step 4, σ\sigma from step 5, and the jump terms from step 6.

d1=ln⁡(S/K)+(r−q+12σ2)TσTd2=d1−σTCall(K)=Se−qTΦ(d1)−Ke−rTΦ(d2)d_1 = \frac{\ln(S/K) + \big(r - \textcolor{teal}{q} + \tfrac12\textcolor{teal}{\sigma}^2\big)T}{\textcolor{teal}{\sigma}\sqrt T} \qquad d_2 = d_1 - \textcolor{teal}{\sigma}\sqrt T \qquad \text{Call}(K) = S e^{-\textcolor{teal}{q}T}\Phi(d_1) - K e^{-rT}\Phi(d_2) V=∑n=050e−λ′T(λ′T)nn![Call(K; σn,rn)−Call(C; σn,rn)]σn=σ2+nσJ2Trn=r−λk+n(μJ+σJ2/2)TV = \sum_{n=0}^{50} \frac{e^{-\lambda' T}(\lambda' T)^n}{n!}\Big[\text{Call}(K;\ \sigma_n, r_n) - \text{Call}(C;\ \sigma_n, r_n)\Big] \qquad \sigma_n = \sqrt{\textcolor{teal}{\sigma}^2 + \frac{n\textcolor{teal}{\sigma_J}^2}{T}} \qquad r_n = r - \textcolor{teal}{\lambda} k + \frac{n(\textcolor{teal}{\mu_J} + \textcolor{teal}{\sigma_J}^2/2)}{T}
Value
d1d_1, d2d_2 at the strike−0.4987, −0.5470
Call(11.60) without jumps, with jumps0.105120, 0.206256 GHS
Call(12.50) with jumps0.084845 GHS
Spread value VV0.121411 GHS per USD

Handbook chapters 6 to 9.

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).

fair premium=notional×VS1.5≤most it can payfair premium≤100\text{fair premium} = \frac{\text{notional} \times V}{S} \qquad \textcolor{teal}{1.5} \le \frac{\text{most it can pay}}{\text{fair premium}} \le \textcolor{teal}{100}
Value
Fair premium1,084.03 USDC
Fair rate, signed in millionths1.0840% (10,840)
Most it can pay ÷ fair premium7.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.

premium=notional×fair rate×markupbuyer pays=premium×(1+5%)\text{premium} = \text{notional} \times \text{fair rate} \times \textcolor{teal}{\text{markup}} \qquad \text{buyer pays} = \text{premium} \times (1 + \textcolor{teal}{5\%})
Value
Premium rate: 10,840 × 1.1612,574 millionths (1.2574%)
Premium1,257.40 USDC
Purchase fee62.87 USDC
Buyer pays1,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.

buyer receives=payout×(1−2%)\text{buyer receives} = \text{payout} \times (1 - \textcolor{teal}{2\%})
If the rate ends at 12.00Value
Payout3,571.43 USDC
Payout fee71.43 USDC
Buyer receives3,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:

ChangeFair rateChange in price
None (as above)1.0840%
No jump allowance (λ\lambda = 0)0.9028%−16.7%
No expected drift (μ\mu = 0)0.9046%−16.6%
No market-type margin (mm = 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 (pp = 0.97)1.0528%−2.9%
Twice the jumps (λ\lambda = 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.