diff --git a/tests/e2e/mvp_test.go b/tests/e2e/mvp_test.go index 2bd96acd..7a128090 100644 --- a/tests/e2e/mvp_test.go +++ b/tests/e2e/mvp_test.go @@ -27,15 +27,14 @@ func TestMVP(t *testing.T) { // when a user on P deposits an amount as collateral in the vault contract // then it can be used as "lien" to stake local and to "cross stake" on chain C // when an amount is "cross staked" to a validator on chain C - // - // not fully implemented: - // // and the ibc package is relayed // then the amount is converted into an amount in the chain C bonding token // and scheduled to be staked as synthetic token on the validator // when the next epoch is executed on chain C // then the synthetic tokens are minted and staked + // // when the user on chain P starts an undelegate + // // ... var ( @@ -107,23 +106,23 @@ func TestMVP(t *testing.T) { // Stake Locally - A user triggers a local staking action to a chosen validator. They then can manage their delegation and vote via the local staking contract. myLocalValidatorAddr := sdk.ValAddress(providerChain.Vals.Validators[0].Address).String() - execMsg = fmt.Sprintf(`{"stake_local":{"amount": {"denom":%q, "amount":"%d"}, "msg":%q}}`, - sdk.DefaultBondDenom, 50_000_000, + execLocalStakingMsg := fmt.Sprintf(`{"stake_local":{"amount": {"denom":%q, "amount":"%d"}, "msg":%q}}`, + sdk.DefaultBondDenom, 30_000_000, base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(`{"validator": "%s"}`, myLocalValidatorAddr)))) - providerCli.MustExecVault(execMsg) + providerCli.MustExecVault(execLocalStakingMsg) - assert.Equal(t, 50_000_000, providerCli.QueryVaultFreeBalance()) + assert.Equal(t, 70_000_000, providerCli.QueryVaultFreeBalance()) // Cross Stake - A user pulls out additional liens on the same collateral "cross staking" it on different chains. execMsg = fmt.Sprintf(`{"stake_remote":{"contract":"%s", "amount": {"denom":%q, "amount":"%d"}, "msg":%q}}`, providerContracts.externalStaking.String(), - sdk.DefaultBondDenom, 40_000_000, + sdk.DefaultBondDenom, 80_000_000, base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(`{"validator": "%s"}`, myExtValidatorAddr)))) providerCli.MustExecVault(execMsg) require.NoError(t, coord.RelayAndAckPendingPackets(ibcPath)) - assert.NotEqual(t, 50_000_000, providerCli.QueryVaultFreeBalance()) // todo: set correct number + require.Equal(t, 20_000_000, providerCli.QueryVaultFreeBalance()) // = 70 (free) + 30 (local) - 80 (remote staked) // then qRsp = providerCli.QueryExtStaking(Query{ @@ -132,7 +131,7 @@ func TestMVP(t *testing.T) { "validator": myExtValidatorAddr, }, }) - assert.Equal(t, "40000000", qRsp["stake"], qRsp) + assert.Equal(t, "80000000", qRsp["stake"], qRsp) assert.Empty(t, qRsp["pending_unbonds"]) // consumer chain @@ -145,16 +144,16 @@ func TestMVP(t *testing.T) { consumerCli.ExecNewEpoch() // then the total delegated amount is updated - consumerCli.assertTotalDelegated(math.NewInt(18_000_000)) // 40_000_000 /2 * (1 -0.1) + consumerCli.assertTotalDelegated(math.NewInt(36_000_000)) // 80_000_000 /2 * (1 -0.1) // and the delegated amount is updated for the validator - consumerCli.assertShare(myExtValidator, 18) // 18_000_000 / 1_000_000 # default sdk factor + consumerCli.assertShare(myExtValidator, math.LegacyNewDec(36)) // 36_000_000 / 1_000_000 # default sdk factor // provider chain // ============== // // Cross Stake - A user undelegates - execMsg = fmt.Sprintf(`{"unstake":{"validator":"%s", "amount":{"denom":"%s", "amount":"20000000"}}}`, myExtValidator.String(), sdk.DefaultBondDenom) + execMsg = fmt.Sprintf(`{"unstake":{"validator":"%s", "amount":{"denom":"%s", "amount":"30000000"}}}`, myExtValidator.String(), sdk.DefaultBondDenom) providerCli.MustExecExtStaking(execMsg) require.NoError(t, coord.RelayAndAckPendingPackets(ibcPath)) @@ -166,10 +165,10 @@ func TestMVP(t *testing.T) { "validator": myExtValidatorAddr, }, }) - assert.Equal(t, "20000000", qRsp["stake"], qRsp) + require.Equal(t, "50000000", qRsp["stake"], qRsp) require.Len(t, qRsp["pending_unbonds"], 1) unbonds := qRsp["pending_unbonds"].([]any)[0].(map[string]any) - assert.Equal(t, "20000000", unbonds["amount"], qRsp) + assert.Equal(t, "30000000", unbonds["amount"], qRsp) // consumer chain // ==================== @@ -177,32 +176,37 @@ func TestMVP(t *testing.T) { consumerCli.ExecNewEpoch() // then the total delegated amount is updated - consumerCli.assertTotalDelegated(math.NewInt(9000000)) // (40_000_000 - 20_000_000) /2 * (1 -0.1) - consumerCli.assertShare(myExtValidator, 9) // 20_000_000 / 1_000_000 # default sdk factor + consumerCli.assertTotalDelegated(math.NewInt(22_500_000)) // (80_000_000 - 30_000_000) /2 * (1 -0.1) + consumerCli.assertShare(myExtValidator, math.LegacyNewDecWithPrec(225, 1)) // 27_000_000 / 1_000_000 # default sdk factor // provider chain // ============== // // A user withdraws the undelegated amount - assert.NotEqual(t, 50_000_000, providerCli.QueryVaultFreeBalance()) // todo: set correct number + require.Equal(t, 20_000_000, providerCli.QueryVaultFreeBalance()) releaseData := unbonds["release_at"].(string) require.NotEmpty(t, releaseData) at, err := strconv.Atoi(releaseData) require.NoError(t, err) releasedAt := time.Unix(0, int64(at)).UTC() - t.Logf("+++: %s\n", releasedAt.String()) - + // update system time coord.CurrentTime = releasedAt.Add(time.Minute) coord.UpdateTime() coord.CommitBlock(providerChain, consumerChain) providerCli.MustExecExtStaking(`{"withdraw_unbonded":{}}`) - coord.CommitBlock(providerChain, consumerChain) - - assert.NotEqual(t, 50_000_000, providerCli.QueryVaultFreeBalance()) // todo: set correct number + assert.Equal(t, 50_000_000, providerCli.QueryVaultFreeBalance()) - // gotBalance := providerChain.Balance(providerChain.SenderAccount.GetAddress(), "stake") - // assert.Equal(t, sdk.NewInt64Coin("stake", 10_000_000), gotBalance.Sub(startBalance)) + // provider chain + // ============== + // + // A user unstakes some free amount from the vault + balanceBefore := providerChain.Balance(providerChain.SenderAccount.GetAddress(), "stake") + providerCli.MustExecVault(`{"unbond":{"amount":{"denom":"stake", "amount": "30000000"}}}`) + // then + assert.Equal(t, 20_000_000, providerCli.QueryVaultFreeBalance()) + balanceAfter := providerChain.Balance(providerChain.SenderAccount.GetAddress(), "stake") + assert.Equal(t, math.NewInt(30_000_000), balanceAfter.Sub(balanceBefore).Amount) } diff --git a/tests/e2e/test_client.go b/tests/e2e/test_client.go index 6f377e50..217cc3aa 100644 --- a/tests/e2e/test_client.go +++ b/tests/e2e/test_client.go @@ -179,8 +179,8 @@ func (p *TestConsumerClient) assertTotalDelegated(expTotalDelegated math.Int) { assert.Equal(p.t, sdk.NewCoin(sdk.DefaultBondDenom, expTotalDelegated), usedAmount) } -func (p *TestConsumerClient) assertShare(val sdk.ValAddress, exp int64) { +func (p *TestConsumerClient) assertShare(val sdk.ValAddress, exp math.LegacyDec) { del, found := p.app.StakingKeeper.GetDelegation(p.chain.GetContext(), p.contracts.staking, val) require.True(p.t, found) - assert.Equal(p.t, math.LegacyNewDec(exp), del.Shares) + assert.Equal(p.t, exp, del.Shares) }