Skip to content

Commit

Permalink
feat: mint & burn e2e tests for fiattokenfactory (#371)
Browse files Browse the repository at this point in the history
Co-authored-by: John Letey <[email protected]>
  • Loading branch information
boojamya and johnletey authored Oct 17, 2024
1 parent 8664bcf commit 8cb4c9f
Showing 1 changed file with 233 additions and 0 deletions.
233 changes: 233 additions & 0 deletions e2e/fiat_tf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}

0 comments on commit 8cb4c9f

Please sign in to comment.