Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: expedited proposal min deposit param #254

Merged
merged 56 commits into from
Jun 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
5fd6d11
make proto-all
p0mvn May 19, 2022
ebc98bd
make proto-all with IsExpedited flag
p0mvn May 19, 2022
4498298
expedited_voting_period on voting params
p0mvn May 19, 2022
c964a0d
go mod tidy
p0mvn May 19, 2022
68d3724
add IsExpedited flag to all proposals
p0mvn May 19, 2022
e74b6ce
implement the foundation for expedited proposals
p0mvn May 20, 2022
de4f187
add validation for voting period params
p0mvn May 20, 2022
2be2b33
validate tally params - expedited must be greater than or equal to re…
p0mvn May 20, 2022
de6d0d4
fix cli
p0mvn May 20, 2022
14ac4ee
fix problems with querying tally params
p0mvn May 20, 2022
c9f61a4
TestProposalPassedEndblocker for expedited
p0mvn May 20, 2022
6f6d34d
update TestCmdParams
p0mvn May 20, 2022
2e2f96d
fix TestMigrate v040
p0mvn May 20, 2022
c46a1e6
fix TestGRPCQueryProposal
p0mvn May 20, 2022
39344ce
fix v043 TestMigrateJSON
p0mvn May 20, 2022
fe53f96
fix TestRandomizedGenState
p0mvn May 20, 2022
ddfda7c
fix TestSimulateMsgSubmitProposal
p0mvn May 20, 2022
83bad19
TestExpeditedToRegularConversion
p0mvn May 20, 2022
3f949da
fix TestIntegrationTestSuite/TestCmdParams/text_output
p0mvn May 20, 2022
45eb715
test TestExpeditedProposal_PassAndConversionToRegular
p0mvn May 20, 2022
324fb3e
attempt to fix TestAppStateDeterminism
p0mvn May 20, 2022
b90072a
fix TestRandomizedGenState after changing rand generation bounds
p0mvn May 20, 2022
ead97d0
fix TestParamChanges
p0mvn May 20, 2022
13a09c5
Merge branch 'osmosis-main' into roman/emergency-voting
p0mvn May 20, 2022
63272d2
Update x/gov/abci.go
p0mvn May 20, 2022
5f53f22
Update x/gov/abci.go
p0mvn May 20, 2022
83cb447
Update x/gov/types/keys.go
p0mvn May 20, 2022
15fab45
refactor to have isExpedited flag on the proposal struct
p0mvn Jun 2, 2022
5a348e8
fix tests
p0mvn Jun 2, 2022
11cad5f
Merge branch 'osmosis-main' into roman/emergency-voting
p0mvn Jun 2, 2022
9fab856
clean up proto files and remove is_expedited from CommunityPoolSpendP…
p0mvn Jun 2, 2022
91fbb54
fix migrate tests
p0mvn Jun 2, 2022
47d3cae
fix proto
p0mvn Jun 3, 2022
9ffefd0
Update x/gov/abci.go
p0mvn Jun 3, 2022
6896268
Update proto/cosmos/gov/v1beta1/gov.proto
p0mvn Jun 3, 2022
3cc294a
expedited vote threshold must be strictly greater than regular
p0mvn Jun 3, 2022
69d7f3b
fix Cmd tests
p0mvn Jun 3, 2022
7c12628
fix another cmd test
p0mvn Jun 3, 2022
68528ce
Add spec for emergency voting (#249)
mattverse Jun 5, 2022
1430846
Update x/gov/types/keys.go
p0mvn Jun 6, 2022
a7d05e0
remove redundant isExpedited flag from ContentFromProposalType
p0mvn Jun 6, 2022
3d13fa5
Update x/gov/abci.go
p0mvn Jun 6, 2022
3bccb4d
Merge branch 'osmosis-main' into roman/emergency-voting
p0mvn Jun 7, 2022
001433f
feat: expedited proposal min deposit param
p0mvn Jun 7, 2022
f59e04d
fix TestMigrateJSON
p0mvn Jun 7, 2022
e35dabb
improve TestProposalHandler to test validation of invalid min expedit…
p0mvn Jun 7, 2022
96bc750
fix abci tests
p0mvn Jun 7, 2022
781138d
fix migrate_test.go
p0mvn Jun 7, 2022
b8fdc1a
fix more cli tests
p0mvn Jun 7, 2022
55e3810
fix TestRandomizedGenState
p0mvn Jun 8, 2022
8c5646c
Merge branch 'osmosis-main' into roman/expedited-deposit
p0mvn Jun 17, 2022
b1ae23d
fix merge issue
p0mvn Jun 17, 2022
4fecadb
Update x/gov/types/proposal.go
p0mvn Jun 17, 2022
6fe17ac
Merge branch 'osmosis-main' into roman/expedited-deposit
p0mvn Jun 17, 2022
a409a00
Merge branch 'osmosis-main' into roman/expedited-deposit
p0mvn Jun 17, 2022
6e9e75b
Update x/gov/abci_test.go
p0mvn Jun 20, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/core/proto-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -5111,6 +5111,7 @@ DepositParams defines the params for deposits on governance proposals.
| ----- | ---- | ----- | ----------- |
| `min_deposit` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | Minimum deposit for a proposal to enter voting period. |
| `max_deposit_period` | [google.protobuf.Duration](#google.protobuf.Duration) | | Maximum period for Atom holders to deposit on a proposal. Initial value: 2 months. |
| `min_expedited_deposit` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | Minimum expedited deposit for a proposal to enter voting period. |



Expand Down
8 changes: 8 additions & 0 deletions proto/cosmos/gov/v1beta1/gov.proto
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,14 @@ message DepositParams {
(gogoproto.jsontag) = "max_deposit_period,omitempty",
(gogoproto.moretags) = "yaml:\"max_deposit_period\""
];

// Minimum expedited deposit for a proposal to enter voting period.
repeated cosmos.base.v1beta1.Coin min_expedited_deposit = 3 [
(gogoproto.nullable) = false,
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins",
(gogoproto.moretags) = "yaml:\"min_expedited_deposit\"",
(gogoproto.jsontag) = "min_expedited_deposit,omitempty"
];
}

// VotingParams defines the params for voting on governance proposals.
Expand Down
3 changes: 2 additions & 1 deletion x/gov/abci.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ func EndBlocker(ctx sdk.Context, keeper keeper.Keeper) {
logger.Info(
"proposal did not meet minimum deposit; deleted",
"proposal", proposal.ProposalId,
"is_expedited", proposal.IsExpedited,
"title", proposal.GetTitle(),
"min_deposit", keeper.GetDepositParams(ctx).MinDeposit.String(),
"min_deposit", proposal.GetMinDepositFromParams(keeper.GetDepositParams(ctx)).String(),
"total_deposit", proposal.TotalDeposit.String(),
)

Expand Down
34 changes: 25 additions & 9 deletions x/gov/abci_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ func TestTickPassedVotingPeriod(t *testing.T) {
t.Run(tc.name, func(t *testing.T) {
testProposal := TestProposal

depositMultiplier := getDepositMultiplier(tc.isExpedited)

app := simapp.Setup(false)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
addrs := simapp.AddTestAddrs(app, ctx, 10, valTokens)
Expand All @@ -242,7 +244,7 @@ func TestTickPassedVotingPeriod(t *testing.T) {
require.False(t, activeQueue.Valid())
activeQueue.Close()

proposalCoins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 5))}
proposalCoins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 5*depositMultiplier))}
newProposalMsg, err := types.NewMsgSubmitProposal(testProposal, proposalCoins, addrs[0], tc.isExpedited)
require.NoError(t, err)

