Skip to content

Commit f74bc21

Browse files
p0mvnmergify[bot]
authored andcommitted
test(x/gamm): remove liquidity events (#2186)
* test(x/gamm): remove liquidity events * remove capacity pre-allocation * Update x/gamm/keeper/internal/events/emit_test.go Co-authored-by: Adam Tucker <adam@osmosis.team> * Update x/gamm/keeper/msg_server_test.go Co-authored-by: Adam Tucker <adam@osmosis.team> * Update x/gamm/keeper/pool_service_test.go Co-authored-by: Adam Tucker <adam@osmosis.team> * shareIn * update event comments * changelog * Update CHANGELOG.md Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com> * add docs Co-authored-by: Adam Tucker <adam@osmosis.team> Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com> (cherry picked from commit 40f19a3) # Conflicts: # CHANGELOG.md # x/gamm/keeper/pool_service_test.go # x/superfluid/keeper/unpool_test.go
1 parent 681ffae commit f74bc21

File tree

9 files changed

+597
-84
lines changed

9 files changed

+597
-84
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,18 @@ This release contains minor CLI bug fixes.
103103
* [1759](https://github.com/osmosis-labs/osmosis/pull/1759) Fix pagination filter in incentives query.
104104
* [1698](https://github.com/osmosis-labs/osmosis/pull/1698) Register wasm snapshotter extension.
105105
* [1931](https://github.com/osmosis-labs/osmosis/pull/1931) Add explicit check for input denoms to `CalcJoinPoolShares`
106+
<<<<<<< HEAD
107+
=======
108+
* [2011](https://github.com/osmosis-labs/osmosis/pull/2011) Fix bug in TokenFactory initGenesis, relating to denom creation fee param.
109+
* [2186](https://github.com/osmosis-labs/osmosis/pull/2186) Remove liquidity event that was emitted twice per message.
110+
111+
### Improvements
112+
* [#2214](https://github.com/osmosis-labs/osmosis/pull/2214) Speedup epoch distribution, superfluid component
113+
114+
### SDK Upgrades
115+
* [#2245](https://github.com/osmosis-labs/osmosis/pull/2244) Upgrade SDK with the following major changes:
116+
* Minimum deposit on proposer at submission time: https://github.com/osmosis-labs/cosmos-sdk/pull/296
117+
>>>>>>> 40f19a38 (test(x/gamm): remove liquidity events (#2186))
106118
107119
## [v9.0.0 - Nitrogen](https://github.com/osmosis-labs/osmosis/releases/tag/v9.0.0)
108120

app/apptesting/events.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package apptesting
2+
3+
import sdk "github.com/cosmos/cosmos-sdk/types"
4+
5+
// AssertEventEmitted asserts that ctx's event manager has emitted the given number of events
6+
// of the given type.
7+
func (s *KeeperTestHelper) AssertEventEmitted(ctx sdk.Context, eventTypeExpected string, numEventsExpected int) {
8+
allEvents := ctx.EventManager().Events()
9+
// filter out other events
10+
actualEvents := make([]sdk.Event, 0)
11+
for _, event := range allEvents {
12+
if event.Type == eventTypeExpected {
13+
actualEvents = append(actualEvents, event)
14+
}
15+
}
16+
s.Equal(numEventsExpected, len(actualEvents))
17+
}

x/gamm/keeper/internal/events/emit_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,57 @@ func (suite *GammEventsTestSuite) TestEmitAddLiquidityEvent() {
140140
})
141141
}
142142
}
143+
144+
func (suite *GammEventsTestSuite) TestEmitRemoveLiquidityEvent() {
145+
testcases := map[string]struct {
146+
ctx sdk.Context
147+
testAccountAddr sdk.AccAddress
148+
poolId uint64
149+
tokensOut sdk.Coins
150+
}{
151+
"basic valid": {
152+
ctx: suite.CreateTestContext(),
153+
testAccountAddr: sdk.AccAddress([]byte(addressString)),
154+
poolId: 1,
155+
tokensOut: sdk.NewCoins(sdk.NewCoin(testDenomA, sdk.NewInt(1234))),
156+
},
157+
"context with no event manager": {
158+
ctx: sdk.Context{},
159+
},
160+
"valid with multiple tokens out": {
161+
ctx: suite.CreateTestContext(),
162+
testAccountAddr: sdk.AccAddress([]byte(addressString)),
163+
poolId: 200,
164+
tokensOut: sdk.NewCoins(sdk.NewCoin(testDenomA, sdk.NewInt(12)), sdk.NewCoin(testDenomB, sdk.NewInt(99))),
165+
},
166+
}
167+
168+
for name, tc := range testcases {
169+
suite.Run(name, func() {
170+
expectedEvents := sdk.Events{
171+
sdk.NewEvent(
172+
types.TypeEvtPoolExited,
173+
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
174+
sdk.NewAttribute(sdk.AttributeKeySender, tc.testAccountAddr.String()),
175+
sdk.NewAttribute(types.AttributeKeyPoolId, strconv.FormatUint(tc.poolId, 10)),
176+
sdk.NewAttribute(types.AttributeKeyTokensOut, tc.tokensOut.String()),
177+
),
178+
}
179+
180+
hasNoEventManager := tc.ctx.EventManager() == nil
181+
182+
// System under test.
183+
events.EmitRemoveLiquidityEvent(tc.ctx, tc.testAccountAddr, tc.poolId, tc.tokensOut)
184+
185+
// Assertions
186+
if hasNoEventManager {
187+
// If there is no event manager on context, this is a no-op.
188+
return
189+
}
190+
191+
eventManager := tc.ctx.EventManager()
192+
actualEvents := eventManager.Events()
193+
suite.Equal(expectedEvents, actualEvents)
194+
})
195+
}
196+
}

x/gamm/keeper/msg_server.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,6 @@ func (server msgServer) ExitPool(goCtx context.Context, msg *types.MsgExitPool)
138138
}
139139

140140
ctx.EventManager().EmitEvents(sdk.Events{
141-
sdk.NewEvent(
142-
types.TypeEvtPoolExited,
143-
sdk.NewAttribute(types.AttributeKeyPoolId, strconv.FormatUint(msg.PoolId, 10)),
144-
),
145141
sdk.NewEvent(
146142
sdk.EventTypeMessage,
147143
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),

x/gamm/keeper/msg_server_test.go

Lines changed: 89 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010

1111
const (
1212
doesNotExistDenom = "nodenom"
13+
// Max positive int64.
14+
int64Max = int64(^uint64(0) >> 1)
1315
)
1416

1517
var _ = suite.TestingSuite(nil)
@@ -46,7 +48,7 @@ func (suite *KeeperTestSuite) TestSwapExactAmountIn_Events() {
4648
tokenIn: sdk.NewCoin("foo", sdk.NewInt(tokenIn)),
4749
tokenOutMinAmount: sdk.NewInt(tokenInMinAmount),
4850
expectedSwapEvents: 1,
49-
expectedMessageEvents: 3, // 1 gamm + 2 tendermint.
51+
expectedMessageEvents: 3, // 1 gamm + 2 events emitted by other keeper methods.
5052
},
5153
"two hops": {
5254
routes: []types.SwapAmountInRoute{
@@ -62,7 +64,7 @@ func (suite *KeeperTestSuite) TestSwapExactAmountIn_Events() {
6264
tokenIn: sdk.NewCoin("foo", sdk.NewInt(tokenIn)),
6365
tokenOutMinAmount: sdk.NewInt(tokenInMinAmount),
6466
expectedSwapEvents: 2,
65-
expectedMessageEvents: 5, // 1 gamm + 4 tendermint.
67+
expectedMessageEvents: 5, // 1 gamm + 4 events emitted by other keeper methods.
6668
},
6769
"invalid - two hops, denom does not exist": {
6870
routes: []types.SwapAmountInRoute{
@@ -107,8 +109,8 @@ func (suite *KeeperTestSuite) TestSwapExactAmountIn_Events() {
107109
suite.NotNil(response)
108110
}
109111

110-
assertEventEmitted(suite, ctx, types.TypeEvtTokenSwapped, tc.expectedSwapEvents)
111-
assertEventEmitted(suite, ctx, sdk.EventTypeMessage, tc.expectedMessageEvents)
112+
suite.AssertEventEmitted(ctx, types.TypeEvtTokenSwapped, tc.expectedSwapEvents)
113+
suite.AssertEventEmitted(ctx, sdk.EventTypeMessage, tc.expectedMessageEvents)
112114
})
113115
}
114116
}
@@ -117,8 +119,7 @@ func (suite *KeeperTestSuite) TestSwapExactAmountIn_Events() {
117119
// when calling SwapExactAmountOut.
118120
func (suite *KeeperTestSuite) TestSwapExactAmountOut_Events() {
119121
const (
120-
// Max positive int64.
121-
tokenInMaxAmount = int64(^uint64(0) >> 1)
122+
tokenInMaxAmount = int64Max
122123
tokenOut = 5
123124
)
124125

@@ -146,7 +147,7 @@ func (suite *KeeperTestSuite) TestSwapExactAmountOut_Events() {
146147
tokenOut: sdk.NewCoin("foo", sdk.NewInt(tokenOut)),
147148
tokenInMaxAmount: sdk.NewInt(tokenInMaxAmount),
148149
expectedSwapEvents: 1,
149-
expectedMessageEvents: 3, // 1 gamm + 2 tendermint.
150+
expectedMessageEvents: 3, // 1 gamm + 2 events emitted by other keeper methods.
150151
},
151152
"two hops": {
152153
routes: []types.SwapAmountOutRoute{
@@ -162,7 +163,7 @@ func (suite *KeeperTestSuite) TestSwapExactAmountOut_Events() {
162163
tokenOut: sdk.NewCoin("foo", sdk.NewInt(tokenOut)),
163164
tokenInMaxAmount: sdk.NewInt(tokenInMaxAmount),
164165
expectedSwapEvents: 2,
165-
expectedMessageEvents: 5, // 1 gamm + 4 tendermint.
166+
expectedMessageEvents: 5, // 1 gamm + 4 events emitted by other keeper methods.
166167
},
167168
"invalid - two hops, denom does not exist": {
168169
routes: []types.SwapAmountOutRoute{
@@ -207,8 +208,8 @@ func (suite *KeeperTestSuite) TestSwapExactAmountOut_Events() {
207208
suite.NotNil(response)
208209
}
209210

210-
assertEventEmitted(suite, ctx, types.TypeEvtTokenSwapped, tc.expectedSwapEvents)
211-
assertEventEmitted(suite, ctx, sdk.EventTypeMessage, tc.expectedMessageEvents)
211+
suite.AssertEventEmitted(ctx, types.TypeEvtTokenSwapped, tc.expectedSwapEvents)
212+
suite.AssertEventEmitted(ctx, sdk.EventTypeMessage, tc.expectedMessageEvents)
212213
})
213214
}
214215
}
@@ -217,8 +218,7 @@ func (suite *KeeperTestSuite) TestSwapExactAmountOut_Events() {
217218
// when calling JoinPool.
218219
func (suite *KeeperTestSuite) TestJoinPool_Events() {
219220
const (
220-
// Max positive int64.
221-
tokenInMaxAmount = int64(^uint64(0) >> 1)
221+
tokenInMaxAmount = int64Max
222222
shareOut = 110
223223
)
224224

@@ -239,7 +239,7 @@ func (suite *KeeperTestSuite) TestJoinPool_Events() {
239239
sdk.NewCoin("baz", sdk.NewInt(tokenInMaxAmount)),
240240
),
241241
expectedAddLiquidityEvents: 1,
242-
expectedMessageEvents: 3, // 1 gamm + 2 tendermint.
242+
expectedMessageEvents: 3, // 1 gamm + 2 events emitted by other keeper methods.
243243
},
244244
"tokenInMaxs do not match all tokens in pool - invalid join": {
245245
poolId: 1,
@@ -254,7 +254,6 @@ func (suite *KeeperTestSuite) TestJoinPool_Events() {
254254
suite.Setup()
255255
ctx := suite.Ctx
256256

257-
suite.PrepareBalancerPool()
258257
suite.PrepareBalancerPool()
259258

260259
msgServer := keeper.NewMsgServerImpl(suite.App.GAMMKeeper)
@@ -275,20 +274,85 @@ func (suite *KeeperTestSuite) TestJoinPool_Events() {
275274
suite.Require().NotNil(response)
276275
}
277276

278-
assertEventEmitted(suite, ctx, types.TypeEvtPoolJoined, tc.expectedAddLiquidityEvents)
279-
assertEventEmitted(suite, ctx, sdk.EventTypeMessage, tc.expectedMessageEvents)
277+
suite.AssertEventEmitted(ctx, types.TypeEvtPoolJoined, tc.expectedAddLiquidityEvents)
278+
suite.AssertEventEmitted(ctx, sdk.EventTypeMessage, tc.expectedMessageEvents)
280279
})
281280
}
282281
}
283282

284-
func assertEventEmitted(suite *KeeperTestSuite, ctx sdk.Context, eventTypeExpected string, numEventsExpected int) {
285-
allEvents := ctx.EventManager().Events()
286-
// filter out other events
287-
actualEvents := make([]sdk.Event, 0, 1)
288-
for _, event := range allEvents {
289-
if event.Type == eventTypeExpected {
290-
actualEvents = append(actualEvents, event)
291-
}
283+
// TestExitPool_Events tests that events are correctly emitted
284+
// when calling ExitPool.
285+
func (suite *KeeperTestSuite) TestExitPool_Events() {
286+
const (
287+
tokenOutMinAmount = 1
288+
shareIn = 110
289+
)
290+
291+
testcases := map[string]struct {
292+
poolId uint64
293+
shareInAmount sdk.Int
294+
tokenOutMins sdk.Coins
295+
expectError bool
296+
expectedRemoveLiquidityEvents int
297+
expectedMessageEvents int
298+
}{
299+
"successful exit": {
300+
poolId: 1,
301+
shareInAmount: sdk.NewInt(shareIn),
302+
tokenOutMins: sdk.NewCoins(),
303+
expectedRemoveLiquidityEvents: 1,
304+
expectedMessageEvents: 3, // 1 gamm + 2 events emitted by other keeper methods.
305+
},
306+
"invalid tokenOutMins": {
307+
poolId: 1,
308+
shareInAmount: sdk.NewInt(shareIn),
309+
tokenOutMins: sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(tokenOutMinAmount))),
310+
expectError: true,
311+
},
312+
}
313+
314+
for name, tc := range testcases {
315+
suite.Run(name, func() {
316+
suite.Setup()
317+
ctx := suite.Ctx
318+
319+
suite.PrepareBalancerPool()
320+
msgServer := keeper.NewMsgServerImpl(suite.App.GAMMKeeper)
321+
322+
sender := suite.TestAccs[0].String()
323+
324+
// Pre-join pool to be able to ExitPool.
325+
joinPoolResponse, err := msgServer.JoinPool(sdk.WrapSDKContext(ctx), &types.MsgJoinPool{
326+
Sender: sender,
327+
PoolId: tc.poolId,
328+
ShareOutAmount: sdk.NewInt(shareIn),
329+
TokenInMaxs: sdk.NewCoins(
330+
sdk.NewCoin("foo", sdk.NewInt(int64Max)),
331+
sdk.NewCoin("bar", sdk.NewInt(int64Max)),
332+
sdk.NewCoin("baz", sdk.NewInt(int64Max)),
333+
),
334+
})
335+
suite.Require().NoError(err)
336+
337+
// Reset event counts to 0 by creating a new manager.
338+
ctx = ctx.WithEventManager(sdk.NewEventManager())
339+
suite.Require().Equal(0, len(ctx.EventManager().Events()))
340+
341+
// System under test.
342+
response, err := msgServer.ExitPool(sdk.WrapSDKContext(ctx), &types.MsgExitPool{
343+
Sender: sender,
344+
PoolId: tc.poolId,
345+
ShareInAmount: joinPoolResponse.ShareOutAmount,
346+
TokenOutMins: tc.tokenOutMins,
347+
})
348+
349+
if !tc.expectError {
350+
suite.Require().NoError(err)
351+
suite.Require().NotNil(response)
352+
}
353+
354+
suite.AssertEventEmitted(ctx, types.TypeEvtPoolExited, tc.expectedRemoveLiquidityEvents)
355+
suite.AssertEventEmitted(ctx, sdk.EventTypeMessage, tc.expectedMessageEvents)
356+
})
292357
}
293-
suite.Require().Equal(numEventsExpected, len(actualEvents))
294358
}

0 commit comments

Comments
 (0)