Chain

Validators aren’t reaching quorum. Check that all 4 nodes are reachable from each other:
Common causes:
  • One node crashed on boot (genesis mismatch)
  • Network partition between containers
  • BLS key rotation without re-registering
Sled keeps state across restarts. If genesis.json changed, wipe the DB:
All contracts must be redeployed after this.

Transactions

Possible causes:
  1. Nonce gapeth_getTransactionCount ahead of any submitted tx. Submit the missing nonces.
  2. Insufficient balance — the tx was evicted from the mempool. Check eth_getBalance.
  3. Frontend polling stale — the tx is already confirmed but the client is still polling an old block window. Use eth_getTransactionReceipt directly.
Make sure you’re signing for chain ID 7717. MetaMask / ethers / viem auto-pick this from the RPC, but custom signing paths often forget.
Testnet gas is 1 gwei. Even so, large calls can need tens of thousands of gas. Use eth_estimateGas before sending.
Two nonce semantics matter here and they are easy to confuse:
  • eth_getTransactionCount(address, tag) on yc-node ignores the block tag and always returns the committed state nonce. There is no pending view — asking for "pending" gives you "latest".
  • yc_sendTransaction assigns the nonce server-side from the node’s pending-aware mempool counter (highest pending + 1), so the client cannot choose it. If pending entries stop being mined, that counter runs away from the committed nonce and the executor rejects each block’s worth of them with nonce mismatch: expected N, got M.
The indexer routes every signing path through one nonce manager (yscan/indexer/src/nonce.ts) that reads the committed nonce from the node, keeps a small bounded window of unconfirmed transactions, and on a nonce rejection logs a single [nonce] resync ... expected=N got=M WARN, drops the future-nonce backlog, and retries with capped exponential backoff. It self-heals without restarting the container; a restart is no longer the remedy.If a submission keeps failing it surfaces as NonceResyncExhaustedError, and if the window stays full because the chain is not advancing it surfaces as NonceWindowSaturatedError — both are errors returned to the caller, never an unbounded resubmission loop.Tunable per deployment: NONCE_MAX_IN_FLIGHT (8), NONCE_MAX_ATTEMPTS (5), NONCE_BASE_BACKOFF_MS (100), NONCE_MAX_BACKOFF_MS (4000), NONCE_STALE_AFTER_MS (60000).

Mobile API

Global rate limit is 300 req/min per IP, writes are 30/min. Back off per the Retry-After header. Batch reads where possible.
iOS and Android block cleartext HTTP by default. See the mobile app guide for the Info.plist / network_security_config exceptions.

Operator cheat sheet

Who to ping

  • Protocol / node issues → Eduardo (edudev825@gmail.com)
  • QA / mobile integration → Mostafa