Fiat and stablecoin pools
How 0Pools models fiat-to-stablecoin liquidity lanes for approved partner products.
0Pools is designed around fiat-to-stablecoin liquidity. A partner does not integrate with a raw venue; it integrates with an approved pool lane such as fiat in, stablecoin out, with quote, trade, status, and reconciliation records around that lane.
Pool lane model
Why fiat and stablecoin need a pool layer
Fiat and stablecoins live in different systems. Fiat has bank rails, references, settlement windows, returns, and compliance checks. Stablecoins have networks, addresses, confirmations, and delivery risk. 0Pools puts a product contract over that complexity.
| Problem | Pool-layer answer |
|---|---|
| Fiat and crypto settle on different clocks. | Trade statuses separate acceptance from final settlement. |
| Users need a simple quote. | Partner-visible rate, spread, fee, expiry. |
| Finance needs auditability. | Quote id, trade id, balance ledger, request id. |
| Product needs reusable infrastructure. | Same pool layer can support Gate, Base, partner API, and internal execution. |
Example lanes
Examples are illustrative. Your account can only use pools returned by discovery.
| Lane | Typical user story |
|---|---|
EUR-USDT | Buy USDT with EUR for wallet funding, payroll, or treasury movement. |
EUR-USDC | Buy USDC with EUR for stablecoin settlement flows. |
| Other fiat/stablecoin lanes | Enabled only after product, liquidity, and compliance review. |
Stablecoin delivery
For on-ramp flows, the destination address is locked at firm quote time. That prevents a later request from redirecting funds. Your app should validate and display the destination address before the user accepts the quote.
What not to claim
Do not claim every fiat currency, every stablecoin, every network, instant settlement, or zero-cost conversion. The accurate product claim is: approved partners can discover entitled pools and request bounded quotes against those pools.
The lane is the product primitive
A lane is more than a currency pair. It is the approved relationship between a fiat currency, a stablecoin, allowed sides, supported networks, limits, quote behavior, and settlement-facing records. Partners should render lanes from discovery and capability responses, not from a static asset table.
Example lane records
{
"pool_id": "EUR-USDT",
"fiat_currency": "EUR",
"crypto_currency": "USDT",
"supported_sides": ["on_ramp"],
"supported_networks": ["tron", "ethereum"],
"min_order": "10.00",
"max_order": "5000.00",
"availability": "entitled"
}The exact field names belong in the API reference. The product concept is what matters here: a partner should only build UI from pools and capabilities that the account can actually use.
Before and after pool lanes
| Before 0Pools | With 0Pools lanes |
|---|---|
| Product hard-codes which fiat/stablecoin pairs might exist. | Product asks which pools this partner can use. |
| Network support is buried in product copy or settings. | Network support is rendered from capabilities. |
| Amount limits are discovered after the user confirms. | Amount validation happens before firm quote. |
| Each product builds separate reconciliation joins. | Quote, trade, balance, and request ids can follow a common shape. |
Use-case map
| Lane shape | Common use case | What to verify |
|---|---|---|
| Fiat to USDT | Wallet funding, treasury movement, remittance liquidity. | Destination network, address, quote expiry, balance funding. |
| Fiat to USDC | Merchant settlement, treasury movement, neobank balance. | Product approval, network support, limits. |
| Stablecoin to fiat | Gated off-ramp or payout flow. | Explicit enablement, crypto-receipt address, credited crypto balance, approved payout destination, compliance approval. |
| Fiat to configured 0Asset | Asset-specific program. | Entitlement, mint/burn lifecycle, settlement boundary. |
Developer rules
- Always render the pool id, asset, side, network, amount, and quote expiry back to the user before acceptance.
- Do not assume that support for one network implies support for another network.
- Do not infer off-ramp support from on-ramp support; sell requires explicit enablement and a crypto-receipt gate before fiat payout.
- Treat unavailable quotes as a normal operating state, not an exceptional crash.
- Preserve decimal strings exactly for ledger and reconciliation.
Lane specification
Every fiat/stablecoin pool lane should be treated as a product primitive with explicit capabilities.
| Capability | Example | Why it matters |
|---|---|---|
| Fiat asset | EUR | Determines source currency, formatting, settlement expectations. |
| Stablecoin asset | USDT | Determines target asset and precision. |
| Network | ethereum, polygon | Determines destination validation and delivery behavior. |
| Side | buy or sell when enabled. | Controls user action and risk model. |
| Limits | Min/max order amount. | Prevents avoidable quote failures. |
| Quote TTL | Short acceptance window. | Prevents stale price acceptance. |
Lane payload example
{
"pool_id": "EUR-USDT",
"fiat_asset": "EUR",
"stablecoin_asset": "USDT",
"enabled_sides": ["buy"],
"networks": [
{ "name": "ethereum", "address_format": "evm", "confirmations_policy": "shown_by_status" },
{ "name": "polygon", "address_format": "evm", "confirmations_policy": "shown_by_status" }
],
"limits": {
"min_source_amount": "50.00",
"max_source_amount": "25000.00"
}
}Lane test cases
| Case | Expected behavior |
|---|---|
| Valid EUR to USDT quote under max amount. | Firm quote returns expiry and executable quote id. |
| Unsupported network selected. | UI blocks or backend returns controlled validation error. |
| Amount below minimum. | UI shows minimum before requesting firm quote. |
| Quote expires while user is reviewing. | Accept is disabled and a fresh quote is required. |
Implementation depth
This page is about treating fiat-to-stablecoin lanes as reusable product primitives. For developers, the durable boundary is simple: your product should depend on pair, side, network, amount bounds, quote terms, and delivery fields; it should not depend on how fiat and stablecoin inventory is sourced or rebalanced. That boundary is what lets 0Pools improve liquidity operations without forcing every partner to rebuild product code.
Product scenario
A product supports EUR to USDT today and adds EUR to USDC later. The UI does not change its money logic; it renders lanes from pool discovery and uses the same quote/trade lifecycle.
Before and after in practice
| Before 0Pools | With 0Pools |
|---|---|
| Every new asset pair creates a new integration path with custom validation and settlement assumptions. | New lanes become configuration and entitlement, while the product keeps the same quote and reconciliation contract. |
| 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
| Record | Why it matters | Example |
|---|---|---|
pair | Human-readable lane. | EUR/USDT |
fiat_currency | Input currency for buy flow. | EUR |
crypto_currency | Output asset for buy flow. | USDT |
crypto_network | Network selected for quote. | tron |
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": "fiat-stablecoin-pools",
"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 mode | Product response |
|---|---|
| Asset shown without entitlement | Always render from discovery. |
| Wrong network for address | Validate network before firm quote. |
| Amount outside limits | Block before quote where capabilities provide limits. |
| Lane unavailable | Let users choose another enabled lane or try later. |
Use-case patterns
| Pattern | How 0Pools helps |
|---|---|
| Wallet deposits | Buy stablecoin into a wallet. |
| Treasury conversion | Convert operational fiat into stablecoin. |
| Marketplace balance | Fund seller payout balances. |
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.