1
1
package delegator_test
2
2
3
3
import (
4
- "encoding/json"
5
4
"fmt"
6
- "path"
7
5
"testing"
8
6
"time"
9
7
@@ -12,7 +10,6 @@ import (
12
10
"github.com/strangelove-ventures/interchaintest/v8"
13
11
"github.com/strangelove-ventures/interchaintest/v8/ibc"
14
12
"github.com/strangelove-ventures/interchaintest/v8/testutil"
15
- "github.com/stretchr/testify/assert"
16
13
"github.com/stretchr/testify/suite"
17
14
"golang.org/x/mod/semver"
18
15
"golang.org/x/sync/errgroup"
@@ -54,27 +51,6 @@ func (s *LSMSuite) TestLSMHappyPath() {
54
51
55
52
strideWallet := s .Stride .ValidatorWallets [0 ]
56
53
57
- s .Run ("Validator Bond" , func () {
58
- delegatorShares1 , err := s .Chain .QueryJSON (s .GetContext (), "validator.delegator_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
59
- s .Require ().NoError (err )
60
- validatorBondShares1 , err := s .Chain .QueryJSON (s .GetContext (), "validator.validator_bond_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
61
- s .Require ().NoError (err )
62
-
63
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmBondingMoniker ].FormattedAddress (),
64
- "staking" , "delegate" , providerWallet .ValoperAddress , fmt .Sprintf ("%d%s" , delegation , s .Chain .Config ().Denom ))
65
- s .Require ().NoError (err )
66
- delegatorShares2 , err := s .Chain .QueryJSON (s .GetContext (), "validator.delegator_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
67
- s .Require ().NoError (err )
68
- s .checkAMinusBEqualsX (delegatorShares2 .String (), delegatorShares1 .String (), sdkmath .NewInt (delegation ))
69
-
70
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmBondingMoniker ].FormattedAddress (),
71
- "staking" , "validator-bond" , providerWallet .ValoperAddress )
72
- s .Require ().NoError (err )
73
- validatorBondShares2 , err := s .Chain .QueryJSON (s .GetContext (), "validator.validator_bond_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
74
- s .Require ().NoError (err )
75
- s .checkAMinusBEqualsX (validatorBondShares2 .String (), validatorBondShares1 .String (), sdkmath .NewInt (delegation ).Mul (s .ShareFactor ))
76
- })
77
-
78
54
var tokenizedDenom string
79
55
s .Run ("Tokenize" , func () {
80
56
delegatorShares1 , err := s .Chain .QueryJSON (s .GetContext (), "validator.delegator_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
@@ -86,14 +62,17 @@ func (s *LSMSuite) TestLSMHappyPath() {
86
62
s .Require ().NoError (err )
87
63
s .checkAMinusBEqualsX (delegatorShares2 .String (), delegatorShares1 .String (), sdkmath .NewInt (delegation ))
88
64
89
- sharesPreTokenize , err := s .Chain .QueryJSON (s .GetContext (), "validator.liquid_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
65
+ sharesPreTokenize , err := s .Chain .QueryJSON (s .GetContext (), "liquid_validator.liquid_shares" , "liquid" ,
66
+ "liquid-validator" ,
67
+ providerWallet .ValoperAddress )
90
68
s .Require ().NoError (err )
91
69
_ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (),
92
- "staking " , "tokenize-share" ,
70
+ "liquid " , "tokenize-share" ,
93
71
providerWallet .ValoperAddress , fmt .Sprintf ("%d%s" , tokenize , s .Chain .Config ().Denom ), s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (),
94
72
"--gas" , "auto" )
95
73
s .Require ().NoError (err )
96
- sharesPostTokenize , err := s .Chain .QueryJSON (s .GetContext (), "validator.liquid_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
74
+ sharesPostTokenize , err := s .Chain .QueryJSON (s .GetContext (), "liquid_validator.liquid_shares" , "liquid" ,
75
+ "liquid-validator" , providerWallet .ValoperAddress )
97
76
s .Require ().NoError (err )
98
77
s .checkAMinusBEqualsX (sharesPostTokenize .String (), sharesPreTokenize .String (), sdkmath .NewInt (tokenize ).Mul (s .ShareFactor ))
99
78
@@ -108,28 +87,32 @@ func (s *LSMSuite) TestLSMHappyPath() {
108
87
})
109
88
110
89
s .Run ("Transfer Ownership" , func () {
111
- recordIDResult , err := s .Chain .QueryJSON (s .GetContext (), "record.id" , "staking" , "tokenize-share-record-by-denom" , tokenizedDenom )
90
+ recordIDResult , err := s .Chain .QueryJSON (s .GetContext (), "record.id" , "liquid" ,
91
+ "tokenize-share-record-by-denom" , tokenizedDenom )
112
92
s .Require ().NoError (err )
113
93
recordID := recordIDResult .String ()
114
94
115
- ownerResult , err := s .Chain .QueryJSON (s .GetContext (), "record.owner" , "staking" , "tokenize-share-record-by-denom" , tokenizedDenom )
95
+ ownerResult , err := s .Chain .QueryJSON (s .GetContext (), "record.owner" , "liquid" ,
96
+ "tokenize-share-record-by-denom" , tokenizedDenom )
116
97
s .Require ().NoError (err )
117
98
owner := ownerResult .String ()
118
99
119
100
_ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), owner ,
120
- "staking " , "transfer-tokenize-share-record" , recordID , s .LSMWallets [lsmOwnerMoniker ].FormattedAddress ())
101
+ "liquid " , "transfer-tokenize-share-record" , recordID , s .LSMWallets [lsmOwnerMoniker ].FormattedAddress ())
121
102
s .Require ().NoError (err )
122
103
123
- ownerResult , err = s .Chain .QueryJSON (s .GetContext (), "record.owner" , "staking" , "tokenize-share-record-by-denom" , tokenizedDenom )
104
+ ownerResult , err = s .Chain .QueryJSON (s .GetContext (), "record.owner" , "liquid" ,
105
+ "tokenize-share-record-by-denom" , tokenizedDenom )
124
106
s .Require ().NoError (err )
125
107
owner = ownerResult .String ()
126
108
s .Require ().Equal (s .LSMWallets [lsmOwnerMoniker ].FormattedAddress (), owner )
127
109
128
110
_ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), owner ,
129
- "staking " , "transfer-tokenize-share-record" , recordID , s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress ())
111
+ "liquid " , "transfer-tokenize-share-record" , recordID , s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress ())
130
112
s .Require ().NoError (err )
131
113
132
- ownerResult , err = s .Chain .QueryJSON (s .GetContext (), "record.owner" , "staking" , "tokenize-share-record-by-denom" , tokenizedDenom )
114
+ ownerResult , err = s .Chain .QueryJSON (s .GetContext (), "record.owner" , "liquid" ,
115
+ "tokenize-share-record-by-denom" , tokenizedDenom )
133
116
s .Require ().NoError (err )
134
117
owner = ownerResult .String ()
135
118
s .Require ().Equal (s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (), owner )
@@ -175,12 +158,12 @@ func (s *LSMSuite) TestLSMHappyPath() {
175
158
var happyLiquid1DelegationBalance string
176
159
s .Run ("Redeem Tokens" , func () {
177
160
_ , err := s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (),
178
- "staking " , "redeem-tokens" , fmt .Sprintf ("%d%s" , liquid1Redeem , tokenizedDenom ),
161
+ "liquid " , "redeem-tokens" , fmt .Sprintf ("%d%s" , liquid1Redeem , tokenizedDenom ),
179
162
"--gas" , "auto" )
180
163
s .Require ().NoError (err )
181
164
182
165
_ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid2Moniker ].FormattedAddress (),
183
- "staking " , "redeem-tokens" , fmt .Sprintf ("%d%s" , bankSend , tokenizedDenom ),
166
+ "liquid " , "redeem-tokens" , fmt .Sprintf ("%d%s" , bankSend , tokenizedDenom ),
184
167
"--gas" , "auto" )
185
168
s .Require ().NoError (err )
186
169
@@ -194,7 +177,7 @@ func (s *LSMSuite) TestLSMHappyPath() {
194
177
s .Require ().NoError (testutil .WaitForBlocks (s .GetContext (), 5 , s .Chain ))
195
178
196
179
_ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid3Moniker ].FormattedAddress (),
197
- "staking " , "redeem-tokens" , fmt .Sprintf ("%d%s" , ibcTransfer , tokenizedDenom ),
180
+ "liquid " , "redeem-tokens" , fmt .Sprintf ("%d%s" , ibcTransfer , tokenizedDenom ),
198
181
"--gas" , "auto" )
199
182
s .Require ().NoError (err )
200
183
@@ -230,154 +213,6 @@ func (s *LSMSuite) TestLSMHappyPath() {
230
213
s .checkAMinusBEqualsX (happyLiquid2DelegationBalance , "0" , sdkmath .NewInt (bankSend ))
231
214
s .checkAMinusBEqualsX (happyLiquid3DelegationBalance , "0" , sdkmath .NewInt (ibcTransfer ))
232
215
})
233
- s .Run ("Cleanup" , func () {
234
- validatorBondSharesBeforeResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.validator_bond_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
235
- s .Require ().NoError (err )
236
- validatorBondSharesBefore := validatorBondSharesBeforeResult .String ()
237
-
238
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmBondingMoniker ].FormattedAddress (),
239
- "staking" , "unbond" , providerWallet .ValoperAddress , fmt .Sprintf ("%d%s" , delegation , s .Chain .Config ().Denom ))
240
- s .Require ().NoError (err )
241
-
242
- validatorBondSharesResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.validator_bond_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
243
- s .Require ().NoError (err )
244
- validatorBondShares := validatorBondSharesResult .String ()
245
- s .checkAMinusBEqualsX (validatorBondSharesBefore , validatorBondShares , sdkmath .NewInt (delegation ).Mul (s .ShareFactor ))
246
-
247
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (),
248
- "staking" , "unbond" , providerWallet .ValoperAddress , fmt .Sprintf ("%s%s" , happyLiquid1DelegationBalance , s .Chain .Config ().Denom ))
249
- s .Require ().NoError (err )
250
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid2Moniker ].FormattedAddress (),
251
- "staking" , "unbond" , providerWallet .ValoperAddress , fmt .Sprintf ("%d%s" , bankSend , s .Chain .Config ().Denom ))
252
- s .Require ().NoError (err )
253
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid3Moniker ].FormattedAddress (),
254
- "staking" , "unbond" , providerWallet .ValoperAddress , fmt .Sprintf ("%d%s" , ibcTransfer , s .Chain .Config ().Denom ))
255
- s .Require ().NoError (err )
256
- })
257
- }
258
-
259
- func (s * LSMSuite ) TestICADelegate () {
260
- const (
261
- delegate = 20000000
262
- bondDelegation = 20000000
263
- )
264
- bondingWallet , err := s .Chain .BuildWallet (s .GetContext (), fmt .Sprintf ("lsm_happy_bonding_%d" , time .Now ().Unix ()), "" )
265
- s .Require ().NoError (err )
266
-
267
- err = s .Chain .SendFunds (s .GetContext (), interchaintest .FaucetAccountKeyName , ibc.WalletAmount {
268
- Amount : sdkmath .NewInt (50_000_000 ),
269
- Denom : s .Chain .Config ().Denom ,
270
- Address : bondingWallet .FormattedAddress (),
271
- })
272
- s .Require ().NoError (err )
273
-
274
- providerWallet := s .Chain .ValidatorWallets [0 ]
275
-
276
- strideWallet := s .Stride .ValidatorWallets [0 ]
277
-
278
- s .Run ("Delegate and Bond" , func () {
279
- shares1Result , err := s .Chain .QueryJSON (s .GetContext (), "validator.delegator_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
280
- s .Require ().NoError (err )
281
- shares1 := shares1Result .String ()
282
-
283
- tokens1Result , err := s .Chain .QueryJSON (s .GetContext (), "validator.tokens" , "staking" , "validator" , providerWallet .ValoperAddress )
284
- s .Require ().NoError (err )
285
- tokens1 := tokens1Result .String ()
286
-
287
- bondShares1Result , err := s .Chain .QueryJSON (s .GetContext (), "validator.validator_bond_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
288
- s .Require ().NoError (err )
289
- bondShares1 := bondShares1Result .String ()
290
-
291
- shares1Int , err := chainsuite .StrToSDKInt (shares1 )
292
- s .Require ().NoError (err )
293
- tokens1Int , err := chainsuite .StrToSDKInt (tokens1 )
294
- s .Require ().NoError (err )
295
- bondShares1Int , err := chainsuite .StrToSDKInt (bondShares1 )
296
- s .Require ().NoError (err )
297
-
298
- exchangeRate1 := shares1Int .Quo (tokens1Int )
299
- expectedSharesIncrease := exchangeRate1 .MulRaw (bondDelegation ).Mul (s .ShareFactor )
300
- expectedShares := expectedSharesIncrease .Add (bondShares1Int )
301
-
302
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), bondingWallet .FormattedAddress (),
303
- "staking" , "delegate" , providerWallet .ValoperAddress , fmt .Sprintf ("%d%s" , bondDelegation , s .Chain .Config ().Denom ))
304
- s .Require ().NoError (err )
305
-
306
- _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), bondingWallet .FormattedAddress (),
307
- "staking" , "validator-bond" , providerWallet .ValoperAddress )
308
- s .Require ().NoError (err )
309
-
310
- bondShares2Result , err := s .Chain .QueryJSON (s .GetContext (), "validator.validator_bond_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
311
- s .Require ().NoError (err )
312
- bondShares2 := bondShares2Result .String ()
313
-
314
- bondShares2Int , err := chainsuite .StrToSDKInt (bondShares2 )
315
- s .Require ().NoError (err )
316
- s .Require ().Truef (bondShares2Int .Sub (expectedShares ).Abs ().LTE (sdkmath .NewInt (1 )), "bondShares2: %s, expectedShares: %s" , bondShares2 , expectedShares )
317
- })
318
-
319
- s .Run ("Delegate via ICA" , func () {
320
- preDelegationTokensResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.tokens" , "staking" , "validator" , providerWallet .ValoperAddress )
321
- s .Require ().NoError (err )
322
- preDelegationTokens := preDelegationTokensResult .String ()
323
-
324
- preDelegationSharesResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.delegator_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
325
- s .Require ().NoError (err )
326
- preDelegationShares := preDelegationSharesResult .String ()
327
-
328
- preDelegationLiquidSharesResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.liquid_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
329
- s .Require ().NoError (err )
330
- preDelegationLiquidShares := preDelegationLiquidSharesResult .String ()
331
-
332
- preDelegationTokensInt , err := chainsuite .StrToSDKInt (preDelegationTokens )
333
- s .Require ().NoError (err )
334
- preDelegationSharesInt , err := chainsuite .StrToSDKInt (preDelegationShares )
335
- s .Require ().NoError (err )
336
- exchangeRate := preDelegationSharesInt .Quo (preDelegationTokensInt )
337
- expectedLiquidIncrease := exchangeRate .MulRaw (delegate ).Mul (s .ShareFactor )
338
-
339
- delegateHappy := map [string ]interface {}{
340
- "@type" : "/cosmos.staking.v1beta1.MsgDelegate" ,
341
- "delegator_address" : s .ICAAddr ,
342
- "validator_address" : providerWallet .ValoperAddress ,
343
- "amount" : map [string ]interface {}{
344
- "denom" : s .Chain .Config ().Denom ,
345
- "amount" : fmt .Sprint (delegate ),
346
- },
347
- }
348
- delegateHappyJSON , err := json .Marshal (delegateHappy )
349
- s .Require ().NoError (err )
350
- jsonPath := "delegate-happy.json"
351
- fullJsonPath := path .Join (s .Stride .Validators [0 ].HomeDir (), jsonPath )
352
- stdout , _ , err := s .Stride .GetNode ().ExecBin (s .GetContext (), "tx" , "interchain-accounts" , "host" , "generate-packet-data" , string (delegateHappyJSON ), "--encoding" , "proto3" )
353
- s .Require ().NoError (err )
354
- s .Require ().NoError (s .Stride .Validators [0 ].WriteFile (s .GetContext (), []byte (stdout ), jsonPath ))
355
- ibcChannelStride , err := s .Relayer .GetTransferChannel (s .GetContext (), s .Stride , s .Chain )
356
- s .Require ().NoError (err )
357
-
358
- _ , err = s .Stride .GetNode ().ExecTx (s .GetContext (), strideWallet .Address ,
359
- "interchain-accounts" , "controller" , "send-tx" , ibcChannelStride .ConnectionHops [0 ], fullJsonPath )
360
- s .Require ().NoError (err )
361
-
362
- var tokensDelta sdkmath.Int
363
- s .Require ().EventuallyWithT (func (c * assert.CollectT ) {
364
- postDelegationTokensResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.tokens" , "staking" , "validator" , providerWallet .ValoperAddress )
365
- s .Require ().NoError (err )
366
- postDelegationTokens , err := chainsuite .StrToSDKInt (postDelegationTokensResult .String ())
367
- s .Require ().NoError (err )
368
- tokensDelta = postDelegationTokens .Sub (preDelegationTokensInt )
369
- assert .Truef (c , tokensDelta .Sub (sdkmath .NewInt (delegate )).Abs ().LTE (sdkmath .NewInt (1 )), "tokensDelta: %s, delegate: %d" , tokensDelta , delegate )
370
- }, 20 * time .Second , time .Second )
371
-
372
- postDelegationLiquidSharesResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.liquid_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
373
- s .Require ().NoError (err )
374
- postDelegationLiquidShares , err := chainsuite .StrToSDKInt (postDelegationLiquidSharesResult .String ())
375
- s .Require ().NoError (err )
376
- preDelegationLiquidSharesInt , err := chainsuite .StrToSDKInt (preDelegationLiquidShares )
377
- s .Require ().NoError (err )
378
- liquidSharesDelta := postDelegationLiquidShares .Sub (preDelegationLiquidSharesInt )
379
- s .Require ().Truef (liquidSharesDelta .Sub (expectedLiquidIncrease ).Abs ().LTE (sdkmath .NewInt (1 )), "liquidSharesDelta: %s, expectedLiquidIncrease: %s" , liquidSharesDelta , expectedLiquidIncrease )
380
- })
381
216
}
382
217
383
218
func (s * LSMSuite ) TestTokenizeVested () {
@@ -413,21 +248,25 @@ func (s *LSMSuite) TestTokenizeVested() {
413
248
414
249
// try to tokenize full amount. Should fail.
415
250
_ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), vestingAccount .FormattedAddress (),
416
- "staking" , "tokenize-share" , validatorWallet .ValoperAddress , fmt .Sprintf ("%d%s" , vestingAmount , s .Chain .Config ().Denom ), vestingAccount .FormattedAddress (),
251
+ "liquid" , "tokenize-share" , validatorWallet .ValoperAddress , fmt .Sprintf ("%d%s" , vestingAmount ,
252
+ s .Chain .Config ().Denom ), vestingAccount .FormattedAddress (),
417
253
"--gas" , "auto" )
418
254
s .Require ().Error (err )
419
255
420
- sharesPreTokenizeResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.liquid_shares" , "staking" , "validator" , validatorWallet .ValoperAddress )
256
+ sharesPreTokenizeResult , err := s .Chain .QueryJSON (s .GetContext (), "liquid_validator.liquid_shares" , "liquid" ,
257
+ "liquid-validator" , validatorWallet .ValoperAddress )
421
258
s .Require ().NoError (err )
422
259
sharesPreTokenize := sharesPreTokenizeResult .String ()
423
260
424
261
// try to tokenize vested amount (i.e. half) should succeed if upgraded
425
262
tokenizeAmount := vestingAmount / 2
426
263
_ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), vestingAccount .FormattedAddress (),
427
- "staking" , "tokenize-share" , validatorWallet .ValoperAddress , fmt .Sprintf ("%d%s" , tokenizeAmount , s .Chain .Config ().Denom ), vestingAccount .FormattedAddress (),
264
+ "liquid" , "tokenize-share" , validatorWallet .ValoperAddress , fmt .Sprintf ("%d%s" , tokenizeAmount ,
265
+ s .Chain .Config ().Denom ), vestingAccount .FormattedAddress (),
428
266
"--gas" , "auto" )
429
267
s .Require ().NoError (err )
430
- sharesPostTokenizeResult , err := s .Chain .QueryJSON (s .GetContext (), "validator.liquid_shares" , "staking" , "validator" , validatorWallet .ValoperAddress )
268
+ sharesPostTokenizeResult , err := s .Chain .QueryJSON (s .GetContext (), "liquid_validator.liquid_shares" , "liquid" ,
269
+ "liquid-validator" , validatorWallet .ValoperAddress )
431
270
s .Require ().NoError (err )
432
271
sharesPostTokenize := sharesPostTokenizeResult .String ()
433
272
s .checkAMinusBEqualsX (sharesPostTokenize , sharesPreTokenize , sdkmath .NewInt (tokenizeAmount ).Mul (s .ShareFactor ))
0 commit comments