Expand Down Expand Up @@ -319,25 +321,27 @@ func TestTickPassedVotingPeriod(t *testing.T) {
func TestProposalPassedEndblocker(t *testing.T) {
testcases := []struct {
name string
IsExpedited bool
isExpedited bool
}{
{
name: "regular text",
IsExpedited: false,
isExpedited: false,
},
{
name: "text expedited",
IsExpedited: true,
isExpedited: true,
},
}

for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
testProposal := TestProposal

depositMultiplier := getDepositMultiplier(tc.isExpedited)

app := simapp.Setup(false)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
addrs := simapp.AddTestAddrs(app, ctx, 10, valTokens)
addrs := simapp.AddTestAddrs(app, ctx, 10, valTokens.Mul(sdk.NewInt(depositMultiplier)))

SortAddresses(addrs)

Expand All @@ -356,10 +360,10 @@ func TestProposalPassedEndblocker(t *testing.T) {
require.NotNil(t, macc)
initialModuleAccCoins := app.BankKeeper.GetAllBalances(ctx, macc.GetAddress())

proposal, err := app.GovKeeper.SubmitProposal(ctx, testProposal, tc.IsExpedited)
proposal, err := app.GovKeeper.SubmitProposal(ctx, testProposal, tc.isExpedited)
require.NoError(t, err)

proposalCoins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 10))}
proposalCoins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 10*depositMultiplier))}
newDepositMsg := types.NewMsgDeposit(addrs[0], proposal.ProposalId, proposalCoins)

