Supported assets and pool types
How to present approved 0Pools assets, pairs, networks, sides, limits, and pool types safely.
Supported assets are not a static website list. They are a function of partner entitlement, pool capabilities, environment, product approval, and runtime liquidity.
Decision flow
Pool pair
A pool id expresses the pair. The quote request must match it.
| Pool id | fiatCurrency | cryptoCurrency | Example use |
|---|---|---|---|
EUR-USDT | EUR | USDT | EUR-funded stablecoin delivery. |
EUR-USDC | EUR | USDC | EUR-to-USDC treasury or wallet flow. |
If poolId is EUR-USDT, do not send fiatCurrency: "GBP" or cryptoCurrency: "USDC".
Sides
| Side | Display if |
|---|---|
on_ramp | Capabilities and product approval allow buy flow. |
off_ramp | Explicitly enabled; do not infer from API shape. |
Networks
cryptoNetwork is the network selected for the quote. The canonical vocabulary includes tron, ethereum, bsc, polygon, and solana. The server default is tron when omitted, but a production UI should make the selected network explicit.
Delivery networks can be narrower. For a buy, the destination address and delivery network are locked on the quote. Always display them back to the user.
Limits and economics
Capabilities and quote responses expose:
- Minimum order in USDT-equivalent.
- Maximum order when configured.
- Draw fee bps.
- Spread cap bps.
- Supported sides.
- Supported networks.
Use these to validate before quote and explain quote terms after quote.
UI examples
| Bad UI | Better UI |
|---|---|
| Hard-coded "USDT on all chains". | Network list from capabilities. |
| Sell tab visible for everyone. | Sell tab only when off_ramp is enabled. |
| Amount accepted then rejected late. | Amount validated before firm quote. |
| Destination address entered after quote. | Address captured before firm quote. |
API details
Use List entitled pools and Read pool capabilities for exact fields.
What "supported" means
An asset can be conceptually supported by the platform but unavailable for a specific partner, environment, side, network, amount, or runtime condition. Product UI should always follow the account's discovery and capability data.
Pool types
| Pool type | Description | Product caution |
|---|---|---|
| Fiat to stablecoin | Fiat-funded stablecoin delivery. | Primary on-ramp shape; destination network/address must be clear. |
| Stablecoin to fiat | Stablecoin-funded fiat payout or settlement. | Gated; do not infer from pair support. |
| Stablecoin conversion | Stablecoin asset/network conversion where approved. | Network handling and settlement records matter. |
| Configured 0Asset lane | Program-specific asset movement or mint/burn-adjacent flow. | Requires asset, reserve, settlement, and compliance review. |
| Partner-funded program | Partner prefunds balance and draws from approved pools. | Balance ledger and funding references are required. |
UI rendering pattern
{
"pool_id": "EUR-USDT",
"display": "EUR to USDT",
"side": "on_ramp",
"network_options": ["tron", "ethereum"],
"amount_min": "10.00",
"amount_max": "5000.00",
"can_quote_now": true
}Use this kind of normalized view inside your own product. It lets frontend code render choices without learning private pool internals.
Before and after
| Static support table | Entitled pool model |
|---|---|
| Users see assets that may not work for their account. | Users see only pools and networks their account can use. |
| Engineering updates code for every new network. | UI is driven by capabilities. |
| Off-ramp appears because on-ramp exists. | Each side is enabled independently. |
| Amount validation happens after user accepts. | Amount and network are validated before firm quote. |
Common mistakes
- Showing all networks for a stablecoin because the stablecoin exists.
- Showing
off_rampbecauseon_rampis available. - Treating sandbox support as live support.
- Treating examples as entitlement.
- Allowing destination address entry after quote lock.
- Rounding decimal strings before reconciliation.
Asset support matrix
Supported does not only mean "listed in a dropdown." It means the asset, network, side, limits, precision, settlement behavior, and disclosure language are approved for the partner account.
| Field | Example | Product behavior |
|---|---|---|
asset | USDT | Display asset symbol and stablecoin disclaimer where required. |
network | polygon | Validate address format and chain selection. |
decimals | 6 | Store amounts as strings or minor units; avoid floats. |
side | buy | Render only enabled actions. |
min_amount / max_amount | 50.00 / 25000.00 | Pre-validate before firm quote. |
status | active, paused, deprecated | Hide, disable, or migrate UX. |
Rendering rule
function canRenderPoolAction(pool: PoolCapability, action: 'buy' | 'sell') {
return pool.status === 'active'
&& pool.sides.includes(action)
&& pool.networks.some((network) => network.status === 'active');
}Versioning and deprecation
| Change | Required partner behavior |
|---|---|
| Network paused. | Stop new quotes on that network; keep existing trade history visible. |
| Limit reduced. | Apply new limits before creating quotes. |
| Asset deprecated. | Hide new actions and provide migration/support copy. |
| New network added. | Show only after discovery returns it for the partner. |
Implementation depth
This page is about presenting assets, pairs, sides, networks, and pool types accurately. For developers, the durable boundary is simple: your product should depend on the account-specific supported set returned by discovery and capabilities; it should not depend on unlisted assets, future pairs, source depth, and route preference. That boundary is what lets 0Pools improve liquidity operations without forcing every partner to rebuild product code.
Product scenario
A developer builds an asset selector. Instead of shipping a hard-coded list, the selector reads pools, sides, networks, and limits at runtime and caches only for short UX windows.
Before and after in practice
| Before 0Pools | With 0Pools |
|---|---|
| Docs examples become product configuration, so unsupported pools appear in production. | The product treats examples as examples and runtime capabilities as the 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 |
|---|---|---|
supported_networks | Networks allowed for the selected asset. | [tron, arbitrum] |
min_order | Lower bound from capabilities. | 10.00 |
max_order | Upper bound from capabilities. | 5000.00 |
side_enabled | Whether buy or sell is enabled. | on_ramp=true |
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": "supported-assets-pool-types",
"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 |
|---|---|
| Example copied as config | Replace static lists with capability fetch. |
| Network omitted | Use the default only when the API contract allows it. |
| Pool type misunderstood | Separate fiat/stablecoin, balance, and settlement concepts. |
| Limits not refreshed | Re-read capabilities on session start and before quote. |
Use-case patterns
| Pattern | How 0Pools helps |
|---|---|
| Asset selector | Render only approved lanes. |
| Checkout rails | Validate amount before quote. |
| Admin dashboard | Explain why an asset is hidden. |
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.