From 00c7a6cd37d266a31a7d5c0204f2e4503d4660e0 Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger Date: Mon, 1 Jul 2024 19:21:49 +0200 Subject: [PATCH] wip: adjust for validator pop reward from dao account Signed-off-by: Lorenz Herzberger --- tests/e2e/dao/pop/selection_suite.go | 2 +- x/dao/keeper/distribution.go | 7 ++- .../keeper/msg_server_distribution_result.go | 6 +++ x/dao/keeper/msg_server_report_pop_result.go | 15 ++++++ x/dao/keeper/msg_server_test.go | 48 +++++++++++++------ x/dao/migrations/v3/params.go | 1 - x/dao/types/errors.go | 1 + 7 files changed, 62 insertions(+), 18 deletions(-) diff --git a/tests/e2e/dao/pop/selection_suite.go b/tests/e2e/dao/pop/selection_suite.go index 0b001fb..174f3bf 100644 --- a/tests/e2e/dao/pop/selection_suite.go +++ b/tests/e2e/dao/pop/selection_suite.go @@ -196,7 +196,7 @@ func (s *SelectionE2ETestSuite) VerifyTokens(token string) { }) s.Require().NoError(err) assert.Contains(s.T(), out.String(), token) - assert.Equal(s.T(), "amount: \"17979452050\"\ndenom: "+token+"\n", out.String()) // Total supply 2 * 7990867578 (total supply) + 1 * 1997716894 (challenger) = 17979452050 + assert.Equal(s.T(), "amount: \"17979452053\"\ndenom: "+token+"\n", out.String()) // Total supply 2 * 7990867578 (total supply) + 1 * 1997716894 (challenger) = 17979452050 out, err = clitestutil.ExecTestCLICmd(val.ClientCtx, bank.GetBalancesCmd(), []string{ machines[0].address, diff --git a/x/dao/keeper/distribution.go b/x/dao/keeper/distribution.go index b21ac79..fedb737 100644 --- a/x/dao/keeper/distribution.go +++ b/x/dao/keeper/distribution.go @@ -48,11 +48,14 @@ func (k Keeper) ComputeDistribution(ctx sdk.Context, lastReissuance int64, block distribution.StrategicAddr = k.GetParams(ctx).DistributionAddressStrategic distribution.PopAddr = k.GetParams(ctx).DistributionAddressPop - distribution.DaoAmount = util.UintValueToRDDLTokenString(uint64(float64(amount) * types.PercentageDao)) + // PoP rewards subtracted from DaoAmount and added to PoPAmount for later distribution + validatorPoPRewards := k.GetValidatorPoPReward(ctx) + + distribution.DaoAmount = util.UintValueToRDDLTokenString(uint64(float64(amount)*types.PercentageDao) - validatorPoPRewards) distribution.EarlyInvAmount = util.UintValueToRDDLTokenString(uint64(float64(amount) * types.PercentageEarlyInvestor)) distribution.InvestorAmount = util.UintValueToRDDLTokenString(uint64(float64(amount) * types.PercentageInvestor)) distribution.StrategicAmount = util.UintValueToRDDLTokenString(uint64(float64(amount) * types.PercentageStrategic)) - distribution.PopAmount = util.UintValueToRDDLTokenString(uint64(float64(amount) * types.PercentagePop)) + distribution.PopAmount = util.UintValueToRDDLTokenString(uint64(float64(amount)*types.PercentagePop) + validatorPoPRewards) return distribution } diff --git a/x/dao/keeper/msg_server_distribution_result.go b/x/dao/keeper/msg_server_distribution_result.go index e4734f8..1d49af6 100644 --- a/x/dao/keeper/msg_server_distribution_result.go +++ b/x/dao/keeper/msg_server_distribution_result.go @@ -45,6 +45,7 @@ func (k msgServer) resolveStagedClaims(ctx sdk.Context, start int64, end int64) } popParticipants := make(map[string]uint64) + validatorPopReward := k.GetValidatorPoPReward(ctx) for _, challenge := range challenges { // if challenge not finished nobody has claims @@ -56,6 +57,11 @@ func (k msgServer) resolveStagedClaims(ctx sdk.Context, start int64, end int64) if challenge.GetSuccess() { popParticipants[challenge.Challengee] += challengeeAmt } + initiatorAddr, err := sdk.AccAddressFromHexUnsafe(challenge.Initiator) + if err != nil { + util.GetAppLogger().Error(ctx, "error converting initiator address") + } + popParticipants[initiatorAddr.String()] += validatorPopReward } // second data structure because map iteration order is not guaranteed in GO diff --git a/x/dao/keeper/msg_server_report_pop_result.go b/x/dao/keeper/msg_server_report_pop_result.go index 5813cc3..f158e43 100644 --- a/x/dao/keeper/msg_server_report_pop_result.go +++ b/x/dao/keeper/msg_server_report_pop_result.go @@ -44,6 +44,12 @@ func (k msgServer) ReportPopResult(goCtx context.Context, msg *types.MsgReportPo return nil, err } + _, err = sdk.AccAddressFromHexUnsafe(msg.Challenge.GetInitiator()) + if err != nil { + util.GetAppLogger().Error(ctx, "error converting initiator address") + return nil, errorsmod.Wrap(types.ErrInvalidPoPInitiator, "PoP initiator not hex encoded") + } + // update valid PoP Result reports err = k.updateChallenge(ctx, msg) if err != nil { @@ -74,6 +80,9 @@ func (k msgServer) issuePoPRewards(ctx sdk.Context, challenge types.Challenge) ( stagedCRDDL = stagedCRDDL.AddAmount(sdk.NewIntFromUint64(challengerAmt)) } + validatorPoPreward := k.GetValidatorPoPReward(ctx) + stagedCRDDL = stagedCRDDL.AddAmount(sdk.NewIntFromUint64(validatorPoPreward)) + err = k.bankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(stagedCRDDL)) if err != nil { return @@ -90,6 +99,12 @@ func (k msgServer) handlePoP(ctx sdk.Context, challenge types.Challenge) (err er return } + initiatorAddr, _ := sdk.AccAddressFromHexUnsafe(challenge.Initiator) + err = k.sendRewards(ctx, initiatorAddr.String(), k.GetValidatorPoPReward(ctx)) + if err != nil { + return + } + if !challenge.GetSuccess() { return } diff --git a/x/dao/keeper/msg_server_test.go b/x/dao/keeper/msg_server_test.go index e9ecdca..b4c0fa9 100644 --- a/x/dao/keeper/msg_server_test.go +++ b/x/dao/keeper/msg_server_test.go @@ -2,6 +2,7 @@ package keeper_test import ( "context" + "encoding/hex" "fmt" "testing" @@ -30,6 +31,7 @@ func TestMsgServer(t *testing.T) { func TestMsgServerReportPoPResult(t *testing.T) { t.Parallel() initiator := sample.Secp256k1AccAddress() + initiatorHex := hex.EncodeToString(initiator.Bytes()) challenger := sample.Secp256k1AccAddress() challengee := sample.Secp256k1AccAddress() errInvalidPopData := "Invalid pop data" @@ -44,7 +46,7 @@ func TestMsgServerReportPoPResult(t *testing.T) { types.MsgReportPopResult{ Creator: challenger.String(), Challenge: &types.Challenge{ - Initiator: initiator.String(), + Initiator: initiatorHex, Challenger: challenger.String(), Challengee: challengee.String(), Height: 1, @@ -59,7 +61,7 @@ func TestMsgServerReportPoPResult(t *testing.T) { types.MsgReportPopResult{ Creator: challenger.String(), Challenge: &types.Challenge{ - Initiator: initiator.String(), + Initiator: initiatorHex, Challenger: challenger.String(), Challengee: challengee.String(), Height: 2, @@ -87,7 +89,7 @@ func TestMsgServerReportPoPResult(t *testing.T) { types.MsgReportPopResult{ Creator: challenger.String(), Challenge: &types.Challenge{ - Initiator: initiator.String(), + Initiator: initiatorHex, Challenger: challenger.String(), Challengee: challengee.String(), Height: 4, @@ -102,7 +104,7 @@ func TestMsgServerReportPoPResult(t *testing.T) { types.MsgReportPopResult{ Creator: challenger.String(), Challenge: &types.Challenge{ - Initiator: initiator.String(), + Initiator: initiatorHex, Challenger: challenger.String(), Challengee: challengee.String(), Height: 5, @@ -117,7 +119,7 @@ func TestMsgServerReportPoPResult(t *testing.T) { types.MsgReportPopResult{ Creator: challenger.String(), Challenge: &types.Challenge{ - Initiator: initiator.String(), + Initiator: initiatorHex, Challenger: challenger.String(), Challengee: challengee.String(), Height: 6, @@ -128,7 +130,7 @@ func TestMsgServerReportPoPResult(t *testing.T) { "PoP report data does not match challenge: invalid challenge", }, { - "Non-Existing PoP", + "Initiator not hex encoded", types.MsgReportPopResult{ Creator: challenger.String(), Challenge: &types.Challenge{ @@ -140,6 +142,21 @@ func TestMsgServerReportPoPResult(t *testing.T) { Finished: true, }, }, + "PoP initiator not hex encoded: invalid PoP initiator", + }, + { + "Non-Existing PoP", + types.MsgReportPopResult{ + Creator: challenger.String(), + Challenge: &types.Challenge{ + Initiator: initiatorHex, + Challenger: challenger.String(), + Challengee: challengee.String(), + Height: 8, + Success: true, + Finished: true, + }, + }, "no challenge found for PoP report: invalid challenge", }, } @@ -147,7 +164,7 @@ func TestMsgServerReportPoPResult(t *testing.T) { msgServer, ctx, k := setupMsgServer(t) sdkCtx := sdk.UnwrapSDKContext(ctx) // set up the challenges, do not store the last challenge (special test case) - for i := 0; i < 6; i++ { + for i := 0; i < len(testCases)-1; i++ { msg := testCases[i].msg challenge := msg.GetChallenge() k.StoreChallenge(sdkCtx, *challenge) @@ -155,16 +172,19 @@ func TestMsgServerReportPoPResult(t *testing.T) { // adjust challenge 4 to satisfy the test case testCases[3].msg.Challenge.Challengee = testCases[3].msg.Challenge.Challenger testCases[4].msg.Challenge.Challenger = testCases[4].msg.Challenge.Challengee - testCases[5].msg.Challenge.Initiator = testCases[5].msg.Challenge.Challenger + testCases[5].msg.Challenge.Initiator = hex.EncodeToString(challenger.Bytes()) for _, tc := range testCases { - res, err := msgServer.ReportPopResult(ctx, &tc.msg) + tc := tc + t.Run(tc.name, func(t *testing.T) { + res, err := msgServer.ReportPopResult(ctx, &tc.msg) - if tc.errMsg != "" { - assert.EqualError(t, err, tc.errMsg) - } else { - assert.Equal(t, &types.MsgReportPopResultResponse{}, res) - } + if tc.errMsg != "" { + assert.EqualError(t, err, tc.errMsg) + } else { + assert.Equal(t, &types.MsgReportPopResultResponse{}, res) + } + }) } } func TestMsgServerMintToken(t *testing.T) { diff --git a/x/dao/migrations/v3/params.go b/x/dao/migrations/v3/params.go index 8a2ece3..59e5ebd 100644 --- a/x/dao/migrations/v3/params.go +++ b/x/dao/migrations/v3/params.go @@ -19,7 +19,6 @@ func MigrateParams(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.Bina params.ValidatorPopReward = 1 - // migratedParams := types.NewParams(params.MintAddress, params.TokenDenom, params.StagedDenom, params.ClaimDenom, params.ReissuanceAsset, params.ReissuanceEpochs, params.PopEpochs, params.DistributionOffset, params.DistributionAddressEarlyInv, params.DistributionAddressInvestor, params.DistributionAddressStrategic, params.DistributionAddressDao, params.DistributionAddressPop, params.MqttResponseTimeout, params.ClaimAddress, params.TxGasLimit, 1) bz, err := cdc.Marshal(¶ms) if err != nil { return err diff --git a/x/dao/types/errors.go b/x/dao/types/errors.go index 576c169..eeaa2c9 100644 --- a/x/dao/types/errors.go +++ b/x/dao/types/errors.go @@ -29,4 +29,5 @@ var ( ErrConvertClaims = errorsmod.Register(ModuleName, 20, "convert claim failed") ErrInvalidClaimAddress = errorsmod.Register(ModuleName, 21, "invalid claim address") ErrInvalidPopReporter = errorsmod.Register(ModuleName, 22, "invalid PoP reporter") + ErrInvalidPoPInitiator = errorsmod.Register(ModuleName, 23, "invalid PoP initiator") )