You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PR #3753 closes the validation-failure receipt divergence between the v2 and giga executors (CON-368) by routing those failures through the v2 fallback. The xreview of that PR identified the remaining parity exposures that should gate the mixed-fleet giga rollout — none blocked the PR, all are load-bearing before giga becomes the default on a fleet with v2 validators running LastResultsHash validation.
Gates, in priority order
Executed-tx receipt-gas parity has no fallback backstop (MEDIUM). Txs that pass validation and execute (success, revert, out-of-gas, EIP-7623 floor) get giga-stamped receipts (GasUsed = execResult.UsedGas); parity with v2 rests entirely on giga's gas accounting matching, with no safety net. giga/tests/data/skip_list.json already catalogs 60 result_code and 33 gas_mismatch divergences in the state-test corpus — on a mixed fleet, each is a CON-368-shaped halt candidate if the tx shape lands in a block. Gate: parity-fuzz over executed txs (burn down the skip list), not just validation failures.
v2 BasicDecorator checks giga does not pre-validate. Intrinsic-gas floor (etx.Gas() < intrinsicGas), MaxInitCodeSize, and block MaxGas are rejected fee-free in v2's ante but neither checked by validateGigaEVMTx nor routed to fallback — a gas-below-intrinsic tx would execute (and charge a fee) under giga while v2 rejects it: a latent LastResultsHash/AppHash fork sibling to CON-368. Either add these checks to validateGigaEVMTx (falling back like the others) or document why unreachable.
app_giga_fallback_to_v2 rate alert. The counter now carries a reason label (PR fix(giga): route EVM validation failures to v2 fallback (CON-368) #3753); add a dashboard alert — sustained fallback ≈ block rate means either someone forcing degradation (drain-pairs / fresh unassociated addresses) or a new divergence class leaking into the fallback path. Doubles as the canary for gate 1.
Normalize nil-slice serialization surfaces.generateDefaultWhitelistedCwCodeHashesForDelegateCall returns [][]byte(nil), which JSON-marshals as null where a seeded empty slice marshals as [] — a 2-byte param-store difference is enough to skew ante store-gas and fork receipts if the two write paths ever run on different nodes. Return [][]byte{} (state-serialization surface; needs its own review).
(Minor) The tx-ordering ineligibility fallback (delegatedToV2, block not "all EVM then all Cosmos") re-routes to v2 without incrementing the fallback metric — outside the abort family, worth a label for complete fallback observability.
Problem
PR #3753 closes the validation-failure receipt divergence between the v2 and giga executors (CON-368) by routing those failures through the v2 fallback. The xreview of that PR identified the remaining parity exposures that should gate the mixed-fleet giga rollout — none blocked the PR, all are load-bearing before giga becomes the default on a fleet with v2 validators running LastResultsHash validation.
Gates, in priority order
GasUsed = execResult.UsedGas); parity with v2 rests entirely on giga's gas accounting matching, with no safety net.giga/tests/data/skip_list.jsonalready catalogs 60result_codeand 33gas_mismatchdivergences in the state-test corpus — on a mixed fleet, each is a CON-368-shaped halt candidate if the tx shape lands in a block. Gate: parity-fuzz over executed txs (burn down the skip list), not just validation failures.BasicDecoratorchecks giga does not pre-validate. Intrinsic-gas floor (etx.Gas() < intrinsicGas),MaxInitCodeSize, and blockMaxGasare rejected fee-free in v2's ante but neither checked byvalidateGigaEVMTxnor routed to fallback — a gas-below-intrinsic tx would execute (and charge a fee) under giga while v2 rejects it: a latent LastResultsHash/AppHash fork sibling to CON-368. Either add these checks tovalidateGigaEVMTx(falling back like the others) or document why unreachable.app_giga_fallback_to_v2rate alert. The counter now carries areasonlabel (PR fix(giga): route EVM validation failures to v2 fallback (CON-368) #3753); add a dashboard alert — sustained fallback ≈ block rate means either someone forcing degradation (drain-pairs / fresh unassociated addresses) or a new divergence class leaking into the fallback path. Doubles as the canary for gate 1.generateDefaultWhitelistedCwCodeHashesForDelegateCallreturns[][]byte(nil), which JSON-marshals asnullwhere a seeded empty slice marshals as[]— a 2-byte param-store difference is enough to skew ante store-gas and fork receipts if the two write paths ever run on different nodes. Return[][]byte{}(state-serialization surface; needs its own review).delegatedToV2, block not "all EVM then all Cosmos") re-routes to v2 without incrementing the fallback metric — outside the abort family, worth a label for complete fallback observability.Context