github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/supply/internal/keeper/bank_test.go (about) 1 package keeper_test 2 3 import ( 4 "testing" 5 6 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply" 7 8 "github.com/stretchr/testify/require" 9 10 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 11 keep "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply/internal/keeper" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply/internal/types" 13 ) 14 15 const initialPower = int64(100) 16 17 // create module accounts for testing 18 var ( 19 holderAcc = types.NewEmptyModuleAccount(holder) 20 burnerAcc = types.NewEmptyModuleAccount(types.Burner, types.Burner) 21 minterAcc = types.NewEmptyModuleAccount(types.Minter, types.Minter) 22 multiPermAcc = types.NewEmptyModuleAccount(multiPerm, types.Burner, types.Minter, types.Staking) 23 randomPermAcc = types.NewEmptyModuleAccount(randomPerm, "random") 24 25 initTokens = sdk.TokensFromConsensusPower(initialPower) 26 initCoins = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initTokens)) 27 ) 28 29 func getCoinsByName(ctx sdk.Context, sk keep.Keeper, ak types.AccountKeeper, moduleName string) sdk.Coins { 30 moduleAddress := sk.GetModuleAddress(moduleName) 31 macc := ak.GetAccount(ctx, moduleAddress) 32 if macc == nil { 33 return sdk.Coins(nil) 34 } 35 return macc.GetCoins() 36 } 37 38 func TestSendCoins(t *testing.T) { 39 app, ctx := createTestApp(false) 40 keeper := app.SupplyKeeper 41 ak := app.AccountKeeper 42 43 baseAcc := ak.NewAccountWithAddress(ctx, types.NewModuleAddress("baseAcc")) 44 45 err := holderAcc.SetCoins(initCoins) 46 require.NoError(t, err) 47 keeper.SetSupply(ctx, types.NewSupply(initCoins)) 48 49 keeper.SetModuleAccount(ctx, holderAcc) 50 keeper.SetModuleAccount(ctx, burnerAcc) 51 ak.SetAccount(ctx, baseAcc) 52 53 require.Panics(t, func() { 54 keeper.SendCoinsFromModuleToModule(ctx, "", holderAcc.GetName(), initCoins) 55 }) 56 57 require.Panics(t, func() { 58 keeper.SendCoinsFromModuleToModule(ctx, types.Burner, "", initCoins) 59 }) 60 61 require.Panics(t, func() { 62 keeper.SendCoinsFromModuleToAccount(ctx, "", baseAcc.GetAddress(), initCoins) 63 }) 64 65 err = keeper.SendCoinsFromModuleToAccount(ctx, holderAcc.GetName(), baseAcc.GetAddress(), initCoins.Add(initCoins...)) 66 require.Error(t, err) 67 68 err = keeper.SendCoinsFromModuleToModule(ctx, holderAcc.GetName(), types.Burner, initCoins) 69 require.NoError(t, err) 70 require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, holderAcc.GetName())) 71 require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, types.Burner)) 72 73 err = keeper.SendCoinsFromModuleToAccount(ctx, types.Burner, baseAcc.GetAddress(), initCoins) 74 require.NoError(t, err) 75 require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, types.Burner)) 76 77 require.Equal(t, initCoins, ak.GetAccount(ctx, baseAcc.GetAddress()).GetCoins()) 78 79 err = keeper.SendCoinsFromAccountToModule(ctx, baseAcc.GetAddress(), types.Burner, initCoins) 80 require.NoError(t, err) 81 require.Equal(t, sdk.Coins(nil), ak.GetAccount(ctx, baseAcc.GetAddress()).GetCoins()) 82 require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, types.Burner)) 83 } 84 85 func TestMintCoins(t *testing.T) { 86 app, ctx := createTestApp(false) 87 keeper := app.SupplyKeeper 88 ak := app.AccountKeeper 89 90 keeper.SetModuleAccount(ctx, burnerAcc) 91 keeper.SetModuleAccount(ctx, minterAcc) 92 keeper.SetModuleAccount(ctx, multiPermAcc) 93 keeper.SetModuleAccount(ctx, randomPermAcc) 94 95 initialSupply := keeper.GetSupply(ctx) 96 97 require.Panics(t, func() { keeper.MintCoins(ctx, "", initCoins) }, "no module account") 98 require.Panics(t, func() { keeper.MintCoins(ctx, types.Burner, initCoins) }, "invalid permission") 99 err := keeper.MintCoins(ctx, types.Minter, sdk.Coins{sdk.Coin{Denom: "denom", Amount: sdk.NewDec(-10)}}) 100 require.Error(t, err, "insufficient coins") 101 102 require.Panics(t, func() { keeper.MintCoins(ctx, randomPerm, initCoins) }) 103 104 err = keeper.MintCoins(ctx, types.Minter, initCoins) 105 require.NoError(t, err) 106 require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, types.Minter)) 107 require.Equal(t, initialSupply.GetTotal().Add(initCoins...), keeper.GetSupply(ctx).GetTotal()) 108 109 // test same functionality on module account with multiple permissions 110 initialSupply = keeper.GetSupply(ctx) 111 112 err = keeper.MintCoins(ctx, multiPermAcc.GetName(), initCoins) 113 require.NoError(t, err) 114 require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, multiPermAcc.GetName())) 115 require.Equal(t, initialSupply.GetTotal().Add(initCoins...), keeper.GetSupply(ctx).GetTotal()) 116 117 require.Panics(t, func() { keeper.MintCoins(ctx, types.Burner, initCoins) }) 118 } 119 120 func TestBurnCoins(t *testing.T) { 121 app, ctx := createTestApp(false) 122 keeper := app.SupplyKeeper 123 ak := app.AccountKeeper 124 125 require.NoError(t, burnerAcc.SetCoins(initCoins)) 126 keeper.SetSupply(ctx, types.NewSupply(initCoins)) 127 keeper.SetModuleAccount(ctx, burnerAcc) 128 129 initialSupply := keeper.GetSupply(ctx) 130 initialSupply = initialSupply.Inflate(initCoins) 131 keeper.SetSupply(ctx, initialSupply) 132 133 require.Panics(t, func() { keeper.BurnCoins(ctx, "", initCoins) }, "no module account") 134 require.Panics(t, func() { keeper.BurnCoins(ctx, types.Minter, initCoins) }, "invalid permission") 135 require.Panics(t, func() { keeper.BurnCoins(ctx, randomPerm, initialSupply.GetTotal()) }, "random permission") 136 err := keeper.BurnCoins(ctx, types.Burner, initialSupply.GetTotal()) 137 require.Error(t, err, "insufficient coins") 138 139 err = keeper.BurnCoins(ctx, types.Burner, initCoins) 140 require.NoError(t, err) 141 require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, types.Burner)) 142 require.Equal(t, initialSupply.GetTotal().Sub(initCoins), keeper.GetSupply(ctx).GetTotal()) 143 144 // test same functionality on module account with multiple permissions 145 initialSupply = keeper.GetSupply(ctx) 146 initialSupply = initialSupply.Inflate(initCoins) 147 keeper.SetSupply(ctx, initialSupply) 148 149 require.NoError(t, multiPermAcc.SetCoins(initCoins)) 150 keeper.SetModuleAccount(ctx, multiPermAcc) 151 152 err = keeper.BurnCoins(ctx, multiPermAcc.GetName(), initCoins) 153 require.NoError(t, err) 154 require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, multiPermAcc.GetName())) 155 require.Equal(t, initialSupply.GetTotal().Sub(initCoins), keeper.GetSupply(ctx).GetTotal()) 156 } 157 158 func TestKeeper_SendCoinsFromModuleToAccountBlackList(t *testing.T) { 159 app, ctx := createTestApp(false) 160 keeper := app.SupplyKeeper 161 162 err := keeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, types.NewModuleAddress(types.ModuleName), initCoins) 163 require.Error(t, err) 164 } 165 166 func Test_SendCoinsAdapter(t *testing.T) { 167 app, ctx := createTestApp(false) 168 keeper := app.SupplyKeeper 169 ak := app.AccountKeeper 170 from := ak.NewAccountWithAddress(ctx, types.NewModuleAddress("baseAcc")) 171 172 to := ak.NewAccountWithAddress(ctx, types.NewModuleAddress("baseAcc1")) 173 transferAmount, ok := sdk.NewIntFromString("0") 174 require.Equal(t, ok, true) 175 transferAmountDec := sdk.NewDecFromIntWithPrec(transferAmount, sdk.Precision) 176 token := sdk.NewCoin(sdk.DefaultBondDenom, transferAmountDec) 177 sk := supply.NewSupplyKeeperAdapter(keeper) 178 err := sk.SendCoins(ctx, from.GetAddress(), to.GetAddress(), token.ToCoins()) 179 require.NoError(t, err) 180 }