handleAndCheck(t, handler, ctx, newDepositMsg)
Expand Down Expand Up @@ -415,9 +419,11 @@ func TestExpeditedProposal_PassAndConversionToRegular(t *testing.T) {
t.Run(tc.name, func(t *testing.T) {
testProposal := TestProposal

depositMultiplier := getDepositMultiplier(true)

app := simapp.Setup(false)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
addrs := simapp.AddTestAddrs(app, ctx, 10, valTokens)
addrs := simapp.AddTestAddrs(app, ctx, 10, valTokens.Mul(sdk.NewInt(depositMultiplier)))

SortAddresses(addrs)

Expand Down Expand Up @@ -447,7 +453,7 @@ func TestExpeditedProposal_PassAndConversionToRegular(t *testing.T) {
submitterInitialBalance := app.BankKeeper.GetAllBalances(ctx, addrs[0])
depositorInitialBalance := app.BankKeeper.GetAllBalances(ctx, addrs[1])

proposalCoins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 5))}
proposalCoins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 5*depositMultiplier))}
newProposalMsg, err := types.NewMsgSubmitProposal(testProposal, proposalCoins, addrs[0], true)
require.NoError(t, err)

Expand Down Expand Up @@ -639,3 +645,13 @@ func TestEndBlockerProposalHandlerFailed(t *testing.T) {
// validate that the proposal fails/has been rejected
gov.EndBlocker(ctx, app.GovKeeper)
}

