Swap to panic/recover version

This commit is contained in:
Christopher Goes 2018-05-08 17:34:09 +02:00
parent af379b6cf6
commit 1f8ef62d28
No known key found for this signature in database
GPG Key ID: E828D98232D328D3
3 changed files with 74 additions and 159 deletions

View File

@ -5,12 +5,15 @@ import ()
// Gas measured by the SDK
type Gas = int64
// Error thrown when out of gas
type ErrorOutOfGas struct {
Descriptor string
}
// GasMeter interface to track gas consumption
type GasMeter interface {
GasExceeded() bool
GasConsumed() Gas
ConsumeGas(amount Gas)
ConsumeGasOrFail(amount Gas) bool
ConsumeGas(amount Gas, descriptor string)
}
type basicGasMeter struct {
@ -25,19 +28,13 @@ func NewGasMeter(limit Gas) GasMeter {
}
}
func (g *basicGasMeter) GasExceeded() bool {
return g.consumed > g.limit
}
func (g *basicGasMeter) GasConsumed() Gas {
return g.consumed
}
func (g *basicGasMeter) ConsumeGas(amount Gas) {
func (g *basicGasMeter) ConsumeGas(amount Gas, descriptor string) {
g.consumed += amount
}
func (g *basicGasMeter) ConsumeGasOrFail(amount Gas) bool {
g.ConsumeGas(amount)
return g.GasExceeded()
if g.consumed > g.limit {
panic(ErrorOutOfGas{descriptor})
}
}

View File

@ -17,7 +17,7 @@ func NewKeeper(am sdk.AccountMapper) Keeper {
}
// GetCoins returns the coins at the addr.
func (keeper Keeper) GetCoins(ctx sdk.Context, addr sdk.Address) (sdk.Coins, sdk.Error) {
func (keeper Keeper) GetCoins(ctx sdk.Context, addr sdk.Address) sdk.Coins {
return getCoins(ctx, keeper.am, addr)
}
@ -27,7 +27,7 @@ func (keeper Keeper) SetCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coins)
}
// HasCoins returns whether or not an account has at least amt coins.
func (keeper Keeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coins) (bool, sdk.Error) {
func (keeper Keeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coins) bool {
return hasCoins(ctx, keeper.am, addr, amt)
}
@ -64,12 +64,12 @@ func NewSendKeeper(am sdk.AccountMapper) SendKeeper {
}
// GetCoins returns the coins at the addr.
func (keeper SendKeeper) GetCoins(ctx sdk.Context, addr sdk.Address) (sdk.Coins, sdk.Error) {
func (keeper SendKeeper) GetCoins(ctx sdk.Context, addr sdk.Address) sdk.Coins {
return getCoins(ctx, keeper.am, addr)
}
// HasCoins returns whether or not an account has at least amt coins.
func (keeper SendKeeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coins) (bool, sdk.Error) {
func (keeper SendKeeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coins) bool {
return hasCoins(ctx, keeper.am, addr, amt)
}
@ -96,32 +96,28 @@ func NewViewKeeper(am sdk.AccountMapper) ViewKeeper {
}
// GetCoins returns the coins at the addr.
func (keeper ViewKeeper) GetCoins(ctx sdk.Context, addr sdk.Address) (sdk.Coins, sdk.Error) {
func (keeper ViewKeeper) GetCoins(ctx sdk.Context, addr sdk.Address) sdk.Coins {
return getCoins(ctx, keeper.am, addr)
}
// HasCoins returns whether or not an account has at least amt coins.
func (keeper ViewKeeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coins) (bool, sdk.Error) {
func (keeper ViewKeeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coins) bool {
return hasCoins(ctx, keeper.am, addr, amt)
}
//______________________________________________________________________________________________
func getCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address) (sdk.Coins, sdk.Error) {
if ctx.GasMeter().ConsumeGasOrFail(10) {
return sdk.Coins{}, sdk.ErrOutOfGas("out of gas in getCoins")
}
func getCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address) sdk.Coins {
ctx.GasMeter().ConsumeGas(10, "getCoins")
acc := am.GetAccount(ctx, addr)
if acc == nil {
return sdk.Coins{}, nil
return sdk.Coins{}
}
return acc.GetCoins(), nil
return acc.GetCoins()
}
func setCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) sdk.Error {
if ctx.GasMeter().ConsumeGasOrFail(100) {
return sdk.ErrOutOfGas("out of gas in setCoins")
}
ctx.GasMeter().ConsumeGas(100, "setCoins")
acc := am.GetAccount(ctx, addr)
if acc == nil {
acc = am.NewAccountWithAddress(ctx, addr)
@ -132,19 +128,14 @@ func setCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.C
}
// HasCoins returns whether or not an account has at least amt coins.
func hasCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) (bool, sdk.Error) {
if ctx.GasMeter().ConsumeGasOrFail(10) {
return false, sdk.ErrOutOfGas("out of gas in hasCoins")
}
coins, err := getCoins(ctx, am, addr)
if err != nil {
return false, err
}
return coins.IsGTE(amt), nil
func hasCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) bool {
ctx.GasMeter().ConsumeGas(10, "hasCoins")
return getCoins(ctx, am, addr).IsGTE(amt)
}
// SubtractCoins subtracts amt from the coins at the addr.
func subtractCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) {
ctx.GasMeter().ConsumeGas(10, "subtractCoins")
oldCoins := getCoins(ctx, am, addr)
newCoins := oldCoins.Minus(amt)
if !newCoins.IsNotNegative() {
@ -157,6 +148,7 @@ func subtractCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt
// AddCoins adds amt to the coins at the addr.
func addCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) {
ctx.GasMeter().ConsumeGas(10, "addCoins")
oldCoins := getCoins(ctx, am, addr)
newCoins := oldCoins.Plus(amt)
if !newCoins.IsNotNegative() {

View File

@ -42,79 +42,58 @@ func TestKeeper(t *testing.T) {
// Test GetCoins/SetCoins
accountMapper.SetAccount(ctx, acc)
coins, err := coinKeeper.GetCoins(ctx, addr)
assert.Nil(t, err)
assert.True(t, coins.IsEqual(sdk.Coins{}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{}))
coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 10}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}}))
// Test HasCoins
foo, _ := coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
assert.True(t, foo)
foo, _ = coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})
assert.True(t, foo)
foo, _ = coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})
assert.False(t, foo)
bar, _ := coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})
assert.False(t, bar)
assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}))
assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}}))
assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}}))
assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}}))
// Test AddCoins
coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 25}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 25}}))
coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 15}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 15}, {"foocoin", 25}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 15}, {"foocoin", 25}}))
// Test SubtractCoins
coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}}))
_, err = coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 11}})
_, err := coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 11}})
assert.Implements(t, (*sdk.Error)(nil), err)
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}}))
coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 10}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 15}}))
bar, _ = coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 1}})
assert.False(t, bar)
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 15}}))
assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 1}}))
// Test SendCoins
coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 5}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 10}}))
coins, err = coinKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 5}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}}))
_, err2 := coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 50}})
assert.Implements(t, (*sdk.Error)(nil), err2)
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 10}}))
coins, err = coinKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 5}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}}))
coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 30}})
coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"barcoin", 10}, {"foocoin", 5}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}}))
coins, err = coinKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}}))
// Test InputOutputCoins
input1 := NewInput(addr2, sdk.Coins{{"foocoin", 2}})
output1 := NewOutput(addr, sdk.Coins{{"foocoin", 2}})
coinKeeper.InputOutputCoins(ctx, []Input{input1}, []Output{output1})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}}))
coins, err = coinKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}}))
inputs := []Input{
NewInput(addr, sdk.Coins{{"foocoin", 3}}),
@ -126,40 +105,12 @@ func TestKeeper(t *testing.T) {
NewOutput(addr3, sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}),
}
coinKeeper.InputOutputCoins(ctx, inputs, outputs)
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}}))
coins, err = coinKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}}))
coins, err = coinKeeper.GetCoins(ctx, addr3)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}}))
assert.True(t, coinKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}))
}
func TestKeeperGas(t *testing.T) {
ms, authKey := setupMultiStore()
cdc := wire.NewCodec()
auth.RegisterBaseAccount(cdc)
ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), 10)
accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{})
coinKeeper := NewKeeper(accountMapper)
addr := sdk.Address([]byte("addr1"))
acc := accountMapper.NewAccountWithAddress(ctx, addr)
// Test GetCoins/SetCoins
accountMapper.SetAccount(ctx, acc)
coins, err := coinKeeper.GetCoins(ctx, addr)
assert.Nil(t, err)
assert.True(t, coins.IsEqual(sdk.Coins{}))
coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
coins, err = coinKeeper.GetCoins(ctx, addr)
assert.NotNil(t, err)
assert.True(t, coins.IsEqual(sdk.Coins{}))
}
func TestSendKeeper(t *testing.T) {
ms, authKey := setupMultiStore()
@ -178,55 +129,40 @@ func TestSendKeeper(t *testing.T) {
// Test GetCoins/SetCoins
accountMapper.SetAccount(ctx, acc)
coins, err := sendKeeper.GetCoins(ctx, addr)
assert.Nil(t, err)
assert.True(t, coins.IsEqual(sdk.Coins{}))
assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{}))
coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
coins, err = sendKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 10}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}}))
// Test HasCoins
foo, _ := sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
assert.True(t, foo)
foo, _ = sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})
assert.True(t, foo)
foo, _ = sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})
assert.False(t, foo)
bar, _ := sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})
assert.False(t, bar)
assert.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}))
assert.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}}))
assert.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}}))
assert.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}}))
coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})
// Test SendCoins
sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 5}})
coins, err = sendKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 10}}))
coins, err = sendKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 5}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}}))
_, err2 := sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 50}})
assert.Implements(t, (*sdk.Error)(nil), err2)
coins, err = sendKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 10}}))
coins, err = sendKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 5}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}}))
coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 30}})
sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"barcoin", 10}, {"foocoin", 5}})
coins, err = sendKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}}))
coins, err = sendKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}}))
// Test InputOutputCoins
input1 := NewInput(addr2, sdk.Coins{{"foocoin", 2}})
output1 := NewOutput(addr, sdk.Coins{{"foocoin", 2}})
sendKeeper.InputOutputCoins(ctx, []Input{input1}, []Output{output1})
coins, err = sendKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}}))
coins, err = sendKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}}))
inputs := []Input{
NewInput(addr, sdk.Coins{{"foocoin", 3}}),
@ -238,12 +174,9 @@ func TestSendKeeper(t *testing.T) {
NewOutput(addr3, sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}),
}
sendKeeper.InputOutputCoins(ctx, inputs, outputs)
coins, err = sendKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}}))
coins, err = sendKeeper.GetCoins(ctx, addr2)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}}))
coins, err = sendKeeper.GetCoins(ctx, addr3)
assert.True(t, coins.IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}}))
assert.True(t, sendKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}))
}
@ -253,7 +186,7 @@ func TestViewKeeper(t *testing.T) {
cdc := wire.NewCodec()
auth.RegisterBaseAccount(cdc)
ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), 100000)
ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), 10000)
accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{})
coinKeeper := NewKeeper(accountMapper)
viewKeeper := NewViewKeeper(accountMapper)
@ -263,21 +196,14 @@ func TestViewKeeper(t *testing.T) {
// Test GetCoins/SetCoins
accountMapper.SetAccount(ctx, acc)
coins, err := viewKeeper.GetCoins(ctx, addr)
assert.Nil(t, err)
assert.True(t, coins.IsEqual(sdk.Coins{}))
assert.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{}))
coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
coins, err = viewKeeper.GetCoins(ctx, addr)
assert.True(t, coins.IsEqual(sdk.Coins{{"foocoin", 10}}))
assert.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}}))
// Test HasCoins
foo, _ := viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})
assert.True(t, foo)
foo, _ = viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})
assert.True(t, foo)
foo, _ = viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})
assert.False(t, foo)
bar, _ := viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})
assert.False(t, bar)
assert.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}))
assert.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}}))
assert.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}}))
assert.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}}))
}