Skip to content

Commit 5f40e82

Browse files
committed
test+docs(svip): update tests and docs for standalone activated/paused state
1 parent 5b7c887 commit 5f40e82

7 files changed

Lines changed: 90 additions & 98 deletions

File tree

evmd/docs/SVIP.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,6 @@ Open `/tmp/svip_set_params.json` and replace `<GOV_AUTHORITY>` with the address
148148
"@type": "/cosmos.svip.v1.MsgUpdateParams",
149149
"authority": "og10d07y265gmmuvt4z0w9aw880jnsr700jrdya3k",
150150
"params": {
151-
"activated": false,
152-
"paused": false,
153151
"half_life_seconds": "473364000"
154152
}
155153
}
@@ -202,12 +200,11 @@ Status should be `PROPOSAL_STATUS_PASSED`.
202200
evmd q svip params
203201
```
204202

205-
> **Heads up:** Don't be alarmed if this shows `params: {}`. Before activation, both `activated` and `paused` are `false`, and `half_life_seconds` is an integer. Proto3 serialization drops fields that equal their default values (`false`, `0`), so the whole thing looks empty even though the values are stored correctly. If you want proof, just move on to step 3. `MsgActivate` will reject with "half_life_seconds must be set before activation" if the value didn't stick.
203+
> **Heads up:** Don't be alarmed if this shows `params: {}`. `half_life_seconds` is an integer, and proto3 serialization drops fields that equal their default value (`0`), so the whole thing looks empty even though the value is stored correctly. If you want proof, just move on to step 3. `MsgActivate` will reject with "half_life_seconds must be set before activation" if the value didn't stick.
206204
207205
> **Devnet:** Use `--from mykey --home ~/.og-evm-devnet --chain-id 10740 --keyring-backend test --gas 300000 --gas-prices 10000000ogwei` for both submit and vote. Deposit is `10000000ogwei`. Wait ~35 seconds after voting.
208206
209207
**Guardrails:**
210-
- You can't set `activated` back to `false` once it's been turned on. Activation is permanent.
211208
- `half_life_seconds` must be at least 1 year.
212209
- After activation, `half_life_seconds` can't change by more than 50% in a single proposal.
213210

@@ -391,14 +388,14 @@ evmd q svip pool-state
391388
## Queries
392389

393390
```bash
394-
# Module parameters (activated, paused, half_life_seconds)
391+
# Module parameters (half_life_seconds)
395392
evmd q svip params
396393