// With expedited proposal's minimum deposit set higher than the default deposit, we must
// initialize and deposit an amount depositMultiplier times larger
// than the regular min deposit amount.
func getDepositMultiplier(isExpedited bool) int64 {
if !isExpedited {
return 1
}
return types.DefaultMinExpeditedDepositTokens.Quo(types.DefaultMinDepositTokens).Int64()
}
2 changes: 1 addition & 1 deletion x/gov/client/testutil/cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func TestIntegrationTestSuite(t *testing.T) {
suite.Run(t, NewIntegrationTestSuite(cfg))

genesisState := types.DefaultGenesisState()
genesisState.DepositParams = types.NewDepositParams(sdk.NewCoins(sdk.NewCoin(cfg.BondDenom, types.DefaultMinDepositTokens)), time.Duration(15)*time.Second)
genesisState.DepositParams = types.NewDepositParams(sdk.NewCoins(sdk.NewCoin(cfg.BondDenom, types.DefaultMinDepositTokens)), time.Duration(15)*time.Second, sdk.NewCoins(sdk.NewCoin(cfg.BondDenom, types.DefaultMinExpeditedDepositTokens)))
genesisState.VotingParams = types.NewVotingParams(time.Duration(5)*time.Second, time.Duration(2)*time.Second, []types.ProposalVotingPeriod{})
bz, err := cfg.Codec.MarshalJSON(genesisState)
require.NoError(t, err)
Expand Down
7 changes: 5 additions & 2 deletions x/gov/client/testutil/suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func (s *IntegrationTestSuite) TestCmdParams() {
{
"json output",
[]string{fmt.Sprintf("--%s=json", tmcli.OutputFlag)},
`{"voting_params":{"voting_period":"172800000000000","proposal_voting_periods":null,"expedited_voting_period":"86400000000000"},"tally_params":{"quorum":"0.334000000000000000","threshold":"0.500000000000000000","veto_threshold":"0.334000000000000000","expedited_threshold":"0.667000000000000000"},"deposit_params":{"min_deposit":[{"denom":"stake","amount":"10000000"}],"max_deposit_period":"172800000000000"}}`,
`{"voting_params":{"voting_period":"172800000000000","proposal_voting_periods":null,"expedited_voting_period":"86400000000000"},"tally_params":{"quorum":"0.334000000000000000","threshold":"0.500000000000000000","veto_threshold":"0.334000000000000000","expedited_threshold":"0.667000000000000000"},"deposit_params":{"min_deposit":[{"denom":"stake","amount":"10000000"}],"max_deposit_period":"172800000000000","min_expedited_deposit":[{"denom":"stake","amount":"50000000"}]}}`,
},
{
"text output",
Expand All @@ -99,6 +99,9 @@ deposit_params:
min_deposit:
- amount: "10000000"
denom: stake
min_expedited_deposit:
- amount: "50000000"
denom: stake
tally_params:
expedited_threshold: "0.667000000000000000"
quorum: "0.334000000000000000"
Expand Down Expand Up @@ -156,7 +159,7 @@ func (s *IntegrationTestSuite) TestCmdParam() {
"deposit",
fmt.Sprintf("--%s=json", tmcli.OutputFlag),
},
`{"min_deposit":[{"denom":"stake","amount":"10000000"}],"max_deposit_period":"172800000000000"}`,
`{"min_deposit":[{"denom":"stake","amount":"10000000"}],"max_deposit_period":"172800000000000","min_expedited_deposit":[{"denom":"stake","amount":"50000000"}]}`,
},
}

Expand Down
3 changes: 2 additions & 1 deletion x/gov/keeper/deposit.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ func (keeper Keeper) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAdd
// Check if deposit has provided sufficient total funds to transition the proposal into the voting period
activatedVotingPeriod := false

if proposal.Status == types.StatusDepositPeriod && proposal.TotalDeposit.IsAllGTE(keeper.GetDepositParams(ctx).MinDeposit) {
minDepositAmount := proposal.GetMinDepositFromParams(keeper.GetDepositParams(ctx))
if proposal.Status == types.StatusDepositPeriod && proposal.TotalDeposit.IsAllGTE(minDepositAmount) {
keeper.ActivateVotingPeriod(ctx, proposal)

activatedVotingPeriod = true
Expand Down
212 changes: 117 additions & 95 deletions x/gov/keeper/deposit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,102 +9,124 @@ import (

"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/gov/types"
)

func TestDeposits(t *testing.T) {
app := simapp.Setup(false)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})

TestAddrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(10000000))

tp := TestProposal
proposal, err := app.GovKeeper.SubmitProposal(ctx, tp, false)
require.NoError(t, err)
proposalID := proposal.ProposalId

fourStake := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 4)))
fiveStake := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 5)))

addr0Initial := app.BankKeeper.GetAllBalances(ctx, TestAddrs[0])
addr1Initial := app.BankKeeper.GetAllBalances(ctx, TestAddrs[1])

require.True(t, proposal.TotalDeposit.IsEqual(sdk.NewCoins()))

