Skip to content

Commit 3168764

Browse files
dusan-maksimovicmattverse
authored andcommitted
fix(x/gov): Backport of pull request cosmos#18173 to feature/v.0.47.x-ics-lsm branch (cosmos#19305)
1 parent 54cc86a commit 3168764

7 files changed

Lines changed: 98 additions & 25 deletions

File tree

x/gov/abci.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,13 @@ func EndBlocker(ctx sdk.Context, keeper *keeper.Keeper) {
3030
}
3131

3232
// called when proposal become inactive
33-
keeper.Hooks().AfterProposalFailedMinDeposit(ctx, proposal.Id)
33+
cacheCtx, writeCache := ctx.CacheContext()
34+
err := keeper.Hooks().AfterProposalFailedMinDeposit(cacheCtx, proposal.Id)
35+
if err == nil { // purposely ignoring the error here not to halt the chain if the hook fails
36+
writeCache()
37+
} else {
38+
keeper.Logger(ctx).Error("failed to execute AfterProposalFailedMinDeposit hook", "error", err)
39+
}
3440

3541
ctx.EventManager().EmitEvent(
3642
sdk.NewEvent(
@@ -142,7 +148,13 @@ func EndBlocker(ctx sdk.Context, keeper *keeper.Keeper) {
142148
keeper.SetProposal(ctx, proposal)
143149

144150
// when proposal become active
145-
keeper.Hooks().AfterProposalVotingPeriodEnded(ctx, proposal.Id)
151+
cacheCtx, writeCache := ctx.CacheContext()
152+
err := keeper.Hooks().AfterProposalVotingPeriodEnded(cacheCtx, proposal.Id)
153+
if err == nil { // purposely ignoring the error here not to halt the chain if the hook fails
154+
writeCache()
155+
} else {
156+
keeper.Logger(ctx).Error("failed to execute AfterProposalVotingPeriodEnded hook", "error", err)
157+
}
146158

147159
logger.Info(
148160
"proposal tallied",

x/gov/keeper/deposit.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,10 @@ func (keeper Keeper) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAdd
148148
}
149149

150150
// called when deposit has been added to a proposal, however the proposal may not be active
151-
keeper.Hooks().AfterProposalDeposit(ctx, proposalID, depositorAddr)
151+
err = keeper.Hooks().AfterProposalDeposit(ctx, proposalID, depositorAddr)
152+
if err != nil {
153+
return false, err
154+
}
152155

153156
ctx.EventManager().EmitEvent(
154157
sdk.NewEvent(

x/gov/keeper/hooks_test.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,29 @@ type MockGovHooksReceiver struct {
2525
AfterProposalVotingPeriodEndedValid bool
2626
}
2727

28-
func (h *MockGovHooksReceiver) AfterProposalSubmission(ctx sdk.Context, proposalID uint64) {
28+
func (h *MockGovHooksReceiver) AfterProposalSubmission(ctx sdk.Context, proposalID uint64) error {
2929
h.AfterProposalSubmissionValid = true
30+
return nil
3031
}
3132

32-
func (h *MockGovHooksReceiver) AfterProposalDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) {
33+
func (h *MockGovHooksReceiver) AfterProposalDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) error {
3334
h.AfterProposalDepositValid = true
35+
return nil
3436
}
3537

36-
func (h *MockGovHooksReceiver) AfterProposalVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) {
38+
func (h *MockGovHooksReceiver) AfterProposalVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) error {
3739
h.AfterProposalVoteValid = true
40+
return nil
3841
}
3942

40-
func (h *MockGovHooksReceiver) AfterProposalFailedMinDeposit(ctx sdk.Context, proposalID uint64) {
43+
func (h *MockGovHooksReceiver) AfterProposalFailedMinDeposit(ctx sdk.Context, proposalID uint64) error {
4144
h.AfterProposalFailedMinDepositValid = true
45+
return nil
4246
}
4347

44-
func (h *MockGovHooksReceiver) AfterProposalVotingPeriodEnded(ctx sdk.Context, proposalID uint64) {
48+
func (h *MockGovHooksReceiver) AfterProposalVotingPeriodEnded(ctx sdk.Context, proposalID uint64) error {
4549
h.AfterProposalVotingPeriodEndedValid = true
50+
return nil
4651
}
4752

4853
func TestHooks(t *testing.T) {

x/gov/keeper/proposal.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ func (keeper Keeper) SubmitProposal(ctx sdk.Context, messages []sdk.Msg, metadat
9595
keeper.SetProposalID(ctx, proposalID+1)
9696

9797
// called right after a proposal is submitted
98-
keeper.Hooks().AfterProposalSubmission(ctx, proposalID)
98+
err = keeper.Hooks().AfterProposalSubmission(ctx, proposalID)
99+
if err != nil {
100+
return v1.Proposal{}, err
101+
}
99102

100103
ctx.EventManager().EmitEvent(
101104
sdk.NewEvent(

x/gov/keeper/vote.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.A
3232
keeper.SetVote(ctx, vote)
3333

3434
// called after a vote on a proposal is cast
35-
keeper.Hooks().AfterProposalVote(ctx, proposalID, voterAddr)
35+
err = keeper.Hooks().AfterProposalVote(ctx, proposalID, voterAddr)
36+
if err != nil {
37+
return err
38+
}
3639

3740
ctx.EventManager().EmitEvent(
3841
sdk.NewEvent(

x/gov/types/expected_keepers.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ type BankKeeper interface {
5656

5757
// GovHooks event hooks for governance proposal object (noalias)
5858
type GovHooks interface {
59-
AfterProposalSubmission(ctx sdk.Context, proposalID uint64) // Must be called after proposal is submitted
60-
AfterProposalDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) // Must be called after a deposit is made
61-
AfterProposalVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) // Must be called after a vote on a proposal is cast
62-
AfterProposalFailedMinDeposit(ctx sdk.Context, proposalID uint64) // Must be called when proposal fails to reach min deposit
63-
AfterProposalVotingPeriodEnded(ctx sdk.Context, proposalID uint64) // Must be called when proposal's finishes it's voting period
59+
AfterProposalSubmission(ctx sdk.Context, proposalID uint64) error // Must be called after proposal is submitted
60+
AfterProposalDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) error // Must be called after a deposit is made
61+
AfterProposalVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) error // Must be called after a vote on a proposal is cast
62+
AfterProposalFailedMinDeposit(ctx sdk.Context, proposalID uint64) error // Must be called when proposal fails to reach min deposit
63+
AfterProposalVotingPeriodEnded(ctx sdk.Context, proposalID uint64) error // Must be called when proposal's finishes it's voting period
6464
}
6565

6666
type GovHooksWrapper struct{ GovHooks }

x/gov/types/hooks.go

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,79 @@ func NewMultiGovHooks(hooks ...GovHooks) MultiGovHooks {
1313
return hooks
1414
}
1515

16-
func (h MultiGovHooks) AfterProposalSubmission(ctx sdk.Context, proposalID uint64) {
16+
func (h MultiGovHooks) AfterProposalSubmission(ctx sdk.Context, proposalID uint64) error {
17+
var errs error
1718
for i := range h {
18-
h[i].AfterProposalSubmission(ctx, proposalID)
19+
errs = JoinErrors(errs, h[i].AfterProposalSubmission(ctx, proposalID))
1920
}
21+
return errs
2022
}
2123

22-
func (h MultiGovHooks) AfterProposalDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) {
24+
func (h MultiGovHooks) AfterProposalDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) error {
25+
var errs error
2326
for i := range h {
24-
h[i].AfterProposalDeposit(ctx, proposalID, depositorAddr)
27+
errs = JoinErrors(errs, h[i].AfterProposalDeposit(ctx, proposalID, depositorAddr))
2528
}
29+
return errs
2630
}
2731

28-
func (h MultiGovHooks) AfterProposalVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) {
32+
func (h MultiGovHooks) AfterProposalVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) error {
33+
var errs error
2934
for i := range h {
30-
h[i].AfterProposalVote(ctx, proposalID, voterAddr)
35+
errs = JoinErrors(errs, h[i].AfterProposalVote(ctx, proposalID, voterAddr))
3136
}
37+
return errs
3238
}
3339

34-
func (h MultiGovHooks) AfterProposalFailedMinDeposit(ctx sdk.Context, proposalID uint64) {
40+
func (h MultiGovHooks) AfterProposalFailedMinDeposit(ctx sdk.Context, proposalID uint64) error {
41+
var errs error
3542
for i := range h {
36-
h[i].AfterProposalFailedMinDeposit(ctx, proposalID)
43+
errs = JoinErrors(errs, h[i].AfterProposalFailedMinDeposit(ctx, proposalID))
3744
}
45+
return errs
3846
}
3947

40-
func (h MultiGovHooks) AfterProposalVotingPeriodEnded(ctx sdk.Context, proposalID uint64) {
48+
func (h MultiGovHooks) AfterProposalVotingPeriodEnded(ctx sdk.Context, proposalID uint64) error {
49+
var errs error
4150
for i := range h {
42-
h[i].AfterProposalVotingPeriodEnded(ctx, proposalID)
51+
errs = JoinErrors(errs, h[i].AfterProposalVotingPeriodEnded(ctx, proposalID))
4352
}
53+
return errs
54+
}
55+
56+
// implementation of errors.Join() in Go 1.20, until we upgrade to that version
57+
func JoinErrors(errs ...error) error {
58+
n := 0
59+
for _, err := range errs {
60+
if err != nil {
61+
n++
62+
}
63+
}
64+
if n == 0 {
65+
return nil
66+
}
67+
e := &joinError{
68+
errs: make([]error, 0, n),
69+
}
70+
for _, err := range errs {
71+
if err != nil {
72+
e.errs = append(e.errs, err)
73+
}
74+
}
75+
return e
76+
}
77+
78+
type joinError struct {
79+
errs []error
80+
}
81+
82+
func (e *joinError) Error() string {
83+
var b []byte
84+
for i, err := range e.errs {
85+
if i > 0 {
86+
b = append(b, '\n')
87+
}
88+
b = append(b, err.Error()...)
89+
}
90+
return string(b)
4491
}

0 commit comments

Comments
 (0)