Timing
Sova makes one block per Zcash block: about a minute on average, and a five-minute gap is normal. Zcash testnet also has bursts of blocks a few seconds apart. Design for few, full transactions.
Four habits
Section titled “Four habits”- Batch. Put many calls in one transaction: Multicall3 at
0xa7c966ccffA9681a9662ceA416Ca3c360dC42ac0on the testnet, or an EIP-7702 batch from your own account (Prague rules apply). - Pipeline. Send a run of transactions with consecutive nonces at once. Don’t wait for each receipt before sending the next.
- Wait.
eth_sendRawTransactionSyncreturns the receipt. A node waits up to 300 s (SOVA_SEND_SYNC_TIMEOUT_SECS); the public RPC waits up to 90 s. After a timeout, polleth_getTransactionReceipt: the transaction is still in the pool. - Count Zcash blocks. Use
anchor()’s height, orblock.timestamp(the Zcash block’s time). Notblock.number: Sova’s block rate may change, Zcash’s height won’t.ZecCheckoutcounts its payment window in Zcash blocks.
Settlement
Section titled “Settlement”Sova settles on Zcash. Mints are final at Zcash depth, and a transaction is settled once three more epochs are built on it (about four minutes). ZEC payments wait for their own confirmations: 3 on testnet, 10 on mainnet.
On the testnet, the RPC’s safe (3 blocks) and finalized (100 blocks)
labels are conveniences for tools, not guarantees:
what this testnet is.
Mapping heights
Section titled “Mapping heights”Sova block N anchors Zcash height N + B − 1, where B is the network’s
epoch base. On the testnet B is 4388500, so a burn in Zcash block h
is paid in Sova block h − 4388500 + 1. Contracts read the anchor with
anchor().