Repository navigation
Conversation
The v0.8.0 [Format] entry says value-exceeds-balance errors now surface revm 38's OutOfFunds text and attributes the new allowance error to EOA-to-EOA transfers. Verified against the post-upgrade testnet endpoint: the previous "insufficient funds for gas * price + value" text still fires whenever gas-price/fee fields are present (the shape ethers/viem always send), and the allowance error is only reachable on contract or precompile targets -- plain EOA-to-EOA transfers whose balance covers value now estimate successfully regardless of gas affordability. Also notes that the allowance string is shared with --rpc.gascap clamping, distinguishable only by the parenthesized bound. Matches the localdev expectations in tests/localdev/evm_compatibility.test.ts.
Address review on circlefin#297: scope application-facing notes to v0.7.2 (v0.8.0 error-text matrix is tracked in circlefin#291) and document the gas required exceeds allowance string collision. Co-authored-by: Cursor <cursoragent@cursor.com>
|
@romac @ZhiyuCircle hi please advise, would appreciate a review |
|
One clarification to the gas-cap sentence in this PR: please distinguish node-local Some other gas-cap paths may surface as |
Summary
The v0.8.0
[Format]entry describing the insufficient-balance JSON-RPC error-text change (in bothBREAKING_CHANGES.mdandCHANGELOG.md) doesn't match the behavior observable on Arc Testnet post-upgrade on two points, and omits a string collision that tooling authors need to know about. Since the entry's explicit audience is "tooling that matches JSON-RPC error text", the details matter — a matcher updated to follow the current wording breaks on the most common request shape.All claims below were verified against
rpc.testnet.arc.network(post-v0.8.0) on 2026-08-29, and each one is also consistent with this repo's own localdev test expectations.1. The previous
insufficient funds…text is still live — on the most common request shapeThe entry says value-exceeds-balance errors "now reflect revm 38's
OutOfFundsvariant". Measured:eth_estimateGas/eth_call, value > balance)gasPriceormaxFeePerGaspresent-32003insufficient funds for gas * price + value: have 0 want 1000000000000000000-32003EVM error: OutOfFundsethers and viem populate fee fields automatically, so most real traffic still gets the previous text. A tooling author who follows the current entry and replaces their
insufficient fundspattern withOutOfFundsbreaks. The localdev suite already expects both:tests/localdev/evm_compatibility.test.tsasserts/OutOfFunds|insufficient funds/on this path.2.
gas required exceeds allowancefires on contract/precompile targets — plain EOA-to-EOA transfers never surface itThe entry attributes the new
gas required exceeds allowancetext to "simple (EOA-to-EOA) transfer with insufficient balance". Measured, with fee fields present:0x5208)insufficient funds for gas * price + value…-32000gas required exceeds allowance (0)This is exactly what the
disable_fee_chargemechanism the entry describes implies: the basic-transfer shortcut bypasses the caller gas-allowance cap, so EOA-to-EOA estimation now succeeds regardless of gas affordability — the allowance error is reachable only on non-shortcut (contract/precompile) targets. The localdev test agrees: thebalance check if gas price is providedcase deliberately targets a contract "to skip Reth's basic-transfer shortcut" before expecting/insufficient funds for transfer|gas required exceeds allowance/.3. The allowance string is shared with
--rpc.gascapclampinggas required exceeds allowance (<limit>)is the same string emitted when estimation is clamped by--rpc.gascap— only the parenthesized bound distinguishes a balance-derived allowance from the configured cap. Worth one line here since this is the entry tooling authors will read when their matchers break; it also covers part of the "document how a developer can recognize the RPC-cap error specifically" request in #271.Changes
BREAKING_CHANGES.md: rewrote the three sub-bullets of the v0.8.0[Format]entry to state the request-shape-dependent text matrix, the correct target class for the allowance error, and the--rpc.gascapstring collision.CHANGELOG.md: mirrored the same corrections in the corresponding one-paragraph bullet.No taxonomy changes (that discussion belongs to #270) and no new files — this only makes the existing entry match observable behavior.
Context
Surfaced while working through the error-classification discussion in #203, where a downstream SDK consumer's matcher broke on exactly this upgrade. Related: #270 (application-facing breaking-change taxonomy), #271 (RPC gas cap vs protocol limits distinction).
Happy to adjust wording if maintainers prefer to keep the mechanism explanation (
disable_fee_charge) out of the operator-facing doc.