diff --git a/rocketpool/node/node.go b/rocketpool/node/node.go index 3670d6163..7f35cb81d 100644 --- a/rocketpool/node/node.go +++ b/rocketpool/node/node.go @@ -145,8 +145,18 @@ func run(c *cli.Command) error { errorLog := log.NewColorLogger(ErrorColor) updateLog := log.NewColorLogger(UpdateColor) - // Create the state manager - m := state.NewNetworkStateManager(rp, cfg.Smartnode.GetStateManagerContracts(), bc, &updateLog) + // Create the state provider. In live mode this is a NetworkStateManager + // backed by the real EC/BC; in --network-state mode it is a + // StaticNetworkStateProvider that serves from the pre-loaded snapshot. + var m state.NetworkStateProvider + if services.IsStaticStateMode(c) { + m, err = services.GetNetworkStateProvider(c) + if err != nil { + return fmt.Errorf("error getting network state provider: %w", err) + } + } else { + m = state.NewNetworkStateManager(rp, cfg.Smartnode.GetStateManagerContracts(), bc, &updateLog) + } stateLocker := collectors.NewStateLocker() // Initialize tasks @@ -497,7 +507,7 @@ func removeLegacyFeeRecipientFiles(c *cli.Command) error { } // Update the latest network state at each cycle -func updateNetworkState(m *state.NetworkStateManager, log *log.ColorLogger, nodeAddress common.Address) (*state.NetworkState, error) { +func updateNetworkState(m state.NetworkStateProvider, log *log.ColorLogger, nodeAddress common.Address) (*state.NetworkState, error) { // Get the state of the network state, err := m.GetHeadStateForNode(nodeAddress) if err != nil { diff --git a/rocketpool/node/verify-pdao-props-state_test.go b/rocketpool/node/verify-pdao-props-state_test.go new file mode 100644 index 000000000..432fe803d --- /dev/null +++ b/rocketpool/node/verify-pdao-props-state_test.go @@ -0,0 +1,449 @@ +package node + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/smartnode/bindings/dao/protocol" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/shared/services/beacon" + "github.com/rocket-pool/smartnode/shared/services/proposals" + "github.com/rocket-pool/smartnode/shared/services/state" + "github.com/rocket-pool/smartnode/shared/utils/log" +) + +const stateFixture = "../../shared/services/state/testdata/small_state.json" + +// --- stubs --------------------------------------------------------------- + +// stubBeaconClient satisfies beacon.Client; only GetBeaconBlock is called by +// the challenge flow, so the rest panic if invoked. +type stubBeaconClient struct { + beacon.Client // embedded nil – will panic on any un-overridden method + block beacon.BeaconBlock +} + +func (s *stubBeaconClient) GetBeaconBlock(_ string) (beacon.BeaconBlock, bool, error) { + return s.block, true, nil +} + +// stubNodeGetter returns a fixed on-chain root for every proposal. +type stubNodeGetter struct { + root types.VotingTreeNode +} + +func (s *stubNodeGetter) GetNode(_ uint64, _ uint64) (types.VotingTreeNode, error) { + return s.root, nil +} + +// stubTreeProvider returns a fixed local tree for every target block. +type stubTreeProvider struct { + tree *proposals.NetworkVotingTree +} + +func (s *stubTreeProvider) GetNetworkTree(_ uint32) (*proposals.NetworkVotingTree, error) { + return s.tree, nil +} + +// stubChallengeStateGetter returns a preconfigured state per (proposal, index). +type stubChallengeStateGetter struct { + states map[[2]uint64]types.ChallengeState +} + +func (s *stubChallengeStateGetter) GetChallengeState(proposalID uint64, index uint64) (types.ChallengeState, error) { + key := [2]uint64{proposalID, index} + if cs, ok := s.states[key]; ok { + return cs, nil + } + return types.ChallengeState_Unchallenged, nil +} + +// stubEventProvider returns pre-configured RootSubmitted events. +type stubEventProvider struct { + events []protocol.RootSubmitted +} + +func (s *stubEventProvider) GetRootSubmittedEvents(_ []uint64, _, _ *big.Int) ([]protocol.RootSubmitted, error) { + return s.events, nil +} + +// stubArtifactChecker simulates finding a challengeable child index. +type stubArtifactChecker struct { + childIndex uint64 + challengedNode types.VotingTreeNode + proof []types.VotingTreeNode +} + +func (s *stubArtifactChecker) CheckForChallengeableArtifacts(_ protocol.RootSubmitted) (uint64, types.VotingTreeNode, []types.VotingTreeNode, error) { + return s.childIndex, s.challengedNode, s.proof, nil +} + +// --- helpers ------------------------------------------------------------- + +func makeLocalRoot() types.VotingTreeNode { + return types.VotingTreeNode{ + Sum: big.NewInt(1000), + Hash: common.HexToHash("0xaaaa"), + } +} + +func makeMismatchedOnChainRoot() types.VotingTreeNode { + return types.VotingTreeNode{ + Sum: big.NewInt(9999), + Hash: common.HexToHash("0xbbbb"), + } +} + +// --- tests --------------------------------------------------------------- + +// TestChallengePathNoEligible verifies that when our node address matches the +// proposer of the only pending proposal, no challenges are produced. +func TestChallengePathNoEligible(t *testing.T) { + provider, err := state.NewStaticNetworkStateProviderFromFile(stateFixture) + if err != nil { + t.Fatalf("loading state: %v", err) + } + ns, _ := provider.GetHeadState() + + // Find the pending proposal's proposer and use it as our node address + var proposerAddr common.Address + for _, p := range ns.ProtocolDaoProposalDetails { + if p.State == types.ProtocolDaoProposalState_Pending && p.ID != 0 { + proposerAddr = p.ProposerAddress + break + } + } + + logger := log.NewColorLogger(0) + challenges, defeats, err := getChallengesFromState( + ns, proposerAddr, &logger, + &stubBeaconClient{block: beacon.BeaconBlock{ExecutionBlockNumber: ns.ElBlockNumber}}, + &stubNodeGetter{root: makeLocalRoot()}, + &stubTreeProvider{}, + &stubChallengeStateGetter{}, + &stubEventProvider{}, + &stubArtifactChecker{}, + map[uint64]bool{}, + map[uint64]map[uint64]*protocol.RootSubmitted{}, + nil, + ) + if err != nil { + t.Fatalf("getChallengesFromState: %v", err) + } + if len(challenges) != 0 { + t.Errorf("expected 0 challenges when node is the proposer, got %d", len(challenges)) + } + if len(defeats) != 0 { + t.Errorf("expected 0 defeats when node is the proposer, got %d", len(defeats)) + } +} + +// TestChallengePathMatchingRoot verifies that a pending proposal whose +// on-chain root matches the local tree produces no challenges. +func TestChallengePathMatchingRoot(t *testing.T) { + provider, err := state.NewStaticNetworkStateProviderFromFile(stateFixture) + if err != nil { + t.Fatalf("loading state: %v", err) + } + ns, _ := provider.GetHeadState() + + localRoot := makeLocalRoot() + localTree := &proposals.NetworkVotingTree{ + VotingTree: &proposals.VotingTree{ + Nodes: []*types.VotingTreeNode{&localRoot}, + }, + } + + nodeAddr := common.HexToAddress("0x1111111111111111111111111111111111111111") + logger := log.NewColorLogger(0) + validCache := map[uint64]bool{} + + challenges, defeats, err := getChallengesFromState( + ns, nodeAddr, &logger, + &stubBeaconClient{block: beacon.BeaconBlock{ExecutionBlockNumber: ns.ElBlockNumber}}, + &stubNodeGetter{root: localRoot}, + &stubTreeProvider{tree: localTree}, + &stubChallengeStateGetter{}, + &stubEventProvider{}, + &stubArtifactChecker{}, + validCache, + map[uint64]map[uint64]*protocol.RootSubmitted{}, + nil, + ) + if err != nil { + t.Fatalf("getChallengesFromState: %v", err) + } + if len(challenges) != 0 { + t.Errorf("expected 0 challenges for matching root, got %d", len(challenges)) + } + if len(defeats) != 0 { + t.Errorf("expected 0 defeats for matching root, got %d", len(defeats)) + } + + // Matching proposal should be cached as valid + for _, p := range ns.ProtocolDaoProposalDetails { + if p.State == types.ProtocolDaoProposalState_Pending && p.ID != 0 { + if !validCache[p.ID] { + t.Errorf("proposal %d should have been cached as valid", p.ID) + } + } + } +} + +// TestChallengePathMismatchProducesChallenge verifies that a root mismatch +// causes the flow to produce a challenge against the identified child index. +func TestChallengePathMismatchProducesChallenge(t *testing.T) { + provider, err := state.NewStaticNetworkStateProviderFromFile(stateFixture) + if err != nil { + t.Fatalf("loading state: %v", err) + } + ns, _ := provider.GetHeadState() + + // Find the pending proposal + var pendingProp protocol.ProtocolDaoProposalDetails + for _, p := range ns.ProtocolDaoProposalDetails { + if p.State == types.ProtocolDaoProposalState_Pending && p.ID != 0 { + pendingProp = p + break + } + } + + // Local root differs from on-chain root + localRoot := makeLocalRoot() + localTree := &proposals.NetworkVotingTree{ + VotingTree: &proposals.VotingTree{ + Nodes: []*types.VotingTreeNode{&localRoot}, + }, + } + + // Simulate a RootSubmitted event at index 1 (root) for this proposal + rootEvent := protocol.RootSubmitted{ + ProposalID: big.NewInt(int64(pendingProp.ID)), + Proposer: pendingProp.ProposerAddress, + BlockNumber: pendingProp.TargetBlock, + Index: big.NewInt(1), + Root: makeMismatchedOnChainRoot(), + } + + challengedChildNode := types.VotingTreeNode{ + Sum: big.NewInt(500), + Hash: common.HexToHash("0xcccc"), + } + proofNodes := []types.VotingTreeNode{ + {Sum: big.NewInt(500), Hash: common.HexToHash("0xdddd")}, + } + + nodeAddr := common.HexToAddress("0x1111111111111111111111111111111111111111") + logger := log.NewColorLogger(0) + + challenges, defeats, err := getChallengesFromState( + ns, nodeAddr, &logger, + &stubBeaconClient{block: beacon.BeaconBlock{ExecutionBlockNumber: ns.ElBlockNumber}}, + &stubNodeGetter{root: makeMismatchedOnChainRoot()}, + &stubTreeProvider{tree: localTree}, + &stubChallengeStateGetter{}, + &stubEventProvider{events: []protocol.RootSubmitted{rootEvent}}, + &stubArtifactChecker{childIndex: 2, challengedNode: challengedChildNode, proof: proofNodes}, + map[uint64]bool{}, + map[uint64]map[uint64]*protocol.RootSubmitted{}, + nil, + ) + if err != nil { + t.Fatalf("getChallengesFromState: %v", err) + } + if len(challenges) != 1 { + t.Fatalf("expected 1 challenge, got %d", len(challenges)) + } + if challenges[0].proposalID != pendingProp.ID { + t.Errorf("challenge proposalID: got %d, want %d", challenges[0].proposalID, pendingProp.ID) + } + if challenges[0].challengedIndex != 2 { + t.Errorf("challenge index: got %d, want 2", challenges[0].challengedIndex) + } + if challenges[0].challengedNode.Hash != challengedChildNode.Hash { + t.Errorf("challenge node hash mismatch") + } + if len(challenges[0].witness) != 1 { + t.Errorf("challenge proof length: got %d, want 1", len(challenges[0].witness)) + } + if len(defeats) != 0 { + t.Errorf("expected 0 defeats, got %d", len(defeats)) + } + t.Logf("Challenge produced for proposal %d at index %d", challenges[0].proposalID, challenges[0].challengedIndex) +} + +// TestChallengePathAlreadyChallengedWaits verifies that when the target index +// is already in Challenged state but the challenge window has NOT expired +// (relative to the state's slot time), the flow returns nothing — we wait +// for the proposer to respond. +func TestChallengePathAlreadyChallengedWaits(t *testing.T) { + provider, err := state.NewStaticNetworkStateProviderFromFile(stateFixture) + if err != nil { + t.Fatalf("loading state: %v", err) + } + ns, _ := provider.GetHeadState() + + var pendingProp protocol.ProtocolDaoProposalDetails + for _, p := range ns.ProtocolDaoProposalDetails { + if p.State == types.ProtocolDaoProposalState_Pending && p.ID != 0 { + pendingProp = p + break + } + } + + localRoot := makeLocalRoot() + localTree := &proposals.NetworkVotingTree{ + VotingTree: &proposals.VotingTree{ + Nodes: []*types.VotingTreeNode{&localRoot}, + }, + } + + rootEvent := protocol.RootSubmitted{ + ProposalID: big.NewInt(int64(pendingProp.ID)), + Proposer: pendingProp.ProposerAddress, + BlockNumber: pendingProp.TargetBlock, + Index: big.NewInt(1), + Root: makeMismatchedOnChainRoot(), + } + + // Index 2 has already been challenged + csGetter := &stubChallengeStateGetter{ + states: map[[2]uint64]types.ChallengeState{ + {pendingProp.ID, 2}: types.ChallengeState_Challenged, + }, + } + + nodeAddr := common.HexToAddress("0x1111111111111111111111111111111111111111") + logger := log.NewColorLogger(0) + + challenges, defeats, err := getChallengesFromState( + ns, nodeAddr, &logger, + &stubBeaconClient{block: beacon.BeaconBlock{ExecutionBlockNumber: ns.ElBlockNumber}}, + &stubNodeGetter{root: makeMismatchedOnChainRoot()}, + &stubTreeProvider{tree: localTree}, + csGetter, + &stubEventProvider{events: []protocol.RootSubmitted{rootEvent}}, + &stubArtifactChecker{childIndex: 2, challengedNode: types.VotingTreeNode{Sum: big.NewInt(500), Hash: common.HexToHash("0xcccc")}}, + map[uint64]bool{}, + map[uint64]map[uint64]*protocol.RootSubmitted{}, + nil, + ) + if err != nil { + t.Fatalf("getChallengesFromState: %v", err) + } + if len(challenges) != 0 { + t.Errorf("expected 0 challenges (waiting for response), got %d", len(challenges)) + } + if len(defeats) != 0 { + t.Errorf("expected 0 defeats (still within challenge window), got %d", len(defeats)) + } +} + +// TestChallengePathRespondedDelveDeeper verifies that when a challenged index +// has been responded to, the flow continues deeper into the tree. +func TestChallengePathRespondedDelveDeeper(t *testing.T) { + provider, err := state.NewStaticNetworkStateProviderFromFile(stateFixture) + if err != nil { + t.Fatalf("loading state: %v", err) + } + ns, _ := provider.GetHeadState() + + var pendingProp protocol.ProtocolDaoProposalDetails + for _, p := range ns.ProtocolDaoProposalDetails { + if p.State == types.ProtocolDaoProposalState_Pending && p.ID != 0 { + pendingProp = p + break + } + } + + localRoot := makeLocalRoot() + localTree := &proposals.NetworkVotingTree{ + VotingTree: &proposals.VotingTree{ + Nodes: []*types.VotingTreeNode{&localRoot}, + }, + } + + // Events for both indices 1 (root) and 2 (child responded) + rootEvent := protocol.RootSubmitted{ + ProposalID: big.NewInt(int64(pendingProp.ID)), + Proposer: pendingProp.ProposerAddress, + Index: big.NewInt(1), + Root: makeMismatchedOnChainRoot(), + } + childEvent := protocol.RootSubmitted{ + ProposalID: big.NewInt(int64(pendingProp.ID)), + Proposer: pendingProp.ProposerAddress, + Index: big.NewInt(2), + Root: types.VotingTreeNode{Sum: big.NewInt(500), Hash: common.HexToHash("0xcccc")}, + } + + // Index 2 has been responded to, so the flow should continue to index 4 + csGetter := &stubChallengeStateGetter{ + states: map[[2]uint64]types.ChallengeState{ + {pendingProp.ID, 2}: types.ChallengeState_Responded, + }, + } + + // The artifact checker returns different results depending on call count + callCount := 0 + artifactChecker := &sequentialArtifactChecker{ + results: []artifactResult{ + {childIndex: 2, node: types.VotingTreeNode{Sum: big.NewInt(500), Hash: common.HexToHash("0xcccc")}}, + {childIndex: 4, node: types.VotingTreeNode{Sum: big.NewInt(250), Hash: common.HexToHash("0xeeee")}}, + }, + callCount: &callCount, + } + + nodeAddr := common.HexToAddress("0x1111111111111111111111111111111111111111") + logger := log.NewColorLogger(0) + + challenges, defeats, err := getChallengesFromState( + ns, nodeAddr, &logger, + &stubBeaconClient{block: beacon.BeaconBlock{ExecutionBlockNumber: ns.ElBlockNumber}}, + &stubNodeGetter{root: makeMismatchedOnChainRoot()}, + &stubTreeProvider{tree: localTree}, + csGetter, + &stubEventProvider{events: []protocol.RootSubmitted{rootEvent, childEvent}}, + artifactChecker, + map[uint64]bool{}, + map[uint64]map[uint64]*protocol.RootSubmitted{}, + nil, + ) + if err != nil { + t.Fatalf("getChallengesFromState: %v", err) + } + if len(challenges) != 1 { + t.Fatalf("expected 1 challenge at deeper level, got %d", len(challenges)) + } + if challenges[0].challengedIndex != 4 { + t.Errorf("challenge index: got %d, want 4 (deeper level)", challenges[0].challengedIndex) + } + if len(defeats) != 0 { + t.Errorf("expected 0 defeats, got %d", len(defeats)) + } + t.Logf("Challenge produced at deeper index %d after index 2 was responded to", challenges[0].challengedIndex) +} + +// sequentialArtifactChecker returns different results on successive calls, +// simulating the tree traversal going deeper on each iteration. +type sequentialArtifactChecker struct { + results []artifactResult + callCount *int +} + +type artifactResult struct { + childIndex uint64 + node types.VotingTreeNode + proof []types.VotingTreeNode +} + +func (s *sequentialArtifactChecker) CheckForChallengeableArtifacts(_ protocol.RootSubmitted) (uint64, types.VotingTreeNode, []types.VotingTreeNode, error) { + idx := *s.callCount + *s.callCount++ + if idx >= len(s.results) { + return 0, types.VotingTreeNode{}, nil, nil + } + r := s.results[idx] + return r.childIndex, r.node, r.proof, nil +} diff --git a/rocketpool/node/verify-pdao-props.go b/rocketpool/node/verify-pdao-props.go index c94d463a2..8ced9cc5a 100644 --- a/rocketpool/node/verify-pdao-props.go +++ b/rocketpool/node/verify-pdao-props.go @@ -35,6 +35,31 @@ type defeat struct { challengedIndex uint64 } +// proposalNodeGetter retrieves the on-chain voting tree node submitted with a proposal. +type proposalNodeGetter interface { + GetNode(proposalID uint64, index uint64) (types.VotingTreeNode, error) +} + +// networkTreeProvider builds or loads the local voting tree for a target block. +type networkTreeProvider interface { + GetNetworkTree(blockNumber uint32) (*proposals.NetworkVotingTree, error) +} + +// challengeStateGetter checks the on-chain challenge state for a proposal index. +type challengeStateGetter interface { + GetChallengeState(proposalID uint64, index uint64) (types.ChallengeState, error) +} + +// rootSubmissionEventProvider fetches RootSubmitted events from the chain. +type rootSubmissionEventProvider interface { + GetRootSubmittedEvents(proposalIDs []uint64, startBlock *big.Int, endBlock *big.Int) ([]protocol.RootSubmitted, error) +} + +// challengeArtifactChecker checks a RootSubmitted event for challengeable artifacts. +type challengeArtifactChecker interface { + CheckForChallengeableArtifacts(event protocol.RootSubmitted) (uint64, types.VotingTreeNode, []types.VotingTreeNode, error) +} + type verifyPdaoProps struct { c *cli.Command log *log.ColorLogger @@ -130,6 +155,56 @@ func newVerifyPdaoProps(c *cli.Command, logger log.ColorLogger) (*verifyPdaoProp }, nil } +// liveProposalNodeGetter uses on-chain calls to fetch proposal tree nodes. +type liveProposalNodeGetter struct { + rp *rocketpool.RocketPool + opts *bind.CallOpts +} + +func (g *liveProposalNodeGetter) GetNode(proposalID uint64, index uint64) (types.VotingTreeNode, error) { + return protocol.GetNode(g.rp, proposalID, index, g.opts) +} + +// liveNetworkTreeProvider delegates to the ProposalManager. +type liveNetworkTreeProvider struct { + propMgr *proposals.ProposalManager +} + +func (p *liveNetworkTreeProvider) GetNetworkTree(blockNumber uint32) (*proposals.NetworkVotingTree, error) { + return p.propMgr.GetNetworkTree(blockNumber, nil) +} + +// liveChallengeStateGetter reads challenge state from the chain. +type liveChallengeStateGetter struct { + rp *rocketpool.RocketPool + opts *bind.CallOpts +} + +func (g *liveChallengeStateGetter) GetChallengeState(proposalID uint64, index uint64) (types.ChallengeState, error) { + return protocol.GetChallengeState(g.rp, proposalID, index, g.opts) +} + +// liveRootSubmissionEventProvider fetches RootSubmitted events from the chain. +type liveRootSubmissionEventProvider struct { + rp *rocketpool.RocketPool + intervalSize *big.Int + verifierAddresses []common.Address + opts *bind.CallOpts +} + +func (p *liveRootSubmissionEventProvider) GetRootSubmittedEvents(proposalIDs []uint64, startBlock *big.Int, endBlock *big.Int) ([]protocol.RootSubmitted, error) { + return protocol.GetRootSubmittedEvents(p.rp, proposalIDs, p.intervalSize, startBlock, endBlock, p.verifierAddresses, p.opts) +} + +// liveChallengeArtifactChecker delegates to the ProposalManager. +type liveChallengeArtifactChecker struct { + propMgr *proposals.ProposalManager +} + +func (c *liveChallengeArtifactChecker) CheckForChallengeableArtifacts(event protocol.RootSubmitted) (uint64, types.VotingTreeNode, []types.VotingTreeNode, error) { + return c.propMgr.CheckForChallengeableArtifacts(event) +} + // Verify pDAO proposals func (t *verifyPdaoProps) run(state *state.NetworkState) error { // Log @@ -166,17 +241,47 @@ func (t *verifyPdaoProps) run(state *state.NetworkState) error { return nil } -func (t *verifyPdaoProps) getChallengesandDefeats(state *state.NetworkState, opts *bind.CallOpts) ([]challenge, []defeat, error) { - // Get proposals *not* made by this node that are still in the challenge phase (Pending) +func (t *verifyPdaoProps) getChallengesandDefeats(ns *state.NetworkState, opts *bind.CallOpts) ([]challenge, []defeat, error) { + nodeGetter := &liveProposalNodeGetter{rp: t.rp, opts: opts} + treeProvider := &liveNetworkTreeProvider{propMgr: t.propMgr} + stateGetter := &liveChallengeStateGetter{rp: t.rp, opts: opts} + verifierAddresses := t.cfg.Smartnode.GetPreviousRocketDAOProtocolVerifierAddresses() + eventProvider := &liveRootSubmissionEventProvider{rp: t.rp, intervalSize: t.intervalSize, verifierAddresses: verifierAddresses, opts: opts} + artifactChecker := &liveChallengeArtifactChecker{propMgr: t.propMgr} + + return getChallengesFromState( + ns, t.nodeAddress, t.log, t.bc, + nodeGetter, treeProvider, stateGetter, eventProvider, artifactChecker, + t.validPropCache, t.rootSubmissionCache, t.lastScannedBlock, + ) +} + +// getChallengesFromState computes which proposals need to be challenged or defeated. +// All chain dependencies are injected via interfaces so this can be tested with +// static network state and stub implementations. +func getChallengesFromState( + ns *state.NetworkState, + nodeAddress common.Address, + log *log.ColorLogger, + bc beacon.Client, + nodeGetter proposalNodeGetter, + treeProvider networkTreeProvider, + stateGetter challengeStateGetter, + eventProvider rootSubmissionEventProvider, + artifactChecker challengeArtifactChecker, + validPropCache map[uint64]bool, + rootSubmissionCache map[uint64]map[uint64]*protocol.RootSubmitted, + lastScannedBlock *big.Int, +) ([]challenge, []defeat, error) { eligibleProps := []protocol.ProtocolDaoProposalDetails{} - for _, prop := range state.ProtocolDaoProposalDetails { + for _, prop := range ns.ProtocolDaoProposalDetails { if prop.State == types.ProtocolDaoProposalState_Pending && - prop.ProposerAddress != t.nodeAddress { + prop.ProposerAddress != nodeAddress { eligibleProps = append(eligibleProps, prop) } else { // Remove old proposals from the caches once they're out of scope - delete(t.validPropCache, prop.ID) - delete(t.rootSubmissionCache, prop.ID) + delete(validPropCache, prop.ID) + delete(rootSubmissionCache, prop.ID) } } if len(eligibleProps) == 0 { @@ -186,33 +291,33 @@ func (t *verifyPdaoProps) getChallengesandDefeats(state *state.NetworkState, opt // Check which ones have a root hash mismatch and need to be processed further mismatchingProps := []protocol.ProtocolDaoProposalDetails{} for _, prop := range eligibleProps { - if t.validPropCache[prop.ID] { - // Ignore proposals that have already been cleared + // Ignore proposals that have already been cleared + if validPropCache[prop.ID] { continue } // Get the proposal's network tree root - propRoot, err := protocol.GetNode(t.rp, prop.ID, 1, opts) + propRoot, err := nodeGetter.GetNode(prop.ID, 1) if err != nil { return nil, nil, fmt.Errorf("error getting root node for proposal %d: %w", prop.ID, err) } // Get the local tree - networkTree, err := t.propMgr.GetNetworkTree(prop.TargetBlock, nil) + networkTree, err := treeProvider.GetNetworkTree(prop.TargetBlock) if err != nil { return nil, nil, fmt.Errorf("error getting network tree for proposal %d: %w", prop.ID, err) } localRoot := networkTree.Nodes[0] - // Compare if propRoot.Sum.Cmp(localRoot.Sum) == 0 && propRoot.Hash == localRoot.Hash { - t.log.Printlnf("Proposal %d matches the local tree artifacts, so it does not need to be challenged.", prop.ID) - t.validPropCache[prop.ID] = true + log.Printlnf("Proposal %d matches the local tree artifacts, so it does not need to be challenged.", prop.ID) + validPropCache[prop.ID] = true continue } // This proposal has a mismatch and must be challenged - t.log.Printlnf("Proposal %d does not match the local tree artifacts and must be challenged.", prop.ID) + + log.Printlnf("Proposal %d does not match the local tree artifacts and must be challenged.", prop.ID) mismatchingProps = append(mismatchingProps, prop) } if len(mismatchingProps) == 0 { @@ -221,16 +326,15 @@ func (t *verifyPdaoProps) getChallengesandDefeats(state *state.NetworkState, opt // Get the window of blocks to scan from var startBlock *big.Int - endBlock := big.NewInt(int64(state.ElBlockNumber)) - if t.lastScannedBlock == nil { - // Get the slot number the first proposal was created on + endBlock := big.NewInt(int64(ns.ElBlockNumber)) + if lastScannedBlock == nil { startTime := mismatchingProps[0].CreatedTime - genesisTime := time.Unix(int64(state.BeaconConfig.GenesisTime), 0) - secondsPerSlot := time.Second * time.Duration(state.BeaconConfig.SecondsPerSlot) + genesisTime := time.Unix(int64(ns.BeaconConfig.GenesisTime), 0) + secondsPerSlot := time.Second * time.Duration(ns.BeaconConfig.SecondsPerSlot) startSlot := uint64(startTime.Sub(genesisTime) / secondsPerSlot) // Get the Beacon block for the slot - block, exists, err := t.bc.GetBeaconBlock(fmt.Sprint(startSlot)) + block, exists, err := bc.GetBeaconBlock(fmt.Sprint(startSlot)) if err != nil { return nil, nil, fmt.Errorf("error getting Beacon block at slot %d: %w", startSlot, err) } @@ -241,22 +345,16 @@ func (t *verifyPdaoProps) getChallengesandDefeats(state *state.NetworkState, opt // Get the EL block for this slot startBlock = big.NewInt(int64(block.ExecutionBlockNumber)) } else { - startBlock = big.NewInt(0).Add(t.lastScannedBlock, common.Big1) + startBlock = big.NewInt(0).Add(lastScannedBlock, common.Big1) } // Make containers for mismatching IDs ids := make([]uint64, len(mismatchingProps)) - propMap := map[uint64]*protocol.ProtocolDaoProposalDetails{} for i, prop := range mismatchingProps { ids[i] = prop.ID - propMap[prop.ID] = &mismatchingProps[i] } - // Get the RocketRewardsPool addresses - verifierAddresses := t.cfg.Smartnode.GetPreviousRocketDAOProtocolVerifierAddresses() - - // Get and cache all root submissions for the proposals - rootSubmissionEvents, err := protocol.GetRootSubmittedEvents(t.rp, ids, t.intervalSize, startBlock, endBlock, verifierAddresses, opts) + rootSubmissionEvents, err := eventProvider.GetRootSubmittedEvents(ids, startBlock, endBlock) if err != nil { return nil, nil, fmt.Errorf("error scanning for RootSubmitted events: %w", err) } @@ -264,19 +362,22 @@ func (t *verifyPdaoProps) getChallengesandDefeats(state *state.NetworkState, opt // Add them to the cache propID := event.ProposalID.Uint64() rootIndex := event.Index.Uint64() - eventsForProp, exists := t.rootSubmissionCache[propID] + eventsForProp, exists := rootSubmissionCache[propID] if !exists { eventsForProp = map[uint64]*protocol.RootSubmitted{} } eventsForProp[rootIndex] = &event - t.rootSubmissionCache[propID] = eventsForProp + rootSubmissionCache[propID] = eventsForProp } - // For each proposal, crawl down the tree looking at mismatched indices to challenge until arriving at one that hasn't been challenged yet + // Derive the slot time from the network state's beacon config + slotTime := time.Unix(int64(ns.BeaconConfig.GenesisTime+ns.BeaconSlotNumber*ns.BeaconConfig.SecondsPerSlot), 0) + + // For each proposal, crawl down the tree looking for unchallenged mismatches challenges := []challenge{} defeats := []defeat{} for _, prop := range mismatchingProps { - challenge, defeat, err := t.getChallengeOrDefeatForProposal(prop, opts) + challenge, defeat, err := getChallengeOrDefeatForProposal(prop, log, slotTime, stateGetter, artifactChecker, rootSubmissionCache) if err != nil { return nil, nil, err } @@ -292,22 +393,29 @@ func (t *verifyPdaoProps) getChallengesandDefeats(state *state.NetworkState, opt } // Get the challenge against a proposal if one can be found -func (t *verifyPdaoProps) getChallengeOrDefeatForProposal(prop protocol.ProtocolDaoProposalDetails, opts *bind.CallOpts) (*challenge, *defeat, error) { +func getChallengeOrDefeatForProposal( + prop protocol.ProtocolDaoProposalDetails, + log *log.ColorLogger, + slotTime time.Time, + stateGetter challengeStateGetter, + artifactChecker challengeArtifactChecker, + rootSubmissionCache map[uint64]map[uint64]*protocol.RootSubmitted, +) (*challenge, *defeat, error) { challengedIndex := uint64(1) // Root for { // Get the index of the node to challenge - rootSubmissionEvent, exists := t.rootSubmissionCache[prop.ID][challengedIndex] + rootSubmissionEvent, exists := rootSubmissionCache[prop.ID][challengedIndex] if !exists { return nil, nil, fmt.Errorf("challenge against prop %d, index %d has been responded to but the RootSubmitted event was missing", prop.ID, challengedIndex) } - newChallengedIndex, challengedNode, proof, err := t.propMgr.CheckForChallengeableArtifacts(*rootSubmissionEvent) + newChallengedIndex, challengedNode, proof, err := artifactChecker.CheckForChallengeableArtifacts(*rootSubmissionEvent) if err != nil { return nil, nil, fmt.Errorf("error checking for challengeable artifacts on prop %d, index %s: %w", prop.ID, rootSubmissionEvent.Index.String(), err) } if newChallengedIndex == 0 { // Do nothing if the prop can't be challenged - t.log.Printlnf("Check against proposal %d, index %d showed no challengeable artifacts.", prop.ID, challengedIndex) + log.Printlnf("Check against proposal %d, index %d showed no challengeable artifacts.", prop.ID, challengedIndex) return nil, nil, nil } if newChallengedIndex == challengedIndex { @@ -316,7 +424,7 @@ func (t *verifyPdaoProps) getChallengeOrDefeatForProposal(prop protocol.Protocol } // Check if the index has been challenged yet - state, err := protocol.GetChallengeState(t.rp, prop.ID, newChallengedIndex, opts) + state, err := stateGetter.GetChallengeState(prop.ID, newChallengedIndex) if err != nil { return nil, nil, fmt.Errorf("error checking challenge state for proposal %d, index %d: %w", prop.ID, challengedIndex, err) } @@ -331,14 +439,14 @@ func (t *verifyPdaoProps) getChallengeOrDefeatForProposal(prop protocol.Protocol }, nil, nil case types.ChallengeState_Challenged: // Check if the proposal can be defeated - if time.Since(prop.CreatedTime.Add(prop.ChallengeWindow)) > 0 { + if slotTime.After(prop.CreatedTime.Add(prop.ChallengeWindow)) { return nil, &defeat{ proposalID: prop.ID, challengedIndex: newChallengedIndex, }, nil } // Nothing to do but wait for the proposer to respond - t.log.Printlnf("Proposal %d, index %d has already been challenged; waiting for proposer to respond.", prop.ID, newChallengedIndex) + log.Printlnf("Proposal %d, index %d has already been challenged; waiting for proposer to respond.", prop.ID, newChallengedIndex) return nil, nil, nil case types.ChallengeState_Responded: // Delve deeper into the tree looking for the next index to challenge diff --git a/rocketpool/rocketpool.go b/rocketpool/rocketpool.go index f2edbf96c..212ca060c 100644 --- a/rocketpool/rocketpool.go +++ b/rocketpool/rocketpool.go @@ -74,6 +74,10 @@ func main() { Name: "use-protected-api", Usage: "Set this to true to use the Flashbots Protect RPC instead of your local Execution Client. Useful to ensure your transactions aren't front-run.", }, + &cli.StringFlag{ + Name: "network-state", + Usage: "Absolute path to a saved NetworkState JSON (optionally gzipped) snapshot. When set, the daemon answers requests from the snapshot instead of dialling the execution / consensus clients. Intended for offline inspection and tests.", + }, } // Register commands diff --git a/rocketpool/watchtower/generate-rewards-tree.go b/rocketpool/watchtower/generate-rewards-tree.go index b4b9c073b..9b57e71a3 100644 --- a/rocketpool/watchtower/generate-rewards-tree.go +++ b/rocketpool/watchtower/generate-rewards-tree.go @@ -158,7 +158,7 @@ func (t *generateRewardsTree) generateRewardsTree(index uint64) { return } - var stateManager *state.NetworkStateManager + var stateManager state.NetworkStateProvider // Try getting the rETH address as a canary to see if the block is available client := t.rp diff --git a/rocketpool/watchtower/submit-network-balances-state_test.go b/rocketpool/watchtower/submit-network-balances-state_test.go new file mode 100644 index 000000000..fb4bef3b9 --- /dev/null +++ b/rocketpool/watchtower/submit-network-balances-state_test.go @@ -0,0 +1,177 @@ +package watchtower + +import ( + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/smartnode/bindings/megapool" + "github.com/rocket-pool/smartnode/shared/services/config" + "github.com/rocket-pool/smartnode/shared/services/state" + "github.com/rocket-pool/smartnode/shared/utils/log" +) + +const smallStateFixture = "../../shared/services/state/testdata/network_state.json.gz" + +// stubRewardSplitCalculator returns a deterministic 50/50 split between +// rETH and node rewards, which is sufficient to verify plumbing. +type stubRewardSplitCalculator struct { + calls []rewardSplitCall +} +type rewardSplitCall struct { + MegapoolAddress common.Address + Rewards *big.Int +} + +func (s *stubRewardSplitCalculator) CalculateRewards(megapoolAddress common.Address, rewards *big.Int, _ uint64) (megapool.RewardSplit, error) { + s.calls = append(s.calls, rewardSplitCall{megapoolAddress, new(big.Int).Set(rewards)}) + half := new(big.Int).Div(rewards, big.NewInt(2)) + remainder := new(big.Int).Sub(rewards, half) + return megapool.RewardSplit{ + NodeRewards: half, + VoterRewards: big.NewInt(0), + RethRewards: remainder, + ProtocolDAORewards: big.NewInt(0), + }, nil +} + +// stubSmoothingPoolCalculator returns the full smoothing pool balance as the +// rETH share so the test value is deterministic and easy to verify. +type stubSmoothingPoolCalculator struct{} + +func (s *stubSmoothingPoolCalculator) GetSmoothingPoolShare(ns *state.NetworkState, _ *types.Header, _ time.Time) (*big.Int, error) { + return ns.NetworkDetails.SmoothingPoolBalance, nil +} + +func TestGetNetworkBalancesFromState(t *testing.T) { + provider, err := state.NewStaticNetworkStateProviderFromFile(smallStateFixture) + if err != nil { + t.Fatalf("loading state: %v", err) + } + + ns, err := provider.GetHeadState() + if err != nil { + t.Fatalf("GetHeadState: %v", err) + } + + logger := log.NewColorLogger(0) + cfg := config.NewRocketPoolConfig("", false) + rewardCalc := &stubRewardSplitCalculator{} + spCalc := &stubSmoothingPoolCalculator{} + + elBlockHeader := &types.Header{ + Number: new(big.Int).SetUint64(ns.ElBlockNumber), + } + slotTime := time.Unix(int64(ns.BeaconConfig.GenesisTime+ns.BeaconSlotNumber*ns.BeaconConfig.SecondsPerSlot), 0) + + task := &submitNetworkBalances{ + log: &logger, + cfg: cfg, + } + + balances, err := task.getNetworkBalancesFromState(ns, elBlockHeader, slotTime, rewardCalc, spCalc) + if err != nil { + t.Fatalf("getNetworkBalancesFromState: %v", err) + } + + if balances.Block != ns.ElBlockNumber { + t.Errorf("Block: got %d, want %d", balances.Block, ns.ElBlockNumber) + } + + // DepositPool must equal DepositPoolUserBalance from the state + if balances.DepositPool.Cmp(ns.NetworkDetails.DepositPoolUserBalance) != 0 { + t.Errorf("DepositPool: got %s, want %s", balances.DepositPool, ns.NetworkDetails.DepositPoolUserBalance) + } + + // RETHContract must equal RETHBalance from the state + if balances.RETHContract.Cmp(ns.NetworkDetails.RETHBalance) != 0 { + t.Errorf("RETHContract: got %s, want %s", balances.RETHContract, ns.NetworkDetails.RETHBalance) + } + + // RETHSupply must equal TotalRETHSupply from the state + if balances.RETHSupply.Cmp(ns.NetworkDetails.TotalRETHSupply) != 0 { + t.Errorf("RETHSupply: got %s, want %s", balances.RETHSupply, ns.NetworkDetails.TotalRETHSupply) + } + + // SmoothingPoolShare must equal SmoothingPoolBalance (per our stub) + if balances.SmoothingPoolShare.Cmp(ns.NetworkDetails.SmoothingPoolBalance) != 0 { + t.Errorf("SmoothingPoolShare: got %s, want %s", balances.SmoothingPoolShare, ns.NetworkDetails.SmoothingPoolBalance) + } + + // Verify minipool totals are non-negative + if balances.MinipoolsTotal.Sign() < 0 { + t.Errorf("MinipoolsTotal is negative: %s", balances.MinipoolsTotal) + } + if balances.MinipoolsStaking.Sign() < 0 { + t.Errorf("MinipoolsStaking is negative: %s", balances.MinipoolsStaking) + } + // MinipoolsStaking must not exceed MinipoolsTotal + if balances.MinipoolsStaking.Cmp(balances.MinipoolsTotal) > 0 { + t.Errorf("MinipoolsStaking (%s) > MinipoolsTotal (%s)", balances.MinipoolsStaking, balances.MinipoolsTotal) + } + + // The fixture has 10 minipools; verify the total is non-zero for staking validators + if len(ns.MinipoolDetails) > 0 && balances.MinipoolsTotal.Sign() == 0 { + t.Error("MinipoolsTotal is zero but the fixture has minipools") + } + + // NodeCreditBalance must be the sum of all nodes' DepositCreditBalance + expectedCredit := big.NewInt(0) + for _, node := range ns.NodeDetails { + expectedCredit.Add(expectedCredit, node.DepositCreditBalance) + } + if balances.NodeCreditBalance.Cmp(expectedCredit) != 0 { + t.Errorf("NodeCreditBalance: got %s, want %s", balances.NodeCreditBalance, expectedCredit) + } + + // DistributorShareTotal must be the sum of all nodes' DistributorBalanceUserETH + expectedDistributor := big.NewInt(0) + for _, node := range ns.NodeDetails { + expectedDistributor.Add(expectedDistributor, node.DistributorBalanceUserETH) + } + if balances.DistributorShareTotal.Cmp(expectedDistributor) != 0 { + t.Errorf("DistributorShareTotal: got %s, want %s", balances.DistributorShareTotal, expectedDistributor) + } + + // Verify megapool fields are non-negative + if balances.MegapoolsUserShareTotal.Sign() < 0 { + t.Errorf("MegapoolsUserShareTotal is negative: %s", balances.MegapoolsUserShareTotal) + } + if balances.MegapoolStaking.Sign() < 0 { + t.Errorf("MegapoolStaking is negative: %s", balances.MegapoolStaking) + } + + // The fixture has megapool details; verify they were loaded + if len(ns.MegapoolDetails) == 0 { + t.Fatal("MegapoolDetails is empty — fixture may not have been regenerated with the megapool_details json tag") + } + + // MegapoolsUserShareTotal should equal the sum of UserCapital for megapools + // that appear in MegapoolDetails AND have validators in MegapoolToPubkeysMap + // (the balance loop iterates MegapoolDetails, which is keyed by address). + expectedUserCapital := big.NewInt(0) + for addr, mp := range ns.MegapoolDetails { + if _, hasPubkeys := ns.MegapoolToPubkeysMap[addr]; hasPubkeys { + expectedUserCapital.Add(expectedUserCapital, mp.UserCapital) + } + } + if balances.MegapoolsUserShareTotal.Cmp(expectedUserCapital) != 0 { + t.Errorf("MegapoolsUserShareTotal: got %s, want %s (sum of UserCapital for megapools with validators)", balances.MegapoolsUserShareTotal, expectedUserCapital) + } + + t.Logf("Balances summary:") + t.Logf(" Block: %d", balances.Block) + t.Logf(" DepositPool: %s", balances.DepositPool) + t.Logf(" MinipoolsTotal: %s", balances.MinipoolsTotal) + t.Logf(" MinipoolsStaking: %s", balances.MinipoolsStaking) + t.Logf(" MegapoolsUserShareTotal: %s", balances.MegapoolsUserShareTotal) + t.Logf(" MegapoolStaking: %s", balances.MegapoolStaking) + t.Logf(" DistributorShareTotal: %s", balances.DistributorShareTotal) + t.Logf(" SmoothingPoolShare: %s", balances.SmoothingPoolShare) + t.Logf(" RETHContract: %s", balances.RETHContract) + t.Logf(" RETHSupply: %s", balances.RETHSupply) + t.Logf(" NodeCreditBalance: %s", balances.NodeCreditBalance) + t.Logf(" RewardCalc calls: %d", len(rewardCalc.calls)) +} diff --git a/rocketpool/watchtower/submit-network-balances.go b/rocketpool/watchtower/submit-network-balances.go index d661e31f0..8cfdd8c67 100644 --- a/rocketpool/watchtower/submit-network-balances.go +++ b/rocketpool/watchtower/submit-network-balances.go @@ -43,6 +43,14 @@ type storageGetter interface { GetBool(opts *bind.CallOpts, _key [32]byte) (bool, error) } +type rewardSplitCalculator interface { + CalculateRewards(megapoolAddress common.Address, rewards *big.Int, elBlockNumber uint64) (megapool.RewardSplit, error) +} + +type smoothingPoolShareCalculator interface { + GetSmoothingPoolShare(ns *state.NetworkState, elBlockHeader *types.Header, slotTime time.Time) (*big.Int, error) +} + // Submit network balances task type submitNetworkBalances struct { c *cli.Command @@ -58,6 +66,56 @@ type submitNetworkBalances struct { isRunning bool } +// liveRewardSplitCalculator calls the on-chain megapool contract. +type liveRewardSplitCalculator struct { + rp *rocketpool.RocketPool +} + +func (c *liveRewardSplitCalculator) CalculateRewards(megapoolAddress common.Address, rewards *big.Int, elBlockNumber uint64) (megapool.RewardSplit, error) { + megapoolContract, err := megapool.NewMegaPoolV1(c.rp, megapoolAddress, nil) + if err != nil { + return megapool.RewardSplit{}, fmt.Errorf("error loading megapool contract: %w", err) + } + opts := &bind.CallOpts{ + BlockNumber: new(big.Int).SetUint64(elBlockNumber), + } + return megapoolContract.CalculateRewards(rewards, opts) +} + +// liveSmoothingPoolCalculator uses the tree generator to approximate the +// rETH share of the smoothing pool. +type liveSmoothingPoolCalculator struct { + log *log.ColorLogger + cfg *config.RocketPoolConfig + bc beacon.Client + client *rocketpool.RocketPool +} + +func (c *liveSmoothingPoolCalculator) GetSmoothingPoolShare(ns *state.NetworkState, elBlockHeader *types.Header, slotTime time.Time) (*big.Int, error) { + currentIndex := ns.NetworkDetails.RewardIndex + startTime := ns.NetworkDetails.IntervalStart + intervalTime := ns.NetworkDetails.IntervalDuration + + timeSinceStart := slotTime.Sub(startTime) + intervalsPassed := timeSinceStart / intervalTime + endTime := slotTime + snapshotEnd := &rprewards.SnapshotEnd{ + Slot: ns.BeaconSlotNumber, + ConsensusBlock: ns.BeaconSlotNumber, + ExecutionBlock: ns.ElBlockNumber, + } + + treegen, err := rprewards.NewTreeGenerator(c.log, "[Balances]", rprewards.NewRewardsExecutionClient(c.client), c.cfg, c.bc, currentIndex, startTime, endTime, snapshotEnd, elBlockHeader, uint64(intervalsPassed), ns) + if err != nil { + return nil, fmt.Errorf("error creating merkle tree generator to approximate share of smoothing pool: %w", err) + } + share, err := treegen.ApproximateStakerShareOfSmoothingPool() + if err != nil { + return nil, fmt.Errorf("error getting approximate share of smoothing pool: %w", err) + } + return share, nil +} + // Network balance info type networkBalances struct { Block uint64 @@ -381,11 +439,26 @@ func (t *submitNetworkBalances) getNetworkBalances(elBlockHeader *types.Header, mgr := state.NewNetworkStateManager(client, t.cfg.Smartnode.GetStateManagerContracts(), t.bc, t.log) // Create a new state for the target block - state, err := mgr.GetStateForSlot(beaconBlock) + ns, err := mgr.GetStateForSlot(beaconBlock) if err != nil { return networkBalances{}, fmt.Errorf("couldn't get network state for EL block %s, Beacon slot %d: %w", elBlock, beaconBlock, err) } + rewardCalc := &liveRewardSplitCalculator{rp: client} + spCalc := &liveSmoothingPoolCalculator{log: t.log, cfg: t.cfg, bc: t.bc, client: client} + + return t.getNetworkBalancesFromState(ns, elBlockHeader, slotTime, rewardCalc, spCalc) +} + +// getNetworkBalancesFromState computes the network balances from an already-loaded NetworkState. +func (t *submitNetworkBalances) getNetworkBalancesFromState( + state *state.NetworkState, + elBlockHeader *types.Header, + slotTime time.Time, + rewardCalc rewardSplitCalculator, + spCalc smoothingPoolShareCalculator, +) (networkBalances, error) { + // Data var wg errgroup.Group var depositPoolBalance *big.Int @@ -413,7 +486,8 @@ func (t *submitNetworkBalances) getNetworkBalances(elBlockHeader *types.Header, megapoolBalanceDetails = make([]megapoolBalanceDetail, len(state.MegapoolDetails)) i := 0 for megapoolAddress, megapoolDetails := range state.MegapoolDetails { - megapoolBalanceDetails[i], err = t.getMegapoolBalanceDetails(megapoolAddress, state, megapoolDetails) + var err error + megapoolBalanceDetails[i], err = t.getMegapoolBalanceDetails(megapoolAddress, state, megapoolDetails, rewardCalc) if err != nil { return fmt.Errorf("error getting megapool balance details: %w", err) } @@ -434,37 +508,9 @@ func (t *submitNetworkBalances) getNetworkBalances(elBlockHeader *types.Header, // Get the smoothing pool user share wg.Go(func() error { - - // Get the current interval - currentIndex := state.NetworkDetails.RewardIndex - - // Get the start time for the current interval, and how long an interval is supposed to take - startTime := state.NetworkDetails.IntervalStart - intervalTime := state.NetworkDetails.IntervalDuration - - timeSinceStart := slotTime.Sub(startTime) - intervalsPassed := timeSinceStart / intervalTime - endTime := slotTime - // Since we aren't generating an actual tree, just use beaconBlock as the snapshotEnd - snapshotEnd := &rprewards.SnapshotEnd{ - Slot: beaconBlock, - ConsensusBlock: beaconBlock, - ExecutionBlock: state.ElBlockNumber, - } - - // Approximate the staker's share of the smoothing pool balance - // NOTE: this will use the "vanilla" variant of treegen, without rolling records, to retain parity with other Oracle DAO nodes that aren't using rolling records - treegen, err := rprewards.NewTreeGenerator(t.log, "[Balances]", rprewards.NewRewardsExecutionClient(client), t.cfg, t.bc, currentIndex, startTime, endTime, snapshotEnd, elBlockHeader, uint64(intervalsPassed), state) - if err != nil { - return fmt.Errorf("error creating merkle tree generator to approximate share of smoothing pool: %w", err) - } - smoothingPoolShare, err = treegen.ApproximateStakerShareOfSmoothingPool() - if err != nil { - return fmt.Errorf("error getting approximate share of smoothing pool: %w", err) - } - - return nil - + var err error + smoothingPoolShare, err = spCalc.GetSmoothingPoolShare(state, elBlockHeader, slotTime) + return err }) // Wait for data @@ -517,7 +563,7 @@ func (t *submitNetworkBalances) getNetworkBalances(elBlockHeader *types.Header, } -func (t *submitNetworkBalances) getMegapoolBalanceDetails(megapoolAddress common.Address, state *state.NetworkState, megapoolDetails rpstate.NativeMegapoolDetails) (megapoolBalanceDetail, error) { +func (t *submitNetworkBalances) getMegapoolBalanceDetails(megapoolAddress common.Address, state *state.NetworkState, megapoolDetails rpstate.NativeMegapoolDetails, rewardCalc rewardSplitCalculator) (megapoolBalanceDetail, error) { megapoolBalanceDetails := megapoolBalanceDetail{} megapoolValidators := state.MegapoolToPubkeysMap[megapoolAddress] // iterate the megapoolValidators array @@ -598,24 +644,9 @@ func (t *submitNetworkBalances) getMegapoolBalanceDetails(megapoolAddress common beaconBalanceIncrease = beaconBalanceIncrease.Sub(beaconBalanceIncrease, megapoolDetails.NodeBond) rewards := big.NewInt(0).Add(beaconBalanceIncrease, pendingRewards) - // Load the megapool - megapoolContract, err := megapool.NewMegaPoolV1(t.rp, megapoolAddress, nil) - if err != nil { - return megapoolBalanceDetail{}, fmt.Errorf("error loading megapool contract: %w", err) - } - rewardsSplit := megapool.RewardSplit{ - NodeRewards: big.NewInt(0), - VoterRewards: big.NewInt(0), - RethRewards: big.NewInt(0), - ProtocolDAORewards: big.NewInt(0), - } megapoolBalanceDetails.RethRewards = big.NewInt(0) if rewards.Cmp(big.NewInt(0)) > 0 { - opts := &bind.CallOpts{ - BlockNumber: big.NewInt(0).SetUint64(state.ElBlockNumber), - } - rewardsSplit, err = megapoolContract.CalculateRewards(rewards, opts) - + rewardsSplit, err := rewardCalc.CalculateRewards(megapoolAddress, rewards, state.ElBlockNumber) if err != nil { return megapoolBalanceDetail{}, fmt.Errorf("error calculating rewards split: %w", err) } diff --git a/shared/services/bc-manager.go b/shared/services/bc-manager.go index cd37eca68..1fcd1c739 100644 --- a/shared/services/bc-manager.go +++ b/shared/services/bc-manager.go @@ -26,6 +26,23 @@ type BeaconClientManager struct { primaryReady bool fallbackReady bool ignoreSyncCheck bool + + // static, when non-nil, satisfies every public method of this manager + // directly from the provided client instead of dialling a live beacon + // node. It is set by NewStaticBeaconClientManager and used when the + // daemon is running in --network-state mode. + static beacon.Client +} + +// NewStaticBeaconClientManager returns a BeaconClientManager whose public +// methods all delegate to the provided beacon.Client. No network +// connections are established. +func NewStaticBeaconClientManager(static beacon.Client) *BeaconClientManager { + return &BeaconClientManager{ + static: static, + primaryReady: true, + fallbackReady: false, + } } // This is a signature for a wrapped Beacon client function that only returns an error @@ -369,6 +386,19 @@ func (m *BeaconClientManager) GetValidatorBalances(indices []string, opts *beaco func (m *BeaconClientManager) CheckStatus() *api.ClientManagerStatus { + // In static mode we have no real beacon clients to probe; report the + // synthetic "primary is working and synced" status. + if m.static != nil { + return &api.ClientManagerStatus{ + FallbackEnabled: false, + PrimaryClientStatus: api.ClientStatus{ + IsWorking: true, + IsSynced: true, + SyncProgress: 1, + }, + } + } + status := &api.ClientManagerStatus{ FallbackEnabled: m.fallbackBc != nil, } @@ -431,6 +461,13 @@ func checkBcStatus(client beacon.Client) api.ClientStatus { // Attempts to run a function progressively through each client until one succeeds or they all fail. func (m *BeaconClientManager) runFunction0(function bcFunction0) error { + // Delegate directly to the static backend when the manager is running in + // --network-state mode; there are no primary/fallback clients to route + // through. + if m.static != nil { + return function(m.static) + } + // Check if we can use the primary if m.primaryReady { // Try to run the function on the primary @@ -473,6 +510,10 @@ func (m *BeaconClientManager) runFunction0(function bcFunction0) error { // Attempts to run a function progressively through each client until one succeeds or they all fail. func (m *BeaconClientManager) runFunction1(function bcFunction1) (interface{}, error) { + if m.static != nil { + return function(m.static) + } + // Check if we can use the primary if m.primaryReady { // Try to run the function on the primary @@ -515,6 +556,10 @@ func (m *BeaconClientManager) runFunction1(function bcFunction1) (interface{}, e // Attempts to run a function progressively through each client until one succeeds or they all fail. func (m *BeaconClientManager) runFunction2(function bcFunction2) (interface{}, interface{}, error) { + if m.static != nil { + return function(m.static) + } + // Check if we can use the primary if m.primaryReady { // Try to run the function on the primary diff --git a/shared/services/ec-manager.go b/shared/services/ec-manager.go index 931ca7576..b27cc0deb 100644 --- a/shared/services/ec-manager.go +++ b/shared/services/ec-manager.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/fatih/color" + "github.com/rocket-pool/smartnode/bindings/rocketpool" "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/types/api" cfgtypes "github.com/rocket-pool/smartnode/shared/types/config" @@ -30,6 +31,23 @@ type ExecutionClientManager struct { primaryReady bool fallbackReady bool ignoreSyncCheck bool + + // static, when non-nil, satisfies every public method of this manager + // directly from the provided client instead of dialling a live EC. + // It is set by NewStaticExecutionClientManager and used when the daemon + // is running in --network-state mode. + static rocketpool.ExecutionClient +} + +// NewStaticExecutionClientManager returns an ExecutionClientManager whose +// public methods all delegate to the provided ExecutionClient. No network +// connections are established. +func NewStaticExecutionClientManager(static rocketpool.ExecutionClient) *ExecutionClientManager { + return &ExecutionClientManager{ + static: static, + primaryReady: true, + fallbackReady: false, + } } // This is a signature for a wrapped ethclient.Client function @@ -100,6 +118,9 @@ func NewExecutionClientManager(cfg *config.RocketPoolConfig) (*ExecutionClientMa // CodeAt returns the code of the given account. This is needed to differentiate // between contract internal errors and the local chain being out of sync. func (p *ExecutionClientManager) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + if p.static != nil { + return p.static.CodeAt(ctx, contract, blockNumber) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.CodeAt(ctx, contract, blockNumber) }) @@ -112,6 +133,9 @@ func (p *ExecutionClientManager) CodeAt(ctx context.Context, contract common.Add // CallContract executes an Ethereum contract call with the specified data as the // input. func (p *ExecutionClientManager) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + if p.static != nil { + return p.static.CallContract(ctx, call, blockNumber) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.CallContract(ctx, call, blockNumber) }) @@ -127,6 +151,9 @@ func (p *ExecutionClientManager) CallContract(ctx context.Context, call ethereum // HeaderByHash returns the block header with the given hash. func (p *ExecutionClientManager) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + if p.static != nil { + return p.static.HeaderByHash(ctx, hash) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.HeaderByHash(ctx, hash) }) @@ -139,6 +166,9 @@ func (p *ExecutionClientManager) HeaderByHash(ctx context.Context, hash common.H // HeaderByNumber returns a block header from the current canonical chain. If number is // nil, the latest known header is returned. func (p *ExecutionClientManager) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + if p.static != nil { + return p.static.HeaderByNumber(ctx, number) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.HeaderByNumber(ctx, number) }) @@ -150,6 +180,9 @@ func (p *ExecutionClientManager) HeaderByNumber(ctx context.Context, number *big // PendingCodeAt returns the code of the given account in the pending state. func (p *ExecutionClientManager) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + if p.static != nil { + return p.static.PendingCodeAt(ctx, account) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.PendingCodeAt(ctx, account) }) @@ -161,6 +194,9 @@ func (p *ExecutionClientManager) PendingCodeAt(ctx context.Context, account comm // PendingNonceAt retrieves the current pending nonce associated with an account. func (p *ExecutionClientManager) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + if p.static != nil { + return p.static.PendingNonceAt(ctx, account) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.PendingNonceAt(ctx, account) }) @@ -173,6 +209,9 @@ func (p *ExecutionClientManager) PendingNonceAt(ctx context.Context, account com // SuggestGasPrice retrieves the currently suggested gas price to allow a timely // execution of a transaction. func (p *ExecutionClientManager) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + if p.static != nil { + return p.static.SuggestGasPrice(ctx) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.SuggestGasPrice(ctx) }) @@ -185,6 +224,9 @@ func (p *ExecutionClientManager) SuggestGasPrice(ctx context.Context) (*big.Int, // SuggestGasTipCap retrieves the currently suggested 1559 priority fee to allow // a timely execution of a transaction. func (p *ExecutionClientManager) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + if p.static != nil { + return p.static.SuggestGasTipCap(ctx) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.SuggestGasTipCap(ctx) }) @@ -200,6 +242,9 @@ func (p *ExecutionClientManager) SuggestGasTipCap(ctx context.Context) (*big.Int // transactions may be added or removed by miners, but it should provide a basis // for setting a reasonable default. func (p *ExecutionClientManager) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { + if p.static != nil { + return p.static.EstimateGas(ctx, call) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.EstimateGas(ctx, call) }) @@ -211,6 +256,9 @@ func (p *ExecutionClientManager) EstimateGas(ctx context.Context, call ethereum. // SendTransaction injects the transaction into the pending pool for execution. func (p *ExecutionClientManager) SendTransaction(ctx context.Context, tx *types.Transaction) error { + if p.static != nil { + return p.static.SendTransaction(ctx, tx) + } _, err := p.runFunction(func(client *ethClient) (interface{}, error) { return nil, client.SendTransaction(ctx, tx) }) @@ -226,6 +274,9 @@ func (p *ExecutionClientManager) SendTransaction(ctx context.Context, tx *types. // // TODO(karalabe): Deprecate when the subscription one can return past data too. func (p *ExecutionClientManager) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) { + if p.static != nil { + return p.static.FilterLogs(ctx, query) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.FilterLogs(ctx, query) }) @@ -238,6 +289,9 @@ func (p *ExecutionClientManager) FilterLogs(ctx context.Context, query ethereum. // SubscribeFilterLogs creates a background log filtering operation, returning // a subscription immediately, which can be used to stream the found events. func (p *ExecutionClientManager) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + if p.static != nil { + return p.static.SubscribeFilterLogs(ctx, query, ch) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.SubscribeFilterLogs(ctx, query, ch) }) @@ -254,6 +308,9 @@ func (p *ExecutionClientManager) SubscribeFilterLogs(ctx context.Context, query // TransactionReceipt returns the receipt of a transaction by transaction hash. // Note that the receipt is not available for pending transactions. func (p *ExecutionClientManager) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { + if p.static != nil { + return p.static.TransactionReceipt(ctx, txHash) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.TransactionReceipt(ctx, txHash) }) @@ -269,6 +326,9 @@ func (p *ExecutionClientManager) TransactionReceipt(ctx context.Context, txHash // BlockNumber returns the most recent block number func (p *ExecutionClientManager) BlockNumber(ctx context.Context) (uint64, error) { + if p.static != nil { + return p.static.BlockNumber(ctx) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.BlockNumber(ctx) }) @@ -281,6 +341,9 @@ func (p *ExecutionClientManager) BlockNumber(ctx context.Context) (uint64, error // BalanceAt returns the wei balance of the given account. // The block number can be nil, in which case the balance is taken from the latest known block. func (p *ExecutionClientManager) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { + if p.static != nil { + return p.static.BalanceAt(ctx, account, blockNumber) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.BalanceAt(ctx, account, blockNumber) }) @@ -292,6 +355,9 @@ func (p *ExecutionClientManager) BalanceAt(ctx context.Context, account common.A // TransactionByHash returns the transaction with the given hash. func (p *ExecutionClientManager) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) { + if p.static != nil { + return p.static.TransactionByHash(ctx, hash) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { tx, isPending, err := client.TransactionByHash(ctx, hash) result := []interface{}{tx, isPending} @@ -311,6 +377,9 @@ func (p *ExecutionClientManager) TransactionByHash(ctx context.Context, hash com // NonceAt returns the account nonce of the given account. // The block number can be nil, in which case the nonce is taken from the latest known block. func (p *ExecutionClientManager) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { + if p.static != nil { + return p.static.NonceAt(ctx, account, blockNumber) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.NonceAt(ctx, account, blockNumber) }) @@ -323,6 +392,9 @@ func (p *ExecutionClientManager) NonceAt(ctx context.Context, account common.Add // SyncProgress retrieves the current progress of the sync algorithm. If there's // no sync currently running, it returns nil. func (p *ExecutionClientManager) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { + if p.static != nil { + return p.static.SyncProgress(ctx) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.SyncProgress(ctx) }) @@ -333,6 +405,9 @@ func (p *ExecutionClientManager) SyncProgress(ctx context.Context) (*ethereum.Sy } func (p *ExecutionClientManager) LatestBlockTime(ctx context.Context) (time.Time, error) { + if p.static != nil { + return p.static.LatestBlockTime(ctx) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.LatestBlockTime(ctx) }) @@ -344,6 +419,9 @@ func (p *ExecutionClientManager) LatestBlockTime(ctx context.Context) (time.Time // BlockNumber returns the most recent block number func (p *ExecutionClientManager) ChainID(ctx context.Context) (*big.Int, error) { + if p.static != nil { + return p.static.ChainID(ctx) + } result, err := p.runFunction(func(client *ethClient) (interface{}, error) { return client.ChainID(ctx) }) @@ -359,6 +437,19 @@ func (p *ExecutionClientManager) ChainID(ctx context.Context) (*big.Int, error) func (p *ExecutionClientManager) CheckStatus(cfg *config.RocketPoolConfig) *api.ClientManagerStatus { + // In static mode we have no real clients to probe; report the synthetic + // "primary is working and synced" status. + if p.static != nil { + return &api.ClientManagerStatus{ + FallbackEnabled: false, + PrimaryClientStatus: api.ClientStatus{ + IsWorking: true, + IsSynced: true, + SyncProgress: 1, + }, + } + } + status := &api.ClientManagerStatus{ FallbackEnabled: p.fallbackEc != nil, } diff --git a/shared/services/network_state_provider.go b/shared/services/network_state_provider.go new file mode 100644 index 000000000..6eae2c1ac --- /dev/null +++ b/shared/services/network_state_provider.go @@ -0,0 +1,99 @@ +package services + +import ( + "fmt" + "sync" + + "github.com/urfave/cli/v3" + + "github.com/rocket-pool/smartnode/shared/services/state" +) + +// Memoized static snapshot / provider so that every service accessor +// consults the same in-memory NetworkState without re-reading the file. +var ( + staticState *state.NetworkState + staticStateErr error + initStaticState sync.Once + networkStateProv state.NetworkStateProvider + networkStateProvErr error + initNetworkStateProv sync.Once +) + +// GetStaticStatePath returns the --network-state flag value on the root +// command, or the empty string if not set. +func GetStaticStatePath(c *cli.Command) string { + if c == nil { + return "" + } + return c.Root().String("network-state") +} + +// IsStaticStateMode reports whether the daemon has been asked to serve +// requests from a saved NetworkState snapshot instead of live EC/CC clients. +func IsStaticStateMode(c *cli.Command) bool { + return GetStaticStatePath(c) != "" +} + +// getStaticState loads the NetworkState snapshot pointed at by --network-state, +// memoizing the result on success. It is safe to call concurrently. +func getStaticState(c *cli.Command) (*state.NetworkState, error) { + path := GetStaticStatePath(c) + if path == "" { + return nil, fmt.Errorf("static state mode is not enabled (--network-state is unset)") + } + initStaticState.Do(func() { + provider, err := state.NewStaticNetworkStateProviderFromFile(path) + if err != nil { + staticStateErr = fmt.Errorf("loading static network state from %q: %w", path, err) + return + } + ns, err := provider.GetHeadState() + if err != nil { + staticStateErr = fmt.Errorf("reading head state from %q: %w", path, err) + return + } + staticState = ns + }) + return staticState, staticStateErr +} + +// GetNetworkStateProvider returns a state.NetworkStateProvider backed by +// either the live NetworkStateManager (dialling the configured EC / CC) or +// by a StaticNetworkStateProvider loaded from --network-state, depending on +// the command-line flag. +// +// In live mode, the returned provider reuses the memoized execution and +// consensus clients from GetRocketPool / GetBeaconClient so the daemon +// doesn't establish extra connections. +func GetNetworkStateProvider(c *cli.Command) (state.NetworkStateProvider, error) { + initNetworkStateProv.Do(func() { + if IsStaticStateMode(c) { + ns, err := getStaticState(c) + if err != nil { + networkStateProvErr = err + return + } + networkStateProv = state.NewStaticNetworkStateProvider(ns) + return + } + + cfg, err := GetConfig(c) + if err != nil { + networkStateProvErr = err + return + } + rp, err := GetRocketPool(c) + if err != nil { + networkStateProvErr = err + return + } + bc, err := GetBeaconClient(c) + if err != nil { + networkStateProvErr = err + return + } + networkStateProv = state.NewNetworkStateManager(rp, cfg.Smartnode.GetStateManagerContracts(), bc, nil) + }) + return networkStateProv, networkStateProvErr +} diff --git a/shared/services/proposals/proposal-manager.go b/shared/services/proposals/proposal-manager.go index 71829e5af..e1bede6a4 100644 --- a/shared/services/proposals/proposal-manager.go +++ b/shared/services/proposals/proposal-manager.go @@ -18,7 +18,7 @@ type ProposalManager struct { viSnapshotMgr *VotingInfoSnapshotManager networkTreeMgr *NetworkTreeManager nodeTreeMgr *NodeTreeManager - stateMgr *state.NetworkStateManager + stateMgr state.NetworkStateProvider log *log.ColorLogger logPrefix string diff --git a/shared/services/requirements.go b/shared/services/requirements.go index 8a9646131..7895275ad 100644 --- a/shared/services/requirements.go +++ b/shared/services/requirements.go @@ -46,6 +46,11 @@ func RequireNodeWallet(c *cli.Command) error { } func RequireEthClientSynced(c *cli.Command) error { + // In static mode there is no live EC to poll; the snapshot is, by + // definition, a settled point in time. + if IsStaticStateMode(c) { + return nil + } ethClientSynced, err := waitEthClientSynced(c, false, EthClientSyncTimeout) if err != nil { return err @@ -57,6 +62,9 @@ func RequireEthClientSynced(c *cli.Command) error { } func RequireBeaconClientSynced(c *cli.Command) error { + if IsStaticStateMode(c) { + return nil + } beaconClientSynced, err := waitBeaconClientSynced(c, false, BeaconClientSyncTimeout) if err != nil { return err @@ -68,6 +76,11 @@ func RequireBeaconClientSynced(c *cli.Command) error { } func RequireRocketStorage(c *cli.Command) error { + // In static mode the storage contract is implicitly present (the snapshot + // was produced against it); skip the live code-at probe. + if IsStaticStateMode(c) { + return nil + } if err := RequireEthClientSynced(c); err != nil { return err } @@ -172,16 +185,25 @@ func WaitNodeHdWallet(c *cli.Command, verbose bool) error { } func WaitEthClientSynced(c *cli.Command, verbose bool) error { + if IsStaticStateMode(c) { + return nil + } _, err := waitEthClientSynced(c, verbose, 0) return err } func WaitBeaconClientSynced(c *cli.Command, verbose bool) error { + if IsStaticStateMode(c) { + return nil + } _, err := waitBeaconClientSynced(c, verbose, 0) return err } func WaitRocketStorage(c *cli.Command, verbose bool) error { + if IsStaticStateMode(c) { + return nil + } if err := WaitEthClientSynced(c, verbose); err != nil { return err } @@ -279,11 +301,14 @@ func getNodeRegistered(c *cli.Command) (bool, error) { if err != nil { return false, err } - rp, err := GetRocketPool(c) + nodeAccount, err := w.GetNodeAccount() if err != nil { return false, err } - nodeAccount, err := w.GetNodeAccount() + if IsStaticStateMode(c) { + return isNodeRegisteredInStaticState(c, nodeAccount.Address) + } + rp, err := GetRocketPool(c) if err != nil { return false, err } @@ -296,11 +321,14 @@ func getHdNodeRegistered(c *cli.Command) (bool, error) { if err != nil { return false, err } - rp, err := GetRocketPool(c) + nodeAccount, err := w.GetNodeAccount() if err != nil { return false, err } - nodeAccount, err := w.GetNodeAccount() + if IsStaticStateMode(c) { + return isNodeRegisteredInStaticState(c, nodeAccount.Address) + } + rp, err := GetRocketPool(c) if err != nil { return false, err } @@ -313,11 +341,23 @@ func getNodeTrusted(c *cli.Command) (bool, error) { if err != nil { return false, err } - rp, err := GetRocketPool(c) + nodeAccount, err := w.GetNodeAccount() if err != nil { return false, err } - nodeAccount, err := w.GetNodeAccount() + if IsStaticStateMode(c) { + ns, err := getStaticState(c) + if err != nil { + return false, err + } + for _, m := range ns.OracleDaoMemberDetails { + if m.Address == nodeAccount.Address { + return true, nil + } + } + return false, nil + } + rp, err := GetRocketPool(c) if err != nil { return false, err } @@ -330,17 +370,33 @@ func getNodeSecurityMember(c *cli.Command) (bool, error) { if err != nil { return false, err } - rp, err := GetRocketPool(c) + nodeAccount, err := w.GetNodeAccount() if err != nil { return false, err } - nodeAccount, err := w.GetNodeAccount() + if IsStaticStateMode(c) { + // Security council membership is not captured in the NetworkState + // snapshot, so we cannot answer this from the static data. + return false, fmt.Errorf("security council membership cannot be verified in static state mode") + } + rp, err := GetRocketPool(c) if err != nil { return false, err } return security.GetMemberExists(rp, nodeAccount.Address, nil) } +// isNodeRegisteredInStaticState reports whether the given address appears in +// the snapshot's NodeDetailsByAddress index. +func isNodeRegisteredInStaticState(c *cli.Command, address common.Address) (bool, error) { + ns, err := getStaticState(c) + if err != nil { + return false, err + } + _, ok := ns.NodeDetailsByAddress[address] + return ok, nil +} + // Wait for the eth client to sync // timeout of 0 indicates no timeout var ethClientSyncLock sync.Mutex diff --git a/shared/services/services.go b/shared/services/services.go index 17619af2d..99e748273 100644 --- a/shared/services/services.go +++ b/shared/services/services.go @@ -22,6 +22,7 @@ import ( "github.com/rocket-pool/smartnode/shared/services/config" "github.com/rocket-pool/smartnode/shared/services/contracts" "github.com/rocket-pool/smartnode/shared/services/passwords" + "github.com/rocket-pool/smartnode/shared/services/state" "github.com/rocket-pool/smartnode/shared/services/wallet" lhkeystore "github.com/rocket-pool/smartnode/shared/services/wallet/keystore/lighthouse" lokeystore "github.com/rocket-pool/smartnode/shared/services/wallet/keystore/lodestar" @@ -163,7 +164,9 @@ func GetRocketPool(c *cli.Command) (*rocketpool.RocketPool, error) { return nil, err } var ec rocketpool.ExecutionClient - if c.Root().Bool("use-protected-api") { + if IsStaticStateMode(c) { + ec, err = getStaticExecutionClient(c, cfg) + } else if c.Root().Bool("use-protected-api") { url := cfg.Smartnode.GetFlashbotsProtectUrl() ec, err = dialProtectedEthClient(url) } else { @@ -324,6 +327,16 @@ func getWallet(c *cli.Command, cfg *config.RocketPoolConfig, pm *passwords.Passw func getEthClient(c *cli.Command, cfg *config.RocketPoolConfig) (*ExecutionClientManager, error) { var err error initECManager.Do(func() { + if IsStaticStateMode(c) { + var staticEc *state.StaticExecutionClient + staticEc, err = getStaticExecutionClient(c, cfg) + if err != nil { + return + } + ecManager = NewStaticExecutionClientManager(staticEc) + return + } + // Create a new client manager ecManager, err = NewExecutionClientManager(cfg) if err == nil { @@ -339,6 +352,18 @@ func getEthClient(c *cli.Command, cfg *config.RocketPoolConfig) (*ExecutionClien return ecManager, err } +// getStaticExecutionClient returns a StaticExecutionClient backed by the +// --network-state snapshot and configured with the chain ID from the current +// SmartnodeConfig. +func getStaticExecutionClient(c *cli.Command, cfg *config.RocketPoolConfig) (*state.StaticExecutionClient, error) { + ns, err := getStaticState(c) + if err != nil { + return nil, err + } + chainID := new(big.Int).SetUint64(uint64(cfg.Smartnode.GetChainID())) + return state.NewStaticExecutionClient(ns, chainID), nil +} + func getRocketPool(cfg *config.RocketPoolConfig, client rocketpool.ExecutionClient) (*rocketpool.RocketPool, error) { var err error initRocketPool.Do(func() { @@ -361,6 +386,16 @@ func getRocketSignerRegistry(cfg *config.RocketPoolConfig, client rocketpool.Exe func getBeaconClient(c *cli.Command, cfg *config.RocketPoolConfig) (*BeaconClientManager, error) { var err error initBCManager.Do(func() { + if IsStaticStateMode(c) { + var ns *state.NetworkState + ns, err = getStaticState(c) + if err != nil { + return + } + bcManager = NewStaticBeaconClientManager(state.NewStaticBeaconClient(ns)) + return + } + // Create a new client manager bcManager, err = NewBeaconClientManager(cfg) if err == nil { diff --git a/shared/services/state/network-state.go b/shared/services/state/network-state.go index 811c4cdfb..ac0b80258 100644 --- a/shared/services/state/network-state.go +++ b/shared/services/state/network-state.go @@ -88,7 +88,7 @@ type NetworkState struct { // Map megapool addresses to the pubkeys of its validators MegapoolToPubkeysMap map[common.Address][]types.ValidatorPubkey `json:"-"` - MegapoolDetails map[common.Address]rpstate.NativeMegapoolDetails `json:"-"` + MegapoolDetails map[common.Address]rpstate.NativeMegapoolDetails `json:"megapool_details"` // These next two fields are indexes over MinipoolDetails and are ignored when marshaling to JSON // they are rebuilt when unmarshaling from JSON. @@ -163,6 +163,20 @@ func (ns *NetworkState) UnmarshalJSON(data []byte) error { ns.MinipoolDetailsByNode[details.NodeAddress] = append(nodeList, currentDetails) } + // Rebuild MegapoolToPubkeysMap and MegapoolValidatorInfo from MegapoolValidatorGlobalIndex + ns.MegapoolToPubkeysMap = make(map[common.Address][]types.ValidatorPubkey) + ns.MegapoolValidatorInfo = make(map[types.ValidatorPubkey]*megapool.ValidatorInfoFromGlobalIndex) + for i := range ns.MegapoolValidatorGlobalIndex { + validator := &ns.MegapoolValidatorGlobalIndex[i] + if len(validator.Pubkey) > 0 { + pubkey := types.ValidatorPubkey(validator.Pubkey) + ns.MegapoolToPubkeysMap[validator.MegapoolAddress] = append( + ns.MegapoolToPubkeysMap[validator.MegapoolAddress], pubkey, + ) + ns.MegapoolValidatorInfo[pubkey] = validator + } + } + return nil } diff --git a/shared/services/state/provider.go b/shared/services/state/provider.go new file mode 100644 index 000000000..66f4006a2 --- /dev/null +++ b/shared/services/state/provider.go @@ -0,0 +1,17 @@ +package state + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/smartnode/shared/services/beacon" +) + +// NetworkStateProvider abstracts the retrieval of network state snapshots +// NetworkStateManager satisfies this interface using live EC/CC connections +// StaticNetworkStateProvider satisfies it using a pre-loaded NetworkState +type NetworkStateProvider interface { + GetHeadState() (*NetworkState, error) + GetHeadStateForNode(nodeAddress common.Address) (*NetworkState, error) + GetStateForSlot(slotNumber uint64) (*NetworkState, error) + GetLatestBeaconBlock() (beacon.BeaconBlock, error) + GetLatestFinalizedBeaconBlock() (beacon.BeaconBlock, error) +} diff --git a/shared/services/state/static_bc.go b/shared/services/state/static_bc.go new file mode 100644 index 000000000..99700859c --- /dev/null +++ b/shared/services/state/static_bc.go @@ -0,0 +1,223 @@ +package state + +import ( + "fmt" + "math/big" + "strconv" + + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/smartnode/bindings/types" + "github.com/rocket-pool/smartnode/shared/services/beacon" +) + +// Compile-time check that StaticBeaconClient satisfies beacon.Client +var _ beacon.Client = (*StaticBeaconClient)(nil) + +// StaticBeaconClient serves consensus-layer reads from a pre-loaded +// NetworkState snapshot. Anything not modelled in the snapshot +// (attestations, committees, sync duties, BLS domain data, arbitrary SSZ +// state or block data) returns ErrStaticMode. +type StaticBeaconClient struct { + state *NetworkState +} + +// NewStaticBeaconClient wires the given NetworkState into a static +// beacon.Client implementation. +func NewStaticBeaconClient(ns *NetworkState) *StaticBeaconClient { + return &StaticBeaconClient{state: ns} +} + +func (c *StaticBeaconClient) GetClientType() (beacon.BeaconClientType, error) { + return beacon.Unknown, nil +} + +// GetSyncStatus always reports "fully synced" since the snapshot is a single +// point in time by definition. +func (c *StaticBeaconClient) GetSyncStatus() (beacon.SyncStatus, error) { + return beacon.SyncStatus{Syncing: false, Progress: 1}, nil +} + +func (c *StaticBeaconClient) GetEth2Config() (beacon.Eth2Config, error) { + return c.state.BeaconConfig, nil +} + +func (c *StaticBeaconClient) GetEth2DepositContract() (beacon.Eth2DepositContract, error) { + return beacon.Eth2DepositContract{}, ErrStaticMode +} + +func (c *StaticBeaconClient) GetAttestations(_ string) ([]beacon.AttestationInfo, bool, error) { + return nil, false, ErrStaticMode +} + +// blockHead synthesizes a BeaconBlock for the snapshot's slot. Only the +// fields derivable from the snapshot are populated. +func (c *StaticBeaconClient) blockHead() beacon.BeaconBlock { + return beacon.BeaconBlock{ + Slot: c.state.BeaconSlotNumber, + HasExecutionPayload: true, + ExecutionBlockNumber: c.state.ElBlockNumber, + } +} + +// GetBeaconBlock honours the symbolic "head" / "finalized" / "genesis" +// identifiers and any numeric slot equal to the snapshot's slot. Anything +// else returns ErrStaticMode. +func (c *StaticBeaconClient) GetBeaconBlock(blockId string) (beacon.BeaconBlock, bool, error) { + switch blockId { + case "head", "finalized": + return c.blockHead(), true, nil + case "genesis": + return beacon.BeaconBlock{}, false, ErrStaticMode + } + if slot, err := strconv.ParseUint(blockId, 10, 64); err == nil && slot == c.state.BeaconSlotNumber { + return c.blockHead(), true, nil + } + return beacon.BeaconBlock{}, false, ErrStaticMode +} + +func (c *StaticBeaconClient) GetBeaconBlockHeader(blockId string) (beacon.BeaconBlockHeader, bool, error) { + blk, exists, err := c.GetBeaconBlock(blockId) + if err != nil || !exists { + return beacon.BeaconBlockHeader{}, exists, err + } + return beacon.BeaconBlockHeader{Slot: blk.Slot, ProposerIndex: blk.ProposerIndex}, true, nil +} + +// GetBeaconHead is synthesised from the snapshot's slot. The finalized and +// justified epochs are taken to be the epoch of the snapshot slot itself +// since a snapshot, by definition, represents a settled view of the chain. +func (c *StaticBeaconClient) GetBeaconHead() (beacon.BeaconHead, error) { + cfg := c.state.BeaconConfig + if cfg.SlotsPerEpoch == 0 { + return beacon.BeaconHead{}, fmt.Errorf("beacon config has SlotsPerEpoch=0") + } + epoch := c.state.BeaconSlotNumber / cfg.SlotsPerEpoch + return beacon.BeaconHead{ + Epoch: epoch, + FinalizedEpoch: epoch, + JustifiedEpoch: epoch, + PreviousJustifiedEpoch: epoch, + }, nil +} + +// lookupValidator returns the snapshot's ValidatorStatus for the given +// pubkey, checking both the minipool and megapool validator maps. +func (c *StaticBeaconClient) lookupValidator(pubkey types.ValidatorPubkey) (beacon.ValidatorStatus, bool) { + if v, ok := c.state.MinipoolValidatorDetails[pubkey]; ok { + return v, true + } + if v, ok := c.state.MegapoolValidatorDetails[pubkey]; ok { + return v, true + } + return beacon.ValidatorStatus{}, false +} + +func (c *StaticBeaconClient) GetValidatorStatusByIndex(index string, _ *beacon.ValidatorStatusOptions) (beacon.ValidatorStatus, error) { + for _, v := range c.state.MinipoolValidatorDetails { + if v.Index == index { + return v, nil + } + } + for _, v := range c.state.MegapoolValidatorDetails { + if v.Index == index { + return v, nil + } + } + return beacon.ValidatorStatus{Exists: false}, nil +} + +func (c *StaticBeaconClient) GetValidatorStatus(pubkey types.ValidatorPubkey, _ *beacon.ValidatorStatusOptions) (beacon.ValidatorStatus, error) { + if v, ok := c.lookupValidator(pubkey); ok { + return v, nil + } + return beacon.ValidatorStatus{Exists: false}, nil +} + +func (c *StaticBeaconClient) GetAllValidators() ([]beacon.ValidatorStatus, error) { + out := make([]beacon.ValidatorStatus, 0, len(c.state.MinipoolValidatorDetails)+len(c.state.MegapoolValidatorDetails)) + for _, v := range c.state.MinipoolValidatorDetails { + out = append(out, v) + } + for _, v := range c.state.MegapoolValidatorDetails { + out = append(out, v) + } + return out, nil +} + +func (c *StaticBeaconClient) GetValidatorStatuses(pubkeys []types.ValidatorPubkey, _ *beacon.ValidatorStatusOptions) (map[types.ValidatorPubkey]beacon.ValidatorStatus, error) { + out := make(map[types.ValidatorPubkey]beacon.ValidatorStatus, len(pubkeys)) + for _, pk := range pubkeys { + if v, ok := c.lookupValidator(pk); ok { + out[pk] = v + } + } + return out, nil +} + +func (c *StaticBeaconClient) GetValidatorIndex(pubkey types.ValidatorPubkey) (string, error) { + if v, ok := c.lookupValidator(pubkey); ok { + return v.Index, nil + } + return "", fmt.Errorf("validator %s not found in snapshot", pubkey.Hex()) +} + +func (c *StaticBeaconClient) GetValidatorSyncDuties(_ []string, _ uint64) (map[string]bool, error) { + return nil, ErrStaticMode +} + +func (c *StaticBeaconClient) GetValidatorProposerDuties(_ []string, _ uint64) (map[string]uint64, error) { + return nil, ErrStaticMode +} + +func (c *StaticBeaconClient) GetValidatorBalances(indices []string, _ *beacon.ValidatorStatusOptions) (map[string]*big.Int, error) { + out := make(map[string]*big.Int, len(indices)) + lookup := make(map[string]uint64) + for _, v := range c.state.MinipoolValidatorDetails { + lookup[v.Index] = v.Balance + } + for _, v := range c.state.MegapoolValidatorDetails { + lookup[v.Index] = v.Balance + } + for _, idx := range indices { + if bal, ok := lookup[idx]; ok { + out[idx] = new(big.Int).SetUint64(bal) + } + } + return out, nil +} + +func (c *StaticBeaconClient) GetValidatorBalancesSafe(indices []string, opts *beacon.ValidatorStatusOptions) (map[string]*big.Int, error) { + return c.GetValidatorBalances(indices, opts) +} + +func (c *StaticBeaconClient) GetDomainData(_ []byte, _ uint64, _ bool) ([]byte, error) { + return nil, ErrStaticMode +} + +func (c *StaticBeaconClient) ExitValidator(_ string, _ uint64, _ types.ValidatorSignature) error { + return ErrStaticMode +} + +func (c *StaticBeaconClient) Close() error { + return nil +} + +func (c *StaticBeaconClient) GetEth1DataForEth2Block(_ string) (beacon.Eth1Data, bool, error) { + return beacon.Eth1Data{}, false, ErrStaticMode +} + +func (c *StaticBeaconClient) GetCommitteesForEpoch(_ *uint64) (beacon.Committees, error) { + return nil, ErrStaticMode +} + +func (c *StaticBeaconClient) ChangeWithdrawalCredentials(_ string, _ types.ValidatorPubkey, _ common.Address, _ types.ValidatorSignature) error { + return ErrStaticMode +} + +func (c *StaticBeaconClient) GetBeaconStateSSZ(_ uint64) (*beacon.BeaconStateSSZ, error) { + return nil, ErrStaticMode +} + +func (c *StaticBeaconClient) GetBeaconBlockSSZ(_ uint64) (*beacon.BeaconBlockSSZ, bool, error) { + return nil, false, ErrStaticMode +} diff --git a/shared/services/state/static_ec.go b/shared/services/state/static_ec.go new file mode 100644 index 000000000..399d1b4d5 --- /dev/null +++ b/shared/services/state/static_ec.go @@ -0,0 +1,147 @@ +package state + +import ( + "context" + "math/big" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/rocket-pool/smartnode/bindings/rocketpool" +) + +// Compile-time check that StaticExecutionClient satisfies rocketpool.ExecutionClient +var _ rocketpool.ExecutionClient = (*StaticExecutionClient)(nil) + +// StaticExecutionClient serves execution-layer reads from a pre-loaded +// NetworkState snapshot. Read methods that can be answered from the snapshot +// return synthetic values; anything that would require a live eth_call +// (contract reads, transaction submission, receipts, logs, …) returns +// ErrStaticMode so that callers fail loudly instead of silently stalling on +// a non-existent client. +type StaticExecutionClient struct { + state *NetworkState + chainID *big.Int +} + +// NewStaticExecutionClient wires the given NetworkState + chain ID into a +// static ExecutionClient implementation. +func NewStaticExecutionClient(ns *NetworkState, chainID *big.Int) *StaticExecutionClient { + if chainID == nil { + chainID = big.NewInt(0) + } + return &StaticExecutionClient{state: ns, chainID: new(big.Int).Set(chainID)} +} + +// blockTime returns the timestamp of the snapshot's execution block, derived +// from the beacon config and slot number. This is the best approximation we +// have without a live EL header. +func (c *StaticExecutionClient) blockTime() time.Time { + cfg := c.state.BeaconConfig + ts := cfg.GenesisTime + c.state.BeaconSlotNumber*cfg.SecondsPerSlot + return time.Unix(int64(ts), 0) +} + +// CodeAt returns a single placeholder byte for any address so that bind.go's +// "no code at address" detection passes. Real bytecode reads cannot be +// answered from the snapshot. +func (c *StaticExecutionClient) CodeAt(_ context.Context, _ common.Address, _ *big.Int) ([]byte, error) { + return []byte{0x00}, nil +} + +func (c *StaticExecutionClient) CallContract(_ context.Context, _ ethereum.CallMsg, _ *big.Int) ([]byte, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) HeaderByHash(_ context.Context, _ common.Hash) (*types.Header, error) { + return nil, ErrStaticMode +} + +// HeaderByNumber synthesizes a minimal header for the snapshot's EL block. +// Any other block number returns ErrStaticMode since the snapshot only covers +// a single point in time. +func (c *StaticExecutionClient) HeaderByNumber(_ context.Context, number *big.Int) (*types.Header, error) { + snapshotBlock := new(big.Int).SetUint64(c.state.ElBlockNumber) + if number != nil && number.Cmp(snapshotBlock) != 0 { + return nil, ErrStaticMode + } + return &types.Header{ + Number: snapshotBlock, + Time: uint64(c.blockTime().Unix()), + }, nil +} + +func (c *StaticExecutionClient) PendingCodeAt(_ context.Context, _ common.Address) ([]byte, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) PendingNonceAt(_ context.Context, _ common.Address) (uint64, error) { + return 0, ErrStaticMode +} + +func (c *StaticExecutionClient) SuggestGasPrice(_ context.Context) (*big.Int, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) SuggestGasTipCap(_ context.Context) (*big.Int, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) EstimateGas(_ context.Context, _ ethereum.CallMsg) (uint64, error) { + return 0, ErrStaticMode +} + +func (c *StaticExecutionClient) SendTransaction(_ context.Context, _ *types.Transaction) error { + return ErrStaticMode +} + +func (c *StaticExecutionClient) FilterLogs(_ context.Context, _ ethereum.FilterQuery) ([]types.Log, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) SubscribeFilterLogs(_ context.Context, _ ethereum.FilterQuery, _ chan<- types.Log) (ethereum.Subscription, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) TransactionReceipt(_ context.Context, _ common.Hash) (*types.Receipt, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) BlockNumber(_ context.Context) (uint64, error) { + return c.state.ElBlockNumber, nil +} + +func (c *StaticExecutionClient) BalanceAt(_ context.Context, _ common.Address, _ *big.Int) (*big.Int, error) { + return nil, ErrStaticMode +} + +func (c *StaticExecutionClient) TransactionByHash(_ context.Context, _ common.Hash) (*types.Transaction, bool, error) { + return nil, false, ErrStaticMode +} + +func (c *StaticExecutionClient) NonceAt(_ context.Context, _ common.Address, _ *big.Int) (uint64, error) { + return 0, ErrStaticMode +} + +// SyncProgress returns nil to signal that the client is fully synced. The +// snapshot is, by definition, a single fixed point, so "not syncing" is the +// correct answer. +func (c *StaticExecutionClient) SyncProgress(_ context.Context) (*ethereum.SyncProgress, error) { + return nil, nil +} + +func (c *StaticExecutionClient) LatestBlockTime(_ context.Context) (time.Time, error) { + return c.blockTime(), nil +} + +func (c *StaticExecutionClient) ChainID(_ context.Context) (*big.Int, error) { + return new(big.Int).Set(c.chainID), nil +} + +// NetworkID mirrors ChainID and exists so that the static client can be used +// in places (like checkEcStatus) where the underlying ethclient.Client's +// NetworkID method is invoked directly. +func (c *StaticExecutionClient) NetworkID(_ context.Context) (*big.Int, error) { + return new(big.Int).Set(c.chainID), nil +} diff --git a/shared/services/state/static_mode.go b/shared/services/state/static_mode.go new file mode 100644 index 000000000..fe05e50fe --- /dev/null +++ b/shared/services/state/static_mode.go @@ -0,0 +1,9 @@ +package state + +import "errors" + +// ErrStaticMode is returned by static EC/BC backends when a method is invoked +// that cannot be answered from a pre-loaded NetworkState snapshot. Handlers +// that have not yet been ported to consume NetworkStateProvider directly will +// surface this error instead of attempting a live EC/CC call. +var ErrStaticMode = errors.New("operation not supported in static network state mode") diff --git a/shared/services/state/static_provider.go b/shared/services/state/static_provider.go new file mode 100644 index 000000000..b0450ad3b --- /dev/null +++ b/shared/services/state/static_provider.go @@ -0,0 +1,80 @@ +package state + +import ( + "compress/gzip" + "encoding/json" + "fmt" + "io" + "os" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/smartnode/shared/services/beacon" +) + +// Compile-time check that StaticNetworkStateProvider satisfies NetworkStateProvider +var _ NetworkStateProvider = (*StaticNetworkStateProvider)(nil) + +// StaticNetworkStateProvider serves a pre-loaded NetworkState without any +// EC/CC connections. Useful for deterministic tests driven by previously +// serialized state snapshots +type StaticNetworkStateProvider struct { + state *NetworkState +} + +func NewStaticNetworkStateProvider(ns *NetworkState) *StaticNetworkStateProvider { + return &StaticNetworkStateProvider{state: ns} +} + +func NewStaticNetworkStateProviderFromJSON(r io.Reader) (*StaticNetworkStateProvider, error) { + var ns NetworkState + if err := json.NewDecoder(r).Decode(&ns); err != nil { + return nil, err + } + return NewStaticNetworkStateProvider(&ns), nil +} + +// NewStaticNetworkStateProviderFromFile loads a NetworkState from a JSON file. +// If the path ends in ".gz", the file is transparently decompressed with gzip. +func NewStaticNetworkStateProviderFromFile(path string) (*StaticNetworkStateProvider, error) { + f, err := os.Open(path) + if err != nil { + return nil, fmt.Errorf("opening state file %q: %w", path, err) + } + defer f.Close() + + var r io.Reader = f + if strings.HasSuffix(path, ".gz") { + gz, err := gzip.NewReader(f) + if err != nil { + return nil, fmt.Errorf("creating gzip reader for %q: %w", path, err) + } + defer gz.Close() + r = gz + } + return NewStaticNetworkStateProviderFromJSON(r) +} + +func (p *StaticNetworkStateProvider) GetHeadState() (*NetworkState, error) { + return p.state, nil +} + +func (p *StaticNetworkStateProvider) GetHeadStateForNode(_ common.Address) (*NetworkState, error) { + return p.state, nil +} + +func (p *StaticNetworkStateProvider) GetStateForSlot(_ uint64) (*NetworkState, error) { + return p.state, nil +} + +func (p *StaticNetworkStateProvider) GetLatestBeaconBlock() (beacon.BeaconBlock, error) { + return beacon.BeaconBlock{ + Slot: p.state.BeaconSlotNumber, + HasExecutionPayload: true, + ExecutionBlockNumber: p.state.ElBlockNumber, + }, nil +} + +func (p *StaticNetworkStateProvider) GetLatestFinalizedBeaconBlock() (beacon.BeaconBlock, error) { + return p.GetLatestBeaconBlock() +} diff --git a/shared/services/state/static_provider_test.go b/shared/services/state/static_provider_test.go new file mode 100644 index 000000000..1e438ca08 --- /dev/null +++ b/shared/services/state/static_provider_test.go @@ -0,0 +1,300 @@ +package state + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/rocket-pool/smartnode/bindings/types" +) + +const minimalStatePath = "./testdata/minimal_state.json" + +func TestStaticProviderFromFile(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(minimalStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + ns, err := provider.GetHeadState() + if err != nil { + t.Fatalf("GetHeadState: %v", err) + } + + if ns.ElBlockNumber != 24866136 { + t.Errorf("ElBlockNumber: got %d, want 24866136", ns.ElBlockNumber) + } + if ns.BeaconSlotNumber != 14100211 { + t.Errorf("BeaconSlotNumber: got %d, want 14100211", ns.BeaconSlotNumber) + } + + // Verify index maps were rebuilt by UnmarshalJSON + if len(ns.NodeDetails) != 1 { + t.Fatalf("NodeDetails count: got %d, want 1", len(ns.NodeDetails)) + } + nodeAddr := ns.NodeDetails[0].NodeAddress + if _, ok := ns.NodeDetailsByAddress[nodeAddr]; !ok { + t.Errorf("NodeDetailsByAddress missing %s", nodeAddr.Hex()) + } + + if len(ns.MinipoolDetails) != 1 { + t.Fatalf("MinipoolDetails count: got %d, want 1", len(ns.MinipoolDetails)) + } + mpAddr := ns.MinipoolDetails[0].MinipoolAddress + if _, ok := ns.MinipoolDetailsByAddress[mpAddr]; !ok { + t.Errorf("MinipoolDetailsByAddress missing %s", mpAddr.Hex()) + } + + if len(ns.MinipoolValidatorDetails) != 1 { + t.Errorf("MinipoolValidatorDetails count: got %d, want 1", len(ns.MinipoolValidatorDetails)) + } + if len(ns.MegapoolValidatorDetails) != 1 { + t.Errorf("MegapoolValidatorDetails count: got %d, want 1", len(ns.MegapoolValidatorDetails)) + } + if len(ns.MegapoolValidatorGlobalIndex) != 1 { + t.Errorf("MegapoolValidatorGlobalIndex count: got %d, want 1", len(ns.MegapoolValidatorGlobalIndex)) + } + if len(ns.OracleDaoMemberDetails) != 1 { + t.Errorf("OracleDaoMemberDetails count: got %d, want 1", len(ns.OracleDaoMemberDetails)) + } + if len(ns.ProtocolDaoProposalDetails) != 1 { + t.Errorf("ProtocolDaoProposalDetails count: got %d, want 1", len(ns.ProtocolDaoProposalDetails)) + } +} + +func TestStaticProviderGetHeadStateForNode(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(minimalStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + // Address is ignored for the static provider, but the call must succeed. + ns, err := provider.GetHeadStateForNode(common.HexToAddress("0x1234")) + if err != nil { + t.Fatalf("GetHeadStateForNode: %v", err) + } + if ns.ElBlockNumber != 24866136 { + t.Errorf("ElBlockNumber: got %d, want 24866136", ns.ElBlockNumber) + } +} + +func TestStaticProviderGetStateForSlot(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(minimalStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + ns, err := provider.GetStateForSlot(999) + if err != nil { + t.Fatalf("GetStateForSlot: %v", err) + } + if ns.BeaconSlotNumber != 14100211 { + t.Errorf("BeaconSlotNumber: got %d, want 14100211", ns.BeaconSlotNumber) + } +} + +func TestStaticProviderGetLatestBeaconBlock(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(minimalStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + block, err := provider.GetLatestBeaconBlock() + if err != nil { + t.Fatalf("GetLatestBeaconBlock: %v", err) + } + if block.Slot != 14100211 { + t.Errorf("Slot: got %d, want 14100211", block.Slot) + } + if block.ExecutionBlockNumber != 24866136 { + t.Errorf("ExecutionBlockNumber: got %d, want 24866136", block.ExecutionBlockNumber) + } + if !block.HasExecutionPayload { + t.Error("HasExecutionPayload: got false, want true") + } +} + +func TestStaticProviderGetLatestFinalizedBeaconBlock(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(minimalStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + block, err := provider.GetLatestFinalizedBeaconBlock() + if err != nil { + t.Fatalf("GetLatestFinalizedBeaconBlock: %v", err) + } + if block.Slot != 14100211 { + t.Errorf("Slot: got %d, want 14100211", block.Slot) + } +} + +const smallStatePath = "./testdata/small_state.json" + +func TestStaticProviderMegapoolDetails(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(smallStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + ns, err := provider.GetHeadState() + if err != nil { + t.Fatalf("GetHeadState: %v", err) + } + + // MegapoolDetails must be non-nil and populated from the JSON + if ns.MegapoolDetails == nil { + t.Fatal("MegapoolDetails is nil after loading from JSON") + } + if len(ns.MegapoolDetails) == 0 { + t.Fatal("MegapoolDetails is empty after loading from JSON") + } + + // Every entry's map key must match its Address field + for addr, details := range ns.MegapoolDetails { + if addr != details.Address { + t.Errorf("MegapoolDetails key %s does not match Address field %s", addr.Hex(), details.Address.Hex()) + } + } + + // Spot-check: all loaded megapools must be deployed (per the fixture data) + for addr, details := range ns.MegapoolDetails { + if !details.Deployed { + t.Errorf("MegapoolDetails[%s].Deployed is false, expected true", addr.Hex()) + } + } +} + +func TestStaticProviderMegapoolToPubkeysMap(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(smallStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + ns, err := provider.GetHeadState() + if err != nil { + t.Fatalf("GetHeadState: %v", err) + } + + // MegapoolToPubkeysMap must be rebuilt from MegapoolValidatorGlobalIndex + if ns.MegapoolToPubkeysMap == nil { + t.Fatal("MegapoolToPubkeysMap is nil after loading from JSON") + } + + // Every pubkey in the map must have a corresponding MegapoolValidatorInfo entry + for addr, pubkeys := range ns.MegapoolToPubkeysMap { + for _, pk := range pubkeys { + if _, ok := ns.MegapoolValidatorInfo[pk]; !ok { + t.Errorf("pubkey from MegapoolToPubkeysMap[%s] not found in MegapoolValidatorInfo", addr.Hex()) + } + } + } + + // Total pubkeys across all megapools must equal the non-empty entries in MegapoolValidatorGlobalIndex + totalPubkeys := 0 + for _, pks := range ns.MegapoolToPubkeysMap { + totalPubkeys += len(pks) + } + + expectedCount := 0 + for _, v := range ns.MegapoolValidatorGlobalIndex { + if len(v.Pubkey) > 0 { + expectedCount++ + } + } + if totalPubkeys != expectedCount { + t.Errorf("MegapoolToPubkeysMap total pubkeys: got %d, want %d", totalPubkeys, expectedCount) + } +} + +func TestStaticProviderMegapoolValidatorInfo(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(smallStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + ns, err := provider.GetHeadState() + if err != nil { + t.Fatalf("GetHeadState: %v", err) + } + + if ns.MegapoolValidatorInfo == nil { + t.Fatal("MegapoolValidatorInfo is nil after loading from JSON") + } + + // Every entry in MegapoolValidatorInfo must point back into MegapoolValidatorGlobalIndex + for pk, info := range ns.MegapoolValidatorInfo { + found := false + for i := range ns.MegapoolValidatorGlobalIndex { + candidate := &ns.MegapoolValidatorGlobalIndex[i] + if candidate == info { + found = true + break + } + } + if !found { + t.Errorf("MegapoolValidatorInfo[%x] does not point into MegapoolValidatorGlobalIndex", pk[:4]) + } + } +} + +func TestStaticProviderChallengeableProposal(t *testing.T) { + provider, err := NewStaticNetworkStateProviderFromFile(smallStatePath) + if err != nil { + t.Fatalf("NewStaticNetworkStateProviderFromFile: %v", err) + } + + ns, err := provider.GetHeadState() + if err != nil { + t.Fatalf("GetHeadState: %v", err) + } + + if len(ns.ProtocolDaoProposalDetails) == 0 { + t.Fatal("ProtocolDaoProposalDetails is empty") + } + + // Find proposals in Pending state (challengeable) + pendingCount := 0 + for _, prop := range ns.ProtocolDaoProposalDetails { + if prop.State == types.ProtocolDaoProposalState_Pending && prop.ID != 0 { + pendingCount++ + + // Compute slot time from beacon config + slotTime := ns.BeaconConfig.GenesisTime + ns.BeaconSlotNumber*ns.BeaconConfig.SecondsPerSlot + challengeDeadline := prop.CreatedTime.Add(prop.ChallengeWindow) + + // The proposal must still be within its challenge window relative to slot time + if uint64(challengeDeadline.Unix()) <= slotTime { + t.Errorf("Pending proposal %d: challenge window expired before slot time (deadline %s, slot time %d)", + prop.ID, challengeDeadline, slotTime) + } + + // Proposal bond and challenge bond must be positive + if prop.ProposalBond == nil || prop.ProposalBond.Sign() <= 0 { + t.Errorf("Pending proposal %d has non-positive ProposalBond", prop.ID) + } + if prop.ChallengeBond == nil || prop.ChallengeBond.Sign() <= 0 { + t.Errorf("Pending proposal %d has non-positive ChallengeBond", prop.ID) + } + + t.Logf("Found challengeable proposal: id=%d, proposer=%s, message=%q, challengeDeadline=%s", + prop.ID, prop.ProposerAddress.Hex(), prop.Message, challengeDeadline) + } + } + + if pendingCount == 0 { + t.Error("No Pending (challengeable) proposals found in fixture") + } +} + +func TestStaticProviderFromConstructor(t *testing.T) { + ns := buildTestState() + provider := NewStaticNetworkStateProvider(ns) + + got, err := provider.GetHeadState() + if err != nil { + t.Fatalf("GetHeadState: %v", err) + } + if got != ns { + t.Error("GetHeadState returned a different pointer than the one provided") + } +} diff --git a/shared/services/state/testdata/minimal_state.json b/shared/services/state/testdata/minimal_state.json new file mode 100644 index 000000000..1f5b1358a --- /dev/null +++ b/shared/services/state/testdata/minimal_state.json @@ -0,0 +1,266 @@ +{ + "el_block_number": 24866136, + "beacon_slot_number": 14100211, + "beacon_config": { + "genesis_fork_version": "0x00000000", + "genesis_validators_root": "0x4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95", + "genesis_epoch": 0, + "genesis_time": 1606824023, + "seconds_per_slot": 12, + "slots_per_epoch": 32, + "seconds_per_epoch": 384, + "epochs_per_sync_committee_period": 256 + }, + "network_details": { + "rpl_price": 776478216768226, + "min_collateral_fraction": null, + "max_collateral_fraction": null, + "minimum_legacy_rpl_stake_fraction": 150000000000000000, + "interval_duration": 2419200000000000, + "interval_start": "2026-04-09T02:35:39-03:00", + "node_operator_rewards_percent": 700000000000000000, + "trusted_node_operator_rewards_percent": 25000000000000000, + "protocol_dao_rewards_percent": 275000000000000000, + "pending_rpl_rewards": 11960955922800823950327, + "reward_index": 48, + "scrub_period": 43200000000000, + "smoothing_pool_address": "0xd4e96ef8eee8678dbff4d535e033ed1a4f7605b7", + "deposit_pool_balance": 24931958235492440846, + "deposit_pool_excess": 0, + "queue_capacity": { + "Total": 0, + "Effective": 0 + }, + "queue_length": 0, + "rpl_inflation_interval_rate": 1000133680617113500, + "rpl_total_supply": 22367035426763561716994616, + "prices_block": 24861736, + "latest_reportable_prices_block": 0, + "eth_utilization_rate": 0.8712405169631294, + "staking_eth_balance": 341917464851876559540958, + "reth_exchange_rate": 1.1612320967638408, + "total_eth_balance": 392448994502337156290059, + "reth_balance": 1636472342448477906006, + "total_reth_supply": 337945353472962104952775, + "total_rpl_stake": 8098072833508269448304164, + "total_network_megapool_staked_rpl": 939405862506464476158282, + "total_legacy_staked_rpl": 7158666971001804972145882, + "smoothing_pool_balance": 1817511848245644155, + "pending_voter_share": 0, + "node_fee": 0.05, + "balances_block": 24861736, + "latest_reportable_balances_block": 0, + "submit_balances_enabled": true, + "submit_prices_enabled": true, + "minipool_launch_timeout": 1209600, + "promotion_scrub_period": 259200000000000, + "bond_reduction_window_start": 43200000000000, + "bond_reduction_window_length": 172800000000000, + "deposit_pool_user_balance": -7927068041764507559154, + "prices_submission_frequency": 86400, + "balances_submission_frequency": 86400, + "MegapoolRevenueSplitSettings": { + "node_operator_commission_share": 50000000000000000, + "node_operator_commission_adder": 0, + "voter_commission_share": 90000000000000000, + "pdao_commission_share": 0 + }, + "MegapoolRevenueSplitTimeWeightedAverages": { + "node_share": 50000000000000000, + "voter_share": 90000000000000000, + "pdao_share": 0 + }, + "pending_voter_share_eth": 0, + "reduced_bond": 4000000000000000000 + }, + "node_details": [ + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "Australia/Sydney", + "fee_distributor_initialised": false, + "fee_distributor_address": "0xeff6728ae7080251577b3795b9e4261d2ae1254b", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 0, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 0, + "eth_bonded": 0, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 0, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 0, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 0, + "megapool_validator_count": 0, + "balance_eth": 8418496487119000, + "balance_reth": 0, + "balance_rpl": 57536544484369712, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0xd2a4848a6644749e652c1d9398b5aa317f57395b", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 0, + "node_address": "0xfe1f75e8e3c4516c8526911f9cec0f0570588aea", + "average_node_fee": 0, + "collateralisation_ratio": 2000000000000000000, + "distributor_balance": 0, + "megapool_address": "0x1b4ff4ef12a881341357c563c76252b7bdccb99b", + "megapool_deployed": false + } + ], + "minipool_details": [ + { + "exists": true, + "minipool_address": "0x56b678c9be79dbf30b19f7361aeb5c7bcb973916", + "pubkey": "b505b14d17c0e6f9719ce4b22f71da941caff7827a8311a0a366afd8d274c76ccaf108626260bcee8f9c0f1d8bd5f979", + "status_raw": 2, + "status_block": 13338063, + "status_time": 1633153391, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1633153265, + "use_latest_delegate": false, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x64627611655c8cdcafae7607589b4483a1578f4a", + "version": 3, + "balance": 90122563450000000, + "distributable_balance": 31264774000000000, + "node_share_of_balance": 11098994770000000, + "user_share_of_balance": 20165779230000000, + "node_refund_balance": 58857789450000000, + "withdrawal_credentials": "0x01000000000000000000000056b678c9be79dbf30b19f7361aeb5c7bcb973916", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8011198014565000000, + "user_share_of_balance_including_beacon": 24020345688435000000, + "node_share_of_beacon_balance": 8000099019795000000, + "user_share_of_beacon_balance": 24000179909205000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1692447707, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + } + ], + "megapool_validator_global_index": [ + { + "Pubkey": "kfTiOePLQfXr42OG93ZH9YjW1qQ5Z4ZHT1Vfxv8cO0mRXId/pegZuEpkxVOFmZuW", + "ValidatorInfo": { + "LastAssignmentTime": 1771372823, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": false, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x7eb3b28eefe1b25ad5257318710abe6249aabdbc", + "ValidatorId": 0 + } + ], + "validator_details": [ + { + "pubkey": "9084ea3ad00a45571eb5a51e19e558f2fae6178cd514988c0df2fc2b478f2e4177f755a2db3d5fc8f9ff18515f08d55b", + "index": "500912", + "withdrawal_credentials": "0x010000000000000000000000bd388a756dbf73d896017e04a817cd63bab3b0d6", + "balance": 32014643978, + "status": "active_ongoing", + "effective_balance": 32000000000, + "slashed": false, + "activation_eligibility_epoch": 174499, + "activation_epoch": 174536, + "exit_epoch": 18446744073709551615, + "withdrawable_epoch": 18446744073709551615, + "exists": true + } + ], + "megapool_validator_details": [ + { + "pubkey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "index": "", + "withdrawal_credentials": "0x0000000000000000000000000000000000000000000000000000000000000000", + "balance": 0, + "status": "", + "effective_balance": 0, + "slashed": false, + "activation_eligibility_epoch": 0, + "activation_epoch": 0, + "exit_epoch": 0, + "withdrawable_epoch": 0, + "exists": false + } + ], + "oracle_dao_member_details": [ + { + "address": "0xb3a533098485bede3cb7fa8711af84fe0bb1e0ad", + "exists": true, + "id": "nimbus", + "url": "https://nimbus.team", + "joinedTime": "2021-12-20T08:52:01-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + } + ], + "protocol_dao_proposal_details": [ + { + "id": 1, + "dao": "", + "proposerAddress": "0x0f617c3691dd48e7d2f909d48197a9cb49696f1f", + "targetBlock": 21874233, + "message": "update RPL rewards distribution", + "createdTime": "2025-02-18T12:53:35-03:00", + "challengeWindow": 1800000000000, + "startTime": "2025-02-25T12:53:35-03:00", + "phase1EndTime": "2025-03-04T12:53:35-03:00", + "phase2EndTime": "2025-03-11T12:53:35-03:00", + "expiryTime": "2025-04-08T12:53:35-03:00", + "votingPowerRequired": 12503027397435500499408, + "votingPowerFor": 23917574318012563724, + "votingPowerAgainst": 0, + "votingPowerAbstained": 3150956914197554277, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": false, + "isVetoed": false, + "vetoQuorum": 42510293151280701697988, + "payload": "dyf+YgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY0V4XYoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D/CwE7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJtuZKjsYAAA==", + "payloadStr": "proposalSettingRewardsClaimers(25000000000000000,275000000000000000,700000000000000000)", + "state": 5, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + } + ] +} diff --git a/shared/services/state/testdata/network_state.json.gz b/shared/services/state/testdata/network_state.json.gz new file mode 100644 index 000000000..49cfca43f Binary files /dev/null and b/shared/services/state/testdata/network_state.json.gz differ diff --git a/shared/services/state/testdata/small_state.json b/shared/services/state/testdata/small_state.json new file mode 100644 index 000000000..36e97f870 --- /dev/null +++ b/shared/services/state/testdata/small_state.json @@ -0,0 +1,8137 @@ +{ + "el_block_number": 24879811, + "beacon_slot_number": 14113923, + "beacon_config": { + "genesis_fork_version": "0x00000000", + "genesis_validators_root": "0x4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95", + "genesis_epoch": 0, + "genesis_time": 1606824023, + "seconds_per_slot": 12, + "slots_per_epoch": 32, + "seconds_per_epoch": 384, + "epochs_per_sync_committee_period": 256 + }, + "network_details": { + "rpl_price": 769290801996347, + "min_collateral_fraction": null, + "max_collateral_fraction": null, + "minimum_legacy_rpl_stake_fraction": 150000000000000000, + "interval_duration": 2419200000000000, + "interval_start": "2026-04-09T02:35:39-03:00", + "node_operator_rewards_percent": 700000000000000000, + "trusted_node_operator_rewards_percent": 25000000000000000, + "protocol_dao_rewards_percent": 275000000000000000, + "pending_rpl_rewards": 17943832573340215568545, + "reward_index": 48, + "scrub_period": 43200000000000, + "smoothing_pool_address": "0xd4e96ef8eee8678dbff4d535e033ed1a4f7605b7", + "deposit_pool_balance": 24931958235492440846, + "deposit_pool_excess": 0, + "queue_capacity": { + "Total": 0, + "Effective": 0 + }, + "queue_length": 0, + "rpl_inflation_interval_rate": 1000133680617113500, + "rpl_total_supply": 22367035426763561716994616, + "prices_block": 24876097, + "latest_reportable_prices_block": 0, + "eth_utilization_rate": 0.8664390676178502, + "staking_eth_balance": 340571417532849325110122, + "reth_exchange_rate": 1.161361759810098, + "total_eth_balance": 393070246092667017109023, + "reth_balance": 2224148175222317944602, + "total_reth_supply": 338360158912466277545855, + "total_rpl_stake": 8107811906214522956424886, + "total_network_megapool_staked_rpl": 951538151350856523495156, + "total_legacy_staked_rpl": 7156273754863666432929730, + "smoothing_pool_balance": 3493026238132472184, + "pending_voter_share": 0, + "node_fee": 0.05, + "balances_block": 24876097, + "latest_reportable_balances_block": 0, + "submit_balances_enabled": true, + "submit_prices_enabled": true, + "minipool_launch_timeout": 1209600, + "promotion_scrub_period": 259200000000000, + "bond_reduction_window_start": 43200000000000, + "bond_reduction_window_length": 172800000000000, + "deposit_pool_user_balance": -7919068041764507559154, + "prices_submission_frequency": 86400, + "balances_submission_frequency": 86400, + "MegapoolRevenueSplitSettings": { + "node_operator_commission_share": 50000000000000000, + "node_operator_commission_adder": 0, + "voter_commission_share": 90000000000000000, + "pdao_commission_share": 0 + }, + "MegapoolRevenueSplitTimeWeightedAverages": { + "node_share": 50000000000000000, + "voter_share": 90000000000000000, + "pdao_share": 0 + }, + "pending_voter_share_eth": 0, + "reduced_bond": 4000000000000000000 + }, + "node_details": [ + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "Australia/Sydney", + "fee_distributor_initialised": false, + "fee_distributor_address": "0xeff6728ae7080251577b3795b9e4261d2ae1254b", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 0, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 0, + "eth_bonded": 0, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 0, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 0, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 0, + "megapool_validator_count": 0, + "balance_eth": 8418496487119000, + "balance_reth": 0, + "balance_rpl": 57536544484369712, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0xd2a4848a6644749e652c1d9398b5aa317f57395b", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 0, + "node_address": "0xfe1f75e8e3c4516c8526911f9cec0f0570588aea", + "average_node_fee": 0, + "collateralisation_ratio": 2000000000000000000, + "distributor_balance": 0, + "megapool_address": "0x1b4ff4ef12a881341357c563c76252b7bdccb99b", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "America/Los_Angeles", + "fee_distributor_initialised": false, + "fee_distributor_address": "0xddf60470a6cfd677445e784d3c9aafba1b96f12f", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 0, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 0, + "eth_bonded": 0, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 0, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 300000000473800306499, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 0, + "megapool_validator_count": 0, + "balance_eth": 202521529729513999, + "balance_reth": 0, + "balance_rpl": 0, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0xd2a4848a6644749e652c1d9398b5aa317f57395b", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 0, + "node_address": "0xccbff44e0f0329527feb0167bc8744d7d5aed3e9", + "average_node_fee": 0, + "collateralisation_ratio": 2000000000000000000, + "distributor_balance": 0, + "megapool_address": "0x3566ec0ea6409af4715bce50c0771ce75a520f4b", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "America/New_York", + "fee_distributor_initialised": false, + "fee_distributor_address": "0x6522d18256d8ff22ffa481e95aab726d70e440c4", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 0, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 0, + "eth_bonded": 0, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 0, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 0, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 0, + "megapool_validator_count": 0, + "balance_eth": 17915401919120000, + "balance_reth": 0, + "balance_rpl": 0, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0xd2a4848a6644749e652c1d9398b5aa317f57395b", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 0, + "node_address": "0x8b371a3bbe75ee4746a191aee69400f8ebb99eeb", + "average_node_fee": 0, + "collateralisation_ratio": 2000000000000000000, + "distributor_balance": 0, + "megapool_address": "0x589d7973705c2cd7759c1daed44eaf063f07162d", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "Europe/London", + "fee_distributor_initialised": false, + "fee_distributor_address": "0x5a53cf4093628b0619a3ab47d7660f7a5616e29e", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 0, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 0, + "eth_bonded": 0, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 0, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 0, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 0, + "megapool_validator_count": 0, + "balance_eth": 97392408367685164, + "balance_reth": 0, + "balance_rpl": 948989031536, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0x2a1af071ef61a7003fa57df47d93ad82b66344b7", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 0, + "node_address": "0x8d074ad69b55dd57da2708306f1c200ae1803359", + "average_node_fee": 0, + "collateralisation_ratio": 2000000000000000000, + "distributor_balance": 0, + "megapool_address": "0xb441e14e12c642c1ae6c33e9cea18492292057cf", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "America/New_York", + "fee_distributor_initialised": true, + "fee_distributor_address": "0x51dee76f12bbb3ce93e09dbab7951152f5f2f9ee", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 0, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 0, + "eth_bonded": 0, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 0, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 0, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 15, + "megapool_validator_count": 0, + "balance_eth": 91376115898994, + "balance_reth": 0, + "balance_rpl": 0, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0x689c6853f3debac91b72f32bafa83200eec9613c", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": true, + "smoothing_pool_registration_changed": 1661731855, + "node_address": "0x33043c521e9c3e80e0c05a2c25f2e894fefc0328", + "average_node_fee": 0, + "collateralisation_ratio": 2000000000000000000, + "distributor_balance": 0, + "megapool_address": "0x9fc178c22a209e71ccf5c69eda35257e0501ee63", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "Australia/Brisbane", + "fee_distributor_initialised": true, + "fee_distributor_address": "0x0f60e3aa62eca79e8daec700bef07972db358ce3", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 2496000000000000000000, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 2496000000000000000000, + "eth_bonded": 832000000000000000000, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 832000000000000000000, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 70349045176595779797890, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 104, + "megapool_validator_count": 0, + "balance_eth": 113045113564388284, + "balance_reth": 0, + "balance_rpl": 0, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 32744482665678990, + "distributor_balance_node_eth": 18022157126071380, + "withdrawal_address": "0x98294f70a703e379adae7d80d9692d5c34c303d6", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 1732939079, + "node_address": "0x64627611655c8cdcafae7607589b4483a1578f4a", + "average_node_fee": 140000000000000000, + "collateralisation_ratio": 4000000000000000000, + "distributor_balance": 50766639791750370, + "megapool_address": "0x1e99cc705f0debdd1507272829018806ca1e6c28", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "Australia/Brisbane", + "fee_distributor_initialised": false, + "fee_distributor_address": "0x5c33d8a7000a2448f4e21098c0c0c8d095e45754", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 0, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 0, + "eth_bonded": 0, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 0, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 0, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 0, + "megapool_validator_count": 0, + "balance_eth": 409024940646000, + "balance_reth": 0, + "balance_rpl": 0, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0x9e4c596db9d03f464a668ec185e9b44d5b8fbc71", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 0, + "node_address": "0x9e4c596db9d03f464a668ec185e9b44d5b8fbc71", + "average_node_fee": 0, + "collateralisation_ratio": 2000000000000000000, + "distributor_balance": 0, + "megapool_address": "0x3565e415266f31fecdbe86c8f14384c9221617c2", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1633060014, + "timezone_location": "Australia/Brisbane", + "fee_distributor_initialised": true, + "fee_distributor_address": "0x54876715e4e77cded1a143bd8d80f3275e72c6a2", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 72000000000000000000, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 72000000000000000000, + "eth_bonded": 24000000000000000000, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 24000000000000000000, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 843717898453440018528, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 3, + "megapool_validator_count": 0, + "balance_eth": 112286218449449679, + "balance_reth": 0, + "balance_rpl": 0, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0x02e1c80a8113b2d53f7816ac1da051d78b13f0c9", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": true, + "smoothing_pool_registration_changed": 1661735502, + "node_address": "0xc942b5aa63a3410a13358a7a3aedf33d9e9d3ac3", + "average_node_fee": 140000000000000000, + "collateralisation_ratio": 4000000000000000000, + "distributor_balance": 0, + "megapool_address": "0xe7e5acf573be5b8f56aa30046726bbf0a07bcd00", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1636416510, + "timezone_location": "America/New_York", + "fee_distributor_initialised": true, + "fee_distributor_address": "0x90765169fb6309e4afc58a2bf730b69cb83b8c00", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 96000000000000000000, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 0, + "minipool_eth_borrowed": 96000000000000000000, + "eth_bonded": 32000000000000000000, + "megapool_eth_bonded": 0, + "minipool_eth_bonded": 32000000000000000000, + "megapool_staked_rpl": 0, + "legacy_staked_rpl": 1715981243419371004946, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 18, + "megapool_validator_count": 0, + "balance_eth": 368378094254557384, + "balance_reth": 0, + "balance_rpl": 88052359080876727988, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0x0dd7397e821a042621da96f6f546fffb7ec4c18c", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": false, + "smoothing_pool_registration_changed": 1723026323, + "node_address": "0x0dd7397e821a042621da96f6f546fffb7ec4c18c", + "average_node_fee": 140000000000000000, + "collateralisation_ratio": 4000000000000000000, + "distributor_balance": 0, + "megapool_address": "0xec8ab31e97cd6daa59d22046217790a2238319fa", + "megapool_deployed": false + }, + { + "exists": true, + "registration_time": 1636416513, + "timezone_location": "America/Chicago", + "fee_distributor_initialised": true, + "fee_distributor_address": "0x8ba5e3eb9cc15362928bdb5def98009b6c0996d9", + "reward_network": 0, + "effective_rpl_stake": null, + "minimum_rpl_stake": null, + "maximum_rpl_stake": null, + "eth_borrowed": 1140000000000000000000, + "eth_borrowed_limit": null, + "megapool_eth_borrowed": 84000000000000000000, + "minipool_eth_borrowed": 1056000000000000000000, + "eth_bonded": 364000000000000000000, + "megapool_eth_bonded": 12000000000000000000, + "minipool_eth_bonded": 352000000000000000000, + "megapool_staked_rpl": 3436171957813934769781, + "legacy_staked_rpl": 26500335482494612845277, + "unstaking_rpl": 0, + "locked_rpl": 0, + "minipool_count": 46, + "megapool_validator_count": 0, + "balance_eth": 746240573664136556, + "balance_reth": 0, + "balance_rpl": 0, + "balance_old_rpl": 0, + "deposit_credit_balance": 0, + "distributor_balance_user_eth": 0, + "distributor_balance_node_eth": 0, + "withdrawal_address": "0x399e0ae23663f27181ebb4e66ec504b3aab25541", + "pending_withdrawal_address": "0x0000000000000000000000000000000000000000", + "smoothing_pool_registration_state": true, + "smoothing_pool_registration_changed": 1661731798, + "node_address": "0x751683968fd078341c48b90bc657d6babc2339f7", + "average_node_fee": 140000000000000000, + "collateralisation_ratio": 4000000000000000000, + "distributor_balance": 0, + "megapool_address": "0x49177f3f4a5e9591791d5418a6fcecd3e301080b", + "megapool_deployed": true + } + ], + "minipool_details": [ + { + "exists": true, + "minipool_address": "0x56b678c9be79dbf30b19f7361aeb5c7bcb973916", + "pubkey": "b505b14d17c0e6f9719ce4b22f71da941caff7827a8311a0a366afd8d274c76ccaf108626260bcee8f9c0f1d8bd5f979", + "status_raw": 2, + "status_block": 13338063, + "status_time": 1633153391, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1633153265, + "use_latest_delegate": false, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x64627611655c8cdcafae7607589b4483a1578f4a", + "version": 3, + "balance": 90122563450000000, + "distributable_balance": 31264774000000000, + "node_share_of_balance": 11098994770000000, + "user_share_of_balance": 20165779230000000, + "node_refund_balance": 58857789450000000, + "withdrawal_credentials": "0x01000000000000000000000056b678c9be79dbf30b19f7361aeb5c7bcb973916", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8012520128285000000, + "user_share_of_balance_including_beacon": 24022747838715000000, + "node_share_of_beacon_balance": 8001421133515000000, + "user_share_of_beacon_balance": 24002582059485000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1692447707, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0x91595d677f2a19b771815965f926e3ef53537d0c", + "pubkey": "af58626df299b097aac139db69914457639fdc209a4655afdb060a018316b8f9d68873a54e1a813e969e15e28f6282b1", + "status_raw": 2, + "status_block": 13351312, + "status_time": 1633333068, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1633333031, + "use_latest_delegate": false, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x64627611655c8cdcafae7607589b4483a1578f4a", + "version": 3, + "balance": 123905033105000000, + "distributable_balance": 31204149000000000, + "node_share_of_balance": 11077472895000000, + "user_share_of_balance": 20126676105000000, + "node_refund_balance": 92700884105000000, + "withdrawal_credentials": "0x01000000000000000000000091595d677f2a19b771815965f926e3ef53537d0c", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8012502356275000000, + "user_share_of_balance_including_beacon": 24022715548725000000, + "node_share_of_beacon_balance": 8001424883380000000, + "user_share_of_beacon_balance": 24002588872620000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1692447719, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0xd32b67257468c298f5f0b0fe41eb5a95bdb60b8a", + "pubkey": "b3e56556eba53de50632b445abfc6c0b732287e6207b6a0f755672a50ed5713dd0b028dd2676f1812223d1e074219fb1", + "status_raw": 2, + "status_block": 13539186, + "status_time": 1635878552, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1635835230, + "use_latest_delegate": false, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x64627611655c8cdcafae7607589b4483a1578f4a", + "version": 3, + "balance": 90073052805000000, + "distributable_balance": 31271140000000000, + "node_share_of_balance": 11101254700000000, + "user_share_of_balance": 20169885300000000, + "node_refund_balance": 58801912805000000, + "withdrawal_credentials": "0x010000000000000000000000d32b67257468c298f5f0b0fe41eb5a95bdb60b8a", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8012523028990000000, + "user_share_of_balance_including_beacon": 24022753109010000000, + "node_share_of_beacon_balance": 8001421774290000000, + "user_share_of_beacon_balance": 24002583223710000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1681835471, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0xa77e57ed01a20fb1a76ed3ef03315012f240c86e", + "pubkey": "ace62a00048f84c7917e2d0a706abdde4066832bb3cf625599213f0555e3f09a3c9a361e743f53e312c2f8ad0db1d8af", + "status_raw": 2, + "status_block": 13557759, + "status_time": 1636130823, + "finalised": true, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1636087530, + "use_latest_delegate": false, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x33043c521e9c3e80e0c05a2c25f2e894fefc0328", + "version": 3, + "balance": 0, + "distributable_balance": 0, + "node_share_of_balance": 0, + "user_share_of_balance": 0, + "node_refund_balance": 0, + "withdrawal_credentials": "0x010000000000000000000000a77e57ed01a20fb1a76ed3ef03315012f240c86e", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 0, + "user_share_of_balance_including_beacon": 0, + "node_share_of_beacon_balance": 0, + "user_share_of_beacon_balance": 0, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1681829675, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0x0c00106cdcb79b2fdfe1e88cae909c1c4ca0680a", + "pubkey": "a1df386873a11bce3ab8ae213e2d8d0c07043dc34ca6b82a16ac090df2b2c4671df5d40212569cc860e975ee2cddd45e", + "status_raw": 2, + "status_block": 13558015, + "status_time": 1636134028, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1636090771, + "use_latest_delegate": true, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0x03d30466d199ef540823fe2a22cae2e3b9343bb0", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0xc942b5aa63a3410a13358a7a3aedf33d9e9d3ac3", + "version": 3, + "balance": 132364712930000000, + "distributable_balance": 80281894000000000, + "node_share_of_balance": 28500072370000000, + "user_share_of_balance": 51781821630000000, + "node_refund_balance": 52082818930000000, + "withdrawal_credentials": "0x0100000000000000000000000c00106cdcb79b2fdfe1e88cae909c1c4ca0680a", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8029701509520000000, + "user_share_of_balance_including_beacon": 24053964714480000000, + "node_share_of_beacon_balance": 8001201437150000000, + "user_share_of_beacon_balance": 24002182892850000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1681821287, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0x5a94a8b4482d61d51e3f3830212a1d82df64b6eb", + "pubkey": "b8e4c2b951cac6db27dd3da24cbd36232a28153261db9c8641ac5bf13a7955456e7cef5cdb0b89d18671c87413e7daa1", + "status_raw": 2, + "status_block": 13582104, + "status_time": 1636460277, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1636416647, + "use_latest_delegate": false, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x0dd7397e821a042621da96f6f546fffb7ec4c18c", + "version": 3, + "balance": 734368650370000000, + "distributable_balance": 30961961000000000, + "node_share_of_balance": 10991496155000000, + "user_share_of_balance": 19970464845000000, + "node_refund_balance": 703406689370000000, + "withdrawal_credentials": "0x0100000000000000000000005a94a8b4482d61d51e3f3830212a1d82df64b6eb", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8012375984085000000, + "user_share_of_balance_including_beacon": 24022485942915000000, + "node_share_of_beacon_balance": 8001384487930000000, + "user_share_of_beacon_balance": 24002515478070000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1697278763, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0xb6f14a4dfc7266654aa40f8c38297573db072f26", + "pubkey": "a38827bf5a75e29dc84718f763ee2dd7b45ce242c61290f695df12c24608b7895b45e22fb419d4d160d1ce94a9bcb122", + "status_raw": 2, + "status_block": 13582108, + "status_time": 1636460337, + "finalised": true, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1636416678, + "use_latest_delegate": true, + "delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "previous_delegate": "0x0000000000000000000000000000000000000000", + "effective_delegate": "0x03d30466d199ef540823fe2a22cae2e3b9343bb0", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x5548d14e46bf650da61e8f33b96cc5d14c89f9e9", + "version": 3, + "balance": 0, + "distributable_balance": 0, + "node_share_of_balance": 0, + "user_share_of_balance": 0, + "node_refund_balance": 0, + "withdrawal_credentials": "0x010000000000000000000000b6f14a4dfc7266654aa40f8c38297573db072f26", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 0, + "user_share_of_balance_including_beacon": 0, + "node_share_of_beacon_balance": 0, + "user_share_of_beacon_balance": 0, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1681820303, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0x811b8f9cd8450eb51ac13cedd74c95d549d73aff", + "pubkey": "817e3a7e13b53dc99b2bc727073b4c4253c85a313166102364a5d3a9b44007ebafc256611cd61ff67a5e5bbfcc84720b", + "status_raw": 2, + "status_block": 13582105, + "status_time": 1636460293, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1636416727, + "use_latest_delegate": true, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0x03d30466d199ef540823fe2a22cae2e3b9343bb0", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x751683968fd078341c48b90bc657d6babc2339f7", + "version": 3, + "balance": 66342685945000000, + "distributable_balance": 31314247000000000, + "node_share_of_balance": 11116557685000000, + "user_share_of_balance": 20197689315000000, + "node_refund_balance": 35028438945000000, + "withdrawal_credentials": "0x010000000000000000000000811b8f9cd8450eb51ac13cedd74c95d549d73aff", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8012539105165000000, + "user_share_of_balance_including_beacon": 24022782317835000000, + "node_share_of_beacon_balance": 8001422547480000000, + "user_share_of_beacon_balance": 24002584628520000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1681852667, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0xe28337fdb63b848a2948e6bec11eb90bc7d12545", + "pubkey": "a6a4de5ae41360f87519a75e5c23f0923015dc6de5aadf843bcf90f3d1cec70ddcf91881eb1f1d35f8818ddc813195a3", + "status_raw": 2, + "status_block": 13582154, + "status_time": 1636460963, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1636417434, + "use_latest_delegate": true, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0x03d30466d199ef540823fe2a22cae2e3b9343bb0", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x751683968fd078341c48b90bc657d6babc2339f7", + "version": 3, + "balance": 183809502760000000, + "distributable_balance": 80718954000000000, + "node_share_of_balance": 28655228670000000, + "user_share_of_balance": 52063725330000000, + "node_refund_balance": 103090548760000000, + "withdrawal_credentials": "0x010000000000000000000000e28337fdb63b848a2948e6bec11eb90bc7d12545", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8030077777215000000, + "user_share_of_balance_including_beacon": 24054648355785000000, + "node_share_of_beacon_balance": 8001422548545000000, + "user_share_of_beacon_balance": 24002584630455000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1681852679, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + }, + { + "exists": true, + "minipool_address": "0xc1fbb67cf03ecacc7a4baada85a8c403b5905d50", + "pubkey": "a714bda562d6c4ed68f11491cb1f8dc5f6ed8444a71d81a35448ad224627b91df6dac8b27c6cccc5e0e752a586392966", + "status_raw": 2, + "status_block": 13582134, + "status_time": 1636460650, + "finalised": false, + "deposit_type_raw": 4, + "node_fee": 140000000000000000, + "node_deposit_balance": 8000000000000000000, + "node_deposit_assigned": true, + "user_deposit_balance": 24000000000000000000, + "user_deposit_assigned": true, + "user_deposit_assigned_time": 1636417434, + "use_latest_delegate": true, + "delegate": "0xa347c391bc8f740caba37672157c8aacd08ac567", + "previous_delegate": "0xe7e0ddc778d6332c449dc0789c1c8b7c1c6154c2", + "effective_delegate": "0x03d30466d199ef540823fe2a22cae2e3b9343bb0", + "penalty_count": 0, + "penalty_rate": 0, + "node_address": "0x82ed7b4d62b6f1e297ed1cc598b42d61c89ea791", + "version": 3, + "balance": 131900111510000000, + "distributable_balance": 79611607000000000, + "node_share_of_balance": 28262120485000000, + "user_share_of_balance": 51349486515000000, + "node_refund_balance": 52288504510000000, + "withdrawal_credentials": "0x010000000000000000000000c1fbb67cf03ecacc7a4baada85a8c403b5905d50", + "status": "Staking", + "deposit_type": "Variable", + "node_share_of_balance_including_beacon": 8029683085375000000, + "user_share_of_balance_including_beacon": 24053931239625000000, + "node_share_of_beacon_balance": 8001420964890000000, + "user_share_of_beacon_balance": 24002581753110000000, + "user_distributed": false, + "slashed": false, + "is_vacant": false, + "last_bond_reduction_time": 1681820831, + "last_bond_reduction_prev_value": 16000000000000000000, + "last_bond_reduction_prev_node_fee": 150000000000000000, + "reduce_bond_time": 0, + "reduce_bond_cancelled": false, + "reduce_bond_value": 0, + "pre_migration_balance": 0 + } + ], + "megapool_validator_global_index": [ + { + "Pubkey": "kfTiOePLQfXr42OG93ZH9YjW1qQ5Z4ZHT1Vfxv8cO0mRXId/pegZuEpkxVOFmZuW", + "ValidatorInfo": { + "LastAssignmentTime": 1771372823, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": false, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x7eb3b28eefe1b25ad5257318710abe6249aabdbc", + "ValidatorId": 0 + }, + { + "Pubkey": "gAj3G+iewjoH0z1hQxj1Ht5+eZB8Kyu41SH60PKY1gfOe9JHVgv55MVYtrXy6i12", + "ValidatorInfo": { + "LastAssignmentTime": 1771372823, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": false, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x575d3264d304eb70ab131fb9ca252b214fe9f15a", + "ValidatorId": 0 + }, + { + "Pubkey": "sy6CP2SmSnYCCMxG14WkUq48mXQ8ZKtNWuhXCGb7UFLAUnDw8eI27DlMq3o/vyyA", + "ValidatorInfo": { + "LastAssignmentTime": 1771372823, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": false, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x575d3264d304eb70ab131fb9ca252b214fe9f15a", + "ValidatorId": 1 + }, + { + "Pubkey": "ln1pC1YXE2POoBNE5gXgQbe7szljkB9MX5Na4JCaERKTXWIdWmC8pkDH57EGfwpX", + "ValidatorInfo": { + "LastAssignmentTime": 1771372835, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": false, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x17f150fe44bc7f57f241a0ddf39d66d5a6fbaec8", + "ValidatorId": 0 + }, + { + "Pubkey": "tAOnmlhV5Uk5rIc6DTPVcpMmCW9xoC6fU2ayz24aHDn+uRVMRVoyqqZ2G+8/vD9c", + "ValidatorInfo": { + "LastAssignmentTime": 1771372835, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": true, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x8c73122bd9271def27f9d5ff24b1555ce695e318", + "ValidatorId": 0 + }, + { + "Pubkey": "p6I2HWFo3Kg5Ku1dmK7kgI7Teb8U/8Xd1xlmhuu8yld0bCK4ahQYU6KNKBJ/e6HS", + "ValidatorInfo": { + "LastAssignmentTime": 1771372835, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": true, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x8c73122bd9271def27f9d5ff24b1555ce695e318", + "ValidatorId": 1 + }, + { + "Pubkey": "rjDaFa/cDhJ8mXLJwJVTd+QZI/RKykj0TaqTWh2J1EHzknp8J8Ut/W9wrkZlh1FB", + "ValidatorInfo": { + "LastAssignmentTime": 1771372847, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": true, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x8c73122bd9271def27f9d5ff24b1555ce695e318", + "ValidatorId": 2 + }, + { + "Pubkey": "lM0BUwPXZ1sNHlKlIHgW0zj38G+/CplYIRhgdHoYPtFH4A6UkijfX0/DF1BMCLey", + "ValidatorInfo": { + "LastAssignmentTime": 1771372847, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": true, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x8c73122bd9271def27f9d5ff24b1555ce695e318", + "ValidatorId": 3 + }, + { + "Pubkey": "hRtgsSZVTO0rcnbRi8QzMwtTEhh6JxZ5aloBbU94RdSgXnruN4P9cF6DOzjgsb0b", + "ValidatorInfo": { + "LastAssignmentTime": 1771372847, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": true, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x8c73122bd9271def27f9d5ff24b1555ce695e318", + "ValidatorId": 4 + }, + { + "Pubkey": "qrQ912zIarkP25BjIzYwOxDZxZLQ5cKzgvzH3md7e0qackdzRA7K/0aro9B2EBn6", + "ValidatorInfo": { + "LastAssignmentTime": 1771372871, + "LastRequestedValue": 32000, + "LastRequestedBond": 4000, + "DepositValue": 1000, + "Staked": false, + "Exited": false, + "InQueue": false, + "InPrestake": true, + "ExpressUsed": true, + "Dissolved": false, + "Exiting": false, + "Locked": false, + "ExitBalance": 0, + "LockedTime": 0 + }, + "MegapoolAddress": "0x8c73122bd9271def27f9d5ff24b1555ce695e318", + "ValidatorId": 5 + } + ], + "megapool_details": { + "0x001026c70491f0bfd836b8ae2d05dba2fea553b3": { + "address": "0x001026c70491f0bfd836b8ae2d05dba2fea553b3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 60, + "activeValidatorCount": 60, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 1860000000000000000000, + "nodeBond": 240000000000000000000, + "userCapital": 1680000000000000000000, + "bondRequirement": 240000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x04fc77c4ee3ba206935907845228681542ffc04f": { + "address": "0x04fc77c4ee3ba206935907845228681542ffc04f", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x05c6e265962d0b1d4851702648dda90417f9e6f0": { + "address": "0x05c6e265962d0b1d4851702648dda90417f9e6f0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x060b9b56cb662b430430f85c3eeff53507b3f1ba": { + "address": "0x060b9b56cb662b430430f85c3eeff53507b3f1ba", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 16, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 64000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 64000000000000000000 + }, + "0x07f0505b04b256e60537e3cc79303b38b89f2f56": { + "address": "0x07f0505b04b256e60537e3cc79303b38b89f2f56", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x096005aa7a1589fb38f7a000134af506530ccc06": { + "address": "0x096005aa7a1589fb38f7a000134af506530ccc06", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x09b5932dc582fdef98445401ffac0c9b09cac798": { + "address": "0x09b5932dc582fdef98445401ffac0c9b09cac798", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 10, + "activeValidatorCount": 10, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 40000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 40000000000000000000 + }, + "0x09f5060149c61a14140d928a6941254444b5bfd4": { + "address": "0x09f5060149c61a14140d928a6941254444b5bfd4", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x0b97b3820c698b863175e8aec39275d9e0610346": { + "address": "0x0b97b3820c698b863175e8aec39275d9e0610346", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x0d7d78b932f75b4c18597c76d817d47b88ba8efb": { + "address": "0x0d7d78b932f75b4c18597c76d817d47b88ba8efb", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 37, + "activeValidatorCount": 37, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 1147000000000000000000, + "nodeBond": 148000000000000000000, + "userCapital": 1036000000000000000000, + "bondRequirement": 148000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x0ddef86a8406097979b293ae9f9b28e5ad3663c9": { + "address": "0x0ddef86a8406097979b293ae9f9b28e5ad3663c9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x0e948a6f8eff5d1595a8eaeaeb07161a4edfe8ae": { + "address": "0x0e948a6f8eff5d1595a8eaeaeb07161a4edfe8ae", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x107d2f32cf06639c4d7be5ae11498ffb96464fd5": { + "address": "0x107d2f32cf06639c4d7be5ae11498ffb96464fd5", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x11b9169512e8f1d1dd404a4930e64ed712c582e3": { + "address": "0x11b9169512e8f1d1dd404a4930e64ed712c582e3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 93000000000000000000, + "nodeBond": 12000000000000000000, + "userCapital": 84000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x11fdc6c0bec40df6c39f62865350441e30a1e5a2": { + "address": "0x11fdc6c0bec40df6c39f62865350441e30a1e5a2", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x148aa878e2a9fa898ef96492a24697a921b74688": { + "address": "0x148aa878e2a9fa898ef96492a24697a921b74688", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 18, + "activeValidatorCount": 18, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 72000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 72000000000000000000 + }, + "0x14fcd50de18edb499727d43e7bbac22c12cc67d0": { + "address": "0x14fcd50de18edb499727d43e7bbac22c12cc67d0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x15113a77b7dfe2f0df8caa7f3997811a6ae087f9": { + "address": "0x15113a77b7dfe2f0df8caa7f3997811a6ae087f9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x155cc72801817589c388bed27ab3678b42a744e0": { + "address": "0x155cc72801817589c388bed27ab3678b42a744e0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 12, + "activeValidatorCount": 12, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 155000000000000000000, + "nodeBond": 20000000000000000000, + "userCapital": 140000000000000000000, + "bondRequirement": 48000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 28000000000000000000 + }, + "0x16e3a75ff094a6d084e873265a2dd3d3b5321225": { + "address": "0x16e3a75ff094a6d084e873265a2dd3d3b5321225", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x17208d13c1b60a2532a5bd02cc93dfac9f836c05": { + "address": "0x17208d13c1b60a2532a5bd02cc93dfac9f836c05", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x173f639c8c3a17be20d32b7551894b9f96ad647a": { + "address": "0x173f639c8c3a17be20d32b7551894b9f96ad647a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 16, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 64000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 64000000000000000000 + }, + "0x17f150fe44bc7f57f241a0ddf39d66d5a6fbaec8": { + "address": "0x17f150fe44bc7f57f241a0ddf39d66d5a6fbaec8", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 93000000000000000000, + "nodeBond": 12000000000000000000, + "userCapital": 84000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x187259033a0d8a801d89aac24e53849083215baf": { + "address": "0x187259033a0d8a801d89aac24e53849083215baf", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x1ffc637f51078e1a579cac748cca6450f6c2dfdb": { + "address": "0x1ffc637f51078e1a579cac748cca6450f6c2dfdb", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x202e9c76b39f7e1e67f7cb4f69b0b208491f7514": { + "address": "0x202e9c76b39f7e1e67f7cb4f69b0b208491f7514", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x231456d1e8eaf7fb20b4492c28e44160c1519b76": { + "address": "0x231456d1e8eaf7fb20b4492c28e44160c1519b76", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x242b71494fb4912b372f39e0b7232a7e0f858089": { + "address": "0x242b71494fb4912b372f39e0b7232a7e0f858089", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x24b231f6296a65eb43f4232b8ab1c19e6bbad409": { + "address": "0x24b231f6296a65eb43f4232b8ab1c19e6bbad409", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x252926c1faedb6c576a25c64f32334859c333b91": { + "address": "0x252926c1faedb6c576a25c64f32334859c333b91", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x2571149f71228a4b91f4ed6ed5ef9a1618bfdbf9": { + "address": "0x2571149f71228a4b91f4ed6ed5ef9a1618bfdbf9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x27c3d6d64296f4bd5cade79c878e108a4c7c7d42": { + "address": "0x27c3d6d64296f4bd5cade79c878e108a4c7c7d42", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 12000000000000000000 + }, + "0x28f4b296ca87682fb1254033121d685feaa7537a": { + "address": "0x28f4b296ca87682fb1254033121d685feaa7537a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 9, + "activeValidatorCount": 9, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 279000000000000000000, + "nodeBond": 36000000000000000000, + "userCapital": 252000000000000000000, + "bondRequirement": 36000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x2a0397ae7b1fe1a536492316b25d9a10992d3024": { + "address": "0x2a0397ae7b1fe1a536492316b25d9a10992d3024", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x2a49ee6ebfd0149c62dd1365431967a15e6143ba": { + "address": "0x2a49ee6ebfd0149c62dd1365431967a15e6143ba", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 175, + "activeValidatorCount": 175, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 700000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 700000000000000000000 + }, + "0x2a5552663e53a6b807c3615a625496f265cc0774": { + "address": "0x2a5552663e53a6b807c3615a625496f265cc0774", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 185, + "activeValidatorCount": 185, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 2170000000000000000000, + "nodeBond": 280000000000000000000, + "userCapital": 1960000000000000000000, + "bondRequirement": 740000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 460000000000000000000 + }, + "0x2ab7c535b1875a4212eb41e45a905d5f72495b73": { + "address": "0x2ab7c535b1875a4212eb41e45a905d5f72495b73", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 12000000000000000000 + }, + "0x2bf8800f5ba6c5663d2c5783c80732675195f5f1": { + "address": "0x2bf8800f5ba6c5663d2c5783c80732675195f5f1", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 38, + "activeValidatorCount": 38, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 341000000000000000000, + "nodeBond": 44000000000000000000, + "userCapital": 308000000000000000000, + "bondRequirement": 152000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 108000000000000000000 + }, + "0x2c3f93b90010d7d0c72a50d308f4056a90c73e17": { + "address": "0x2c3f93b90010d7d0c72a50d308f4056a90c73e17", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x2d21e1442e4763ec806539455b971d74dd6e33f0": { + "address": "0x2d21e1442e4763ec806539455b971d74dd6e33f0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x2d30eb165bbd226b4eb5d4fe5f972b1766cff977": { + "address": "0x2d30eb165bbd226b4eb5d4fe5f972b1766cff977", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 25, + "activeValidatorCount": 12, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 372000000000000000000, + "nodeBond": 48000000000000000000, + "userCapital": 336000000000000000000, + "bondRequirement": 48000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x2d4ca1fe4b201d26e4b905ba77a4f910b2ebce17": { + "address": "0x2d4ca1fe4b201d26e4b905ba77a4f910b2ebce17", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x2d84269e8c35d220f6bfc07074bfc1d67aad3560": { + "address": "0x2d84269e8c35d220f6bfc07074bfc1d67aad3560", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x2dca2a6de4955fae58210e13d46d01b1126ac364": { + "address": "0x2dca2a6de4955fae58210e13d46d01b1126ac364", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x31d871d06111bd805b291f46864637d8d176d51f": { + "address": "0x31d871d06111bd805b291f46864637d8d176d51f", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x340a8e4893cfee38f6d49c22a283c7ca49431ecb": { + "address": "0x340a8e4893cfee38f6d49c22a283c7ca49431ecb", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 10, + "activeValidatorCount": 10, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 40000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 40000000000000000000 + }, + "0x3498e8a0bb496dd801f9a46a867ff3dec314b9ad": { + "address": "0x3498e8a0bb496dd801f9a46a867ff3dec314b9ad", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x36cac45b796ba3a1a05c3761803f475cfe27f1ee": { + "address": "0x36cac45b796ba3a1a05c3761803f475cfe27f1ee", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 62, + "activeValidatorCount": 62, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 1922000000000000000000, + "nodeBond": 248000000000000000000, + "userCapital": 1736000000000000000000, + "bondRequirement": 248000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x371086f01f0210bf6cd24cb21983b6e3da826281": { + "address": "0x371086f01f0210bf6cd24cb21983b6e3da826281", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x37f6fab61e720f372b5aa5b3965bf93142855ab6": { + "address": "0x37f6fab61e720f372b5aa5b3965bf93142855ab6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 20000000000000000000 + }, + "0x38213679572b497ff2ea70782591996fa0f127bc": { + "address": "0x38213679572b497ff2ea70782591996fa0f127bc", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x3875fd40236bf85a1da7df80e7f7bb163398e34d": { + "address": "0x3875fd40236bf85a1da7df80e7f7bb163398e34d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 24, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x398ce8f4bd0abd06b82d6af5c83914535eea4da3": { + "address": "0x398ce8f4bd0abd06b82d6af5c83914535eea4da3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x398d873e823fcdff7764fe49d322d53d6eff6931": { + "address": "0x398d873e823fcdff7764fe49d322d53d6eff6931", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x3993a11d14b39a816e122e04575d867eb5fa2f14": { + "address": "0x3993a11d14b39a816e122e04575d867eb5fa2f14", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 69, + "activeValidatorCount": 69, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 868000000000000000000, + "nodeBond": 112000000000000000000, + "userCapital": 784000000000000000000, + "bondRequirement": 276000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 164000000000000000000 + }, + "0x39c3911cad928028a40e7ae65bbcab292f56e4a5": { + "address": "0x39c3911cad928028a40e7ae65bbcab292f56e4a5", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 798, + "activeValidatorCount": 798, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 24738000000000000000000, + "nodeBond": 3192000000000000000000, + "userCapital": 22344000000000000000000, + "bondRequirement": 3192000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x39d19de7d3f36992ca145d431fc09b9aa9928c4b": { + "address": "0x39d19de7d3f36992ca145d431fc09b9aa9928c4b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x3aa4c1ba16d861646b64b69e90e59f28b40cb244": { + "address": "0x3aa4c1ba16d861646b64b69e90e59f28b40cb244", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x3b42f9123fec85d13426e1d7593f3ac2f563daeb": { + "address": "0x3b42f9123fec85d13426e1d7593f3ac2f563daeb", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x3c3c0a6b259fa55ba5adc439df1c107ec77f030e": { + "address": "0x3c3c0a6b259fa55ba5adc439df1c107ec77f030e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x3cb664484946227a0e6e7dafd930dbfe3b86fb11": { + "address": "0x3cb664484946227a0e6e7dafd930dbfe3b86fb11", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x3cdac283878b9d40ae559c827ace256c56537a4e": { + "address": "0x3cdac283878b9d40ae559c827ace256c56537a4e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x3ceea4a4d077c24eaa0a24765b3f23143cc57bb9": { + "address": "0x3ceea4a4d077c24eaa0a24765b3f23143cc57bb9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x3d978b8de96583b3388bfd3abc5ff38562d52517": { + "address": "0x3d978b8de96583b3388bfd3abc5ff38562d52517", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 12000000000000000000 + }, + "0x3eedc0eb271804ec68df9bccfd565aa31df2a9c9": { + "address": "0x3eedc0eb271804ec68df9bccfd565aa31df2a9c9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 34, + "activeValidatorCount": 34, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 136000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 136000000000000000000 + }, + "0x3f75221b6e67bfe82a2796096d522e156feafa6c": { + "address": "0x3f75221b6e67bfe82a2796096d522e156feafa6c", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 20, + "activeValidatorCount": 20, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 80000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 80000000000000000000 + }, + "0x3fe49eae720d868e878bc227e3b5edcdedbf46f4": { + "address": "0x3fe49eae720d868e878bc227e3b5edcdedbf46f4", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 41, + "activeValidatorCount": 41, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 1271000000000000000000, + "nodeBond": 164000000000000000000, + "userCapital": 1148000000000000000000, + "bondRequirement": 164000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x402634757cfef54ee78b1e6e36a6cf5454702597": { + "address": "0x402634757cfef54ee78b1e6e36a6cf5454702597", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x410a22b5c662b9e3a03dca5672c06ac8f6506b36": { + "address": "0x410a22b5c662b9e3a03dca5672c06ac8f6506b36", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 47, + "activeValidatorCount": 47, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 1085000000000000000000, + "nodeBond": 140000000000000000000, + "userCapital": 980000000000000000000, + "bondRequirement": 188000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 48000000000000000000 + }, + "0x4245b9d87b2ac9fb1c0d9517ae7b01a025a47991": { + "address": "0x4245b9d87b2ac9fb1c0d9517ae7b01a025a47991", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x46e5cd357cd6dac27c707906e2cc886fbce1674b": { + "address": "0x46e5cd357cd6dac27c707906e2cc886fbce1674b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x46e6ee4217f750e2bab65c8912f1f3c06f648bf1": { + "address": "0x46e6ee4217f750e2bab65c8912f1f3c06f648bf1", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 16, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 372000000000000000000, + "nodeBond": 48000000000000000000, + "userCapital": 336000000000000000000, + "bondRequirement": 64000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x47b73a43a2979588df06c616a7337d3a0b385f79": { + "address": "0x47b73a43a2979588df06c616a7337d3a0b385f79", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x49177f3f4a5e9591791d5418a6fcecd3e301080b": { + "address": "0x49177f3f4a5e9591791d5418a6fcecd3e301080b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 93000000000000000000, + "nodeBond": 12000000000000000000, + "userCapital": 84000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x4a1d58b784bf1808472f108dbef2ab41c97c02b7": { + "address": "0x4a1d58b784bf1808472f108dbef2ab41c97c02b7", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 13, + "activeValidatorCount": 13, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 52000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 52000000000000000000 + }, + "0x4a8a46fb5f7dfdff74ee083b71ad765ec5a41513": { + "address": "0x4a8a46fb5f7dfdff74ee083b71ad765ec5a41513", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x4a97717085ba68b3bcfbd4b00f2a221dfc0a369a": { + "address": "0x4a97717085ba68b3bcfbd4b00f2a221dfc0a369a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x4aaba51421402ac6d6e9d956be16b916210d791e": { + "address": "0x4aaba51421402ac6d6e9d956be16b916210d791e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x4b66f1ceda1c3f38ab9edb5c22eaf24a2d13b97d": { + "address": "0x4b66f1ceda1c3f38ab9edb5c22eaf24a2d13b97d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x4be2a5122a95a1a2039e3416ea4d64249f04f765": { + "address": "0x4be2a5122a95a1a2039e3416ea4d64249f04f765", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 11, + "activeValidatorCount": 11, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 44000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 44000000000000000000 + }, + "0x4ce5d4e9c6b12c2e2fb9e7ac39bb9407c95e2e84": { + "address": "0x4ce5d4e9c6b12c2e2fb9e7ac39bb9407c95e2e84", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x4ec9501eb17eb4940321949a48adea3577be1b83": { + "address": "0x4ec9501eb17eb4940321949a48adea3577be1b83", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 15, + "activeValidatorCount": 15, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 60000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 60000000000000000000 + }, + "0x4f4a75267902020f8edb257c7b759118fe9ada60": { + "address": "0x4f4a75267902020f8edb257c7b759118fe9ada60", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x4fb8244bfc58ecc251dec763a556ea9f0fe59514": { + "address": "0x4fb8244bfc58ecc251dec763a556ea9f0fe59514", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x5061840caee4439eee98dd0eca18249f2f2f52a0": { + "address": "0x5061840caee4439eee98dd0eca18249f2f2f52a0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x50986f9d79b00f16de4a9b6a10b27d6f2023ce25": { + "address": "0x50986f9d79b00f16de4a9b6a10b27d6f2023ce25", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x543dba54e98feb402dc11a4ad476c9ab892e81dc": { + "address": "0x543dba54e98feb402dc11a4ad476c9ab892e81dc", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 125, + "activeValidatorCount": 125, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 2170000000000000000000, + "nodeBond": 280000000000000000000, + "userCapital": 1960000000000000000000, + "bondRequirement": 500000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 220000000000000000000 + }, + "0x54972d3994f5b1a3b802129e71f5532000f27b18": { + "address": "0x54972d3994f5b1a3b802129e71f5532000f27b18", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 109, + "activeValidatorCount": 96, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 2511000000000000000000, + "nodeBond": 324000000000000000000, + "userCapital": 2268000000000000000000, + "bondRequirement": 384000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 60000000000000000000 + }, + "0x556c4160df4fa6fb3c17cb37bf8ffaac057d999a": { + "address": "0x556c4160df4fa6fb3c17cb37bf8ffaac057d999a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x56f45fa3e02162b6f2a4d00950276add90ec9efa": { + "address": "0x56f45fa3e02162b6f2a4d00950276add90ec9efa", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x575d3264d304eb70ab131fb9ca252b214fe9f15a": { + "address": "0x575d3264d304eb70ab131fb9ca252b214fe9f15a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x5790bbce7dcaf2600239c09c5e5c8b9231ebf927": { + "address": "0x5790bbce7dcaf2600239c09c5e5c8b9231ebf927", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x57b14688d6e1eba6645465a8820369d5fda39cdc": { + "address": "0x57b14688d6e1eba6645465a8820369d5fda39cdc", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x59590a3ae46658ff842306f95f3b368c5dd5384e": { + "address": "0x59590a3ae46658ff842306f95f3b368c5dd5384e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x59c61a4a5aedb9104dc945777652678f25d9ea81": { + "address": "0x59c61a4a5aedb9104dc945777652678f25d9ea81", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x5a9c7a86e141485ebe9bd510f08d3711bc72ffdf": { + "address": "0x5a9c7a86e141485ebe9bd510f08d3711bc72ffdf", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x5e3ef49aabf836c8c30ec53978e4b88ca006b091": { + "address": "0x5e3ef49aabf836c8c30ec53978e4b88ca006b091", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x5e87f9f4454ff90495bfe9d7e65b927693ed8e98": { + "address": "0x5e87f9f4454ff90495bfe9d7e65b927693ed8e98", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 12, + "activeValidatorCount": 12, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 372000000000000000000, + "nodeBond": 48000000000000000000, + "userCapital": 336000000000000000000, + "bondRequirement": 48000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x5f19d09553b513c383e8e6bd3ab9c67f912b0bf3": { + "address": "0x5f19d09553b513c383e8e6bd3ab9c67f912b0bf3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 59, + "activeValidatorCount": 59, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 236000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 236000000000000000000 + }, + "0x609391eee517fb2db9cf7262b0fe5ec2a1410484": { + "address": "0x609391eee517fb2db9cf7262b0fe5ec2a1410484", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 24000000000000000000 + }, + "0x60f55f15cbeafbe37c9fd918aee3a08d05d7ed59": { + "address": "0x60f55f15cbeafbe37c9fd918aee3a08d05d7ed59", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x6125a75cdfa947cf4f7be55bfb02f632957f13e7": { + "address": "0x6125a75cdfa947cf4f7be55bfb02f632957f13e7", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x61f76bc6f04d19beaec73bcdbda4b1ede8d8cd29": { + "address": "0x61f76bc6f04d19beaec73bcdbda4b1ede8d8cd29", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 30, + "activeValidatorCount": 30, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 120000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 120000000000000000000 + }, + "0x62b90bca9e9668f2c1e7cb1a9daa3bc41d7e00f6": { + "address": "0x62b90bca9e9668f2c1e7cb1a9daa3bc41d7e00f6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x62df03a1e9342e380a21930b75051c14bf29d641": { + "address": "0x62df03a1e9342e380a21930b75051c14bf29d641", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x6354446c7f7abb5d7ef434cd6be2518eeea55992": { + "address": "0x6354446c7f7abb5d7ef434cd6be2518eeea55992", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 16, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 496000000000000000000, + "nodeBond": 64000000000000000000, + "userCapital": 448000000000000000000, + "bondRequirement": 64000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x6394c9e9e2d5f2a14eafa5614b8254a4a7c0a924": { + "address": "0x6394c9e9e2d5f2a14eafa5614b8254a4a7c0a924", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 16, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 496000000000000000000, + "nodeBond": 64000000000000000000, + "userCapital": 448000000000000000000, + "bondRequirement": 64000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x63d4bafca9e70f862ff69ab001cf31e41ab2ce2e": { + "address": "0x63d4bafca9e70f862ff69ab001cf31e41ab2ce2e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x643ed728a1745d886cca8c3fa6f955131d5ae28d": { + "address": "0x643ed728a1745d886cca8c3fa6f955131d5ae28d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x64cb5817d21fe30ae7d05676e365ccb0378f9a57": { + "address": "0x64cb5817d21fe30ae7d05676e365ccb0378f9a57", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x66e20ba42b71bb51b2b1ef02751a1055680793ba": { + "address": "0x66e20ba42b71bb51b2b1ef02751a1055680793ba", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 10, + "activeValidatorCount": 10, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 186000000000000000000, + "nodeBond": 24000000000000000000, + "userCapital": 168000000000000000000, + "bondRequirement": 40000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x670d826569e4c504f942314fdab620711ca74186": { + "address": "0x670d826569e4c504f942314fdab620711ca74186", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 25, + "activeValidatorCount": 25, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 100000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 100000000000000000000 + }, + "0x6823548e0487fe5fa03dd41b2e2c943e6c05a733": { + "address": "0x6823548e0487fe5fa03dd41b2e2c943e6c05a733", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 20000000000000000000 + }, + "0x68f47397b8b665bea18d8205e491c21d2041355e": { + "address": "0x68f47397b8b665bea18d8205e491c21d2041355e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x69366e127515e0354e604ebb0dfb6d5df1111379": { + "address": "0x69366e127515e0354e604ebb0dfb6d5df1111379", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x6944161af4b898e75f7424d5e35cf735ebb176f8": { + "address": "0x6944161af4b898e75f7424d5e35cf735ebb176f8", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 21, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x6961569e9e72ee271def3f8dc137855e229932a9": { + "address": "0x6961569e9e72ee271def3f8dc137855e229932a9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 30, + "activeValidatorCount": 30, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 120000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 120000000000000000000 + }, + "0x6abfeea929bd250f20b344c831135ce8a627195e": { + "address": "0x6abfeea929bd250f20b344c831135ce8a627195e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x6ca73e1c2e447026227f7aceaf1dcdfbcf75849c": { + "address": "0x6ca73e1c2e447026227f7aceaf1dcdfbcf75849c", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 12, + "activeValidatorCount": 12, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 372000000000000000000, + "nodeBond": 48000000000000000000, + "userCapital": 336000000000000000000, + "bondRequirement": 48000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x6d3cad7445b4cc17714acaa35c81acbf8d1e2b98": { + "address": "0x6d3cad7445b4cc17714acaa35c81acbf8d1e2b98", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x6e607a4b0dc7ff62d035f9e54fc33baaf43a6245": { + "address": "0x6e607a4b0dc7ff62d035f9e54fc33baaf43a6245", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x70f519ce921aa76ceb869ff39cf070c5b86f0e4b": { + "address": "0x70f519ce921aa76ceb869ff39cf070c5b86f0e4b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x72a6a17fadaa0d70bb6887faf163f0bf294932d7": { + "address": "0x72a6a17fadaa0d70bb6887faf163f0bf294932d7", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x730b8e0438b739e0d1e969743f3669ab178a7b9d": { + "address": "0x730b8e0438b739e0d1e969743f3669ab178a7b9d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x7479e9a3d36bd74f8ce89f284a50deafd090663d": { + "address": "0x7479e9a3d36bd74f8ce89f284a50deafd090663d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x74e722d3a0373787228bb74dc829e735afaa74ef": { + "address": "0x74e722d3a0373787228bb74dc829e735afaa74ef", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x75955d4867edef5af5846dddb2a1a71b7bc6df10": { + "address": "0x75955d4867edef5af5846dddb2a1a71b7bc6df10", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x7b7ffa1d358f69d7afe4439ca25766ff00b7066f": { + "address": "0x7b7ffa1d358f69d7afe4439ca25766ff00b7066f", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x7c83b68b2998eb3aaf5715da9ea77fc817bc6a73": { + "address": "0x7c83b68b2998eb3aaf5715da9ea77fc817bc6a73", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 22, + "activeValidatorCount": 22, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 682000000000000000000, + "nodeBond": 88000000000000000000, + "userCapital": 616000000000000000000, + "bondRequirement": 88000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x7cae22a19d9db483a7a76e313c2b34922b2235b2": { + "address": "0x7cae22a19d9db483a7a76e313c2b34922b2235b2", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x7eb3b28eefe1b25ad5257318710abe6249aabdbc": { + "address": "0x7eb3b28eefe1b25ad5257318710abe6249aabdbc", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 93000000000000000000, + "nodeBond": 12000000000000000000, + "userCapital": 84000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x8041f4fecc8c92dd4be86cb1760d304c1f2c6335": { + "address": "0x8041f4fecc8c92dd4be86cb1760d304c1f2c6335", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x809ea47b9e54708c3b41057d3431b0659e0d5cb6": { + "address": "0x809ea47b9e54708c3b41057d3431b0659e0d5cb6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 25, + "activeValidatorCount": 25, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 775000000000000000000, + "nodeBond": 100000000000000000000, + "userCapital": 700000000000000000000, + "bondRequirement": 100000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x80a6fc45dd12eebed3e68f86be42a40faecfe050": { + "address": "0x80a6fc45dd12eebed3e68f86be42a40faecfe050", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 106, + "activeValidatorCount": 106, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 424000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 424000000000000000000 + }, + "0x8236d80c86ff9f8168a174b86da7898e415e27a6": { + "address": "0x8236d80c86ff9f8168a174b86da7898e415e27a6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 10, + "activeValidatorCount": 10, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 40000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 40000000000000000000 + }, + "0x82e01ab84efb00123b9478164668ec8224aa34d4": { + "address": "0x82e01ab84efb00123b9478164668ec8224aa34d4", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 12, + "activeValidatorCount": 12, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 372000000000000000000, + "nodeBond": 48000000000000000000, + "userCapital": 336000000000000000000, + "bondRequirement": 48000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x83d5972fb93a3bb0dd26e365d030dc1003fdc26c": { + "address": "0x83d5972fb93a3bb0dd26e365d030dc1003fdc26c", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x84ffc4fde074c63a065328a850c8c56dfc448949": { + "address": "0x84ffc4fde074c63a065328a850c8c56dfc448949", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x856b5e6b28b85ec8c3e2ef4e49c1ca54ad50e3fc": { + "address": "0x856b5e6b28b85ec8c3e2ef4e49c1ca54ad50e3fc", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 7, + "activeValidatorCount": 7, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 28000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 24000000000000000000 + }, + "0x85aae9b1b4016e46c1e23761f14d2fb768a868ba": { + "address": "0x85aae9b1b4016e46c1e23761f14d2fb768a868ba", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x85b4e95cfeee1ab6ef647111308c81d90e242acf": { + "address": "0x85b4e95cfeee1ab6ef647111308c81d90e242acf", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 155000000000000000000, + "nodeBond": 20000000000000000000, + "userCapital": 140000000000000000000, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x86886076b99b7c65092f180fde8318f3a2ff5595": { + "address": "0x86886076b99b7c65092f180fde8318f3a2ff5595", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x86cb5e1a76916178293bb508498bb0108feb755b": { + "address": "0x86cb5e1a76916178293bb508498bb0108feb755b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x874f4e2bb80bf1c5ddf67128673269f8e08419ae": { + "address": "0x874f4e2bb80bf1c5ddf67128673269f8e08419ae", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x8757206f757de5cff43e04e745e44fcefef91462": { + "address": "0x8757206f757de5cff43e04e745e44fcefef91462", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x89edeb54dad88438d951ad958db15c7cebc70fc1": { + "address": "0x89edeb54dad88438d951ad958db15c7cebc70fc1", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x8aba615ebf656c9832610d0f74f5c4e0bdac88c4": { + "address": "0x8aba615ebf656c9832610d0f74f5c4e0bdac88c4", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 12, + "activeValidatorCount": 12, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 310000000000000000000, + "nodeBond": 40000000000000000000, + "userCapital": 280000000000000000000, + "bondRequirement": 48000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0x8ae5cbe85af0bee492c07f61b07a7e6e1f85e243": { + "address": "0x8ae5cbe85af0bee492c07f61b07a7e6e1f85e243", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x8b20b3732b60852c3d5757cad1eb3d73b8d6ba2f": { + "address": "0x8b20b3732b60852c3d5757cad1eb3d73b8d6ba2f", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x8b6c3df877536da8ad9dfcee4ce796a93e67177c": { + "address": "0x8b6c3df877536da8ad9dfcee4ce796a93e67177c", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x8c121b1a4d725120529661ca7763ecf980ba88ba": { + "address": "0x8c121b1a4d725120529661ca7763ecf980ba88ba", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x8c73122bd9271def27f9d5ff24b1555ce695e318": { + "address": "0x8c73122bd9271def27f9d5ff24b1555ce695e318", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 248000000000000000000, + "nodeBond": 32000000000000000000, + "userCapital": 224000000000000000000, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x8f74e925a69b5a4639323e70ff07ea22b3072f04": { + "address": "0x8f74e925a69b5a4639323e70ff07ea22b3072f04", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 12, + "activeValidatorCount": 12, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 372000000000000000000, + "nodeBond": 48000000000000000000, + "userCapital": 336000000000000000000, + "bondRequirement": 48000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x91b18e51cbf2cd9712da7e6f2209edc8cc4f8286": { + "address": "0x91b18e51cbf2cd9712da7e6f2209edc8cc4f8286", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 93000000000000000000, + "nodeBond": 12000000000000000000, + "userCapital": 84000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x927771a34dcfbfaa0db53683f78fea5537afe9b4": { + "address": "0x927771a34dcfbfaa0db53683f78fea5537afe9b4", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 27, + "activeValidatorCount": 27, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 108000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 100000000000000000000 + }, + "0x9458497f336ab81602b9a7f1241d90d39e0f38f6": { + "address": "0x9458497f336ab81602b9a7f1241d90d39e0f38f6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 21, + "activeValidatorCount": 21, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 651000000000000000000, + "nodeBond": 84000000000000000000, + "userCapital": 588000000000000000000, + "bondRequirement": 84000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x946b59dd4fb701e3078f38fb82c713c81ffd1db7": { + "address": "0x946b59dd4fb701e3078f38fb82c713c81ffd1db7", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 155000000000000000000, + "nodeBond": 20000000000000000000, + "userCapital": 140000000000000000000, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x94f31a996acd928fd65b3cb797d792bd867ccec3": { + "address": "0x94f31a996acd928fd65b3cb797d792bd867ccec3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x9777ab70c7f5925bd97739365c3e6e9a63ec9fb8": { + "address": "0x9777ab70c7f5925bd97739365c3e6e9a63ec9fb8", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0x9802eaa903c1c39b73a57c1b9c5c63e3875a6195": { + "address": "0x9802eaa903c1c39b73a57c1b9c5c63e3875a6195", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x997d32ac7fefdb784c7c7cd6944f68fec2495b5b": { + "address": "0x997d32ac7fefdb784c7c7cd6944f68fec2495b5b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0x99dc921df343fe4619a438359b676c1d3f0f3ff5": { + "address": "0x99dc921df343fe4619a438359b676c1d3f0f3ff5", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x9a3327a9d22d8d51d103e7e3085ba16bc6d1406e": { + "address": "0x9a3327a9d22d8d51d103e7e3085ba16bc6d1406e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x9b58c444689a7a3b80b1a3b9f60fb2439c8e2049": { + "address": "0x9b58c444689a7a3b80b1a3b9f60fb2439c8e2049", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x9b6d791482053d988c6f846f230be4a50ece5000": { + "address": "0x9b6d791482053d988c6f846f230be4a50ece5000", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0x9dfbd3d803772c5b40f37edab498e66c6fa8e169": { + "address": "0x9dfbd3d803772c5b40f37edab498e66c6fa8e169", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 25, + "activeValidatorCount": 25, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 100000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 100000000000000000000 + }, + "0x9ecb2ba200a5e08c0b8c2a9a797531dddfc70462": { + "address": "0x9ecb2ba200a5e08c0b8c2a9a797531dddfc70462", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0x9ff7335e9df777813f781d169a0618e79bd7c561": { + "address": "0x9ff7335e9df777813f781d169a0618e79bd7c561", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xa06d6c19e662a1f3608e259753cd040395f18406": { + "address": "0xa06d6c19e662a1f3608e259753cd040395f18406", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 14, + "activeValidatorCount": 14, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 56000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 48000000000000000000 + }, + "0xa2bf96bdb6d68d1e6278cc5491516e2916e1ff65": { + "address": "0xa2bf96bdb6d68d1e6278cc5491516e2916e1ff65", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xa43294e8cf620f525afe3e5e08720763ddce524d": { + "address": "0xa43294e8cf620f525afe3e5e08720763ddce524d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xa59e63eee2f1a8f0517aa2aba896fe76584c1ae3": { + "address": "0xa59e63eee2f1a8f0517aa2aba896fe76584c1ae3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xa5f43bc53976d966e40dcab05b51dbcc08e56923": { + "address": "0xa5f43bc53976d966e40dcab05b51dbcc08e56923", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xa805395cd14da055ba3f05ff400bcbb68e4b66b0": { + "address": "0xa805395cd14da055ba3f05ff400bcbb68e4b66b0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xa8223aaec5156ef96d87d3926bba28830f0482e3": { + "address": "0xa8223aaec5156ef96d87d3926bba28830f0482e3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xa8ae9700f19230ca8beb04bb6ecd17f205d50618": { + "address": "0xa8ae9700f19230ca8beb04bb6ecd17f205d50618", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 17, + "activeValidatorCount": 17, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 527000000000000000000, + "nodeBond": 68000000000000000000, + "userCapital": 476000000000000000000, + "bondRequirement": 68000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xa9eb034b0de946e404c65a3b14b8f7d0a24cc8f6": { + "address": "0xa9eb034b0de946e404c65a3b14b8f7d0a24cc8f6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xaa1b77f558955af7e5df8c20357f4065329675b6": { + "address": "0xaa1b77f558955af7e5df8c20357f4065329675b6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xaabc622455e489f27ffe18697bb6f09c8fee7287": { + "address": "0xaabc622455e489f27ffe18697bb6f09c8fee7287", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xab34928010918829ecfbfb912f818547b8235c02": { + "address": "0xab34928010918829ecfbfb912f818547b8235c02", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 36, + "activeValidatorCount": 36, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 144000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 144000000000000000000 + }, + "0xab41cacbe49c26993c4c33f2abd2a7633cddefe6": { + "address": "0xab41cacbe49c26993c4c33f2abd2a7633cddefe6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xaba524ac37db09c3b212bab69d4ec623cefaec73": { + "address": "0xaba524ac37db09c3b212bab69d4ec623cefaec73", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xabcd0a5b383d9910abed9be61e9befedf48d507d": { + "address": "0xabcd0a5b383d9910abed9be61e9befedf48d507d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xad1ecdf7ff65f762b11e9a4e73bda89380905b63": { + "address": "0xad1ecdf7ff65f762b11e9a4e73bda89380905b63", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xadd358a427c6c348e40440263b20e2ee15ec7e64": { + "address": "0xadd358a427c6c348e40440263b20e2ee15ec7e64", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xae353e098d251c004fb2a2f7c1251042b9835289": { + "address": "0xae353e098d251c004fb2a2f7c1251042b9835289", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 16, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 496000000000000000000, + "nodeBond": 64000000000000000000, + "userCapital": 448000000000000000000, + "bondRequirement": 64000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xae5c9b4e6b511e49ceb2f822916eae74ef27faf9": { + "address": "0xae5c9b4e6b511e49ceb2f822916eae74ef27faf9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 20000000000000000000 + }, + "0xaebb51307aa362aab2f20d4a5652c8c35cb824b6": { + "address": "0xaebb51307aa362aab2f20d4a5652c8c35cb824b6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 30, + "activeValidatorCount": 30, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 620000000000000000000, + "nodeBond": 80000000000000000000, + "userCapital": 560000000000000000000, + "bondRequirement": 120000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 40000000000000000000 + }, + "0xb03a15f087ddeae2c88c659ba24dcca8f8609e13": { + "address": "0xb03a15f087ddeae2c88c659ba24dcca8f8609e13", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xb05d065656d4c976ae8d41714156aa420f54baa8": { + "address": "0xb05d065656d4c976ae8d41714156aa420f54baa8", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xb18208080441e2c2e1fc7744b975480e75519d99": { + "address": "0xb18208080441e2c2e1fc7744b975480e75519d99", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 23, + "activeValidatorCount": 23, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 92000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 92000000000000000000 + }, + "0xb3b61c12c8da4eb1f351ae4a3aa007790c6d2a63": { + "address": "0xb3b61c12c8da4eb1f351ae4a3aa007790c6d2a63", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 35, + "activeValidatorCount": 35, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 1085000000000000000000, + "nodeBond": 140000000000000000000, + "userCapital": 980000000000000000000, + "bondRequirement": 140000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xb4a70c2d373c1a1b5fdfb9efa1d6e16c9200dc28": { + "address": "0xb4a70c2d373c1a1b5fdfb9efa1d6e16c9200dc28", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xb5bc214b48d54d065a64fcfa56ab74f0a3a7d5de": { + "address": "0xb5bc214b48d54d065a64fcfa56ab74f0a3a7d5de", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xb67dbb6e1a69d0a6d88ce63ff9725c4b18318fe3": { + "address": "0xb67dbb6e1a69d0a6d88ce63ff9725c4b18318fe3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xb699d7eaf5ea699ef53ada8a44d89920a6107fd1": { + "address": "0xb699d7eaf5ea699ef53ada8a44d89920a6107fd1", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 20000000000000000000 + }, + "0xb6e7f62894f407ead0c9e432f2f95da8835cf722": { + "address": "0xb6e7f62894f407ead0c9e432f2f95da8835cf722", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xb74047dbf2cd959d98769e75d80d8185b3240fbb": { + "address": "0xb74047dbf2cd959d98769e75d80d8185b3240fbb", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xb784c6ededa8fff9a5c46690c7a7dd62bb94ce70": { + "address": "0xb784c6ededa8fff9a5c46690c7a7dd62bb94ce70", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xb83ebe9fb207b78f1ceff77eef306022873757e5": { + "address": "0xb83ebe9fb207b78f1ceff77eef306022873757e5", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xb8dff64ddccfd6cb8032f4d8ca930a36bdc3c47d": { + "address": "0xb8dff64ddccfd6cb8032f4d8ca930a36bdc3c47d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 9, + "activeValidatorCount": 9, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 36000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 36000000000000000000 + }, + "0xb8f54c642056bb6fcd6b5aca3f78ffb8569438f0": { + "address": "0xb8f54c642056bb6fcd6b5aca3f78ffb8569438f0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xba38d1263e4d241967c06272c35bf8ae3f08e688": { + "address": "0xba38d1263e4d241967c06272c35bf8ae3f08e688", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xbb47fa60d73df77962f70b260b8ae6d3ef71873a": { + "address": "0xbb47fa60d73df77962f70b260b8ae6d3ef71873a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xbc2861b0b01e412690a85ac7e33f26b87ef798e3": { + "address": "0xbc2861b0b01e412690a85ac7e33f26b87ef798e3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 7, + "activeValidatorCount": 7, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 28000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 28000000000000000000 + }, + "0xbcc7bfcb87f699335885ca58ffafba69e2aa66d3": { + "address": "0xbcc7bfcb87f699335885ca58ffafba69e2aa66d3", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 248000000000000000000, + "nodeBond": 32000000000000000000, + "userCapital": 224000000000000000000, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xbf6c130395f8031b3231c8f3019ebe4adcf4d2fb": { + "address": "0xbf6c130395f8031b3231c8f3019ebe4adcf4d2fb", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xc032f04a94c5c3bd3c264ebb9f1557e4d2434253": { + "address": "0xc032f04a94c5c3bd3c264ebb9f1557e4d2434253", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xc06b82f4d00088a85ba449830692dbfa894d812a": { + "address": "0xc06b82f4d00088a85ba449830692dbfa894d812a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xc0ec48417c28ad1ad061da245c91e18c9c9f9276": { + "address": "0xc0ec48417c28ad1ad061da245c91e18c9c9f9276", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 16, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 64000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 64000000000000000000 + }, + "0xc1556f1ef9249fbd2beacd8e73556926fc885d3a": { + "address": "0xc1556f1ef9249fbd2beacd8e73556926fc885d3a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 16, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xc29e41c971e36417a4d23cb4f696155e5c59a717": { + "address": "0xc29e41c971e36417a4d23cb4f696155e5c59a717", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 12000000000000000000 + }, + "0xc2a62c6cfcba21a863d594c28ae87d4690c82412": { + "address": "0xc2a62c6cfcba21a863d594c28ae87d4690c82412", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 27, + "activeValidatorCount": 27, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 310000000000000000000, + "nodeBond": 40000000000000000000, + "userCapital": 280000000000000000000, + "bondRequirement": 108000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 68000000000000000000 + }, + "0xc2ea323c6bdf100e85d014929b7a1ff8420a9753": { + "address": "0xc2ea323c6bdf100e85d014929b7a1ff8420a9753", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 56, + "activeValidatorCount": 56, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 224000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 224000000000000000000 + }, + "0xc32505d69534c9a9e807abf40fc09cf9e4c84929": { + "address": "0xc32505d69534c9a9e807abf40fc09cf9e4c84929", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xc328ca0b35549d993674407ebf3c547a2984f240": { + "address": "0xc328ca0b35549d993674407ebf3c547a2984f240", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0xc451aa44d336c30d75a778b968467445a6bfb59a": { + "address": "0xc451aa44d336c30d75a778b968467445a6bfb59a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0xc46dbe2bab2fa15ad4fd24f69c04ff407ec5d744": { + "address": "0xc46dbe2bab2fa15ad4fd24f69c04ff407ec5d744", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 27, + "activeValidatorCount": 27, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 837000000000000000000, + "nodeBond": 108000000000000000000, + "userCapital": 756000000000000000000, + "bondRequirement": 108000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xc4c55c44bb2e1a48f07e0dd42917447a7591d6ff": { + "address": "0xc4c55c44bb2e1a48f07e0dd42917447a7591d6ff", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xc70b5228e7f0442dd93f8b44fc718f65f5cab1ec": { + "address": "0xc70b5228e7f0442dd93f8b44fc718f65f5cab1ec", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xc7b7c307ee213df9aeebd797ab54f2e63db3687b": { + "address": "0xc7b7c307ee213df9aeebd797ab54f2e63db3687b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xc970f6ae512b4550549eb12f6d7e83a366e4a5d5": { + "address": "0xc970f6ae512b4550549eb12f6d7e83a366e4a5d5", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xc9efc754b637d4d818acd0a57ffa3758d91bba71": { + "address": "0xc9efc754b637d4d818acd0a57ffa3758d91bba71", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xc9f3fc79116863e8365fd97d00ea51f9329fe57a": { + "address": "0xc9f3fc79116863e8365fd97d00ea51f9329fe57a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 248000000000000000000, + "nodeBond": 32000000000000000000, + "userCapital": 224000000000000000000, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xca337f35d218fe8b9f9b592ced34dc73956db145": { + "address": "0xca337f35d218fe8b9f9b592ced34dc73956db145", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 93000000000000000000, + "nodeBond": 12000000000000000000, + "userCapital": 84000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xcb45405e4ec86e64c39820789b591ec33c460473": { + "address": "0xcb45405e4ec86e64c39820789b591ec33c460473", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 248000000000000000000, + "nodeBond": 32000000000000000000, + "userCapital": 224000000000000000000, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xcbff4bb1551fcac60ae8feda141544902662526d": { + "address": "0xcbff4bb1551fcac60ae8feda141544902662526d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xcd5c31b69853d8fc5f347f1d29ac58b533937165": { + "address": "0xcd5c31b69853d8fc5f347f1d29ac58b533937165", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 24000000000000000000 + }, + "0xd1c34e1d036d2603cc65dda01498857bafcdcb4c": { + "address": "0xd1c34e1d036d2603cc65dda01498857bafcdcb4c", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xd2b3dd90a12aa8dfaddd39881837803807db1093": { + "address": "0xd2b3dd90a12aa8dfaddd39881837803807db1093", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xd497c7fdeefa93db36a55856740847964eb8ce85": { + "address": "0xd497c7fdeefa93db36a55856740847964eb8ce85", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 186000000000000000000, + "nodeBond": 24000000000000000000, + "userCapital": 168000000000000000000, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xd4b5d5f071397b42628fd1e1d932f19a8ce79a3b": { + "address": "0xd4b5d5f071397b42628fd1e1d932f19a8ce79a3b", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 7, + "activeValidatorCount": 7, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": true, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 28000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 28000000000000000000 + }, + "0xd4e4e04f54f48491a6024ac0868fe251d85a3b7d": { + "address": "0xd4e4e04f54f48491a6024ac0868fe251d85a3b7d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 138, + "activeValidatorCount": 138, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 4278000000000000000000, + "nodeBond": 552000000000000000000, + "userCapital": 3864000000000000000000, + "bondRequirement": 552000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xd68c719ff010868b175d819a26c313f228c2854a": { + "address": "0xd68c719ff010868b175d819a26c313f228c2854a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 24000000000000000000 + }, + "0xd8be6eb9f43c1ca72e7cad1900d5ed68cad9a8e6": { + "address": "0xd8be6eb9f43c1ca72e7cad1900d5ed68cad9a8e6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xd8cfeea756a6c78608fa483fba0dc96d9eb33ea4": { + "address": "0xd8cfeea756a6c78608fa483fba0dc96d9eb33ea4", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xd8d949de8475cd23924fcc66d4c0af499f7ceba2": { + "address": "0xd8d949de8475cd23924fcc66d4c0af499f7ceba2", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xd9933f8200ca14d3f9226e9e3e2632c7295a659a": { + "address": "0xd9933f8200ca14d3f9226e9e3e2632c7295a659a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xd9cfd483772c252b1baad50d8592a952c2aa7a20": { + "address": "0xd9cfd483772c252b1baad50d8592a952c2aa7a20", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xda7a87c1f36ef55f4079abbe5207b3a5ceb783ea": { + "address": "0xda7a87c1f36ef55f4079abbe5207b3a5ceb783ea", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xdd216589b39dcc6a4d697720aa76dd0b1fde1fc9": { + "address": "0xdd216589b39dcc6a4d697720aa76dd0b1fde1fc9", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xddb825a19dd9f3531035c4e2a42b170710ace165": { + "address": "0xddb825a19dd9f3531035c4e2a42b170710ace165", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xddca4ec9ae3d02c7817399e08143dedb51d44f16": { + "address": "0xddca4ec9ae3d02c7817399e08143dedb51d44f16", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xde3befd5aa40dc302c0efb0983fc512c06062bce": { + "address": "0xde3befd5aa40dc302c0efb0983fc512c06062bce", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xde50ac4d21669681a0446af438b0261fb5f93d88": { + "address": "0xde50ac4d21669681a0446af438b0261fb5f93d88", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xde6a109307d840aa9ffb0a7ce7f84d49bad4147e": { + "address": "0xde6a109307d840aa9ffb0a7ce7f84d49bad4147e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 14, + "activeValidatorCount": 14, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 56000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 56000000000000000000 + }, + "0xdfced1cbc513c3d550267eca0f86ee144ae89341": { + "address": "0xdfced1cbc513c3d550267eca0f86ee144ae89341", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 10, + "activeValidatorCount": 10, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 40000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 40000000000000000000 + }, + "0xe0f9f7aeb2f1f0c827035044906fe1c357e396ea": { + "address": "0xe0f9f7aeb2f1f0c827035044906fe1c357e396ea", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 28, + "activeValidatorCount": 28, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 112000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 112000000000000000000 + }, + "0xe40f7a44f74b9beacc64f9cfe132dc14eceff923": { + "address": "0xe40f7a44f74b9beacc64f9cfe132dc14eceff923", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xe53aaf695bc50007a60fcd997181222636b6dc6f": { + "address": "0xe53aaf695bc50007a60fcd997181222636b6dc6f", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xe75264d3362211005047155e4af3dfca0d733a0f": { + "address": "0xe75264d3362211005047155e4af3dfca0d733a0f", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 10, + "activeValidatorCount": 10, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 40000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 40000000000000000000 + }, + "0xe7d15decb924f11aaeec1aafe8323389785ce233": { + "address": "0xe7d15decb924f11aaeec1aafe8323389785ce233", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xe81506fed63892bca180a1afa76c4113593dacd2": { + "address": "0xe81506fed63892bca180a1afa76c4113593dacd2", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xe8d28cc3fdf75dcc3245c457f6f237f5314a07d8": { + "address": "0xe8d28cc3fdf75dcc3245c457f6f237f5314a07d8", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xea8e96906ee043055f643337462ba536df4b5b5e": { + "address": "0xea8e96906ee043055f643337462ba536df4b5b5e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 65, + "activeValidatorCount": 65, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 260000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 260000000000000000000 + }, + "0xebf0232c9b29b0e72114de1d13723911f3c0635c": { + "address": "0xebf0232c9b29b0e72114de1d13723911f3c0635c", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 9, + "activeValidatorCount": 9, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 36000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 36000000000000000000 + }, + "0xecf80d01ebcdb8c6f275f9d20548aa9a7a15b0c0": { + "address": "0xecf80d01ebcdb8c6f275f9d20548aa9a7a15b0c0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 27, + "activeValidatorCount": 27, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 186000000000000000000, + "nodeBond": 24000000000000000000, + "userCapital": 168000000000000000000, + "bondRequirement": 108000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 84000000000000000000 + }, + "0xedbf22a00cb63b5177064df30a7ca77d00897121": { + "address": "0xedbf22a00cb63b5177064df30a7ca77d00897121", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 31, + "activeValidatorCount": 31, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 155000000000000000000, + "nodeBond": 20000000000000000000, + "userCapital": 140000000000000000000, + "bondRequirement": 124000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 104000000000000000000 + }, + "0xeff5f39b7dbb941b65eac081ddebf39e96e6f354": { + "address": "0xeff5f39b7dbb941b65eac081ddebf39e96e6f354", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 18, + "activeValidatorCount": 0, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 0, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xf0b97ef86a1c491fd794fb7853b8c87c05d26004": { + "address": "0xf0b97ef86a1c491fd794fb7853b8c87c05d26004", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 3, + "activeValidatorCount": 3, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 12000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xf14db14f588f984b432fb01260345080528e0fae": { + "address": "0xf14db14f588f984b432fb01260345080528e0fae", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xf2478317635c56291191391a0647d0b1d097af3a": { + "address": "0xf2478317635c56291191391a0647d0b1d097af3a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 16000000000000000000 + }, + "0xf289f43e8c1c8b9441b4d288b44f6e73f3719a40": { + "address": "0xf289f43e8c1c8b9441b4d288b44f6e73f3719a40", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xf34f0873e4477d9d7a744c5dc6d89c9ed57377bc": { + "address": "0xf34f0873e4477d9d7a744c5dc6d89c9ed57377bc", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xf461b3132cb8721f922d28da4d83bba8a50f07ec": { + "address": "0xf461b3132cb8721f922d28da4d83bba8a50f07ec", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xf4f7d306811a705b8708ba4e4aa5c50dd6130d97": { + "address": "0xf4f7d306811a705b8708ba4e4aa5c50dd6130d97", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 28, + "activeValidatorCount": 28, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 868000000000000000000, + "nodeBond": 112000000000000000000, + "userCapital": 784000000000000000000, + "bondRequirement": 112000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xf4ff06eb201f2080d7d9ffa756499094a3625788": { + "address": "0xf4ff06eb201f2080d7d9ffa756499094a3625788", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xf66cbafd8b4a707aa3e2a492fcf325ae1fa46bb6": { + "address": "0xf66cbafd8b4a707aa3e2a492fcf325ae1fa46bb6", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 62000000000000000000, + "nodeBond": 8000000000000000000, + "userCapital": 56000000000000000000, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xf6a150fbedf69a0221cd270a8643dc9a0fcecb9e": { + "address": "0xf6a150fbedf69a0221cd270a8643dc9a0fcecb9e", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xf70e4630bb470ca47e0c991b1c2c0dfee8b4795d": { + "address": "0xf70e4630bb470ca47e0c991b1c2c0dfee8b4795d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xf70f8aaa9f837a5eb963036243178e81b26ceeb0": { + "address": "0xf70f8aaa9f837a5eb963036243178e81b26ceeb0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 389, + "activeValidatorCount": 300, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 31000000000000000000, + "nodeBond": 4000000000000000000, + "userCapital": 28000000000000000000, + "bondRequirement": 1200000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 1196000000000000000000 + }, + "0xf732d057c9ff38c3aab10091fc1729309b5803b8": { + "address": "0xf732d057c9ff38c3aab10091fc1729309b5803b8", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xf7eac112aa279db5a2c2f77587b587d1d3954992": { + "address": "0xf7eac112aa279db5a2c2f77587b587d1d3954992", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 24000000000000000000 + }, + "0xf7fa7f45995f85482614e4c7fdcc037cfa124d4a": { + "address": "0xf7fa7f45995f85482614e4c7fdcc037cfa124d4a", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 5, + "activeValidatorCount": 5, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 20000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 20000000000000000000 + }, + "0xf95eda8bd59cfdb5f20620bbff9dc905f82efba0": { + "address": "0xf95eda8bd59cfdb5f20620bbff9dc905f82efba0", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 6, + "activeValidatorCount": 6, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 186000000000000000000, + "nodeBond": 24000000000000000000, + "userCapital": 168000000000000000000, + "bondRequirement": 24000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + }, + "0xf9f091bd6cc6d53ce5cd3d4469af0a975c030501": { + "address": "0xf9f091bd6cc6d53ce5cd3d4469af0a975c030501", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 32000000000000000000 + }, + "0xfa37cdd3e2787ee64a688d7f6a43944e990d1db2": { + "address": "0xfa37cdd3e2787ee64a688d7f6a43944e990d1db2", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 2, + "activeValidatorCount": 2, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 8000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xfb75920e037176f361aaeb173547dc6db1feb4d4": { + "address": "0xfb75920e037176f361aaeb173547dc6db1feb4d4", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 8, + "activeValidatorCount": 8, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 186000000000000000000, + "nodeBond": 24000000000000000000, + "userCapital": 168000000000000000000, + "bondRequirement": 32000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 8000000000000000000 + }, + "0xfdd68651fb32e80919e7156ad84cc9a7ea195f1d": { + "address": "0xfdd68651fb32e80919e7156ad84cc9a7ea195f1d", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 1, + "activeValidatorCount": 1, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 0, + "nodeBond": 0, + "userCapital": 0, + "bondRequirement": 4000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 4000000000000000000 + }, + "0xfede54fd2c4838bbb43c9d130d642d81d0d4c381": { + "address": "0xfede54fd2c4838bbb43c9d130d642d81d0d4c381", + "delegate": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "effectiveDelegateAddress": "0xca3dd4bee7c174903dbf66c3897c27e9adaaebdd", + "deployed": true, + "validatorCount": 4, + "activeValidatorCount": 4, + "lockedValidatorCount": 0, + "nodeDebt": 0, + "refundValue": 0, + "delegateExpiry": 0, + "delegateExpired": false, + "nodeExpressTicketCount": 0, + "useLatestDelegate": false, + "assignedValue": 124000000000000000000, + "nodeBond": 16000000000000000000, + "userCapital": 112000000000000000000, + "bondRequirement": 16000000000000000000, + "ethBalance": 0, + "lastDistributionTime": 0, + "pendingRewards": 0, + "nodeQueuedBond": 0 + } + }, + "validator_details": [ + { + "pubkey": "90fa276c307519300f851ed9f4dac4d7bc2f53957232089f099515f77ab9a6dda74b1367e3ec318df877c8acd29a4e98", + "index": "267695", + "withdrawal_credentials": "0x01000000000000000000000053d4e981298dd9cb06ce0ecfcaeab3ff84fa26dc", + "balance": 32003941818, + "status": "active_ongoing", + "effective_balance": 32000000000, + "slashed": false, + "activation_eligibility_epoch": 83875, + "activation_epoch": 83904, + "exit_epoch": 18446744073709551615, + "withdrawable_epoch": 18446744073709551615, + "exists": true + }, + { + "pubkey": "8535369bfb00ee8a2bc0b06c9a467d24509f5e16932383683057719916bd7befcd4107a393b3c2e8eb5716fe63b27cc3", + "index": "1090199", + "withdrawal_credentials": "0x010000000000000000000000fd7a11f14db5432e1c21cc3a864fbbe694012c06", + "balance": 0, + "status": "withdrawal_done", + "effective_balance": 0, + "slashed": false, + "activation_eligibility_epoch": 251299, + "activation_epoch": 251421, + "exit_epoch": 276663, + "withdrawable_epoch": 276919, + "exists": true + }, + { + "pubkey": "aebf315f8488adf60857653bf1097495dbe003cd8c27f6896c1bffe4f3c168b3758ded8a471f5b25f2c324986b1b7e4b", + "index": "1331657", + "withdrawal_credentials": "0x010000000000000000000000fdbea69c24d3bdbd76c7bb1c748b7a78e4c0d799", + "balance": 32013989358, + "status": "active_ongoing", + "effective_balance": 32000000000, + "slashed": false, + "activation_eligibility_epoch": 274018, + "activation_epoch": 275787, + "exit_epoch": 18446744073709551615, + "withdrawable_epoch": 18446744073709551615, + "exists": true + }, + { + "pubkey": "b2c6839762bb7039353af53079b492025214713ac502b6bcbd95f28e99aa8638526e3f2fde631813666f74209912e2b2", + "index": "513011", + "withdrawal_credentials": "0x010000000000000000000000200aed6615c19aa0a0593213d5027d72a03c40db", + "balance": 0, + "status": "withdrawal_done", + "effective_balance": 0, + "slashed": false, + "activation_eligibility_epoch": 178915, + "activation_epoch": 178941, + "exit_epoch": 318894, + "withdrawable_epoch": 319150, + "exists": true + }, + { + "pubkey": "acde55967a5872a07178397ede95b55e9a60fe723c9d78a25098c8195ed28a49a2489a730ee7dd8a6f72f81ef3d427b8", + "index": "609321", + "withdrawal_credentials": "0x0100000000000000000000009bcb42dc592c455237c3b25c128b25e02f0343b8", + "balance": 0, + "status": "withdrawal_done", + "effective_balance": 0, + "slashed": false, + "activation_eligibility_epoch": 200994, + "activation_epoch": 206695, + "exit_epoch": 225568, + "withdrawable_epoch": 225824, + "exists": true + }, + { + "pubkey": "8abec7404c88b4d97dbe9a72bd59b9c5a179836d5d73761811f23f130fa5fe5819d0e0668fff82f69deb76b9daf227ac", + "index": "332665", + "withdrawal_credentials": "0x010000000000000000000000b249405edfca43df38c77e6751f6690c14c7c013", + "balance": 0, + "status": "withdrawal_done", + "effective_balance": 0, + "slashed": false, + "activation_eligibility_epoch": 107427, + "activation_epoch": 110123, + "exit_epoch": 198636, + "withdrawable_epoch": 198892, + "exists": true + }, + { + "pubkey": "a2b78082c7900d3e2917991a44fd079767cba28020ef311dcd3dcf68f90220ce4040602159754d5e3c93670e6a884040", + "index": "1553356", + "withdrawal_credentials": "0x010000000000000000000000d9950d3b27b0be234d9542159384c3cdeb9e46ff", + "balance": 32012440073, + "status": "active_ongoing", + "effective_balance": 32000000000, + "slashed": false, + "activation_eligibility_epoch": 307043, + "activation_epoch": 307086, + "exit_epoch": 18446744073709551615, + "withdrawable_epoch": 18446744073709551615, + "exists": true + }, + { + "pubkey": "b2c817d4f1504d1dde3c7d51e69fea02278a1adefbe4ff3a4501c401539ca4302fb40f3c70d1ed30e271ac47d5a35591", + "index": "265557", + "withdrawal_credentials": "0x010000000000000000000000760bb964e83a2a70346df23976a7355ac9464850", + "balance": 0, + "status": "withdrawal_done", + "effective_balance": 0, + "slashed": false, + "activation_eligibility_epoch": 83171, + "activation_epoch": 83215, + "exit_epoch": 320189, + "withdrawable_epoch": 320445, + "exists": true + }, + { + "pubkey": "a71cb6e4f389d46a034805fa67c1a5c06cb4ef12ed0577d4a466d4d590249d5be45a340f716486e9464db64861d3893e", + "index": "684827", + "withdrawal_credentials": "0x01000000000000000000000006ca57a4f4722543c13466fee9e8e49facfb7ec7", + "balance": 32001896401, + "status": "active_ongoing", + "effective_balance": 32000000000, + "slashed": false, + "activation_eligibility_epoch": 204068, + "activation_epoch": 212538, + "exit_epoch": 18446744073709551615, + "withdrawable_epoch": 18446744073709551615, + "exists": true + }, + { + "pubkey": "ac22d356b204066053d4e3b71a932f52c99ef0a3e45d5d9a4031dbec8a283619b5746270613a355e6145cb9f656fa8ac", + "index": "678544", + "withdrawal_credentials": "0x010000000000000000000000607ba055f4ac2b6be65db8a90bcab9ad32c3e0b0", + "balance": 32001913781, + "status": "active_ongoing", + "effective_balance": 32000000000, + "slashed": false, + "activation_eligibility_epoch": 203875, + "activation_epoch": 212006, + "exit_epoch": 18446744073709551615, + "withdrawable_epoch": 18446744073709551615, + "exists": true + } + ], + "megapool_validator_details": [ + { + "pubkey": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "index": "", + "withdrawal_credentials": "0x0000000000000000000000000000000000000000000000000000000000000000", + "balance": 0, + "status": "", + "effective_balance": 0, + "slashed": false, + "activation_eligibility_epoch": 0, + "activation_epoch": 0, + "exit_epoch": 0, + "withdrawable_epoch": 0, + "exists": false + } + ], + "oracle_dao_member_details": [ + { + "address": "0xb3a533098485bede3cb7fa8711af84fe0bb1e0ad", + "exists": true, + "id": "nimbus", + "url": "https://nimbus.team", + "joinedTime": "2021-12-20T08:52:01-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0x9f56f3aeed0e79f0e7612119aca0bab15477cec6", + "exists": true, + "id": "rocketscientists-1", + "url": "http://rpscientists.com/", + "joinedTime": "2023-02-06T19:13:11-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0xc5d291607600044348e5014404cc18394bd1d57d", + "exists": true, + "id": "lighthouse", + "url": "https://lighthouse.sigp.io", + "joinedTime": "2021-12-08T02:01:09-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0x8d074ad69b55dd57da2708306f1c200ae1803359", + "exists": true, + "id": "rocketpool-t", + "url": "https://rocketpool.net", + "joinedTime": "2021-10-04T02:16:18-03:00", + "lastProposalTime": "2026-02-23T23:09:23-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0x751683968fd078341c48b90bc657d6babc2339f7", + "exists": true, + "id": "superphiz", + "url": "https://ethstaker.cc", + "joinedTime": "2021-11-22T01:44:33-03:00", + "lastProposalTime": "2024-10-23T22:33:11-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0x2354628919e1d53d2a69cf700cc53c4093977b94", + "exists": true, + "id": "rocketpool-1", + "url": "https://rocketpool.net", + "joinedTime": "2022-07-20T21:03:27-03:00", + "lastProposalTime": "2023-03-16T21:43:35-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0x8fb569c14b372430f9af8b235940187b449d0dec", + "exists": true, + "id": "sassal", + "url": "https://twitter.com/sassal0x", + "joinedTime": "2022-12-17T11:08:35-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0x2c6c5809a257ea74a2df6d20aee6119196d4bea0", + "exists": true, + "id": "bankless", + "url": "https://banklesshq.com", + "joinedTime": "2021-11-24T00:06:46-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0xd7f94c53691afb5a616c6af96e7075c1ffa1d8ee", + "exists": true, + "id": "beaconcha.in", + "url": "https://www.beaconcha.in", + "joinedTime": "2021-11-24T06:31:58-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + }, + { + "address": "0xdf590a63b91e8278a9102bee9aafd444f8a4b780", + "exists": true, + "id": "consensyscodefi", + "url": "https://consensys.net/codefi", + "joinedTime": "2021-11-24T15:40:11-03:00", + "lastProposalTime": "1969-12-31T21:00:00-03:00", + "rplBondAmount": 1750000000000000000000, + "replacementAddress": "0x0000000000000000000000000000000000000000", + "isChallenged": false + } + ], + "protocol_dao_proposal_details": [ + { + "id": 1, + "dao": "", + "proposerAddress": "0x0f617c3691dd48e7d2f909d48197a9cb49696f1f", + "targetBlock": 21874233, + "message": "update RPL rewards distribution", + "createdTime": "2025-02-18T12:53:35-03:00", + "challengeWindow": 1800000000000, + "startTime": "2025-02-25T12:53:35-03:00", + "phase1EndTime": "2025-03-04T12:53:35-03:00", + "phase2EndTime": "2025-03-11T12:53:35-03:00", + "expiryTime": "2025-04-08T12:53:35-03:00", + "votingPowerRequired": 12503027397435500499408, + "votingPowerFor": 23917574318012563724, + "votingPowerAgainst": 0, + "votingPowerAbstained": 3150956914197554277, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": false, + "isVetoed": false, + "vetoQuorum": 42510293151280701697988, + "payload": "dyf+YgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY0V4XYoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9D/CwE7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJtuZKjsYAAA==", + "payloadStr": "proposalSettingRewardsClaimers(25000000000000000,275000000000000000,700000000000000000)", + "state": 5, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 2, + "dao": "", + "proposerAddress": "0x2c5d28538f051686e62da624ddb2811cc59a4979", + "targetBlock": 22085516, + "message": "recurring payment to IMC-2025-04", + "createdTime": "2025-03-20T01:06:59-03:00", + "challengeWindow": 1800000000000, + "startTime": "2025-03-27T01:06:59-03:00", + "phase1EndTime": "2025-04-03T01:06:59-03:00", + "phase2EndTime": "2025-04-10T01:06:59-03:00", + "expiryTime": "2025-05-08T01:06:59-03:00", + "votingPowerRequired": 12329064080571900077030, + "votingPowerFor": 13860342522374671913536, + "votingPowerAgainst": 288928793221427000722, + "votingPowerAbstained": 0, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": true, + "isVetoed": false, + "vetoQuorum": 41918817873944460261903, + "payload": "iWvdqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAuGfqO7yQmVTXNwGf71qyXf2zjLkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlWlaFJ+II2CKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfSbqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALSU1DLTIwMjUtMDQAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "payloadStr": "proposalTreasuryNewContract(IMC-2025-04,0xb867EA3bBC909954d737019FEf5AB25dFDb38CB9,11024625079120103834154,2419200,1741844139,5)", + "state": 9, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 3, + "dao": "", + "proposerAddress": "0x0f617c3691dd48e7d2f909d48197a9cb49696f1f", + "targetBlock": 22206455, + "message": "recurring payment to GMC-2025-05", + "createdTime": "2025-04-05T22:11:59-03:00", + "challengeWindow": 1800000000000, + "startTime": "2025-04-12T22:11:59-03:00", + "phase1EndTime": "2025-04-19T22:11:59-03:00", + "phase2EndTime": "2025-04-26T22:11:59-03:00", + "expiryTime": "2025-05-24T22:11:59-03:00", + "votingPowerRequired": 12301527027637196252646, + "votingPowerFor": 13430210766829972955654, + "votingPowerAgainst": 436531270565886060325, + "votingPowerAbstained": 52640934326261610185, + "votingPowerVeto": 288928793221427000722, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": true, + "isVetoed": false, + "vetoQuorum": 41825191893966467258996, + "payload": "iWvdqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAbv0IMD9C7baPLWRkvNyggk4cgToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS41CFvYDkdP1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf3WKsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR01DLTIwMjUtMDUAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "payloadStr": "proposalTreasuryNewContract(GMC-2025-05,0x6efD08303F42EDb68F2D6464BCdCA0824e1C813a,5574738115527619071956,2419200,1744263339,9)", + "state": 9, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 4, + "dao": "", + "proposerAddress": "0x2c5d28538f051686e62da624ddb2811cc59a4979", + "targetBlock": 22959311, + "message": "recurring payment to IMC-2025-08", + "createdTime": "2025-07-20T05:58:35-03:00", + "challengeWindow": 1800000000000, + "startTime": "2025-07-27T05:58:35-03:00", + "phase1EndTime": "2025-08-03T05:58:35-03:00", + "phase2EndTime": "2025-08-10T05:58:35-03:00", + "expiryTime": "2025-09-07T05:58:35-03:00", + "votingPowerRequired": 11798282473831783982755, + "votingPowerFor": 12730975103188178734942, + "votingPowerAgainst": 0, + "votingPowerAbstained": 0, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": true, + "isVetoed": false, + "vetoQuorum": 40114160411028065541367, + "payload": "iWvdqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAuGfqO7yQmVTXNwGf71qyXf2zjLkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmosQHkw0Bzs1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiLAKsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALSU1DLTIwMjUtMDgAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "payloadStr": "proposalTreasuryNewContract(IMC-2025-08,0xb867EA3bBC909954d737019FEf5AB25dFDb38CB9,11403276519339238157524,2419200,1753940139,13)", + "state": 9, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 5, + "dao": "", + "proposerAddress": "0x2c5d28538f051686e62da624ddb2811cc59a4979", + "targetBlock": 23493422, + "message": "Core-Team-Funding-2025", + "createdTime": "2025-10-02T20:50:47-03:00", + "challengeWindow": 1800000000000, + "startTime": "2025-10-09T20:50:47-03:00", + "phase1EndTime": "2025-10-16T20:50:47-03:00", + "phase2EndTime": "2025-10-23T20:50:47-03:00", + "expiryTime": "2025-11-20T20:50:47-03:00", + "votingPowerRequired": 11430819884688405059331, + "votingPowerFor": 13238217023120861309543, + "votingPowerAgainst": 0, + "votingPowerAbstained": 0, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": true, + "isVetoed": false, + "vetoQuorum": 38864787607940577201727, + "payload": "PtsF9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAA0qSEimZEdJ5lLB2TmLWqMX9XOVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4O9V76vvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANY29yZS1kZXYtMjAyNQAAAAAAAAAAAAAAAAAAAAAAAAA=", + "payloadStr": "proposalTreasuryOneTimeSpend(core-dev-2025,0xd2A4848a6644749e652c1D9398B5AA317f57395B,54376198368480207044608)", + "state": 9, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 6, + "dao": "", + "proposerAddress": "0x0f617c3691dd48e7d2f909d48197a9cb49696f1f", + "targetBlock": 23877246, + "message": "recurring payment to GMC-2026-01", + "createdTime": "2025-11-25T14:31:59-03:00", + "challengeWindow": 1800000000000, + "startTime": "2025-12-02T14:31:59-03:00", + "phase1EndTime": "2025-12-09T14:31:59-03:00", + "phase2EndTime": "2025-12-16T14:31:59-03:00", + "expiryTime": "2026-01-13T14:31:59-03:00", + "votingPowerRequired": 11130375163416872650748, + "votingPowerFor": 11027698082051262233108, + "votingPowerAgainst": 0, + "votingPowerAbstained": 965270600305990706503, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": true, + "isVetoed": false, + "vetoQuorum": 37843275555617367012546, + "payload": "iWvdqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAbv0IMD9C7baPLWRkvNyggk4cgToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATrs1mUZO5fV/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlDkqsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR01DLTIwMjYtMDEAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "payloadStr": "proposalTreasuryNewContract(GMC-2026-01,0x6efD08303F42EDb68F2D6464BCdCA0824e1C813a,5809343578141814674942,2419200,1766036139,13)", + "state": 9, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 7, + "dao": "", + "proposerAddress": "0x2c5d28538f051686e62da624ddb2811cc59a4979", + "targetBlock": 24241628, + "message": "set deposit.pool.maximum", + "createdTime": "2026-01-15T14:40:59-03:00", + "challengeWindow": 1800000000000, + "startTime": "2026-01-22T14:40:59-03:00", + "phase1EndTime": "2026-01-29T14:40:59-03:00", + "phase2EndTime": "2026-02-05T14:40:59-03:00", + "expiryTime": "2026-03-05T14:40:59-03:00", + "votingPowerRequired": 10608964372026330562006, + "votingPowerFor": 11718658670803011156781, + "votingPowerAgainst": 0, + "votingPowerAbstained": 985213412393576695551, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": true, + "isVetoed": false, + "vetoQuorum": 36070478864889523910822, + "payload": "7RzZ9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9oym2M2RxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcm9ja2V0REFPUHJvdG9jb2xTZXR0aW5nc0RlcG9zaXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGRlcG9zaXQucG9vbC5tYXhpbXVtAAAAAAAAAAAAAAAA", + "payloadStr": "proposalSettingUint(rocketDAOProtocolSettingsDeposit,deposit.pool.maximum,6000000000000000000000000)", + "state": 9, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 8, + "dao": "", + "proposerAddress": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "targetBlock": 24879811, + "message": "challengeable: increase node.per.minipool.stake.maximum", + "createdTime": "2026-04-14T18:14:59+00:00", + "challengeWindow": 1800000000000, + "startTime": "2026-04-21T18:14:59+00:00", + "phase1EndTime": "2026-04-28T18:14:59+00:00", + "phase2EndTime": "2026-05-05T18:14:59+00:00", + "expiryTime": "2026-06-02T18:14:59+00:00", + "votingPowerRequired": 10608964372026330562006, + "votingPowerFor": 0, + "votingPowerAgainst": 0, + "votingPowerAbstained": 0, + "votingPowerVeto": 0, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": false, + "isVetoed": false, + "vetoQuorum": 36070478864889523910822, + "payload": "7RzZ9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9oym2M2RxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcm9ja2V0REFPUHJvdG9jb2xTZXR0aW5nc0RlcG9zaXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGRlcG9zaXQucG9vbC5tYXhpbXVtAAAAAAAAAAAAAAAA", + "payloadStr": "proposalSettingUint(rocketDAOProtocolSettingsNode,node.per.minipool.stake.maximum,200000000000000000000)", + "state": 0, + "proposalBond": 100000000000000000000, + "challengeBond": 10000000000000000000, + "defeatIndex": 0 + }, + { + "id": 0, + "dao": "", + "proposerAddress": "0x0000000000000000000000000000000000000000", + "targetBlock": 0, + "message": "", + "createdTime": "0001-01-01T00:00:00Z", + "challengeWindow": 0, + "startTime": "0001-01-01T00:00:00Z", + "phase1EndTime": "0001-01-01T00:00:00Z", + "phase2EndTime": "0001-01-01T00:00:00Z", + "expiryTime": "0001-01-01T00:00:00Z", + "votingPowerRequired": null, + "votingPowerFor": null, + "votingPowerAgainst": null, + "votingPowerAbstained": null, + "votingPowerVeto": null, + "isDestroyed": false, + "isFinalized": false, + "isExecuted": false, + "isVetoed": false, + "vetoQuorum": null, + "payload": null, + "payloadStr": "", + "state": 8, + "proposalBond": null, + "challengeBond": null, + "defeatIndex": 0 + } + ] +} \ No newline at end of file diff --git a/treegen/tree-gen.go b/treegen/tree-gen.go index 015958749..fb2ce0c8e 100644 --- a/treegen/tree-gen.go +++ b/treegen/tree-gen.go @@ -93,7 +93,7 @@ type treeGenerator struct { rp rprewards.RewardsExecutionClient rpNative *rocketpool.RocketPool cfg *config.RocketPoolConfig - mgr *state.NetworkStateManager + mgr state.NetworkStateProvider bn beacon.Client beaconConfig beacon.Eth2Config targets targets