// Check no deposits at beginning
deposit, found := app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.False(t, found)
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.True(t, proposal.VotingStartTime.Equal(time.Time{}))

// Check first deposit
votingStarted, err := app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[0], fourStake)
require.NoError(t, err)
require.False(t, votingStarted)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[0])
require.True(t, found)
require.Equal(t, fourStake, deposit.Amount)
require.Equal(t, TestAddrs[0].String(), deposit.Depositor)
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.Equal(t, fourStake, proposal.TotalDeposit)
require.Equal(t, addr0Initial.Sub(fourStake), app.BankKeeper.GetAllBalances(ctx, TestAddrs[0]))

// Check a second deposit from same address
votingStarted, err = app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[0], fiveStake)
require.NoError(t, err)
require.False(t, votingStarted)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[0])
require.True(t, found)
require.Equal(t, fourStake.Add(fiveStake...), deposit.Amount)
require.Equal(t, TestAddrs[0].String(), deposit.Depositor)
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.Equal(t, fourStake.Add(fiveStake...), proposal.TotalDeposit)
require.Equal(t, addr0Initial.Sub(fourStake).Sub(fiveStake), app.BankKeeper.GetAllBalances(ctx, TestAddrs[0]))

// Check third deposit from a new address
votingStarted, err = app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[1], fourStake)
require.NoError(t, err)
require.True(t, votingStarted)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.True(t, found)
require.Equal(t, TestAddrs[1].String(), deposit.Depositor)
require.Equal(t, fourStake, deposit.Amount)
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.Equal(t, fourStake.Add(fiveStake...).Add(fourStake...), proposal.TotalDeposit)
require.Equal(t, addr1Initial.Sub(fourStake), app.BankKeeper.GetAllBalances(ctx, TestAddrs[1]))

// Check that proposal moved to voting period
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.True(t, proposal.VotingStartTime.Equal(ctx.BlockHeader().Time))

// Test deposit iterator
// NOTE order of deposits is determined by the addresses
deposits := app.GovKeeper.GetAllDeposits(ctx)
require.Len(t, deposits, 2)
require.Equal(t, deposits, app.GovKeeper.GetDeposits(ctx, proposalID))
require.Equal(t, TestAddrs[0].String(), deposits[0].Depositor)
require.Equal(t, fourStake.Add(fiveStake...), deposits[0].Amount)
require.Equal(t, TestAddrs[1].String(), deposits[1].Depositor)
require.Equal(t, fourStake, deposits[1].Amount)

// Test Refund Deposits
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.True(t, found)
require.Equal(t, fourStake, deposit.Amount)
app.GovKeeper.RefundDeposits(ctx, proposalID)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.False(t, found)
require.Equal(t, addr0Initial, app.BankKeeper.GetAllBalances(ctx, TestAddrs[0]))
require.Equal(t, addr1Initial, app.BankKeeper.GetAllBalances(ctx, TestAddrs[1]))

// Test delete deposits
_, err = app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[0], fourStake)
require.NoError(t, err)
app.GovKeeper.DeleteDeposits(ctx, proposalID)
deposits = app.GovKeeper.GetDeposits(ctx, proposalID)
require.Len(t, deposits, 0)
testcases := map[string]struct {
isExpedited bool
}{
"regular": {
isExpedited: false,
},
"expedited": {
isExpedited: true,
},
}

for _, tc := range testcases {
app := simapp.Setup(false)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})

// With expedited proposals the minimum deposit is higer, so we must
// initialize and deposit an amount depositMultiplier times larger
// than the regular min deposit amount.
depositMultiplier := int64(1)
if tc.isExpedited {
depositMultiplier = types.DefaultMinExpeditedDepositTokens.Quo(types.DefaultMinDepositTokens).Int64()
}

TestAddrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(10000000*depositMultiplier))

tp := TestProposal
proposal, err := app.GovKeeper.SubmitProposal(ctx, tp, tc.isExpedited)
require.NoError(t, err)
proposalID := proposal.ProposalId

