Part of #402 — follow-up to the app-wiring PR.
Scope
Register the proposal-preparations (setFeeRecipient) scheduler slot subscriber: on startup and on each epoch's first slot, submit ProposalPreparation{validator_index, fee_recipient} for every active cluster validator to the beacon node. Charon registers this as the first slot subscriber (app/app.go:475-478; implementation at app.go:1145-1193) — keep that registration order.
This is financial correctness on proposals: without it the node's beacon node never learns the fee recipients, so any block the cluster adopts from this node's BN pays execution rewards to the BN's default address. Charon peers only prepare their own BNs, so they cannot cover for a Pluto node in a mixed cluster.
Also surface fee-recipient hex-parse errors while implementing this: build_validators (crates/app/src/node/mod.rs) currently maps malformed/missing lock addresses to the zero address via unwrap_or_default, whereas Charon surfaces a decode error at proposal-preparation time — this issue is the natural place to align that.
Dependencies
Acceptance
- First
subscribe_slot subscriber; on_startup || first_in_epoch gate; no-op on zero active validators (Charon parity).
- Malformed fee-recipient addresses produce an error, not a silent
0x0.
- Wiring test against beaconmock asserting the POST content on startup and on an epoch boundary.
Part of #402 — follow-up to the app-wiring PR.
Scope
Register the proposal-preparations (
setFeeRecipient) scheduler slot subscriber: on startup and on each epoch's first slot, submitProposalPreparation{validator_index, fee_recipient}for every active cluster validator to the beacon node. Charon registers this as the first slot subscriber (app/app.go:475-478; implementation atapp.go:1145-1193) — keep that registration order.This is financial correctness on proposals: without it the node's beacon node never learns the fee recipients, so any block the cluster adopts from this node's BN pays execution rewards to the BN's default address. Charon peers only prepare their own BNs, so they cannot cover for a Pluto node in a mixed cluster.
Also surface fee-recipient hex-parse errors while implementing this:
build_validators(crates/app/src/node/mod.rs) currently maps malformed/missing lock addresses to the zero address viaunwrap_or_default, whereas Charon surfaces a decode error at proposal-preparation time — this issue is the natural place to align that.Dependencies
submit_proposal_preparationsclient method.Acceptance
subscribe_slotsubscriber;on_startup || first_in_epochgate; no-op on zero active validators (Charon parity).0x0.