placeStrike, placeRange, or placeLadder on ChancePool. Full signatures live in Contract methods; this page covers how to build the args correctly.
Choose a mode
See Bet modes for the payout math of each.
Common args (all modes)
Keep expectedCommitId fresh
Every bet pins the epoch it settles under. If the epoch rotates between your read and your transaction landing, the place revertsCommitMismatch. The fix is mechanical:
TypeScript
Mode-specific gotchas
- Strike —
multipleBpsis gated by the liveeffectiveMaxMultiplierBps(), which shrinks as bankroll liability fills. Quote it immediately before placing, not at page load. - Range — the band must bracket expected value:
payoutMin ≤ 0.85 × stake ≤ payoutMax, andpayoutMax − stakemust fit the liability cap. - Ladder — the contract checks
Σ massWad × payouts / WAD == EV × stakein exact integer math. Snap your float probabilities onto the identity (largest-remainder rounding, then move single mass units between buckets until the check passes) or the place revertsInvalidOdds. See Bet constraints.
Attribution
platform and game land on the BetPlaced event (emit-only — never stored on the bet, and echoed back through the API’s bet payloads). Pass stable identifiers so your wagers are attributable in analytics:
After the transaction
ThebetId comes back as the return value and on BetPlaced. From here, follow Results & proofs — you don’t need to poll the contract.