Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: rewards 2.1 calculation #215

Merged
merged 8 commits into from
Feb 4, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package stakerOperators

import (
"github.com/Layr-Labs/sidecar/pkg/rewardsUtils"
)

const _10_stakerODOperatorSetStrategyPayoutQuery = `
create table {{.destTableName}} as
select
staker,
operator,
avs,
operator_set_id,
token,
strategy,
multiplier,
shares,
staker_tokens,
reward_hash,
snapshot
from {{.stakerODOperatorSetRewardAmountsTable}}
`

func (sog *StakerOperatorsGenerator) GenerateAndInsert10StakerODOperatorSetStrategyPayouts(cutoffDate string) error {
rewardsV2_1Enabled, err := sog.globalConfig.IsRewardsV2_1EnabledForCutoffDate(cutoffDate)
if err != nil {
sog.logger.Sugar().Errorw("Failed to check if rewards v2.1 is enabled", "error", err)
return err
}
if !rewardsV2_1Enabled {
sog.logger.Sugar().Infow("Skipping 10_stakerODOperatorSetStrategyPayouts generation as rewards v2.1 is not enabled")
return nil
}

allTableNames := rewardsUtils.GetGoldTableNames(cutoffDate)
destTableName := allTableNames[rewardsUtils.Sot_10_StakerODOperatorSetStrategyPayouts]

sog.logger.Sugar().Infow("Generating and inserting 10_stakerODOperatorSetStrategyPayouts",
"cutoffDate", cutoffDate,
)

if err := rewardsUtils.DropTableIfExists(sog.db, destTableName, sog.logger); err != nil {
sog.logger.Sugar().Errorw("Failed to drop table", "error", err)
return err
}

rewardsTables, err := sog.FindRewardsTableNamesForSearchPattersn(map[string]string{
rewardsUtils.Table_13_StakerODOperatorSetRewardAmounts: rewardsUtils.GoldTableNameSearchPattern[rewardsUtils.Table_13_StakerODOperatorSetRewardAmounts],
}, cutoffDate)
if err != nil {
sog.logger.Sugar().Errorw("Failed to find staker operator table names", "error", err)
return err
}

query, err := rewardsUtils.RenderQueryTemplate(_10_stakerODOperatorSetStrategyPayoutQuery, map[string]interface{}{
"destTableName": destTableName,
"stakerODOperatorSetRewardAmountsTable": rewardsTables[rewardsUtils.Table_13_StakerODOperatorSetRewardAmounts],
})
if err != nil {
sog.logger.Sugar().Errorw("Failed to render 10_stakerODOperatorSetStrategyPayouts query", "error", err)
return err
}

res := sog.db.Exec(query)

if res.Error != nil {
sog.logger.Sugar().Errorw("Failed to generate 10_stakerODOperatorSetStrategyPayouts", "error", res.Error)
return err
}
return nil
}
67 changes: 67 additions & 0 deletions pkg/rewards/stakerOperators/11_avsODOperatorSetStrategyPayouts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package stakerOperators

import (
"github.com/Layr-Labs/sidecar/pkg/rewardsUtils"
)

const _11_avsODOperatorSetStrategyPayoutQuery = `
create table {{.destTableName}} as
select
reward_hash,
snapshot,
token,
avs,
operator_set_id,
operator,
avs_tokens
from {{.avsODOperatorSetRewardAmountsTable}}
`

func (sog *StakerOperatorsGenerator) GenerateAndInsert11AvsODOperatorSetStrategyPayouts(cutoffDate string) error {
rewardsV2_1Enabled, err := sog.globalConfig.IsRewardsV2_1EnabledForCutoffDate(cutoffDate)
if err != nil {
sog.logger.Sugar().Errorw("Failed to check if rewards v2.1 is enabled", "error", err)
return err
}
if !rewardsV2_1Enabled {
sog.logger.Sugar().Infow("Skipping 11_avsODOperatorSetStrategyPayouts generation as rewards v2.1 is not enabled")
return nil
}

allTableNames := rewardsUtils.GetGoldTableNames(cutoffDate)
destTableName := allTableNames[rewardsUtils.Sot_11_AvsODOperatorSetStrategyPayouts]

sog.logger.Sugar().Infow("Generating and inserting 11_avsODOperatorSetStrategyPayouts",
"cutoffDate", cutoffDate,
)

if err := rewardsUtils.DropTableIfExists(sog.db, destTableName, sog.logger); err != nil {
sog.logger.Sugar().Errorw("Failed to drop table", "error", err)
return err
}

rewardsTables, err := sog.FindRewardsTableNamesForSearchPattersn(map[string]string{
rewardsUtils.Table_14_AvsODOperatorSetRewardAmounts: rewardsUtils.GoldTableNameSearchPattern[rewardsUtils.Table_14_AvsODOperatorSetRewardAmounts],
}, cutoffDate)
if err != nil {
sog.logger.Sugar().Errorw("Failed to find staker operator table names", "error", err)
return err
}

query, err := rewardsUtils.RenderQueryTemplate(_11_avsODOperatorSetStrategyPayoutQuery, map[string]interface{}{
"destTableName": destTableName,
"avsODOperatorSetRewardAmountsTable": rewardsTables[rewardsUtils.Table_14_AvsODOperatorSetRewardAmounts],
})
if err != nil {
sog.logger.Sugar().Errorw("Failed to render 11_avsODOperatorSetStrategyPayouts query", "error", err)
return err
}

res := sog.db.Exec(query)

if res.Error != nil {
sog.logger.Sugar().Errorw("Failed to generate 11_avsODOperatorSetStrategyPayouts", "error", res.Error)
return err
}
return nil
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package stakerOperators

import (
"time"

"github.com/Layr-Labs/sidecar/pkg/rewardsUtils"
"go.uber.org/zap"
"time"
)

const _6_stakerOperatorsStaging = `
const _12_stakerOperatorsStaging = `
create table {{.destTableName}} as
SELECT
staker as earner,
Expand Down Expand Up @@ -85,7 +86,9 @@ SELECT
reward_hash,
snapshot
FROM {{.sot5RfaeOperatorStrategyPayout}}

{{ if .rewardsV2Enabled }}

UNION ALL

SELECT
Expand Down Expand Up @@ -133,6 +136,59 @@ SELECT
reward_hash,
snapshot
from {{.sot8AvsODStrategyPayouts}}

{{ end }}

{{ if .rewardsV2_1Enabled }}

UNION ALL

SELECT
operator as earner,
operator as operator,
'operator_od_operator_set_reward' as reward_type,
avs,
token,
'0x0000000000000000000000000000000000000000' as strategy,
'0' as multiplier,
'0' as shares,
operator_tokens as amount,
reward_hash,
snapshot
from {{.sot9OperatorODOperatorSetStrategyPayouts}}

UNION ALL

SELECT
staker as earner,
operator,
'staker_od_operator_set_reward' as reward_type,
avs,
token,
strategy,
multiplier,
shares,
staker_tokens as amount,
reward_hash,
snapshot
from {{.sot10StakerODOperatorSetStrategyPayouts}}

UNION ALL

SELECT
avs as earner,
operator,
'avs_od_operator_set_reward' as reward_type,
avs,
token,
'0x0000000000000000000000000000000000000000' as strategy,
'0' as multiplier,
'0' as shares,
avs_tokens as amount,
reward_hash,
snapshot
from {{.sot11AvsODOperatorSetStrategyPayouts}}

{{ end }}
`

Expand All @@ -150,45 +206,55 @@ type StakerOperatorStaging struct {
Snapshot time.Time
}

func (sog *StakerOperatorsGenerator) GenerateAndInsert9StakerOperatorStaging(cutoffDate string) error {
func (sog *StakerOperatorsGenerator) GenerateAndInsert12StakerOperatorStaging(cutoffDate string) error {
rewardsV2Enabled, err := sog.globalConfig.IsRewardsV2EnabledForCutoffDate(cutoffDate)
if err != nil {
sog.logger.Sugar().Errorw("Failed to check if rewards v2 is enabled", "error", err)
return err
}

rewardsV2_1Enabled, err := sog.globalConfig.IsRewardsV2_1EnabledForCutoffDate(cutoffDate)
if err != nil {
sog.logger.Sugar().Errorw("Failed to check if rewards v2.1 is enabled", "error", err)
return err
}

allTableNames := rewardsUtils.GetGoldTableNames(cutoffDate)
destTableName := allTableNames[rewardsUtils.Sot_9_StakerOperatorStaging]
destTableName := allTableNames[rewardsUtils.Sot_12_StakerOperatorStaging]

if err := rewardsUtils.DropTableIfExists(sog.db, destTableName, sog.logger); err != nil {
sog.logger.Sugar().Errorw("Failed to drop table", "error", err)
return err
}

sog.logger.Sugar().Infow("Generating and inserting 9_stakerOperatorsStaging",
sog.logger.Sugar().Infow("Generating and inserting 12_stakerOperatorsStaging",
zap.String("cutoffDate", cutoffDate),
)

query, err := rewardsUtils.RenderQueryTemplate(_6_stakerOperatorsStaging, map[string]interface{}{
"destTableName": destTableName,
"rewardsV2Enabled": rewardsV2Enabled,
"sot1StakerStrategyPayouts": allTableNames[rewardsUtils.Sot_1_StakerStrategyPayouts],
"sot2OperatorStrategyPayouts": allTableNames[rewardsUtils.Sot_2_OperatorStrategyPayouts],
"sot3RewardsForAllStrategyPayouts": allTableNames[rewardsUtils.Sot_3_RewardsForAllStrategyPayout],
"sot4RfaeStakerStrategyPayout": allTableNames[rewardsUtils.Sot_4_RfaeStakers],
"sot5RfaeOperatorStrategyPayout": allTableNames[rewardsUtils.Sot_5_RfaeOperators],
"sot6OperatorODStrategyPayouts": allTableNames[rewardsUtils.Sot_6_OperatorODStrategyPayouts],
"sot7StakerODStrategyPayouts": allTableNames[rewardsUtils.Sot_7_StakerODStrategyPayouts],
"sot8AvsODStrategyPayouts": allTableNames[rewardsUtils.Sot_8_AvsODStrategyPayouts],
query, err := rewardsUtils.RenderQueryTemplate(_12_stakerOperatorsStaging, map[string]interface{}{
"destTableName": destTableName,
"rewardsV2Enabled": rewardsV2Enabled,
"sot1StakerStrategyPayouts": allTableNames[rewardsUtils.Sot_1_StakerStrategyPayouts],
"sot2OperatorStrategyPayouts": allTableNames[rewardsUtils.Sot_2_OperatorStrategyPayouts],
"sot3RewardsForAllStrategyPayouts": allTableNames[rewardsUtils.Sot_3_RewardsForAllStrategyPayout],
"sot4RfaeStakerStrategyPayout": allTableNames[rewardsUtils.Sot_4_RfaeStakers],
"sot5RfaeOperatorStrategyPayout": allTableNames[rewardsUtils.Sot_5_RfaeOperators],
"sot6OperatorODStrategyPayouts": allTableNames[rewardsUtils.Sot_6_OperatorODStrategyPayouts],
"sot7StakerODStrategyPayouts": allTableNames[rewardsUtils.Sot_7_StakerODStrategyPayouts],
"sot8AvsODStrategyPayouts": allTableNames[rewardsUtils.Sot_8_AvsODStrategyPayouts],
"rewardsV2_1Enabled": rewardsV2_1Enabled,
"sot9OperatorODOperatorSetStrategyPayouts": allTableNames[rewardsUtils.Sot_9_OperatorODOperatorSetStrategyPayouts],
"sot10StakerODOperatorSetStrategyPayouts": allTableNames[rewardsUtils.Sot_10_StakerODOperatorSetStrategyPayouts],
"sot11AvsODOperatorSetStrategyPayouts": allTableNames[rewardsUtils.Sot_11_AvsODOperatorSetStrategyPayouts],
})
if err != nil {
sog.logger.Sugar().Errorw("Failed to render 9_stakerOperatorsStaging query", "error", err)
sog.logger.Sugar().Errorw("Failed to render 12_stakerOperatorsStaging query", "error", err)
return err
}

res := sog.db.Exec(query)
if res.Error != nil {
sog.logger.Sugar().Errorw("Failed to generate 6_stakerOperatorsStaging",
sog.logger.Sugar().Errorw("Failed to generate 12_stakerOperatorsStaging",
zap.String("cutoffDate", cutoffDate),
zap.Error(res.Error),
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package stakerOperators

import (
"time"

"github.com/Layr-Labs/sidecar/pkg/rewardsUtils"
"go.uber.org/zap"
"time"
)

const _7_stakerOperator = `
const _13_stakerOperator = `
insert into {{.destTableName}} (
earner,
operator,
Expand Down Expand Up @@ -50,30 +51,30 @@ type StakerOperator struct {
Snapshot time.Time
}

func (sog *StakerOperatorsGenerator) GenerateAndInsert10StakerOperator(cutoffDate string) error {
sog.logger.Sugar().Infow("Generating and inserting 10_stakerOperator",
func (sog *StakerOperatorsGenerator) GenerateAndInsert13StakerOperator(cutoffDate string) error {
sog.logger.Sugar().Infow("Generating and inserting 13_stakerOperator",
zap.String("cutoffDate", cutoffDate),
)
allTableNames := rewardsUtils.GetGoldTableNames(cutoffDate)
destTableName := rewardsUtils.Sot_10_StakerOperatorTable
destTableName := rewardsUtils.Sot_13_StakerOperatorTable

sog.logger.Sugar().Infow("Generating 10_stakerOperator",
sog.logger.Sugar().Infow("Generating 13_stakerOperator",
zap.String("destTableName", destTableName),
zap.String("cutoffDate", cutoffDate),
)

query, err := rewardsUtils.RenderQueryTemplate(_7_stakerOperator, map[string]interface{}{
query, err := rewardsUtils.RenderQueryTemplate(_13_stakerOperator, map[string]interface{}{
"destTableName": destTableName,
"stakerOperatorStaging": allTableNames[rewardsUtils.Sot_9_StakerOperatorStaging],
"stakerOperatorStaging": allTableNames[rewardsUtils.Sot_12_StakerOperatorStaging],
})
if err != nil {
sog.logger.Sugar().Errorw("Failed to render 10_stakerOperator query", "error", err)
sog.logger.Sugar().Errorw("Failed to render 13_stakerOperator query", "error", err)
return err
}

res := sog.db.Exec(query)
if res.Error != nil {
sog.logger.Sugar().Errorw("Failed to generate 10_stakerOperator",
sog.logger.Sugar().Errorw("Failed to generate 13_stakerOperator",
zap.String("cutoffDate", cutoffDate),
zap.Error(res.Error),
)
Expand All @@ -82,11 +83,11 @@ func (sog *StakerOperatorsGenerator) GenerateAndInsert10StakerOperator(cutoffDat
return nil
}

func (sog *StakerOperatorsGenerator) List7StakerOperator() ([]*StakerOperator, error) {
func (sog *StakerOperatorsGenerator) List13StakerOperator() ([]*StakerOperator, error) {
var rewards []*StakerOperator
res := sog.db.Model(&StakerOperator{}).Find(&rewards)
if res.Error != nil {
sog.logger.Sugar().Errorw("Failed to list 7_stakerOperator", "error", res.Error)
sog.logger.Sugar().Errorw("Failed to list 13_stakerOperator", "error", res.Error)
return nil, res.Error
}
return rewards, nil
Expand Down
Loading