Practical knowledge about Nado (a CLOB perpetual DEX on Ink, Kraken’s L2, built on the former Vertex stack): gateway and EIP-712 signing, linked signer, markets and x18 numbers, orders and market modes, account and fees, limits, operations, and pitfalls. Every rule includes its reason and verification date. There are no addresses, accounts, or project names here—only mechanics, formulas, codes, thresholds, and pitfalls.
Stack used for verification: viem (EIP-712 signTypedData, privateKeyToAccount), Node ≥ 20 fetch (undici) with a timeout, and TypeScript. The official Nado SDK was not used. Freshness: facts verified through 2026-09-16.
How to read annotations inside the files:
- “verified with a live request ” / “verified ” / “observed ”—the response shape or behavior was captured from mainnet-gateway on the stated date; do not simplify a rule without understanding its reason;
- “according to Nado documentation”—taken from
docs.nado.xyzand not verified live; - “not verified” / the “Open questions” section—the last section of each file; summarized at the end of this page.
Files
| File | Covers | Open when |
|---|---|---|
| api-and-signing.md | Mainnet/testnet gateway, chain id, /query and /execute, response envelope, EIP-712 (domain, address(productId) for place_order, endpoint for the rest), sub-account bytes32, nonce (recv_time + tag, tx_nonce), appendix, expiration, digest, linked signer, error classification | Starting Nado code, signing, network preflight, key binding |
| markets-and-numbers.md | symbols query, product fields, x18 → BigInt, non-power-of-10 lots and quantization, leverage from weights, trading_status and listing phases, what is listed, the symbols cache and its freeze, mids, asset names | Market metadata, rounding, market modes, “is this asset listed?” |
| orders.md | Payload, DEFAULT/IOC/FOK/POST_ONLY types, reduceOnly for taker orders only (2067), post_only/not_tradable modes (2117/2069), two minimums ($100 for the book, IOC well below), oversized RO (2064), digest without status and IOC fill by delta, reading your orders, cancellation, retries, codes, smoke test | Any placement, cancellation, or order reconciliation |
| account-and-fees.md | subaccount_info, account value = unweighted health, unified-margin USDT0, positions and PnL, order-survey completeness, stability fence, leverage from weights, VIP-tier fees, fee_rates, binding verification | Balance, equity, sizing, strategy economics |
| rate-limits.md | Documented limits (2400/min per IP, 600/min per wallet), weights, mandatory explicit throttle and chunk configuration, retries | Load design, impossible weight, 429 |
| ops.md | Configuration and preflight, geo-block, testnet and faucet, account and linked-signer setup, going live, symptom-based diagnostics, cache freeze, manual orders, key rotation, shutdown | Going live with real funds and operations |
| pitfalls.md | Pitfall summary with dates, error classes, rejected approaches, open-question summary | Reviewing Nado code, investigating strange behavior |
Quick answers
1. How do I sign an order?
EIP-712, domain {name:'Nado', version:'0.0.1', chainId, verifyingContract}. For place_order, verifyingContract = address(productId) (product id encoded as a 20-byte address); for cancel_orders and link_signer, use endpoint_addr from the contracts query. sender is the master account’s sub-account bytes32 (address + name), even when a linked signer signs. All x18 numbers are strings. → api-and-signing.md §5–6, §12
2. How does a bot receive permission to trade?
Linked signer (“1-Click Trading”): the master signs LinkSigner with tx_nonce from nonces in a browser popup, not a CLI on the server. The signer can trade, but withdrawals go only to the master. The limit is 50 link/revoke operations per 7 days; a new signer replaces the old one; revoke = link the zero address; the sub-account must hold ≥ 5 USDT0. Verify with the linked_signer query. → api-and-signing.md §11
3. How do I know whether an order executed?
The response does not tell you: place_order returns only a digest. For GTC, observe it in orders; for IOC, use the position delta (subaccount_info before and after, up to 3 attempts at 150 ms); no delta → rejection. → orders.md §7
4. Can I place reduceOnly in the book? No: code 2067, reduceOnly is only for IOC/FOK. A TP in the book is an ordinary limit order and reverses the position after it closes. Keep the sum of resting orders on the reducing side no larger than the position; before every IOC that changes the position, cancel your resting orders for that asset; set the real RO bit on every IOC reduction. → orders.md §3
5. Why are all orders rejected with 2117 or 2069?
The market has trading_status = post_only (accepts only POST_ONLY; DEFAULT/IOC at any price → 2117; pre-listing and weekends for stock perpetuals) or not_tradable (2069). Use POST_ONLY for resting orders based on a fresh symbols cache; resend DEFAULT as POST_ONLY after 2117; defer partial IOC; never gate a full close. → orders.md §4, markets-and-numbers.md §5
6. What is the minimum order?
min_size = $100 on every market, but in practice only for the book: maker orders below $100 were not observed, while IOC orders, including reduce-only, passed well below it. Use two minimums (resting $100; IOC only after measuring its floor, with headroom). Never gate a full reduceOnly close on a minimum. → orders.md §5
7. How do I round price and size?
Read tick and lot from symbols (price_increment_x18, size_increment); lots are not powers of 10 (BTC 0.00005, XRP 5). Quantize with BigInt-based functions: pxToStr = round(px/tick) × tick, floorSz for everything, ceilSz only for a full close; add epsilon to the quotient. Use one function for planner and executor. → markets-and-numbers.md §2–3
8. How do I obtain balance and equity?
Query subaccount_info with the sub-account bytes32 → healths[2].health (unweighted health, x18), which is account value in USDT0. Under unified margin, there are no free stablecoins “outside equity” (0), or funds would be double-counted. exists:false most often means the wrong sub-account name. → account-and-fees.md §1
9. How do I read my orders and prove there are none?
Call orders with sender and explicit product_ids (weight 2 per id; configure chunk size for query burst). A partial read looks like an empty account; only a complete all-market survey proves there are no orders. Recognize your orders by the tag in the nonce’s low bits; do not touch foreign orders, but count them as exposure. → account-and-fees.md §3, orders.md §8
10. How do I cancel, and when is cancellation confirmed?
Call cancel_orders with digests (signed against the endpoint). Cancellation is confirmed only if the digest appears in cancelled_orders; everything else is unconfirmed, so do not place a replacement. OrderNotFound means already canceled or filled. → orders.md §9
11. What are the limits and weights?
According to documentation: queries 2400 weight/min per IP, executes 600/min per wallet. Weights: 1—contracts, market_price, place_order, cancel_orders; 2—symbols, subaccount_info, nonces; orders—2 per product id; 5—linked_signer. The application explicitly configures sustained rate, burst, concurrency, and chunk size; the limits were not verified by hitting them live. → rate-limits.md
12. What should I do with 429, 5xx, and a failure envelope?
A failure envelope is a final rejection; do not retry (use a code-specific branch). Retry 429. A 5xx/timeout has an unknown outcome: retry only cancel_orders and a full reduceOnly close; reconcile position for entries and partial reductions. → api-and-signing.md §13, rate-limits.md §6
13. What are the fees?
VIP 0: maker 1.0 / taker 3.5 bps. Tier is based on 30-day volume; maker is 0 at $100M and a rebate begins at $500M. Read your rates from fee_rates. It is unclear whether the window is rolling or uses monthly epochs. → account-and-fees.md §6
14. What is listed, and how do I find out?
72–75 perpetuals: crypto, equities (AAPL, NVDA, TSLA, INTC, …), ETFs (SPY, QQQ), FX, and commodities. Obtain the list only from live symbols; never claim from memory that something is not listed. Asset name = symbol without -PERP. → markets-and-numbers.md §6, §9
15. Why are new assets “not listed” even though they appear in the UI?
The symbols cache is frozen: after a market rename (CIRCLE → CRCL, 2026-08-10), a strict stability check rejects every refresh until process restart. Fix it by restarting after three control symbols requests. → markets-and-numbers.md §7, ops.md §6.3
16. How do I run the bot with real funds?
Preflight with contracts (chain id) and subaccount_info (sub-account name); check the geo-block; complete the testnet checklist with live orders, then move to mainnet with a small deposit. Manual orders on the bot’s sub-account are forbidden. → ops.md
Open questions (summary)
Everything below is not verified or contradictory. Details are in the referenced file’s “Open questions” section.
Signing, API
- Rejection code/text for a nonce outside the recv_time window; appendix fields
isolated,trigger,fee,builder,value;CancellationProducts; existence of an official SDK; WebSocket. → api-and-signing.md - Ordering of
healths[0..1]; shape and weight offee_rates; direct hosts. → api-and-signing.md, account-and-fees.md
Markets
- Semantics of
reduce_only/soft_reduce_only;isolated_only; short weights, liquidation, ADL; candles, trade history, order book, funding, and OI via API; equity-perpetual schedule beyond weekends. → markets-and-numbers.md
Orders
- Oversized reduceOnly IOC—cap or 2064; exact IOC floor (IOC orders passed well below $100, no binary search was performed); rejection code for POST_ONLY crossing the book; full close on a
post_onlymarket with a position; FOK; average fill price; deduplication by nonce. → orders.md
Account and fees
- Fill history, realized PnL, and actual fees via API; accuracy of
entryPrice = |v_quote/amount|; tier as rolling 30 days or monthly epochs; product rates versus account rates; withdrawals; multiple sub-accounts; funding. → account-and-fees.md
Limits
- 2400/600 are documented only; which wallet is counted;
ordersweight; actual labeled consumption was not measured. → rate-limits.md
Operations
- Geo-block response code; exchange behavior when rotating the signer with open orders; multiple sub-accounts under one master across multiple processes. → ops.md
Disclaimer
This is not financial advice or a recommendation to trade. Measured values describe specific periods and do not guarantee any outcome. The Nado API, limits, fees, market modes, and response shapes can change without notice: before using them, verify the facts against official docs.nado.xyz documentation and live requests, especially anything marked “not verified” or “according to documentation.” Run snippet code in dry-run first and with minimal capital. You are responsible for its use.
License
The knowledge base and the nado skill are licensed under CC BY 4.0. You may copy, adapt, and use them, including commercially, but every publication must credit “markpaper — Nado knowledge base,” link to the original and the license, and indicate changes. See LICENSE.md for the terms.
© markpaper authors. Licensed under CC BY 4.0: when publishing or adapting this material, credit “markpaper — Nado knowledge base” and link to the original and the license.