Skip to content

Gas and failure

Quote

estimate = coordinator.quoteServiceFee() (USD cut via the RON/USD feed, 7-day max age) + bufferedGasPrice × (callbackGasLimit + coordinator.ADDITIONAL_GAS()). Your declared gasPrice gets a 10% buffer at request time and must clear the 21 gwei floor, or the request reverts InvalidGasPrice. We over-quote. After the callback we refund leftover native token to the refund address. The USD cut is converted and snapshotted at request time. The site and Convex quote the same coordinator views; they do not keep a second fee table.

Spike handling

Submit at max(declared gasPrice, 2×basefee+20gwei × 1.15, p90). If recommended gas is more than 3× declared, the oracle waits for basefee to drop — requests never expire; oracles rotate until fulfilled. Replacement txs bump 1.25×, max 3, still billed at the buffered declared price.

Callbacks

  • Callback is invoked with exactly callbackGasLimit. No retries.
  • If the fulfiller tx does not have enough gas for EIP-150 forwarding, fulfill reverts NotEnoughGas and the oracle retries with a higher tx limit, so the request is not marked fulfilled.
  • Consumer revert or inner OOG: fulfill succeeds, service fee kept, unused prepaid refunded. The seed is stored on-chain — read it back with seedOf(reqHash) and finish resolution yourself; it is never re-minted or re-delivered.
  • Requests never expire and cannot be cancelled: a Chainlink-style blockhash store (storeBlockhash / storeVerifyHeader, permissionless) keeps the request blockhash recoverable forever, so a fulfilment is a commitment, not a bet you can re-roll by waiting.
  • Confirmations are 1: the next block after the request, so blockhash(requestBlock) exists. Ronin L2 does not reorg; waiting extra blocks is wasted latency.