0Bit Documentation

Slippage limits

How 0Pools limits partner slippage exposure through firm quotes, expiry, amount bounds, and execution rules.

0Pools does not make markets static. It limits the slippage exposure a partner shows to users by making quotes explicit, short-lived, and executable only once.

Where slippage usually appears

In many systems, the price shown at step A is not the same price executable at step D. That creates user confusion and support disputes.

0Pools quote-lock model

Controls that reduce exposure

ControlEffect
Short TTLLimits how long a user can accept a price.
Single-use quotePrevents replaying old terms.
Quote-bound fieldsPrevents changing amount/network/address at execution.
Min/max orderKeeps requests inside approved size bounds.
available: falseAvoids issuing a quote when liquidity cannot support it.
IdempotencyPrevents duplicate execution during retries.

UI rules

  • Show quote expiry as a timer or explicit timestamp.
  • Disable accept before expiry.
  • Request a new quote after expiry.
  • Do not show "guaranteed forever" language.
  • Do not credit final funds on reserved.

Support examples

User reportFirst check
"The price changed."Was the original quote expired before acceptance?
"I clicked twice."Does the same quote id map to one transact id?
"I received less than expected."Compare accepted firm quote, trade status, and ledger movement.
"The flow disappeared."Check entitlement, capabilities, and quote availability.

Before and after

Before 0PoolsWith 0Pools
Product shows an estimated price and executes later against whatever price is available.Product shows a firm quote with explicit expiry.
Users can accept stale terms without realizing the market moved.Expired quotes must be refreshed before execution.
Retry logic can execute the same intent multiple times.Idempotency and single-use quote ids collapse retries.
Support disputes require comparing UI screenshots with provider fills.Support compares accepted quote, trade status, and ledger records.

Acceptance-window diagram

The quote timer is the product expression of market-risk control. It does not make markets static; it prevents the user from accepting old terms silently.

Product copy examples

StateCopy
Firm quote active"This quote is valid until the timer expires."
Quote nearly expired"Quote expiring soon. Refresh if you need more time."
Quote expired"This quote expired. Refresh to continue."
Reserved trade"Your conversion is pending settlement."
Terminal settled"Your conversion completed."
Terminal failed/released"We could not complete this conversion. No final credit was posted."

Engineering checklist

  • Store expires_at and enforce it server-side.
  • Disable browser acceptance when expired, but do not rely only on browser timers.
  • Send an idempotency key on execution.
  • Keep quote-bound fields immutable after the quote is created.
  • Preserve exact decimal strings returned by 0Pools.
  • Reconcile final user amount from trusted status and ledger records.

Numerical slippage example

Before a firm quote, market price can move while the user edits. After a firm quote is accepted within its TTL, the product should execute the accepted terms or fail cleanly.

MomentEUR inputExpected USDTProduct state
User typing100.00107.30 indicativeRefreshable preview.
Firm quote100.00107.42 firmCountdown shown.
User accepts in time100.00107.42 acceptedServer transacts once.
User waits past expiry100.00Not executableRequire fresh quote.

Acceptance guard

function canAcceptQuote(quote: FirmQuote, now = Date.now()) {
  return quote.executable === true && Date.parse(quote.expiresAt) > now;
}

Product language

SituationSuggested copy
Quote active"This amount is locked until the timer expires."
Quote expired"The quote expired. Get a new quote to continue."
Trade reserved"Your accepted quote is processing."
Trade failed/released"The quote could not be completed. No new price was accepted."

Implementation depth

This page is about reducing slippage exposure through quote locks and execution boundaries. For developers, the durable boundary is simple: your product should depend on firm quote expiry, rate, amounts, limits, and terminal status; it should not depend on how 0Pools protects inventory during volatile windows. That boundary is what lets 0Pools improve liquidity operations without forcing every partner to rebuild product code.

Product scenario

A user confirms a quote during a fast market. The app executes the exact quote id within its TTL or asks the user to review fresh terms.

Before and after in practice

Before 0PoolsWith 0Pools
The app submits a market order after showing an old price, so the user receives less than expected.The app uses a single-use firm quote and refuses execution after expiry.
Product teams infer liquidity behavior from provider-specific screens or manual notes.Product teams branch on 0Pools objects: pool, quote, trade, balance, webhook, and ledger.
Support asks engineering to reconstruct state from logs.Support starts from request id, quote id, trade id, event id, and ledger id.

System flow

Records to keep

RecordWhy it mattersExample
displayed_rateWhat the user accepted.1.0731
expires_atWhen the accept window ends.2026-06-28T...
accepted_atWhen the user confirmed.2026-06-28T...
execution_statusWhether the locked quote was used.reserved

A useful implementation stores these records before adding optional analytics. Analytics can be rebuilt from durable state; missing ids usually cannot be reconstructed after a customer-impacting failure.

Example product record

{
  "product_area": "slippage-limits",
  "partner_reference": "partner_order_123",
  "pool_id": "EUR-USDT",
  "quote_id": "pq_test_123",
  "transact_id": "pt_test_456",
  "status": "reserved",
  "request_id": "req_01HZY0POOLS",
  "reconciliation_state": "open"
}

This record is intentionally partner-facing. It references 0Pools objects and your own product ids, but it does not include private liquidity routes, treasury balances, raw provider payloads, or customer secrets.

Failure modes and recovery

Failure modeProduct response
Accept after expiryCreate a new firm quote.
Amount changed after quoteInvalidate the quote and refresh.
Destination changed after quoteLock destination before firm quote.
Partial UI updateTreat quote response as a complete price object.

Use-case patterns

PatternHow 0Pools helps
High-volatility marketsProtect users with short TTLs.
Mobile checkoutHandle background/foreground expiry.
Dispute reviewCompare accepted vs executed terms.

Developer checklist

  • Read runtime discovery and capabilities before rendering enabled actions.
  • Create firm quotes only when the user is ready to accept the terms.
  • Execute from your server with an idempotency key.
  • Treat webhooks and status reads as the source of truth for settlement state.
  • Reconcile by durable ids first, then by amount and timestamp.
  • Do not branch product behavior on provider names, route names, reserve balances, or treasury assumptions.

On this page