From c5103a02e14c0a6bb95f74579c3251c48624ed3f Mon Sep 17 00:00:00 2001 From: dragosrebegea Date: Mon, 5 Feb 2024 14:20:49 +0200 Subject: [PATCH] MX-15033: clearEndedProposals implementation --- vm/gasCost.go | 1 + vm/systemSmartContracts/governance.go | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/vm/gasCost.go b/vm/gasCost.go index c2263db787a..c517520fe54 100644 --- a/vm/gasCost.go +++ b/vm/gasCost.go @@ -28,6 +28,7 @@ type MetaChainSystemSCsCost struct { DelegateVote uint64 RevokeVote uint64 CloseProposal uint64 + ClearProposal uint64 DelegationOps uint64 UnStakeTokens uint64 UnBondTokens uint64 diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 1f0a41652f8..9984cf19954 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -728,8 +728,25 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.Ok } -func (g *governanceContract) clearEndedProposals(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - // TODO: implement +func (g *governanceContract) clearEndedProposals(addresses [][]byte) vmcommon.ReturnCode { + numAddresses := uint64(len(addresses)) + if numAddresses == 0 { + return vmcommon.Ok + } + + err := g.eei.UseGas(numAddresses * g.gasCost.MetaChainSystemSCsCost.ClearProposal) + if err != nil { + g.eei.AddReturnMessage("not enough gas") + return vmcommon.OutOfGas + } + for i := uint64(0); i < numAddresses; i++ { + voter := addresses[i] + if len(voter) != len(args.CallerAddr) { + g.eei.AddReturnMessage("invalid delegator address") + return vmcommon.UserError + } + err = g.clearUserVotes(voter) + } return vmcommon.Ok }