Deterministic fixtures
Every magic value below always produces the same outcome. This table is rendered directly from lib/sandbox/fixtures.ts — the same source the simulation engine and tests read from, so this page can never drift from actual behavior.
Wallet to wallet
M-Pesa — success
Designated MSISDN for M-Pesa that always completes successfully.
Mixx by Yas — success
Designated MSISDN for Mixx by Yas that always completes successfully.
Airtel Money — success
Designated MSISDN for Airtel Money that always completes successfully.
HaloPesa — success
Designated MSISDN for HaloPesa that always completes successfully.
T-Pesa — success
Designated MSISDN for T-Pesa that always completes successfully.
Selcom Pesa — success
Designated MSISDN for Selcom Pesa that always completes successfully.
Insufficient funds
Source wallet balance is too low.
Timeout
Destination provider never responds within the SLA window.
Authorization expiry
Customer never completes authorization before the window closes.
Alias unmapped
Destination identifier has no resolvable account.
3-DS challenge
Forces a step-up authorization challenge (app-push/USSD PIN prompt).
3-DS challenge failure
Customer fails the step-up challenge.
Rail unavailable
Simulates the MNO interconnect being down for this instruction.
Debit succeeded, credit failed
Source debit clears, destination credit fails — the exact case merchant reconciliation must catch.
Same-provider transfer rejected
Two M-Pesa numbers on a MNO_TO_MNO instruction. This is an on-us book transfer, never a cross-network route — must be rejected with SAME_PROVIDER_ON_US before any routing decision.
Ported number: prefix disagrees with declared provider
MSISDN +255650009999 carries a TIGO_PESA prefix (65) but the request declares providerCode AIRTEL_MONEY (the number ported). detectMnoFromMsisdn returns TIGO_PESA; the instruction must still route on the declared AIRTEL_MONEY code, proving prefix is never used as a correctness control.
MSISDN resolves at two providers
MSISDN +255740005555 matches MPESA_TZ by prefix (74) and can also be legitimately declared as SELCOM_PESA (which owns no prefix range and therefore never conflicts by construction). Both requests are valid; the declared providerCode alone decides.
Unregistered destination
Destination MSISDN has no wallet account with the declared provider at all.
Non-USSD authorization
Selcom Pesa cannot authorize via USSD — Test Bank must render its app-push/agent-assisted variant, never a generic PIN prompt.
Bank to bank
TIPS alias resolves
Resolves via the CRDB Bank TIPS directory entry.
TIPS alias unmapped
No TIPS directory entry for this alias.
Card / gateway checkout
Visa success
Passes Luhn and authorizes cleanly.
3-DS challenge
Card requires step-up authentication.
3-DS failure
Card fails step-up authentication.
Insufficient funds
Issuer declines for insufficient funds.
Cross-border corridors
TZ -> KE success
Standard corridor settlement, two-decimal currencies on both sides.
Originating market not LIVE
Instruction declares market=KE as the originating market. Only TZ is LIVE — rejected before any quote, alias lookup, or ledger posting.
Zero-decimal destination (UGX)
Exercises CURRENCY_META.UGX exponent=0 — no fractional units, no naive /100.
Zero-decimal destination (RWF)
Exercises CURRENCY_META.RWF exponent=0.
Quote expired mid-flight
Execution attempted after the quote's expiresAt.
Adverse rate movement
Rate moved against the customer between quote and execution — reversed rather than silently re-quoted.
Corridor liquidity exhausted
Corridor's settlement-window liquidity cap has been used up.
Outside cut-off
Request arrives after the corridor's daily cut-off hour.
Rounding-residual amount
amountMinor chosen so the raw rate multiplication does not divide evenly (e.g. 333333 minor units at a TZ-KE rate of 555/100000). quoteFx must round exactly once and leave no unexplained minor unit — see the money property tests.