2019-08-14 14:10:48 -07:00
|
|
|
package keeper_test
|
2019-06-28 13:11:27 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
2020-02-18 04:50:13 -08:00
|
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
2019-06-28 13:11:27 -07:00
|
|
|
|
2020-03-05 06:40:43 -08:00
|
|
|
codecstd "github.com/cosmos/cosmos-sdk/codec/std"
|
2020-02-18 04:50:13 -08:00
|
|
|
"github.com/cosmos/cosmos-sdk/simapp"
|
2019-06-28 13:11:27 -07:00
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2020-02-18 04:50:13 -08:00
|
|
|
keep "github.com/cosmos/cosmos-sdk/x/supply/keeper"
|
|
|
|
"github.com/cosmos/cosmos-sdk/x/supply/types"
|
2019-06-28 13:11:27 -07:00
|
|
|
)
|
|
|
|
|
2020-02-18 04:50:13 -08:00
|
|
|
const (
|
|
|
|
initialPower = int64(100)
|
|
|
|
holder = "holder"
|
|
|
|
multiPerm = "multiple permissions account"
|
|
|
|
randomPerm = "random permission"
|
|
|
|
)
|
2019-06-28 13:11:27 -07:00
|
|
|
|
2019-08-14 14:10:48 -07:00
|
|
|
// create module accounts for testing
|
2019-06-28 13:11:27 -07:00
|
|
|
var (
|
2019-07-16 07:02:36 -07:00
|
|
|
holderAcc = types.NewEmptyModuleAccount(holder)
|
2019-07-06 12:42:06 -07:00
|
|
|
burnerAcc = types.NewEmptyModuleAccount(types.Burner, types.Burner)
|
|
|
|
minterAcc = types.NewEmptyModuleAccount(types.Minter, types.Minter)
|
2019-07-16 07:02:36 -07:00
|
|
|
multiPermAcc = types.NewEmptyModuleAccount(multiPerm, types.Burner, types.Minter, types.Staking)
|
2019-07-06 12:42:06 -07:00
|
|
|
randomPermAcc = types.NewEmptyModuleAccount(randomPerm, "random")
|
2019-06-28 13:11:27 -07:00
|
|
|
|
|
|
|
initTokens = sdk.TokensFromConsensusPower(initialPower)
|
|
|
|
initCoins = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initTokens))
|
|
|
|
)
|
|
|
|
|
2020-01-30 13:31:16 -08:00
|
|
|
// nolint
|
|
|
|
func getCoinsByName(ctx sdk.Context, sk keep.Keeper, ak types.AccountKeeper, bk types.BankKeeper, moduleName string) sdk.Coins {
|
2019-08-14 14:10:48 -07:00
|
|
|
moduleAddress := sk.GetModuleAddress(moduleName)
|
|
|
|
macc := ak.GetAccount(ctx, moduleAddress)
|
2019-06-28 13:11:27 -07:00
|
|
|
if macc == nil {
|
|
|
|
return sdk.Coins(nil)
|
|
|
|
}
|
2020-01-30 13:31:16 -08:00
|
|
|
|
|
|
|
return bk.GetAllBalances(ctx, macc.GetAddress())
|
2019-06-28 13:11:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestSendCoins(t *testing.T) {
|
2020-02-18 04:50:13 -08:00
|
|
|
app := simapp.Setup(false)
|
|
|
|
ctx := app.BaseApp.NewContext(false, abci.Header{Height: 1})
|
|
|
|
|
|
|
|
// add module accounts to supply keeper
|
|
|
|
maccPerms := simapp.GetMaccPerms()
|
|
|
|
maccPerms[holder] = nil
|
|
|
|
maccPerms[types.Burner] = []string{types.Burner}
|
|
|
|
maccPerms[types.Minter] = []string{types.Minter}
|
|
|
|
maccPerms[multiPerm] = []string{types.Burner, types.Minter, types.Staking}
|
|
|
|
maccPerms[randomPerm] = []string{"random"}
|
|
|
|
|
2020-03-05 06:40:43 -08:00
|
|
|
appCodec := codecstd.NewAppCodec(app.Codec())
|
2020-02-18 04:50:13 -08:00
|
|
|
|
|
|
|
keeper := keep.NewKeeper(appCodec, app.GetKey(types.StoreKey), app.AccountKeeper, app.BankKeeper, maccPerms)
|
2019-08-14 14:10:48 -07:00
|
|
|
ak := app.AccountKeeper
|
2020-01-30 13:31:16 -08:00
|
|
|
bk := app.BankKeeper
|
2019-06-28 13:11:27 -07:00
|
|
|
|
|
|
|
baseAcc := ak.NewAccountWithAddress(ctx, types.NewModuleAddress("baseAcc"))
|
|
|
|
|
2020-01-30 13:31:16 -08:00
|
|
|
require.NoError(t, bk.SetBalances(ctx, holderAcc.GetAddress(), initCoins))
|
2019-08-14 14:10:48 -07:00
|
|
|
keeper.SetSupply(ctx, types.NewSupply(initCoins))
|
2019-06-28 13:11:27 -07:00
|
|
|
|
|
|
|
keeper.SetModuleAccount(ctx, holderAcc)
|
|
|
|
keeper.SetModuleAccount(ctx, burnerAcc)
|
|
|
|
ak.SetAccount(ctx, baseAcc)
|
|
|
|
|
2019-12-27 09:57:54 -08:00
|
|
|
require.Panics(t, func() {
|
|
|
|
keeper.SendCoinsFromModuleToModule(ctx, "", holderAcc.GetName(), initCoins)
|
|
|
|
})
|
2019-06-28 13:11:27 -07:00
|
|
|
|
|
|
|
require.Panics(t, func() {
|
|
|
|
keeper.SendCoinsFromModuleToModule(ctx, types.Burner, "", initCoins)
|
|
|
|
})
|
|
|
|
|
2019-12-27 09:57:54 -08:00
|
|
|
require.Panics(t, func() {
|
|
|
|
keeper.SendCoinsFromModuleToAccount(ctx, "", baseAcc.GetAddress(), initCoins)
|
|
|
|
})
|
2019-06-28 13:11:27 -07:00
|
|
|
|
2020-01-30 13:31:16 -08:00
|
|
|
require.Error(
|
|
|
|
t,
|
|
|
|
keeper.SendCoinsFromModuleToAccount(ctx, holderAcc.GetName(), baseAcc.GetAddress(), initCoins.Add(initCoins...)),
|
|
|
|
)
|
|
|
|
|
|
|
|
require.NoError(
|
|
|
|
t, keeper.SendCoinsFromModuleToModule(ctx, holderAcc.GetName(), types.Burner, initCoins),
|
|
|
|
)
|
|
|
|
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, bk, holderAcc.GetName()))
|
|
|
|
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, bk, types.Burner))
|
|
|
|
|
|
|
|
require.NoError(
|
|
|
|
t, keeper.SendCoinsFromModuleToAccount(ctx, types.Burner, baseAcc.GetAddress(), initCoins),
|
|
|
|
)
|
|
|
|
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, bk, types.Burner))
|
|
|
|
require.Equal(t, initCoins, bk.GetAllBalances(ctx, baseAcc.GetAddress()))
|
|
|
|
|
|
|
|
require.NoError(t, keeper.SendCoinsFromAccountToModule(ctx, baseAcc.GetAddress(), types.Burner, initCoins))
|
|
|
|
require.Equal(t, sdk.Coins(nil), bk.GetAllBalances(ctx, baseAcc.GetAddress()))
|
|
|
|
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, bk, types.Burner))
|
2019-06-28 13:11:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestMintCoins(t *testing.T) {
|
2020-02-18 04:50:13 -08:00
|
|
|
app := simapp.Setup(false)
|
|
|
|
ctx := app.BaseApp.NewContext(false, abci.Header{Height: 1})
|
|
|
|
|
|
|
|
// add module accounts to supply keeper
|
|
|
|
maccPerms := simapp.GetMaccPerms()
|
|
|
|
maccPerms[holder] = nil
|
|
|
|
maccPerms[types.Burner] = []string{types.Burner}
|
|
|
|
maccPerms[types.Minter] = []string{types.Minter}
|
|
|
|
maccPerms[multiPerm] = []string{types.Burner, types.Minter, types.Staking}
|
|
|
|
maccPerms[randomPerm] = []string{"random"}
|
|
|
|
|
2020-03-05 06:40:43 -08:00
|
|
|
appCodec := codecstd.NewAppCodec(app.Codec())
|
2020-02-18 04:50:13 -08:00
|
|
|
|
|
|
|
keeper := keep.NewKeeper(appCodec, app.GetKey(types.StoreKey), app.AccountKeeper, app.BankKeeper, maccPerms)
|
2019-08-14 14:10:48 -07:00
|
|
|
ak := app.AccountKeeper
|
2020-01-30 13:31:16 -08:00
|
|
|
bk := app.BankKeeper
|
2019-06-28 13:11:27 -07:00
|
|
|
|
|
|
|
keeper.SetModuleAccount(ctx, burnerAcc)
|
|
|
|
keeper.SetModuleAccount(ctx, minterAcc)
|
2019-07-06 12:42:06 -07:00
|
|
|
keeper.SetModuleAccount(ctx, multiPermAcc)
|
|
|
|
keeper.SetModuleAccount(ctx, randomPermAcc)
|
2019-06-28 13:11:27 -07:00
|
|
|
|
|
|
|
initialSupply := keeper.GetSupply(ctx)
|
|
|
|
|
2019-12-27 09:57:54 -08:00
|
|
|
require.Panics(t, func() { keeper.MintCoins(ctx, "", initCoins) }, "no module account")
|
2019-07-05 05:32:42 -07:00
|
|
|
require.Panics(t, func() { keeper.MintCoins(ctx, types.Burner, initCoins) }, "invalid permission")
|
2019-12-27 09:57:54 -08:00
|
|
|
err := keeper.MintCoins(ctx, types.Minter, sdk.Coins{sdk.Coin{Denom: "denom", Amount: sdk.NewInt(-10)}})
|
|
|
|
require.Error(t, err, "insufficient coins")
|
2019-06-28 13:11:27 -07:00
|
|
|
|
2019-07-06 12:42:06 -07:00
|
|
|
require.Panics(t, func() { keeper.MintCoins(ctx, randomPerm, initCoins) })
|
|
|
|
|
2019-12-27 09:57:54 -08:00
|
|
|
err = keeper.MintCoins(ctx, types.Minter, initCoins)
|
2019-06-28 13:11:27 -07:00
|
|
|
require.NoError(t, err)
|
2020-01-30 13:31:16 -08:00
|
|
|
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, bk, types.Minter))
|
2020-01-03 12:44:53 -08:00
|
|
|
require.Equal(t, initialSupply.GetTotal().Add(initCoins...), keeper.GetSupply(ctx).GetTotal())
|
2019-07-06 12:42:06 -07:00
|
|
|
|
|
|
|
// test same functionality on module account with multiple permissions
|
|
|
|
initialSupply = keeper.GetSupply(ctx)
|
|
|
|
|
|
|
|
err = keeper.MintCoins(ctx, multiPermAcc.GetName(), initCoins)
|
|
|
|
require.NoError(t, err)
|
2020-01-30 13:31:16 -08:00
|
|
|
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, bk, multiPermAcc.GetName()))
|
2020-01-03 12:44:53 -08:00
|
|
|
require.Equal(t, initialSupply.GetTotal().Add(initCoins...), keeper.GetSupply(ctx).GetTotal())
|
2019-07-06 12:42:06 -07:00
|
|
|
|
|
|
|
require.Panics(t, func() { keeper.MintCoins(ctx, types.Burner, initCoins) })
|
2019-06-28 13:11:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestBurnCoins(t *testing.T) {
|
2020-02-18 04:50:13 -08:00
|
|
|
app := simapp.Setup(false)
|
|
|
|
ctx := app.BaseApp.NewContext(false, abci.Header{Height: 1})
|
|
|
|
|
|
|
|
// add module accounts to supply keeper
|
|
|
|
maccPerms := simapp.GetMaccPerms()
|
|
|
|
maccPerms[holder] = nil
|
|
|
|
maccPerms[types.Burner] = []string{types.Burner}
|
|
|
|
maccPerms[types.Minter] = []string{types.Minter}
|
|
|
|
maccPerms[multiPerm] = []string{types.Burner, types.Minter, types.Staking}
|
|
|
|
maccPerms[randomPerm] = []string{"random"}
|
|
|
|
|
2020-03-05 06:40:43 -08:00
|
|
|
appCodec := codecstd.NewAppCodec(app.Codec())
|
2020-02-18 04:50:13 -08:00
|
|
|
|
|
|
|
keeper := keep.NewKeeper(appCodec, app.GetKey(types.StoreKey), app.AccountKeeper, app.BankKeeper, maccPerms)
|
2019-08-14 14:10:48 -07:00
|
|
|
ak := app.AccountKeeper
|
2020-01-30 13:31:16 -08:00
|
|
|
bk := app.BankKeeper
|
2019-06-28 13:11:27 -07:00
|
|
|
|
2020-01-30 13:31:16 -08:00
|
|
|
require.NoError(t, bk.SetBalances(ctx, burnerAcc.GetAddress(), initCoins))
|
2019-08-14 14:10:48 -07:00
|
|
|
keeper.SetSupply(ctx, types.NewSupply(initCoins))
|
2019-06-28 13:11:27 -07:00
|
|
|
keeper.SetModuleAccount(ctx, burnerAcc)
|
|
|
|
|
|
|
|
initialSupply := keeper.GetSupply(ctx)
|
2020-02-18 04:50:13 -08:00
|
|
|
initialSupply.Inflate(initCoins)
|
2019-06-28 13:11:27 -07:00
|
|
|
keeper.SetSupply(ctx, initialSupply)
|
|
|
|
|
2019-12-27 09:57:54 -08:00
|
|
|
require.Panics(t, func() { keeper.BurnCoins(ctx, "", initCoins) }, "no module account")
|
2019-07-05 05:32:42 -07:00
|
|
|
require.Panics(t, func() { keeper.BurnCoins(ctx, types.Minter, initCoins) }, "invalid permission")
|
2019-08-01 11:56:50 -07:00
|
|
|
require.Panics(t, func() { keeper.BurnCoins(ctx, randomPerm, initialSupply.GetTotal()) }, "random permission")
|
2019-12-27 09:57:54 -08:00
|
|
|
err := keeper.BurnCoins(ctx, types.Burner, initialSupply.GetTotal())
|
|
|
|
require.Error(t, err, "insufficient coins")
|
2019-06-28 13:11:27 -07:00
|
|
|
|
2019-12-27 09:57:54 -08:00
|
|
|
err = keeper.BurnCoins(ctx, types.Burner, initCoins)
|
2019-06-28 13:11:27 -07:00
|
|
|
require.NoError(t, err)
|
2020-01-30 13:31:16 -08:00
|
|
|
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, bk, types.Burner))
|
2019-08-01 11:56:50 -07:00
|
|
|
require.Equal(t, initialSupply.GetTotal().Sub(initCoins), keeper.GetSupply(ctx).GetTotal())
|
2019-07-06 12:42:06 -07:00
|
|
|
|
|
|
|
// test same functionality on module account with multiple permissions
|
|
|
|
initialSupply = keeper.GetSupply(ctx)
|
2020-02-18 04:50:13 -08:00
|
|
|
initialSupply.Inflate(initCoins)
|
2019-07-06 12:42:06 -07:00
|
|
|
keeper.SetSupply(ctx, initialSupply)
|
|
|
|
|
2020-01-30 13:31:16 -08:00
|
|
|
require.NoError(t, bk.SetBalances(ctx, multiPermAcc.GetAddress(), initCoins))
|
2019-07-06 12:42:06 -07:00
|
|
|
keeper.SetModuleAccount(ctx, multiPermAcc)
|
|
|
|
|
|
|
|
err = keeper.BurnCoins(ctx, multiPermAcc.GetName(), initCoins)
|
|
|
|
require.NoError(t, err)
|
2020-01-30 13:31:16 -08:00
|
|
|
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, bk, multiPermAcc.GetName()))
|
2019-08-01 11:56:50 -07:00
|
|
|
require.Equal(t, initialSupply.GetTotal().Sub(initCoins), keeper.GetSupply(ctx).GetTotal())
|
2019-06-28 13:11:27 -07:00
|
|
|
}
|