firstDepositValue := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 4*depositMultiplier)))
secondDepositValue := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 5*depositMultiplier)))

addr0Initial := app.BankKeeper.GetAllBalances(ctx, TestAddrs[0])
addr1Initial := app.BankKeeper.GetAllBalances(ctx, TestAddrs[1])

require.True(t, proposal.TotalDeposit.IsEqual(sdk.NewCoins()))

// Check no deposits at beginning
deposit, found := app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.False(t, found)
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.True(t, proposal.VotingStartTime.Equal(time.Time{}))

// Check first deposit
votingStarted, err := app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[0], firstDepositValue)
require.NoError(t, err)
require.False(t, votingStarted)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[0])
require.True(t, found)
require.Equal(t, firstDepositValue, deposit.Amount)
require.Equal(t, TestAddrs[0].String(), deposit.Depositor)
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.Equal(t, firstDepositValue, proposal.TotalDeposit)
require.Equal(t, addr0Initial.Sub(firstDepositValue), app.BankKeeper.GetAllBalances(ctx, TestAddrs[0]))

// Check a second deposit from same address
votingStarted, err = app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[0], secondDepositValue)
require.NoError(t, err)
require.False(t, votingStarted)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[0])
require.True(t, found)
require.Equal(t, firstDepositValue.Add(secondDepositValue...), deposit.Amount)
require.Equal(t, TestAddrs[0].String(), deposit.Depositor)
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.Equal(t, firstDepositValue.Add(secondDepositValue...), proposal.TotalDeposit)
require.Equal(t, addr0Initial.Sub(firstDepositValue).Sub(secondDepositValue), app.BankKeeper.GetAllBalances(ctx, TestAddrs[0]))

// Check third deposit from a new address
votingStarted, err = app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[1], firstDepositValue)
require.NoError(t, err)
require.True(t, votingStarted)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.True(t, found)
require.Equal(t, TestAddrs[1].String(), deposit.Depositor)
require.Equal(t, firstDepositValue, deposit.Amount)
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.Equal(t, firstDepositValue.Add(secondDepositValue...).Add(firstDepositValue...), proposal.TotalDeposit)
require.Equal(t, addr1Initial.Sub(firstDepositValue), app.BankKeeper.GetAllBalances(ctx, TestAddrs[1]))

// Check that proposal moved to voting period
proposal, ok = app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
require.True(t, proposal.VotingStartTime.Equal(ctx.BlockHeader().Time))

// Test deposit iterator
// NOTE order of deposits is determined by the addresses
deposits := app.GovKeeper.GetAllDeposits(ctx)
require.Len(t, deposits, 2)
require.Equal(t, deposits, app.GovKeeper.GetDeposits(ctx, proposalID))
require.Equal(t, TestAddrs[0].String(), deposits[0].Depositor)
require.Equal(t, firstDepositValue.Add(secondDepositValue...), deposits[0].Amount)
require.Equal(t, TestAddrs[1].String(), deposits[1].Depositor)
require.Equal(t, firstDepositValue, deposits[1].Amount)

// Test Refund Deposits
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.True(t, found)
require.Equal(t, firstDepositValue, deposit.Amount)
app.GovKeeper.RefundDeposits(ctx, proposalID)
deposit, found = app.GovKeeper.GetDeposit(ctx, proposalID, TestAddrs[1])
require.False(t, found)
require.Equal(t, addr0Initial, app.BankKeeper.GetAllBalances(ctx, TestAddrs[0]))
require.Equal(t, addr1Initial, app.BankKeeper.GetAllBalances(ctx, TestAddrs[1]))

// Test delete deposits
_, err = app.GovKeeper.AddDeposit(ctx, proposalID, TestAddrs[0], firstDepositValue)
require.NoError(t, err)
app.GovKeeper.DeleteDeposits(ctx, proposalID)
deposits = app.GovKeeper.GetDeposits(ctx, proposalID)
require.Len(t, deposits, 0)
}
}
Loading