397394
# Pool state (balance, total distributed, current rate, activation time)
398395
evmd q svip pool-state
399396
```
400397

401-
> **About `params: {}`:** The params query uses proto3 serialization, which drops fields that equal their default value (`false` for bools, `0` for integers). Before activation, this means you'll see `params: {}` even when `half_life_seconds` is set. After activation, `activated: true` shows up but `paused` still hides when it's false. Don't worry, the values are stored correctly. Use `q svip pool-state` for the full picture.
398+
> **About `params: {}`:** The params query uses proto3 serialization, which drops fields that equal their default value (`0` for integers). This means you'll see `params: {}` even when `half_life_seconds` is set to 0. Don't worry, the value is stored correctly. Use `q svip pool-state` for the full picture including activated/paused status.
402399
403400
---
404401

evmd/docs/svip_update_params_proposal.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
"@type": "/cosmos.svip.v1.MsgUpdateParams",
55
"authority": "<GOV_AUTHORITY>",
66
"params": {
7-
"activated": false,
8-
"paused": false,
97
"half_life_seconds": "473364000"
108
}
119
}

x/svip/keeper/keeper_test.go

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,43 @@ func TestGetSetParams(t *testing.T) {
7070

7171
// Set custom params and read back
7272
custom := types.Params{
73-
Activated: true,
74-
Paused: false,
7573
HalfLifeSeconds: 31536000,
7674
}
7775
require.NoError(t, td.keeper.SetParams(td.ctx, custom))
7876
got := td.keeper.GetParams(td.ctx)
7977
require.Equal(t, custom, got)
8078
}
8179

80+
func TestGetSetActivated(t *testing.T) {
81+
td := newMockedTestData(t)
82+
83+
// Default is false
84+
require.False(t, td.keeper.GetActivated(td.ctx))
85+
86+
// Set true and read back
87+
td.keeper.SetActivated(td.ctx, true)
88+
require.True(t, td.keeper.GetActivated(td.ctx))
89+
90+
// Set false and read back
91+
td.keeper.SetActivated(td.ctx, false)
92+
require.False(t, td.keeper.GetActivated(td.ctx))
93+
}
94+
95+
func TestGetSetPaused(t *testing.T) {
96+
td := newMockedTestData(t)
97+
98+
// Default is false
99+
require.False(t, td.keeper.GetPaused(td.ctx))
100+
101+
// Set true and read back
102+
td.keeper.SetPaused(td.ctx, true)
103+
require.True(t, td.keeper.GetPaused(td.ctx))
104+
105+
// Set false and read back
106+
td.keeper.SetPaused(td.ctx, false)
107+
require.False(t, td.keeper.GetPaused(td.ctx))
108+
}
109+
82110
func TestGetSetTotalDistributed(t *testing.T) {
83111
td := newMockedTestData(t)
84112

@@ -144,8 +172,9 @@ func TestBeginBlock_NotActivated(t *testing.T) {
144172
func TestBeginBlock_Paused(t *testing.T) {
145173
td := newMockedTestData(t)
146174

147-
params := types.Params{Activated: true, Paused: true, HalfLifeSeconds: 31536000}
148-
require.NoError(t, td.keeper.SetParams(td.ctx, params))
175+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 31536000}))
176+
td.keeper.SetActivated(td.ctx, true)
177+
td.keeper.SetPaused(td.ctx, true)
149178

150179
err := td.keeper.BeginBlock(td.ctx)
151180
require.NoError(t, err)
@@ -160,9 +189,9 @@ func TestBeginBlock_Distributes(t *testing.T) {
160189
halfLife := int64(31536000)
161190
poolBalance := sdkmath.NewInt(1_000_000_000_000)
162191

163-
// Set params as activated
164-
params := types.Params{Activated: true, Paused: false, HalfLifeSeconds: halfLife}
165-
require.NoError(t, td.keeper.SetParams(td.ctx, params))
192+
// Set params and activate
193+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: halfLife}))
194+
td.keeper.SetActivated(td.ctx, true)
166195

167196
// Set activation state
168197
activationTime := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
@@ -216,8 +245,8 @@ func TestBeginBlock_CapsAtPoolBalance(t *testing.T) {
216245
// Remaining pool balance is tiny — smaller than calculated reward
217246
tinyBalance := sdkmath.NewInt(1)
218247

219-
params := types.Params{Activated: true, Paused: false, HalfLifeSeconds: halfLife}
220-
require.NoError(t, td.keeper.SetParams(td.ctx, params))
248+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: halfLife}))
249+
td.keeper.SetActivated(td.ctx, true)
221250

222251
activationTime := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
223252
td.keeper.SetActivationTime(td.ctx, activationTime)

x/svip/keeper/msg_server_test.go

Lines changed: 32 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -32,72 +32,51 @@ func TestUpdateParams_InvalidAuthority(t *testing.T) {
3232
require.ErrorContains(t, err, "invalid authority")
3333
}
3434

35-
func TestUpdateParams_CannotDeactivate(t *testing.T) {
36-
td := newMockedTestData(t)
37-
srv := keeper.NewMsgServerImpl(td.keeper)
38-
39-
// Set as activated
40-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
41-
Activated: true, HalfLifeSeconds: 31536000,
42-
}))
43-
44-
_, err := srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
45-
Authority: govAuthority(),
46-
Params: types.Params{Activated: false, HalfLifeSeconds: 31536000},
47-
})
48-
require.ErrorContains(t, err, "cannot deactivate")
49-
}
50-
5135
func TestUpdateParams_HalfLifeChangeCap(t *testing.T) {
5236
td := newMockedTestData(t)
5337
srv := keeper.NewMsgServerImpl(td.keeper)
5438

55-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
56-
Activated: true, HalfLifeSeconds: 100_000_000,
57-
}))
39+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 100_000_000}))
40+
td.keeper.SetActivated(td.ctx, true)
5841

5942
// >50% increase (1.6x) should fail
6043
_, err := srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
6144
Authority: govAuthority(),
62-
Params: types.Params{Activated: true, HalfLifeSeconds: 160_000_000},
45+
Params: types.Params{HalfLifeSeconds: 160_000_000},
6346
})
6447
require.ErrorIs(t, err, types.ErrHalfLifeChange)
6548

6649
// >50% decrease (0.4x) should fail
6750
_, err = srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
6851
Authority: govAuthority(),
69-
Params: types.Params{Activated: true, HalfLifeSeconds: 40_000_000},
52+
Params: types.Params{HalfLifeSeconds: 40_000_000},
7053
})
7154
require.ErrorIs(t, err, types.ErrHalfLifeChange)
7255

7356
// Exact 0.5x boundary (ratio == 0.5) should pass
7457
_, err = srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
7558
Authority: govAuthority(),
76-
Params: types.Params{Activated: true, HalfLifeSeconds: 50_000_000},
59+
Params: types.Params{HalfLifeSeconds: 50_000_000},
7760
})
7861
require.NoError(t, err)
7962

8063
// Reset to 100M for next boundary test
81-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
82-
Activated: true, HalfLifeSeconds: 100_000_000,
83-
}))
64+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 100_000_000}))
8465

8566
// Exact 1.5x boundary (ratio == 1.5) should pass
8667
_, err = srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
8768
Authority: govAuthority(),
88-
Params: types.Params{Activated: true, HalfLifeSeconds: 150_000_000},
69+
Params: types.Params{HalfLifeSeconds: 150_000_000},
8970
})
9071
require.NoError(t, err)
9172

9273
// Reset to 100M for next test
93-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
94-
Activated: true, HalfLifeSeconds: 100_000_000,
95-
}))
74+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 100_000_000}))
9675

9776
// Within 50% (1.3x) should pass
9877
_, err = srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
9978
Authority: govAuthority(),
100-
Params: types.Params{Activated: true, HalfLifeSeconds: 130_000_000},
79+
Params: types.Params{HalfLifeSeconds: 130_000_000},
10180
})
10281
require.NoError(t, err)
10382
}
@@ -108,7 +87,7 @@ func TestUpdateParams_HalfLifeMinimum(t *testing.T) {
10887

10988
_, err := srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
11089
Authority: govAuthority(),
111-
Params: types.Params{Activated: false, HalfLifeSeconds: 1000}, // < 1 year
90+
Params: types.Params{HalfLifeSeconds: 1000}, // < 1 year
11291
})
11392
require.ErrorContains(t, err, "half_life_seconds must be >= 1 year")
11493
}
@@ -117,7 +96,7 @@ func TestUpdateParams_HappyPath(t *testing.T) {
11796
td := newMockedTestData(t)
11897
srv := keeper.NewMsgServerImpl(td.keeper)
11998

120-
newParams := types.Params{Activated: false, HalfLifeSeconds: 63072000} // 2 years
99+
newParams := types.Params{HalfLifeSeconds: 63072000} // 2 years
121100
_, err := srv.UpdateParams(td.ctx, &types.MsgUpdateParams{
122101
Authority: govAuthority(),
123102
Params: newParams,
@@ -138,9 +117,8 @@ func TestActivate_AlreadyActivated(t *testing.T) {
138117
td := newMockedTestData(t)
139118
srv := keeper.NewMsgServerImpl(td.keeper)
140119

141-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
142-
Activated: true, HalfLifeSeconds: 31536000,
143-
}))
120+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 31536000}))
121+
td.keeper.SetActivated(td.ctx, true)
144122

145123
_, err := srv.Activate(td.ctx, &types.MsgActivate{Authority: govAuthority()})
146124
require.ErrorIs(t, err, types.ErrAlreadyActivated)
@@ -159,9 +137,7 @@ func TestActivate_PoolNotFunded(t *testing.T) {
159137
td := newMockedTestData(t)
160138
srv := keeper.NewMsgServerImpl(td.keeper)
161139

162-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
163-
Activated: false, HalfLifeSeconds: 31536000,
164-
}))
140+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 31536000}))
165141

166142
denom := vmtypes.GetEVMCoinDenom()
167143
moduleAddr := authtypes.NewModuleAddress(types.ModuleName)
@@ -179,9 +155,7 @@ func TestActivate_HappyPath(t *testing.T) {
179155
halfLife := int64(31536000)
180156
poolBalance := sdkmath.NewInt(1_000_000_000_000)
181157

182-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
183-
Activated: false, HalfLifeSeconds: halfLife,
184-
}))
158+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: halfLife}))
185159

186160
denom := vmtypes.GetEVMCoinDenom()
187161
moduleAddr := authtypes.NewModuleAddress(types.ModuleName)
@@ -194,8 +168,7 @@ func TestActivate_HappyPath(t *testing.T) {
194168
_, err := srv.Activate(ctx, &types.MsgActivate{Authority: govAuthority()})
195169
require.NoError(t, err)
196170

197-
params := td.keeper.GetParams(ctx)
198-
require.True(t, params.Activated)
171+
require.True(t, td.keeper.GetActivated(ctx))
199172
require.Equal(t, poolBalance, td.keeper.GetPoolBalanceAtActivation(ctx))
200173
require.Equal(t, blockTime, td.keeper.GetActivationTime(ctx).UTC())
201174
require.Equal(t, blockTime, td.keeper.GetLastBlockTime(ctx).UTC())
@@ -213,9 +186,8 @@ func TestReactivate_PoolNotFunded(t *testing.T) {
213186
td := newMockedTestData(t)
214187
srv := keeper.NewMsgServerImpl(td.keeper)
215188

216-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
217-
Activated: true, HalfLifeSeconds: 31536000,
218-
}))
189+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 31536000}))
190+
td.keeper.SetActivated(td.ctx, true)
219191

220192
denom := vmtypes.GetEVMCoinDenom()
221193
moduleAddr := authtypes.NewModuleAddress(types.ModuleName)
@@ -230,9 +202,9 @@ func TestReactivate_ClearsPaused(t *testing.T) {
230202
td := newMockedTestData(t)
231203
srv := keeper.NewMsgServerImpl(td.keeper)
232204

233-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
234-
Activated: true, Paused: true, HalfLifeSeconds: 31536000,
235-
}))
205+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 31536000}))
206+
td.keeper.SetActivated(td.ctx, true)
207+
td.keeper.SetPaused(td.ctx, true)
236208
td.keeper.SetTotalPausedSeconds(td.ctx, 500)
237209

238210
poolBalance := sdkmath.NewInt(1_000_000_000_000)
@@ -247,8 +219,7 @@ func TestReactivate_ClearsPaused(t *testing.T) {
247219
_, err := srv.Reactivate(ctx, &types.MsgReactivate{Authority: govAuthority()})
248220
require.NoError(t, err)
249221

250-
params := td.keeper.GetParams(ctx)
251-
require.False(t, params.Paused, "reactivate should clear paused flag")
222+
require.False(t, td.keeper.GetPaused(ctx), "reactivate should clear paused flag")
252223
require.Equal(t, int64(0), td.keeper.GetTotalPausedSeconds(ctx))
253224
require.True(t, td.keeper.GetTotalDistributed(ctx).IsZero())
254225
}
@@ -257,9 +228,8 @@ func TestReactivate_HappyPath(t *testing.T) {
257228
td := newMockedTestData(t)
258229
srv := keeper.NewMsgServerImpl(td.keeper)
259230

260-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
261-
Activated: true, HalfLifeSeconds: 31536000,
262-
}))
231+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 31536000}))
232+
td.keeper.SetActivated(td.ctx, true)
263233
td.keeper.SetTotalDistributed(td.ctx, sdkmath.NewInt(5000))
264234

265235
newPoolBalance := sdkmath.NewInt(500_000_000_000)
@@ -293,9 +263,9 @@ func TestPause_AccumulatesPausedDuration(t *testing.T) {
293263
srv := keeper.NewMsgServerImpl(td.keeper)
294264

295265
// Start with activated + paused
296-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
297-
Activated: true, Paused: true, HalfLifeSeconds: 31536000,
298-
}))
266+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: 31536000}))
267+
td.keeper.SetActivated(td.ctx, true)
268+
td.keeper.SetPaused(td.ctx, true)
299269

300270
pauseStart := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
301271
td.keeper.SetLastBlockTime(td.ctx, pauseStart)
@@ -310,9 +280,8 @@ func TestPause_AccumulatesPausedDuration(t *testing.T) {
310280
require.Equal(t, int64(100), td.keeper.GetTotalPausedSeconds(ctx))
311281
require.Equal(t, unpauseTime, td.keeper.GetLastBlockTime(ctx).UTC())
312282

313-
// Verify params updated
314-
params := td.keeper.GetParams(ctx)
315-
require.False(t, params.Paused)
283+
// Verify paused flag cleared
284+
require.False(t, td.keeper.GetPaused(ctx))
316285
}
317286

318287
func TestPause_HappyPath(t *testing.T) {
@@ -325,12 +294,12 @@ func TestPause_HappyPath(t *testing.T) {
325294
// Pause
326295
_, err := srv.Pause(td.ctx, &types.MsgPause{Authority: govAuthority(), Paused: true})
327296
require.NoError(t, err)
328-
require.True(t, td.keeper.GetParams(td.ctx).Paused)
297+
require.True(t, td.keeper.GetPaused(td.ctx))
329298

330299
// Unpause
331300
_, err = srv.Pause(td.ctx, &types.MsgPause{Authority: govAuthority(), Paused: false})
332301
require.NoError(t, err)
333-
require.False(t, td.keeper.GetParams(td.ctx).Paused)
302+
require.False(t, td.keeper.GetPaused(td.ctx))
334303
}
335304

336305
func TestFundPool_InvalidDepositor(t *testing.T) {
@@ -392,9 +361,7 @@ func TestBeginBlock_AfterPauseUnpause(t *testing.T) {
392361
).Return(nil)
393362

394363
// 1. Activate at T=0
395-
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{
396-
Activated: false, HalfLifeSeconds: halfLife,
397-
}))
364+
require.NoError(t, td.keeper.SetParams(td.ctx, types.Params{HalfLifeSeconds: halfLife}))
398365
activationTime := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
399366
ctx := td.ctx.WithBlockTime(activationTime)
400367
_, err := srv.Activate(ctx, &types.MsgActivate{Authority: govAuthority()})

x/svip/types/genesis_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,23 @@ func (suite *GenesisTestSuite) TestGenesisStateValidate() {
5555
{
5656
"invalid - activated with half_life=0",
5757
types.GenesisState{
58-
Params: types.Params{Activated: true, HalfLifeSeconds: 0},
58+
Params: types.Params{HalfLifeSeconds: 0},
59+
Activated: true,
5960
TotalDistributed: sdkmath.ZeroInt(),
6061
PoolBalanceAtActivation: sdkmath.ZeroInt(),
6162
},
6263
true,
6364
},
65+
{
66+
"valid - activated with half_life set",
67+
types.GenesisState{
68+
Params: types.Params{HalfLifeSeconds: 31536000},
69+
Activated: true,
70+
TotalDistributed: sdkmath.ZeroInt(),
71+
PoolBalanceAtActivation: sdkmath.ZeroInt(),
72+
},
73+
false,
74+
},
6475
}
6576

6677
for _, tc := range testCases {

0 commit comments

Comments
 (0)