Skip to content

Bradbury: APPEAL_REVEALING remains at 10/11 reveals past validUntil; recovery unclear #426

Description

@Zhekinmaksim

A public Bradbury transaction remains in stored APPEAL_REVEALING with 10 of 11 votes revealed after validUntil. It has no matching application entry, and I have not found a supported public recovery that settles it.

Environment and current evidence

  • RPC: https://rpc-bradbury.genlayer.com; chain ID 4221.
  • CLI 0.39.1, bundled genlayer-js 1.1.8; Node 20.20.2.
  • Consensus main: 0x0112Bf6e83497965A5fdD6Dad1E447a6E004271D; observed implementation 0x0a2c393975da79505ed930efc55ae4aeb88b0d62, VERSION 2.0.0.
  • Contract: 0xb8BAd484689a32357Caa6E0F427D31B29347fdB4.
  • Transaction: 0xbfbeb7d712d834a94b8f00ccba3ae98f06466db39dee7ad9fcd3f8902e45b8c0.
  • Read-only confirmation on 7 October 2026 at block 23734515, hash 0xc98d85ad906b2ccc4eb9b39e8d4bedd2239debad7d08e17e3f90a1c7b074623c.
  • Block timestamp 1791395584, validUntil 1791394876: 708 seconds past the transaction's validity timestamp.
  • Stored status 9, APPEAL_REVEALING; last stored round array index 3; 11 commits, 10 reveals; votes [1,0,3,3,1,1,1,1,1,1,3].
  • Five initial validators, initial rotations 0. Zero leader replacements did not prevent automatic appeal expansion.
  • entry_count() is 1: the preceding Barclays entry is ADMITTED; the HSBC transaction above has not produced its entry.

These observations come from getTransactionAllData pinned to the block above. They are independent of any frontend status display. Expiry is reported as evidence; I am asking what terminal/recovery behavior the protocol intends after it.

Reproduce by reading the existing transaction

Save as repro.mjs in a Node project with genlayer-js@1.1.8 and viem, then run node repro.mjs. This requires no account or signing key.

import { createClient } from "genlayer-js";
import { testnetBradbury } from "genlayer-js/chains";
import { createPublicClient, http } from "viem";

const rpc = "https://rpc-bradbury.genlayer.com";
const hash = "0xbfbeb7d712d834a94b8f00ccba3ae98f06466db39dee7ad9fcd3f8902e45b8c0";
const sdk = createClient({ chain: testnetBradbury, endpoint: rpc });
const evm = createPublicClient({
  chain: testnetBradbury, transport: http(rpc),
});
const block = await evm.getBlock();
const spec = testnetBradbury.consensusDataContract;
const [stored, rounds] = await evm.readContract({
  address: spec.address, abi: spec.abi,
  functionName: "getTransactionAllData",
  args: [hash], blockNumber: block.number,
});
const projected = await sdk.getTransaction({ hash });
console.log(JSON.stringify({
  block: block.number, timestamp: block.timestamp,
  storedStatus: stored.status,
  validUntil: stored.validUntil,
  initialRotations: stored.initialRotations,
  storedInitialValidators: stored.numOfInitialValidators,
  sdkInitialValidators: projected.numOfInitialValidators,
  lastRound: rounds.at(-1),
}, (_, value) => typeof value === "bigint" ? value.toString() : value, 2));

The live state can advance after this capture. The recorded status, block and timestamp above identify the observed failure.

Recovery and contract execution evidence

A sender-authorized processIdleness(tx) call succeeded in EVM:
0x85a9257b3a11f1a749b0256d8f885d38e057768cedf41f592e443556eaa11dd6.
Immediately afterward, stored status was still APPEAL_COMMITTING. It later reached APPEAL_REVEALING; I cannot attribute that later transition to this call. A later read-only processIdleness simulation in APPEAL_REVEALING reverted with a generic execution reverted, without a revert-data reason.

The leader's stored equivalence outputs contain the real registry page and typed support decisions true/true, plus no-conflict -1. The initial-round debug trace returned successfully. Trace metrics may be replayed/cached, so they do not establish original provider latency or which validator operation timed out.

A separate earlier deployment also remains at 10/11 appeal reveals:
0xc877675db83e49a59543280648b7bd7ac3739762bf00d920ee24baaaac4366b0.
On another earlier deployment, an expanded 23-validator committee remained COMMITTING and idleness simulation returned ValidatorSelectionFailed; those are separate observations, not proof of a shared root cause.

Expected / requested behavior

Please identify the supported public operation that can settle or recover this transaction when a validator does not reveal. If remaining nonterminal after validUntil is intended, please document the applicable recovery/finality rules.

The stalled transaction blocks the project's sequential live campaign. I have not resubmitted it or counted absent application state as a contract refusal.

Evidence and related reports

I filed this public-testnet symptom here alongside other Bradbury CLI reports; please transfer it if the network/consensus team tracks recovery elsewhere.

Activity

  1. Zhekinmaksim commented on Oct 9, 2026

    @Zhekinmaksim
    Author

    A newer, separately scoped Bradbury case now provides a concrete read-only recovery error. This does not establish that the older HSBC case in the original report has the same cause.

    • Consensus VERSION remains 2.0.0, with the verified implementation unchanged. This app uses five initial validators and three rotations.
    • Current Hearsay deployment: 0x2a5c1aA4Ae9e2292B737FE574aF44A2d8a5bB3F7.
    • The owned Vodafone transaction remains stored APPEAL_REVEALING, with 11 commitments and 10 reveals. It is both Accepted and finalization head, slot 10.
    • Pinned block 23922963, timestamp 1791527153 (9 October 2026 06:25:53 UTC): both public ConsensusMain.finalizeTransaction and ConsensusMain.processIdleness reverted in nonpersistent eth_call with InsufficientActiveValidators(34,33), selector 0xb5e5b936. The error was decoded from the verified declaration. No recovery transaction was broadcast.
    • A subsequent frontend-created space is Accepted / Majority agree / Finished with return and exists in app state, but is slot 37, not the finalization head.
    • Verified FinalizationPhase requires both the elapsed acceptance window and the finalization-head condition. The newer creation's 1800-second acceptance floor is 06:35:41 UTC; waiting for that timestamp alone cannot advance it past the older head. Its validUntil is not automatic finalization.

    Could you confirm the supported recovery path for this owned appeal when validator selection requires 34 active validators but 33 are available? We are preserving all outcomes and avoiding repeated paid calls that cannot establish queue progress.

    The original issue remains open with no maintainer response. Public app source and the dated checkpoint are at https://github.com/Zhekinmaksim/hearsay. The exact read-only ABI, pinned receipt and simulations are preserved locally; no signing key or serialized signed transaction is part of this report.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions