From 49e22919852087546c74a8e7920839a957993c1c Mon Sep 17 00:00:00 2001 From: gpsanant Date: Tue, 29 Oct 2024 14:45:46 -0700 Subject: [PATCH] feat: add more test cases --- .../stakerShares/stakerShares_test.go | 352 +++++++++++++++++- 1 file changed, 336 insertions(+), 16 deletions(-) diff --git a/internal/eigenState/stakerShares/stakerShares_test.go b/internal/eigenState/stakerShares/stakerShares_test.go index a5038f93..d23f4eb1 100644 --- a/internal/eigenState/stakerShares/stakerShares_test.go +++ b/internal/eigenState/stakerShares/stakerShares_test.go @@ -649,7 +649,7 @@ func Test_StakerSharesState(t *testing.T) { _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 400, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e18)) assert.Nil(t, err) - change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e17)) + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3"}, []*big.Int{big.NewInt(1e17)}) assert.Nil(t, err) typedChange := change.(*AccumulatedStateDiffs) @@ -675,7 +675,6 @@ func Test_StakerSharesState(t *testing.T) { assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[0].Strategy) assert.Equal(t, "900000000000000000", results[0].Shares) - assert.Equal(t, blockNumber, results[0].BlockNumber) teardown(model) }) @@ -709,7 +708,7 @@ func Test_StakerSharesState(t *testing.T) { _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 401, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(2e18)) assert.Nil(t, err) - change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e17)) + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3"}, []*big.Int{big.NewInt(1e17)}) assert.Nil(t, err) typedChange := change.(*AccumulatedStateDiffs) @@ -735,12 +734,10 @@ func Test_StakerSharesState(t *testing.T) { assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[0].Strategy) assert.Equal(t, "900000000000000000", results[0].Shares) - assert.Equal(t, blockNumber, results[0].BlockNumber) assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", results[1].Staker) assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[1].Strategy) assert.Equal(t, "1800000000000000000", results[1].Shares) - assert.Equal(t, blockNumber, results[1].BlockNumber) teardown(model) }) @@ -781,7 +778,7 @@ func Test_StakerSharesState(t *testing.T) { err = model.SetupStateForBlock(blockNumber) assert.Nil(t, err) - change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e17)) + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3"}, []*big.Int{big.NewInt(1e17)}) assert.Nil(t, err) typedChange := change.(*AccumulatedStateDiffs) @@ -807,12 +804,334 @@ func Test_StakerSharesState(t *testing.T) { assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[0].Strategy) assert.Equal(t, "900000000000000000", results[0].Shares) - assert.Equal(t, blockNumber, results[0].BlockNumber) assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", results[1].Staker) assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[1].Strategy) assert.Equal(t, "1800000000000000000", results[1].Shares) - assert.Equal(t, blockNumber, results[1].BlockNumber) + + teardown(model) + }) + + t.Run("Should not slash delegated staker in a different strategy for a deposit in same block", func(t *testing.T) { + esm := stateManager.NewEigenStateManager(l, grm) + blockNumber := uint64(200) + + delegationModel, err := stakerDelegations.NewStakerDelegationsModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = delegationModel.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDelegation(delegationModel, cfg.GetContractsMapForChain().DelegationManager, blockNumber, 300, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0xbde83df53bc7d159700e966ad5d21e8b7c619459") + assert.Nil(t, err) + + err = delegationModel.CommitFinalState(blockNumber) + assert.Nil(t, err) + + model, err := NewStakerSharesModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 400, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x1234567890abcdef1234567890abcdef12345678", big.NewInt(1e18)) + assert.Nil(t, err) + + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3"}, []*big.Int{big.NewInt(1e17)}) + assert.Nil(t, err) + + typedChange := change.(*AccumulatedStateDiffs) + assert.Equal(t, 1, len(typedChange.StateDiffs)) + + slashDiff := typedChange.StateDiffs[0].Event.(*SlashDiff) + assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", slashDiff.Operator) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", slashDiff.Strategy) + assert.Equal(t, "100000000000000000", slashDiff.WadsSlashed.String()) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + query := ` + select * from staker_shares + where block_number = ? + ` + results := []*StakerShares{} + res := model.DB.Raw(query, blockNumber).Scan(&results) + assert.Nil(t, res.Error) + + assert.Equal(t, 1, len(results)) + assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) + assert.Equal(t, "0x1234567890abcdef1234567890abcdef12345678", results[0].Strategy) + assert.Equal(t, "1000000000000000000", results[0].Shares) + + teardown(model) + }) + + t.Run("Should not slash delegated staker in a different strategy deposited in previous block", func(t *testing.T) { + esm := stateManager.NewEigenStateManager(l, grm) + blockNumber := uint64(200) + + delegationModel, err := stakerDelegations.NewStakerDelegationsModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = delegationModel.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDelegation(delegationModel, cfg.GetContractsMapForChain().DelegationManager, blockNumber, 300, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0xbde83df53bc7d159700e966ad5d21e8b7c619459") + assert.Nil(t, err) + + err = delegationModel.CommitFinalState(blockNumber) + assert.Nil(t, err) + + model, err := NewStakerSharesModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 400, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x1234567890abcdef1234567890abcdef12345678", big.NewInt(1e18)) + assert.Nil(t, err) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + blockNumber = blockNumber + 1 + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3"}, []*big.Int{big.NewInt(1e17)}) + assert.Nil(t, err) + + typedChange := change.(*AccumulatedStateDiffs) + assert.Equal(t, 1, len(typedChange.StateDiffs)) + + slashDiff := typedChange.StateDiffs[0].Event.(*SlashDiff) + assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", slashDiff.Operator) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", slashDiff.Strategy) + assert.Equal(t, "100000000000000000", slashDiff.WadsSlashed.String()) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + query := ` + select * from staker_shares + ` + results := []*StakerShares{} + res := model.DB.Raw(query, blockNumber).Scan(&results) + assert.Nil(t, res.Error) + + assert.Equal(t, 1, len(results)) + assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) + assert.Equal(t, "0x1234567890abcdef1234567890abcdef12345678", results[0].Strategy) + assert.Equal(t, "1000000000000000000", results[0].Shares) + assert.Equal(t, blockNumber-1, results[0].BlockNumber) + + teardown(model) + }) + + t.Run("Should not slash deposit after slashing in same block", func(t *testing.T) { + esm := stateManager.NewEigenStateManager(l, grm) + blockNumber := uint64(200) + + delegationModel, err := stakerDelegations.NewStakerDelegationsModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = delegationModel.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDelegation(delegationModel, cfg.GetContractsMapForChain().DelegationManager, blockNumber, 300, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0xbde83df53bc7d159700e966ad5d21e8b7c619459") + assert.Nil(t, err) + + err = delegationModel.CommitFinalState(blockNumber) + assert.Nil(t, err) + + model, err := NewStakerSharesModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 400, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e18)) + assert.Nil(t, err) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + blockNumber = blockNumber + 1 + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3"}, []*big.Int{big.NewInt(1e17)}) + assert.Nil(t, err) + + typedChange := change.(*AccumulatedStateDiffs) + assert.Equal(t, 1, len(typedChange.StateDiffs)) + + slashDiff := typedChange.StateDiffs[0].Event.(*SlashDiff) + assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", slashDiff.Operator) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", slashDiff.Strategy) + assert.Equal(t, "100000000000000000", slashDiff.WadsSlashed.String()) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 600, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e18)) + assert.Nil(t, err) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + query := ` + select * from staker_shares + where block_number = ? + ` + results := []*StakerShares{} + res := model.DB.Raw(query, blockNumber).Scan(&results) + assert.Nil(t, res.Error) + + assert.Equal(t, 1, len(results)) + assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[0].Strategy) + assert.Equal(t, "1900000000000000000", results[0].Shares) + + teardown(model) + }) + + t.Run("Should not slash deposit after slashing in same block", func(t *testing.T) { + esm := stateManager.NewEigenStateManager(l, grm) + blockNumber := uint64(200) + + delegationModel, err := stakerDelegations.NewStakerDelegationsModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = delegationModel.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDelegation(delegationModel, cfg.GetContractsMapForChain().DelegationManager, blockNumber, 300, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0xbde83df53bc7d159700e966ad5d21e8b7c619459") + assert.Nil(t, err) + + err = delegationModel.CommitFinalState(blockNumber) + assert.Nil(t, err) + + model, err := NewStakerSharesModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 400, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e18)) + assert.Nil(t, err) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + blockNumber = blockNumber + 1 + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3"}, []*big.Int{big.NewInt(1e17)}) + assert.Nil(t, err) + + typedChange := change.(*AccumulatedStateDiffs) + assert.Equal(t, 1, len(typedChange.StateDiffs)) + + slashDiff := typedChange.StateDiffs[0].Event.(*SlashDiff) + assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", slashDiff.Operator) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", slashDiff.Strategy) + assert.Equal(t, "100000000000000000", slashDiff.WadsSlashed.String()) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 600, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(2e18)) + assert.Nil(t, err) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + query := ` + select * from staker_shares + where block_number = ? + ` + results := []*StakerShares{} + res := model.DB.Raw(query, blockNumber).Scan(&results) + assert.Nil(t, res.Error) + + assert.Equal(t, 1, len(results)) + assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[0].Strategy) + assert.Equal(t, "2900000000000000000", results[0].Shares) + + teardown(model) + }) + + t.Run("Should process slashing for several strategies correctly", func(t *testing.T) { + esm := stateManager.NewEigenStateManager(l, grm) + blockNumber := uint64(200) + + delegationModel, err := stakerDelegations.NewStakerDelegationsModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = delegationModel.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDelegation(delegationModel, cfg.GetContractsMapForChain().DelegationManager, blockNumber, 300, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0xbde83df53bc7d159700e966ad5d21e8b7c619459") + assert.Nil(t, err) + + _, err = processDelegation(delegationModel, cfg.GetContractsMapForChain().DelegationManager, blockNumber, 301, "0x4444444444444444444444444444444444444444", "0xbde83df53bc7d159700e966ad5d21e8b7c619459") + assert.Nil(t, err) + + err = delegationModel.CommitFinalState(blockNumber) + assert.Nil(t, err) + + model, err := NewStakerSharesModel(esm, grm, l, cfg) + assert.Nil(t, err) + + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 400, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", big.NewInt(1e18)) + assert.Nil(t, err) + + _, err = processDeposit(model, cfg.GetContractsMapForChain().StrategyManager, blockNumber, 401, "0x4444444444444444444444444444444444444444", "0x1234567890abcdef1234567890abcdef12345678", big.NewInt(2e18)) + assert.Nil(t, err) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + blockNumber = blockNumber + 1 + err = model.SetupStateForBlock(blockNumber) + assert.Nil(t, err) + + change, err := processSlashing(model, cfg.GetContractsMapForChain().AllocationManager, blockNumber, 500, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", []string{"0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", "0x1234567890abcdef1234567890abcdef12345678"}, []*big.Int{big.NewInt(1e17), big.NewInt(9e17)}) + assert.Nil(t, err) + + typedChange := change.(*AccumulatedStateDiffs) + assert.Equal(t, 2, len(typedChange.StateDiffs)) + + slashDiff := typedChange.StateDiffs[0].Event.(*SlashDiff) + assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", slashDiff.Operator) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", slashDiff.Strategy) + assert.Equal(t, "100000000000000000", slashDiff.WadsSlashed.String()) + + slashDiff = typedChange.StateDiffs[1].Event.(*SlashDiff) + assert.Equal(t, "0xbde83df53bc7d159700e966ad5d21e8b7c619459", slashDiff.Operator) + assert.Equal(t, "0x1234567890abcdef1234567890abcdef12345678", slashDiff.Strategy) + assert.Equal(t, "900000000000000000", slashDiff.WadsSlashed.String()) + + err = model.CommitFinalState(blockNumber) + assert.Nil(t, err) + + query := ` + select * from staker_shares + where block_number = ? + ` + results := []*StakerShares{} + res := model.DB.Raw(query, blockNumber).Scan(&results) + assert.Nil(t, res.Error) + + assert.Equal(t, 2, len(results)) + assert.Equal(t, "0xaf6fb48ac4a60c61a64124ce9dc28f508dc8de8d", results[0].Staker) + assert.Equal(t, "0x7d704507b76571a51d9cae8addabbfd0ba0e63d3", results[0].Strategy) + assert.Equal(t, "900000000000000000", results[0].Shares) + + assert.Equal(t, "0x4444444444444444444444444444444444444444", results[1].Staker) + assert.Equal(t, "0x1234567890abcdef1234567890abcdef12345678", results[1].Strategy) + assert.Equal(t, "200000000000000000", results[1].Shares) teardown(model) }) @@ -855,15 +1174,16 @@ func processDeposit(stakerSharesModel *StakerSharesModel, strategyManager string return stakerSharesModel.HandleStateChange(&depositLog) } -func processSlashing(stakerSharesModel *StakerSharesModel, allocationManager string, blockNumber, logIndex uint64, operator, strategy string, wadsSlashed *big.Int) (interface{}, error) { +func processSlashing(stakerSharesModel *StakerSharesModel, allocationManager string, blockNumber, logIndex uint64, operator string, strategies []string, wadsSlashed []*big.Int) (interface{}, error) { + wadsSlashedJson := make([]json.Number, len(wadsSlashed)) + for i, wad := range wadsSlashed { + wadsSlashedJson[i] = json.Number(wad.String()) + } + operatorSlashedEvent := operatorSlashedOutputData{ - Operator: operator, - Strategies: []string{ - strategy, - }, - WadsSlashed: []json.Number{ - json.Number(wadsSlashed.String()), - }, + Operator: operator, + Strategies: strategies, + WadsSlashed: wadsSlashedJson, } operatorJson, err := json.Marshal(operatorSlashedEvent) if err != nil {