diff --git a/x/stake/handler.go b/x/stake/handler.go index 84eeca3c4c..d9f718fe58 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -158,6 +158,9 @@ func delegate(ctx sdk.Context, k Keeper, delegatorAddr sdk.Address, pool, candidate, newShares := pool.candidateAddTokens(candidate, bondAmt.Amount) bond.Shares = bond.Shares.Add(newShares) + // Update bond height + bond.Height = ctx.BlockHeight() + k.setDelegatorBond(ctx, bond) k.setCandidate(ctx, candidate) k.setPool(ctx, pool) @@ -226,6 +229,8 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result { k.removeDelegatorBond(ctx, bond) } else { + // Update bond height + bond.Height = ctx.BlockHeight() k.setDelegatorBond(ctx, bond) } diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index c42f7182b6..03431a4036 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -122,6 +122,7 @@ func TestBond(t *testing.T) { bondsEqual := func(b1, b2 DelegatorBond) bool { return bytes.Equal(b1.DelegatorAddr, b2.DelegatorAddr) && bytes.Equal(b1.CandidateAddr, b2.CandidateAddr) && + b1.Height == b2.Height && b1.Shares == b2.Shares } @@ -142,14 +143,23 @@ func TestBond(t *testing.T) { assert.True(t, found) assert.True(t, bondsEqual(bond1to1, resBond)) + // test height + ctx = ctx.WithBlockHeight(10) + keeper.setDelegatorBond(ctx, bond1to1) + resBond, found = keeper.GetDelegatorBond(ctx, addrDels[0], addrVals[0]) + assert.True(t, found) + assert.Equal(t, resBond.Height, 10) + ctx = ctx.WithBlockHeight(0) + keeper.setDelegatorBond(ctx, bond1to1) + // add some more records keeper.setCandidate(ctx, candidates[1]) keeper.setCandidate(ctx, candidates[2]) - bond1to2 := DelegatorBond{addrDels[0], addrVals[1], sdk.NewRat(9)} - bond1to3 := DelegatorBond{addrDels[0], addrVals[2], sdk.NewRat(9)} - bond2to1 := DelegatorBond{addrDels[1], addrVals[0], sdk.NewRat(9)} - bond2to2 := DelegatorBond{addrDels[1], addrVals[1], sdk.NewRat(9)} - bond2to3 := DelegatorBond{addrDels[1], addrVals[2], sdk.NewRat(9)} + bond1to2 := DelegatorBond{addrDels[0], addrVals[1], sdk.NewRat(9), 0} + bond1to3 := DelegatorBond{addrDels[0], addrVals[2], sdk.NewRat(9), 1} + bond2to1 := DelegatorBond{addrDels[1], addrVals[0], sdk.NewRat(9), 2} + bond2to2 := DelegatorBond{addrDels[1], addrVals[1], sdk.NewRat(9), 3} + bond2to3 := DelegatorBond{addrDels[1], addrVals[2], sdk.NewRat(9), 4} keeper.setDelegatorBond(ctx, bond1to2) keeper.setDelegatorBond(ctx, bond1to3) keeper.setDelegatorBond(ctx, bond2to1) diff --git a/x/stake/types.go b/x/stake/types.go index be48afe3e3..8f9e87cbb0 100644 --- a/x/stake/types.go +++ b/x/stake/types.go @@ -164,4 +164,5 @@ type DelegatorBond struct { DelegatorAddr sdk.Address `json:"delegator_addr"` CandidateAddr sdk.Address `json:"candidate_addr"` Shares sdk.Rat `json:"shares"` + Height int64 `json:"height"` // Last height bond updated } diff --git a/x/stake/view_slash_keeper_test.go b/x/stake/view_slash_keeper_test.go index 2e0e70d3b4..a8b0e10718 100644 --- a/x/stake/view_slash_keeper_test.go +++ b/x/stake/view_slash_keeper_test.go @@ -40,6 +40,7 @@ func TestViewSlashBond(t *testing.T) { bondsEqual := func(b1, b2 DelegatorBond) bool { return bytes.Equal(b1.DelegatorAddr, b2.DelegatorAddr) && bytes.Equal(b1.CandidateAddr, b2.CandidateAddr) && + b1.Height == b2.Height && b1.Shares == b2.Shares } @@ -63,11 +64,11 @@ func TestViewSlashBond(t *testing.T) { // add some more records keeper.setCandidate(ctx, candidates[1]) keeper.setCandidate(ctx, candidates[2]) - bond1to2 := DelegatorBond{addrDels[0], addrVals[1], sdk.NewRat(9)} - bond1to3 := DelegatorBond{addrDels[0], addrVals[2], sdk.NewRat(9)} - bond2to1 := DelegatorBond{addrDels[1], addrVals[0], sdk.NewRat(9)} - bond2to2 := DelegatorBond{addrDels[1], addrVals[1], sdk.NewRat(9)} - bond2to3 := DelegatorBond{addrDels[1], addrVals[2], sdk.NewRat(9)} + bond1to2 := DelegatorBond{addrDels[0], addrVals[1], sdk.NewRat(9), 0} + bond1to3 := DelegatorBond{addrDels[0], addrVals[2], sdk.NewRat(9), 1} + bond2to1 := DelegatorBond{addrDels[1], addrVals[0], sdk.NewRat(9), 2} + bond2to2 := DelegatorBond{addrDels[1], addrVals[1], sdk.NewRat(9), 3} + bond2to3 := DelegatorBond{addrDels[1], addrVals[2], sdk.NewRat(9), 4} keeper.setDelegatorBond(ctx, bond1to2) keeper.setDelegatorBond(ctx, bond1to3) keeper.setDelegatorBond(ctx, bond2to1)