diff --git a/e2e/fiat_tf_test.go b/e2e/fiat_tf_test.go index 81f4f91c..aad332ec 100644 --- a/e2e/fiat_tf_test.go +++ b/e2e/fiat_tf_test.go @@ -1288,3 +1288,236 @@ func TestFiatTFUnblacklist(t *testing.T) { _, err = e2e.ShowBlacklisted(ctx, val, blacklistedUser1) require.Error(t, err, "query succeeded, blacklisted account should not exist") } + +func TestFiatTFMint(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + + nw := e2e.NobleSpinUp(t, ctx, true) + noble := nw.Chain + val := noble.Validators[0] + + // ACTION: Mint while TF is paused + // EXPECTED: Request fails; amount not minted + + w := interchaintest.GetAndFundTestUsers(t, ctx, "receiver-1", math.OneInt(), noble) + receiver1 := w[0] + + e2e.PauseFiatTF(t, ctx, val, nw.FiatTfRoles.Pauser) + + showMinterPreMint, err := e2e.ShowMinters(ctx, val, nw.FiatTfRoles.Minter) + require.NoError(t, err, "failed to query show-minter") + + preMintAllowance := showMinterPreMint.Minters.Allowance.Amount + + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "mint", receiver1.FormattedAddress(), "1uusdc") + require.ErrorContains(t, err, "minting is paused") + + bal, err := noble.GetBalance(ctx, receiver1.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.True(t, bal.IsZero()) + + // allowance should not have changed + showMinterPostMint, err := e2e.ShowMinters(ctx, val, nw.FiatTfRoles.Minter) + require.NoError(t, err, "failed to query show-minter") + expectedShowMinters := fiattokenfactorytypes.QueryGetMintersResponse{ + Minters: fiattokenfactorytypes.Minters{ + Address: nw.FiatTfRoles.Minter.FormattedAddress(), + Allowance: sdk.Coin{ + Denom: "uusdc", + Amount: preMintAllowance, + }, + }, + } + + require.Equal(t, expectedShowMinters.Minters, showMinterPostMint.Minters) + + e2e.UnpauseFiatTF(t, ctx, val, nw.FiatTfRoles.Pauser) + + // ACTION: Mint from non minter + // EXPECTED: Request fails; amount not minted + + w = interchaintest.GetAndFundTestUsers(t, ctx, "alice", math.OneInt(), noble) + alice := w[0] + + _, err = val.ExecTx(ctx, alice.KeyName(), "fiat-tokenfactory", "mint", receiver1.FormattedAddress(), "1uusdc") + require.ErrorContains(t, err, "you are not a minter") + + bal, err = noble.GetBalance(ctx, receiver1.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.True(t, bal.IsZero()) + + // ACTION: Mint from blacklisted minter + // EXPECTED: Request fails; amount not minted + + e2e.BlacklistAccount(t, ctx, val, nw.FiatTfRoles.Blacklister, nw.FiatTfRoles.Minter) + + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "mint", receiver1.FormattedAddress(), "1uusdc") + require.ErrorContains(t, err, "minter address is blacklisted") + + bal, err = noble.GetBalance(ctx, receiver1.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.True(t, bal.IsZero()) + + // allowance should not have changed + showMintersRes, err := e2e.ShowMinters(ctx, val, nw.FiatTfRoles.Minter) + require.NoError(t, err, "failed to query show-minter") + + require.Equal(t, expectedShowMinters.Minters, showMintersRes.Minters) + + e2e.UnblacklistAccount(t, ctx, val, nw.FiatTfRoles.Blacklister, nw.FiatTfRoles.Minter) + + // ACTION: Mint to blacklisted account + // EXPECTED: Request fails; amount not minted + + e2e.BlacklistAccount(t, ctx, val, nw.FiatTfRoles.Blacklister, receiver1) + + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "mint", receiver1.FormattedAddress(), "1uusdc") + require.ErrorContains(t, err, "receiver address is blacklisted") + + bal, err = noble.GetBalance(ctx, receiver1.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.True(t, bal.IsZero()) + + // allowance should not have changed + showMintersRes, err = e2e.ShowMinters(ctx, val, nw.FiatTfRoles.Minter) + require.NoError(t, err, "failed to query show-minter") + + require.Equal(t, expectedShowMinters.Minters, showMintersRes.Minters) + + e2e.UnblacklistAccount(t, ctx, val, nw.FiatTfRoles.Blacklister, receiver1) + + // ACTION: Mint an amount that exceeds the minters allowance + // EXPECTED: Request fails; amount not minted + + exceedAllowance := preMintAllowance.Add(math.NewInt(99)) + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "mint", receiver1.FormattedAddress(), fmt.Sprintf("%duusdc", exceedAllowance.Int64())) + require.ErrorContains(t, err, "minting amount is greater than the allowance") + + bal, err = noble.GetBalance(ctx, receiver1.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.True(t, bal.IsZero()) + + // allowance should not have changed + showMintersRes, err = e2e.ShowMinters(ctx, val, nw.FiatTfRoles.Minter) + require.NoError(t, err, "failed to query show-minter") + require.Equal(t, expectedShowMinters.Minters, showMintersRes.Minters) + + // ACTION: Successfully mint into an account + // EXPECTED: Success + + mintAmount := int64(3) + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "mint", receiver1.FormattedAddress(), fmt.Sprintf("%duusdc", mintAmount)) + require.NoError(t, err, "error minting") + + bal, err = noble.GetBalance(ctx, receiver1.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.True(t, bal.Equal(math.NewInt(mintAmount))) + + showMintersRes, err = e2e.ShowMinters(ctx, val, nw.FiatTfRoles.Minter) + require.NoError(t, err, "failed to query show-minter") + expectedShowMinters.Minters.Allowance = sdk.Coin{ + Denom: "uusdc", + Amount: preMintAllowance.Sub(math.NewInt(mintAmount)), + } + + require.Equal(t, expectedShowMinters.Minters, showMintersRes.Minters) +} + +func TestFiatTFBurn(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + + nw := e2e.NobleSpinUp(t, ctx, true) + noble := nw.Chain + val := noble.Validators[0] + + // setup - mint into minter's wallet + mintAmount := int64(5) + _, err := val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "mint", nw.FiatTfRoles.Minter.FormattedAddress(), fmt.Sprintf("%duusdc", mintAmount)) + require.NoError(t, err, "error minting") + + bal, err := noble.GetBalance(ctx, nw.FiatTfRoles.Minter.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.EqualValues(t, mintAmount, bal.Int64()) + + // ACTION: Burn while TF is paused + // EXPECTED: Request fails; amount not burned + + e2e.PauseFiatTF(t, ctx, val, nw.FiatTfRoles.Pauser) + + burnAmount := int64(1) + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "burn", fmt.Sprintf("%duusdc", burnAmount)) + require.ErrorContains(t, err, "burning is paused") + + bal, err = noble.GetBalance(ctx, nw.FiatTfRoles.Minter.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.EqualValues(t, mintAmount, bal.Int64(), "minters balance should not have decreased") + + e2e.UnpauseFiatTF(t, ctx, val, nw.FiatTfRoles.Pauser) + + // ACTION: Burn from non minter account + // EXPECTED: Request fails; amount not burned + + w := interchaintest.GetAndFundTestUsers(t, ctx, "alice", math.NewInt(burnAmount), noble) + alice := w[0] + + // mint into Alice's account to give her a balance to burn + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "mint", alice.FormattedAddress(), fmt.Sprintf("%duusdc", mintAmount)) + require.NoError(t, err, "error minting") + + bal, err = noble.GetBalance(ctx, alice.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.True(t, bal.Equal(math.NewInt(mintAmount))) + + _, err = val.ExecTx(ctx, alice.KeyName(), "fiat-tokenfactory", "burn", fmt.Sprintf("%duusdc", burnAmount)) + require.ErrorContains(t, err, "you are not a minter") + + bal, err = noble.GetBalance(ctx, alice.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.EqualValues(t, mintAmount, bal.Int64(), "minters balance should not have decreased") + + // ACTION: Burn from a blacklisted minter account + // EXPECTED: Request fails; amount not burned + + e2e.BlacklistAccount(t, ctx, val, nw.FiatTfRoles.Blacklister, nw.FiatTfRoles.Minter) + + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "burn", fmt.Sprintf("%duusdc", burnAmount)) + require.ErrorContains(t, err, "minter address is blacklisted") + + bal, err = noble.GetBalance(ctx, nw.FiatTfRoles.Minter.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.EqualValues(t, mintAmount, bal.Int64(), "minters balance should not have decreased") + + e2e.UnblacklistAccount(t, ctx, val, nw.FiatTfRoles.Blacklister, nw.FiatTfRoles.Minter) + + // ACTION: Burn amount greater than the minters balance + // EXPECTED: Request fails; amount not burned + + exceedAllowance := bal.Add(math.NewInt(99)) + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "burn", fmt.Sprintf("%duusdc", exceedAllowance.Int64())) + require.ErrorContains(t, err, "insufficient funds") + + bal, err = noble.GetBalance(ctx, nw.FiatTfRoles.Minter.FormattedAddress(), "uusdc") + require.NoError(t, err, "error getting balance") + require.EqualValues(t, mintAmount, bal.Int64(), "minters balance should not have decreased") + + // ACTION: Successfully burn tokens + // EXPECTED: Success; amount burned and Minters balance is decreased + + _, err = val.ExecTx(ctx, nw.FiatTfRoles.Minter.KeyName(), "fiat-tokenfactory", "burn", fmt.Sprintf("%duusdc", burnAmount)) + require.NoError(t, err, "error broadcasting burn") + + bal, err = noble.GetBalance(ctx, nw.FiatTfRoles.Minter.FormattedAddress(), "uusdc") + expectedAmount := mintAmount - burnAmount + require.NoError(t, err, "error getting balance") + require.EqualValues(t, expectedAmount, bal.Int64()) +}