@@ -87,19 +87,20 @@ type treegenArguments struct {
8787
8888// Treegen holder for the requested execution metadata and necessary artifacts
8989type treeGenerator struct {
90- log * log.ColorLogger
91- errLog * log.ColorLogger
92- rp * rocketpool.RocketPool
93- cfg * config.RocketPoolConfig
94- mgr * state.NetworkStateManager
95- recordMgr * rprewards.RollingRecordManager
96- bn beacon.Client
97- beaconConfig beacon.Eth2Config
98- targets targets
99- outputDir string
100- prettyPrint bool
101- ruleset uint64
102- useRollingRecords bool
90+ log * log.ColorLogger
91+ errLog * log.ColorLogger
92+ rp * rocketpool.RocketPool
93+ cfg * config.RocketPoolConfig
94+ mgr * state.NetworkStateManager
95+ recordMgr * rprewards.RollingRecordManager
96+ bn beacon.Client
97+ beaconConfig beacon.Eth2Config
98+ targets targets
99+ outputDir string
100+ prettyPrint bool
101+ ruleset uint64
102+ useRollingRecords bool
103+ generateVotingPower bool
103104}
104105
105106// Generates a new rewards tree based on the command line flags
@@ -167,17 +168,18 @@ func GenerateTree(c *cli.Context) error {
167168
168169 // Create the generator
169170 generator := treeGenerator {
170- log : & logger ,
171- errLog : & errLogger ,
172- rp : rp ,
173- cfg : cfg ,
174- bn : bn ,
175- mgr : mgr ,
176- beaconConfig : beaconConfig ,
177- outputDir : c .String ("output-dir" ),
178- prettyPrint : c .Bool ("pretty-print" ),
179- ruleset : c .Uint64 ("ruleset" ),
180- useRollingRecords : c .Bool ("use-rolling-records" ),
171+ log : & logger ,
172+ errLog : & errLogger ,
173+ rp : rp ,
174+ cfg : cfg ,
175+ bn : bn ,
176+ mgr : mgr ,
177+ beaconConfig : beaconConfig ,
178+ outputDir : c .String ("output-dir" ),
179+ prettyPrint : c .Bool ("pretty-print" ),
180+ ruleset : c .Uint64 ("ruleset" ),
181+ useRollingRecords : c .Bool ("use-rolling-records" ),
182+ generateVotingPower : c .Bool ("generate-voting-power" ),
181183 }
182184
183185 // initialize the generator targets
@@ -414,6 +416,14 @@ func (g *treeGenerator) generateRewardsFile(treegen *rprewards.TreeGenerator) (r
414416 return treegen .GenerateTreeWithRuleset (g .ruleset )
415417}
416418
419+ func (g * treeGenerator ) serializeVotingPower (votingPowerFile * VotingPowerFile ) ([]byte , error ) {
420+ if g .prettyPrint {
421+ return json .MarshalIndent (votingPowerFile , "" , "\t " )
422+ }
423+
424+ return json .Marshal (votingPowerFile )
425+ }
426+
417427// Serializes the minipool performance file into JSON
418428func (g * treeGenerator ) serializeMinipoolPerformance (rewardsFile rprewards.IRewardsFile ) ([]byte , error ) {
419429 perfFile := rewardsFile .GetMinipoolPerformanceFile ()
@@ -435,7 +445,7 @@ func (g *treeGenerator) serializeRewardsTree(rewardsFile rprewards.IRewardsFile)
435445}
436446
437447// Writes both the performance file and the rewards file to disk
438- func (g * treeGenerator ) writeFiles (rewardsFile rprewards.IRewardsFile ) error {
448+ func (g * treeGenerator ) writeFiles (rewardsFile rprewards.IRewardsFile , votingPowerFile * VotingPowerFile ) error {
439449 g .log .Printlnf ("Saving JSON files..." )
440450 index := rewardsFile .GetHeader ().Index
441451
@@ -472,6 +482,21 @@ func (g *treeGenerator) writeFiles(rewardsFile rprewards.IRewardsFile) error {
472482 }
473483
474484 g .log .Printlnf ("Saved rewards snapshot file to %s" , rewardsTreePath )
485+
486+ // Write the voting power file to disk
487+ if votingPowerFile != nil {
488+ votingPowerFileBytes , err := g .serializeVotingPower (votingPowerFile )
489+ if err != nil {
490+ return fmt .Errorf ("error serializing voting power file into JSON: %w" , err )
491+ }
492+
493+ votingFilePath := filepath .Join (g .outputDir , fmt .Sprintf ("rp-voting-power-%s-%d.json" , string (g .cfg .Smartnode .Network .Value .(cfgtypes.Network )), votingPowerFile .ConsensusSlot ))
494+ err = os .WriteFile (votingFilePath , votingPowerFileBytes , 0644 )
495+ if err != nil {
496+ return fmt .Errorf ("error saving voting power file to %s: %w" , votingFilePath , err )
497+ }
498+ g .log .Printlnf ("Saved voting power file to %s" , votingFilePath )
499+ }
475500 g .log .Printlnf ("Successfully generated rewards snapshot for interval %d" , index )
476501
477502 return nil
@@ -622,6 +647,7 @@ func (g *treeGenerator) approximateRethSpRewards() error {
622647
623648// Generate a complete rewards tree
624649func (g * treeGenerator ) generateTree () error {
650+ var votingPowerFile * VotingPowerFile
625651 args , err := g .getTreegenArgs ()
626652 if err != nil {
627653 return fmt .Errorf ("error compiling treegen arguments: %w" , err )
@@ -633,6 +659,12 @@ func (g *treeGenerator) generateTree() error {
633659 return err
634660 }
635661
662+ // If a voting power file was requested, generate it now.
663+ if g .generateVotingPower {
664+ votingPowerFile = g .GenerateVotingPower (args .state )
665+ votingPowerFile .Time = args .endTime
666+ }
667+
636668 // Generate the rewards file
637669 start := time .Now ()
638670 rewardsFile , err := g .generateRewardsFile (treegen )
@@ -656,7 +688,7 @@ func (g *treeGenerator) generateTree() error {
656688 }
657689 }
658690
659- err = g .writeFiles (rewardsFile )
691+ err = g .writeFiles (rewardsFile , votingPowerFile )
660692 if err != nil {
661693 return err
662694 }
0 commit comments