Repository navigation
Conversation
ORACLE_SIGNING_KEY and ORACLE_INDEX now accept comma separated lists, paired by position, so a single instance can vote on the SubgraphAvailabilityManager with several registered oracle addresses. A single key and index behave as before. - Static config errors (unparsable keys or indexes, count mismatch, duplicates, invalid contract mode) fail at startup before any transaction - Each signer posts its own config to DataEdge; a failing signer is logged and doesn't stop the others - Signers vote concurrently; a run fails only if every signer fails - A voteMany revert during gas estimation is reported as an error instead of being counted as success - Signers share one RPC provider and their logs carry oracle_index - New signer_votes_total and signer_vote_failures_total metrics labeled by oracle_index; denied_subgraphs_total still counts each change once - RewardsManager mode rejects more than one signing key
Maikol
force-pushed
the
feat/multiple-signers
branch
from
October 6, 2026 13:12
3d74ec4 to
15cb7a6
Compare
Maikol
requested review from
MoonBoi9001 and
tmigone
and
a balanced review from Copilot
October 12, 2026 13:25
There was a problem hiding this comment.
🟡 Changes recommended
DataEdge failures do not abort startup, and partial signer failures are not propagated as described.
2 open findings
What changed in this PR
Adds multi-signer voting support for SubgraphAvailabilityManager instances.
Changes:
- Parses and validates paired signer keys and oracle indexes.
- Adds concurrent multi-signer voting with per-signer metrics.
- Posts signer-specific DataEdge configurations and bumps the version.
| File | Description |
|---|---|
README.md |
Documents multi-signer configuration and behavior. |
crates/common/src/prelude.rs |
Exports structured logging support. |
Cargo.lock |
Records version 1.6.0. |
availability-oracle/src/main.rs |
Configures signers and DataEdge startup posting. |
availability-oracle/src/data_edge.rs |
Reuses shared providers for signer-specific posts. |
availability-oracle/src/contract.rs |
Implements concurrent multi-signer voting and metrics. |
availability-oracle/Cargo.toml |
Bumps the package version. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
Allows a single oracle instance to vote on the
SubgraphAvailabilityManagerwith multiple signers, each registered at its own oracle index.ORACLE_SIGNING_KEY/--signing-keyandORACLE_INDEX/--oracle-indexaccept comma separated lists, paired by position. Spaces around commas are ignored. Existing single key / single index configs work unchanged.MultiStateManagersubmits the same votes through every signer, concurrently.--dry-runvalidates them when keys are given.RewardsManagermode rejects more than one signing key.oracle_indexand don't stop the other signers. A run fails only if every signer fails. A vote that didn't land is retried on the next run anyway, since each run compares deployments against their on-chain deny status.signer_votes_total{oracle_index}andsigner_vote_failures_total{oracle_index}.denied_subgraphs_totalcounts each change once, regardless of the number of signers.Testing
MultiStateManager(all signers called, partial failure is ok, all signers failing reports every cause, signers vote concurrently).0,3:0x69eb1769dc8f71bf0a0f0b5b829d0ef06a70f721625af1c881ca667c4cf4d00e), both indexes voted on two deployments with unavailable files, and together with index 2 reached the execution threshold, flippingisDeniedon the RewardsManager. Ran 55 passes with no errors.🤖 Generated with Claude Code