@@ -2,11 +2,17 @@ package keeper_test
2
2
3
3
import (
4
4
"fmt"
5
+ "math/big"
6
+ "time"
5
7
6
8
"github.com/wormhole-foundation/wormchain/x/tokenfactory/types"
7
9
8
10
sdk "github.com/cosmos/cosmos-sdk/types"
11
+ denoms "github.com/wormhole-foundation/wormchain/x/tokenfactory/types"
12
+
9
13
//banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
14
+ tmtypes "github.com/tendermint/tendermint/proto/tendermint/types"
15
+ keeper "github.com/wormhole-foundation/wormchain/x/tokenfactory/keeper"
10
16
)
11
17
12
18
// TestMintDenomMsg tests TypeMsgMint message is emitted on a successful mint
@@ -49,6 +55,177 @@ func (suite *KeeperTestSuite) TestMintDenomMsg() {
49
55
}
50
56
}
51
57
58
+ func (suite * KeeperTestSuite ) TestMintHuge () {
59
+ // Create a denom
60
+ suite .CreateDefaultDenom ()
61
+
62
+ suite .Ctx = suite .App .BaseApp .NewContext (false , tmtypes.Header {Height : keeper .MainnetUseConditionalHeight , ChainID : "wormchain" , Time : time .Now ().UTC ()})
63
+
64
+ largeAmount := big .NewInt (0 ).Sub (big .NewInt (0 ).Exp (big .NewInt (2 ), big .NewInt (256 ), big .NewInt (0 )), big .NewInt (1 )) // (2 ** 256)-1
65
+ belowLargeAmount := big .NewInt (0 ).Exp (big .NewInt (2 ), big .NewInt (191 ), big .NewInt (0 )) // 2 ** 191
66
+ for _ , tc := range []struct {
67
+ desc string
68
+ amount sdk.Int
69
+ mintDenom string
70
+ admin string
71
+ valid bool
72
+ expectedMessageEvents int
73
+ }{
74
+ {
75
+ desc : "failure case - too many" ,
76
+ amount : sdk .NewIntFromBigInt (largeAmount ),
77
+ mintDenom : suite .defaultDenom ,
78
+ admin : suite .TestAccs [0 ].String (),
79
+ valid : false ,
80
+ expectedMessageEvents : 0 ,
81
+ },
82
+ {
83
+ desc : "success case with 191" ,
84
+ amount : sdk .NewIntFromBigInt (belowLargeAmount ),
85
+ mintDenom : suite .defaultDenom ,
86
+ admin : suite .TestAccs [0 ].String (),
87
+ valid : true ,
88
+ expectedMessageEvents : 1 ,
89
+ },
90
+ {
91
+ desc : "failure case - too many accumulated tokens" ,
92
+ amount : sdk .NewIntFromBigInt (belowLargeAmount ),
93
+ mintDenom : suite .defaultDenom ,
94
+ admin : suite .TestAccs [0 ].String (),
95
+ valid : false ,
96
+ expectedMessageEvents : 0 ,
97
+ },
98
+ } {
99
+ suite .Run (fmt .Sprintf ("Case %s" , tc .desc ), func () {
100
+ ctx := suite .Ctx .WithEventManager (sdk .NewEventManager ())
101
+ suite .Require ().Equal (0 , len (ctx .EventManager ().Events ()))
102
+ // Test mint message
103
+ suite .msgServer .Mint (sdk .WrapSDKContext (ctx ), types .NewMsgMint (tc .admin , sdk .NewCoin (tc .mintDenom , tc .amount ))) //nolint:errcheck
104
+ // Ensure current number and type of event is emitted
105
+ suite .AssertEventEmitted (ctx , types .TypeMsgMint , tc .expectedMessageEvents )
106
+ })
107
+ }
108
+ }
109
+
110
+ func (suite * KeeperTestSuite ) TestMintOffByOne () {
111
+ // Create a denom
112
+ suite .CreateDefaultDenom ()
113
+ suite .Ctx = suite .App .BaseApp .NewContext (false , tmtypes.Header {Height : keeper .MainnetUseConditionalHeight , ChainID : "wormchain" , Time : time .Now ().UTC ()})
114
+
115
+ for _ , tc := range []struct {
116
+ desc string
117
+ amount sdk.Int
118
+ mintDenom string
119
+ admin string
120
+ valid bool
121
+ expectedMessageEvents int
122
+ }{
123
+ {
124
+ desc : "failure case - too many plus 1" ,
125
+ amount : denoms .MintAmountLimit .Add (sdk .NewIntFromUint64 (1 )), // 2 ** 192 + 1
126
+ mintDenom : suite .defaultDenom ,
127
+ admin : suite .TestAccs [0 ].String (),
128
+ valid : false ,
129
+ expectedMessageEvents : 0 ,
130
+ },
131
+ {
132
+ desc : "failure case - too many exactly" ,
133
+ amount : denoms .MintAmountLimit , // 2 ** 192
134
+ mintDenom : suite .defaultDenom ,
135
+ admin : suite .TestAccs [0 ].String (),
136
+ valid : true ,
137
+ expectedMessageEvents : 0 ,
138
+ },
139
+ {
140
+ desc : "success case - one less than limit" ,
141
+ amount : denoms .MintAmountLimit .Sub (sdk .NewIntFromUint64 (1 )), // 2 ** 192 -1
142
+ mintDenom : suite .defaultDenom ,
143
+ admin : suite .TestAccs [0 ].String (),
144
+ valid : true ,
145
+ expectedMessageEvents : 1 ,
146
+ },
147
+ } {
148
+ suite .Run (fmt .Sprintf ("Case %s" , tc .desc ), func () {
149
+ ctx := suite .Ctx .WithEventManager (sdk .NewEventManager ())
150
+ suite .Require ().Equal (0 , len (ctx .EventManager ().Events ()))
151
+ // Test mint message
152
+ suite .msgServer .Mint (sdk .WrapSDKContext (ctx ), types .NewMsgMint (tc .admin , sdk .NewCoin (tc .mintDenom , tc .amount ))) //nolint:errcheck
153
+ // Ensure current number and type of event is emitted
154
+ suite .AssertEventEmitted (ctx , types .TypeMsgMint , tc .expectedMessageEvents )
155
+ })
156
+ }
157
+ }
158
+
159
+ func (suite * KeeperTestSuite ) TestMintFixBlockHeightChecks () {
160
+ // Create a denom
161
+ suite .CreateDefaultDenom ()
162
+
163
+ test_cases := []struct {
164
+ desc string
165
+ amount sdk.Int
166
+ mintDenom string
167
+ admin string
168
+ valid bool
169
+ expectedMessageEvents int
170
+ }{
171
+ {
172
+ desc : "success case - check not implemented before block height" ,
173
+ amount : denoms .MintAmountLimit , // 2 ** 192
174
+ mintDenom : suite .defaultDenom ,
175
+ admin : suite .TestAccs [0 ].String (),
176
+ valid : true ,
177
+ expectedMessageEvents : 1 ,
178
+ },
179
+ {
180
+ desc : "failure case - check implemented on specific block height" ,
181
+ amount : denoms .MintAmountLimit , // 2 ** 192
182
+ mintDenom : suite .defaultDenom ,
183
+ admin : suite .TestAccs [0 ].String (),
184
+ valid : false ,
185
+ expectedMessageEvents : 0 ,
186
+ },
187
+ {
188
+ desc : "failure case - check implemented after specific block height" ,
189
+ amount : denoms .MintAmountLimit , // 2 ** 192
190
+ mintDenom : suite .defaultDenom ,
191
+ admin : suite .TestAccs [0 ].String (),
192
+ valid : false ,
193
+ expectedMessageEvents : 0 ,
194
+ },
195
+ }
196
+ // Before the block has been reached. Should succeed with the call.
197
+ suite .Ctx = suite .App .BaseApp .NewContext (false , tmtypes.Header {Height : keeper .MainnetUseConditionalHeight - 1 , ChainID : "wormchain" , Time : time .Now ().UTC ()})
198
+
199
+ ctx := suite .Ctx .WithEventManager (sdk .NewEventManager ())
200
+ suite .Require ().Equal (0 , len (ctx .EventManager ().Events ()))
201
+ // Test mint message
202
+ suite .msgServer .Mint (sdk .WrapSDKContext (ctx ), types .NewMsgMint (test_cases [0 ].admin , sdk .NewCoin (test_cases [0 ].mintDenom , test_cases [0 ].amount ))) //nolint:errcheck
203
+
204
+ // Ensure current number and type of event is emitted
205
+ suite .AssertEventEmitted (ctx , types .TypeMsgMint , test_cases [0 ].expectedMessageEvents )
206
+
207
+ // On the block has been reached
208
+ suite .Ctx = suite .App .BaseApp .NewContext (false , tmtypes.Header {Height : keeper .MainnetUseConditionalHeight , ChainID : "wormchain" , Time : time .Now ().UTC ()})
209
+ ctx = suite .Ctx .WithEventManager (sdk .NewEventManager ())
210
+ suite .Require ().Equal (0 , len (ctx .EventManager ().Events ()))
211
+ // Test mint message
212
+ suite .msgServer .Mint (sdk .WrapSDKContext (ctx ), types .NewMsgMint (test_cases [1 ].admin , sdk .NewCoin (test_cases [1 ].mintDenom , test_cases [1 ].amount ))) //nolint:errcheck
213
+
214
+ // Ensure current number and type of event is emitted
215
+ suite .AssertEventEmitted (ctx , types .TypeMsgMint , test_cases [1 ].expectedMessageEvents )
216
+
217
+ // After the block has been reached
218
+ suite .Ctx = suite .App .BaseApp .NewContext (false , tmtypes.Header {Height : keeper .MainnetUseConditionalHeight + 1 , ChainID : "wormchain" , Time : time .Now ().UTC ()})
219
+ ctx = suite .Ctx .WithEventManager (sdk .NewEventManager ())
220
+ suite .Require ().Equal (0 , len (ctx .EventManager ().Events ()))
221
+ // Test mint message
222
+ suite .msgServer .Mint (sdk .WrapSDKContext (ctx ), types .NewMsgMint (test_cases [2 ].admin , sdk .NewCoin (test_cases [2 ].mintDenom , test_cases [2 ].amount ))) //nolint:errcheck
223
+
224
+ // Ensure current number and type of event is emitted
225
+ suite .AssertEventEmitted (ctx , types .TypeMsgMint , test_cases [2 ].expectedMessageEvents )
226
+
227
+ }
228
+
52
229
// TestBurnDenomMsg tests TypeMsgBurn message is emitted on a successful burn
53
230
func (suite * KeeperTestSuite ) TestBurnDenomMsg () {
54
231
// Create a denom.
0 commit comments