From f3bf3bf96fdf0e51852a02b883b4818a4e4ca6c5 Mon Sep 17 00:00:00 2001 From: shin Date: Sun, 5 Jul 2026 08:10:12 +0800 Subject: [PATCH] fix(rewards): ChangeSchedule checks net amount instead of total Fixes #338. The ChangeSchedule function in the rewards module was checking funds availability against the full TotalAmount, ignoring already-released tokens. This prevented governance from updating a schedule after partial release, even when the pool held sufficient funds to cover the remaining balance. Change: pass TotalAmount - ReleasedAmount to fundsAvailable instead of TotalAmount, so only the unreleased portion is reserved. Closes: #338 --- x/rewards/keeper/msg_server.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/x/rewards/keeper/msg_server.go b/x/rewards/keeper/msg_server.go index bf6a6961..4c814293 100644 --- a/x/rewards/keeper/msg_server.go +++ b/x/rewards/keeper/msg_server.go @@ -91,8 +91,10 @@ func (k msgServer) ChangeSchedule(ctx context.Context, msg *types.MsgChangeSched return nil, fmt.Errorf("invalid schedule: %w", err) } - // Check available funds - if err := k.fundsAvailable(sdkCtx, schedule.TotalAmount); err != nil { + // Check available funds: only require pool to cover the remaining (unreleased) amount, + // not the full TotalAmount (which may have been partially released already). + netAmount := schedule.TotalAmount.Sub(schedule.ReleasedAmount) + if err := k.fundsAvailable(sdkCtx, netAmount); err != nil { return nil, fmt.Errorf("insufficient funds: %w", err) }