@@ -362,6 +362,15 @@ func (d *Pegnetd) SyncBlock(ctx context.Context, tx *sql.Tx, height uint32) erro
362362 }
363363 }
364364
365+ // 5) Apply Developers Rewards
366+ if height >= V20HeightActivation && height % pegnet .SnapshotRate == 0 {
367+ err := d .DevelopersPayouts (tx , fLog , height , dblock .Timestamp , DeveloperRewardAddreses )
368+ if err != nil {
369+ // something wrong happend during payout execution
370+ return err
371+ }
372+ }
373+
365374 return nil
366375}
367376
@@ -484,6 +493,67 @@ func (d *Pegnetd) SnapshotPayouts(tx *sql.Tx, fLog *log.Entry, rates map[fat2.PT
484493 return nil
485494}
486495
496+ // Developers Reward Payouts
497+ // implementation of PIP16 - distributed rewards collected for developers every 24h
498+ func (d * Pegnetd ) DevelopersPayouts (tx * sql.Tx , fLog * log.Entry , height uint32 , heightTimestamp time.Time , developers []DevReward ) error {
499+
500+ totalPayout := uint64 (conversions .PerBlockDevelopers ) * pegnet .SnapshotRate // once a day
501+ payoutStart := time .Now ()
502+
503+ // We need to mock a TXID to record dev rewards
504+ txid := fmt .Sprintf ("%064d" , height )
505+
506+ // we use hardcoded list of dev payouts
507+ i := 0
508+ for _ , dev := range developers {
509+
510+ // we calculate developers reward from % pre-defined
511+ rewardPayout := uint64 ((conversions .PerBlockDevelopers / 100 ) * dev .DevRewardPct )
512+ addr , err := factom .NewFAAddress (dev .DevAddress )
513+
514+ _ , err = d .Pegnet .AddToBalance (tx , & addr , fat2 .PTickerPEG , rewardPayout )
515+ if err != nil {
516+ return err
517+ }
518+
519+ // Mock entry hash value
520+ addTxid := fmt .Sprintf ("%d-%s" , i , txid )
521+ i ++
522+
523+ // Get dev address as FAAdress
524+ FADevAddress , err := factom .NewFAAddress (dev .DevAddress )
525+ if err != nil {
526+ log .WithFields (log.Fields {
527+ "error" : err ,
528+ "addr" : dev .DevAddress ,
529+ }).Info ("error getting developer address" )
530+ return err
531+ }
532+
533+ // ---- Database Payouts ----
534+ // Inserts tx into the db
535+ err = d .Pegnet .InsertDeveloperRewardCoinbase (tx , txid , addTxid , height , heightTimestamp , rewardPayout , FADevAddress )
536+ if err != nil {
537+ return err
538+ }
539+
540+ fLog .WithFields (log.Fields {
541+ "total" : float64 (totalPayout ) / 1e8 ,
542+ "developer" : len (dev .DevAddress ),
543+ "PEG" : float64 (rewardPayout ) / 1e8 , // Float is good enough here
544+ }).Info ("developer reward | paid out to" )
545+
546+ }
547+
548+ fLog .WithFields (log.Fields {
549+ "total" : float64 (totalPayout ) / 1e8 ,
550+ "elapsed" : time .Since (payoutStart ),
551+ "txid" : txid ,
552+ }).Info ("developer rewards | paid out" )
553+
554+ return nil
555+ }
556+
487557func multiFetch (eblock * factom.EBlock , c * factom.Client ) error {
488558 err := eblock .Get (nil , c )
489559 if err != nil {
0 commit comments