11package delegator_test
22
33import (
4- "encoding/json"
54 "fmt"
6- "path"
75 "testing"
86 "time"
97
@@ -12,7 +10,6 @@ import (
1210 "github.com/strangelove-ventures/interchaintest/v8"
1311 "github.com/strangelove-ventures/interchaintest/v8/ibc"
1412 "github.com/strangelove-ventures/interchaintest/v8/testutil"
15- "github.com/stretchr/testify/assert"
1613 "github.com/stretchr/testify/suite"
1714 "golang.org/x/mod/semver"
1815 "golang.org/x/sync/errgroup"
@@ -54,27 +51,6 @@ func (s *LSMSuite) TestLSMHappyPath() {
5451
5552 strideWallet := s .Stride .ValidatorWallets [0 ]
5653
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-
7854 var tokenizedDenom string
7955 s .Run ("Tokenize" , func () {
8056 delegatorShares1 , err := s .Chain .QueryJSON (s .GetContext (), "validator.delegator_shares" , "staking" , "validator" , providerWallet .ValoperAddress )
@@ -86,14 +62,17 @@ func (s *LSMSuite) TestLSMHappyPath() {
8662 s .Require ().NoError (err )
8763 s .checkAMinusBEqualsX (delegatorShares2 .String (), delegatorShares1 .String (), sdkmath .NewInt (delegation ))
8864
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 )
9068 s .Require ().NoError (err )
9169 _ , err = s .Chain .GetNode ().ExecTx (s .GetContext (), s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (),
92- "staking " , "tokenize-share" ,
70+ "liquid " , "tokenize-share" ,
9371 providerWallet .ValoperAddress , fmt .Sprintf ("%d%s" , tokenize , s .Chain .Config ().Denom ), s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (),
9472 "--gas" , "auto" )
9573 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 )
9776 s .Require ().NoError (err )
9877 s .checkAMinusBEqualsX (sharesPostTokenize .String (), sharesPreTokenize .String (), sdkmath .NewInt (tokenize ).Mul (s .ShareFactor ))
9978
@@ -108,28 +87,32 @@ func (s *LSMSuite) TestLSMHappyPath() {
10887 })
10988
11089 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 )
11292 s .Require ().NoError (err )
11393 recordID := recordIDResult .String ()
11494
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 )
11697 s .Require ().NoError (err )
11798 owner := ownerResult .String ()
11899
119100 _ , 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 ())
121102 s .Require ().NoError (err )
122103
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 )
124106 s .Require ().NoError (err )
125107 owner = ownerResult .String ()
126108 s .Require ().Equal (s .LSMWallets [lsmOwnerMoniker ].FormattedAddress (), owner )
127109
128110 _ , 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 ())
130112 s .Require ().NoError (err )
131113
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 )
133116 s .Require ().NoError (err )
134117 owner = ownerResult .String ()
135118 s .Require ().Equal (s .LSMWallets [lsmLiquid1Moniker ].FormattedAddress (), owner )
@@ -175,12 +158,12 @@ func (s *LSMSuite) TestLSMHappyPath() {
175158 var happyLiquid1DelegationBalance string
176159 s .Run ("Redeem Tokens" , func () {
177160 _ , 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 ),
179162 "--gas" , "auto" )
180163 s .Require ().NoError (err )
181164
182165 _ , 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 ),
184167 "--gas" , "auto" )
185168 s .Require ().NoError (err )
186169
@@ -194,7 +177,7 @@ func (s *LSMSuite) TestLSMHappyPath() {
194177 s .Require ().NoError (testutil .WaitForBlocks (s .GetContext (), 5 , s .Chain ))
195178
196179 _ , 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 ),
198181 "--gas" , "auto" )
199182 s .Require ().NoError (err )
200183
@@ -230,154 +213,6 @@ func (s *LSMSuite) TestLSMHappyPath() {
230213 s .checkAMinusBEqualsX (happyLiquid2DelegationBalance , "0" , sdkmath .NewInt (bankSend ))
231214 s .checkAMinusBEqualsX (happyLiquid3DelegationBalance , "0" , sdkmath .NewInt (ibcTransfer ))
232215 })
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- })
381216}
382217
383218func (s * LSMSuite ) TestTokenizeVested () {
@@ -413,21 +248,25 @@ func (s *LSMSuite) TestTokenizeVested() {
413248
414249 // try to tokenize full amount. Should fail.
415250 _ , 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 (),
417253 "--gas" , "auto" )
418254 s .Require ().Error (err )
419255
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 )
421258 s .Require ().NoError (err )
422259 sharesPreTokenize := sharesPreTokenizeResult .String ()
423260
424261 // try to tokenize vested amount (i.e. half) should succeed if upgraded
425262 tokenizeAmount := vestingAmount / 2
426263 _ , 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 (),
428266 "--gas" , "auto" )
429267 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 )
431270 s .Require ().NoError (err )
432271 sharesPostTokenize := sharesPostTokenizeResult .String ()
433272 s .checkAMinusBEqualsX (sharesPostTokenize , sharesPreTokenize , sdkmath .NewInt (tokenizeAmount ).Mul (s .ShareFactor ))
0 commit comments