Merge PR #3403: Implement parameter-controlled bank/send switch-off

This commit is contained in:
Alessio Treglia 2019-01-28 19:06:48 -08:00 committed by Christopher Goes
parent 6de39e19f3
commit f16cc31919
25 changed files with 191 additions and 34 deletions

View File

@ -15,7 +15,7 @@ GOTOOLS = \
github.com/rakyll/statik github.com/rakyll/statik
GOBIN ?= $(GOPATH)/bin GOBIN ?= $(GOPATH)/bin
all: devtools install test_lint test all: devtools vendor-deps install test_lint test
# The below include contains the tools target. # The below include contains the tools target.
include scripts/Makefile include scripts/Makefile

View File

@ -102,7 +102,11 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b
) )
// add handlers // add handlers
app.bankKeeper = bank.NewBaseKeeper(app.accountKeeper) app.bankKeeper = bank.NewBaseKeeper(
app.accountKeeper,
app.paramsKeeper.Subspace(bank.DefaultParamspace),
bank.DefaultCodespace,
)
app.feeCollectionKeeper = auth.NewFeeCollectionKeeper( app.feeCollectionKeeper = auth.NewFeeCollectionKeeper(
app.cdc, app.cdc,
app.keyFeeCollection, app.keyFeeCollection,
@ -248,6 +252,7 @@ func (app *GaiaApp) initFromGenesisState(ctx sdk.Context, genesisState GenesisSt
// initialize module-specific stores // initialize module-specific stores
auth.InitGenesis(ctx, app.accountKeeper, app.feeCollectionKeeper, genesisState.AuthData) auth.InitGenesis(ctx, app.accountKeeper, app.feeCollectionKeeper, genesisState.AuthData)
bank.InitGenesis(ctx, app.bankKeeper, genesisState.BankData)
slashing.InitGenesis(ctx, app.slashingKeeper, genesisState.SlashingData, genesisState.StakingData) slashing.InitGenesis(ctx, app.slashingKeeper, genesisState.SlashingData, genesisState.StakingData)
gov.InitGenesis(ctx, app.govKeeper, genesisState.GovData) gov.InitGenesis(ctx, app.govKeeper, genesisState.GovData)
mint.InitGenesis(ctx, app.mintKeeper, genesisState.MintData) mint.InitGenesis(ctx, app.mintKeeper, genesisState.MintData)

View File

@ -4,6 +4,8 @@ import (
"os" "os"
"testing" "testing"
"github.com/cosmos/cosmos-sdk/x/bank"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/db"
"github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/log"
@ -28,6 +30,7 @@ func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error {
genesisState := NewGenesisState( genesisState := NewGenesisState(
genaccs, genaccs,
auth.DefaultGenesisState(), auth.DefaultGenesisState(),
bank.DefaultGenesisState(),
staking.DefaultGenesisState(), staking.DefaultGenesisState(),
mint.DefaultGenesisState(), mint.DefaultGenesisState(),
distr.DefaultGenesisState(), distr.DefaultGenesisState(),

View File

@ -9,6 +9,7 @@ import (
"github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/bank"
distr "github.com/cosmos/cosmos-sdk/x/distribution" distr "github.com/cosmos/cosmos-sdk/x/distribution"
"github.com/cosmos/cosmos-sdk/x/gov" "github.com/cosmos/cosmos-sdk/x/gov"
"github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/mint"
@ -39,6 +40,7 @@ func (app *GaiaApp) ExportAppStateAndValidators(forZeroHeight bool) (
genState := NewGenesisState( genState := NewGenesisState(
accounts, accounts,
auth.ExportGenesis(ctx, app.accountKeeper, app.feeCollectionKeeper), auth.ExportGenesis(ctx, app.accountKeeper, app.feeCollectionKeeper),
bank.ExportGenesis(ctx, app.bankKeeper),
staking.ExportGenesis(ctx, app.stakingKeeper), staking.ExportGenesis(ctx, app.stakingKeeper),
mint.ExportGenesis(ctx, app.mintKeeper), mint.ExportGenesis(ctx, app.mintKeeper),
distr.ExportGenesis(ctx, app.distrKeeper), distr.ExportGenesis(ctx, app.distrKeeper),

View File

@ -10,6 +10,8 @@ import (
"sort" "sort"
"strings" "strings"
"github.com/cosmos/cosmos-sdk/x/bank"
tmtypes "github.com/tendermint/tendermint/types" tmtypes "github.com/tendermint/tendermint/types"
"github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec"
@ -34,6 +36,7 @@ var (
type GenesisState struct { type GenesisState struct {
Accounts []GenesisAccount `json:"accounts"` Accounts []GenesisAccount `json:"accounts"`
AuthData auth.GenesisState `json:"auth"` AuthData auth.GenesisState `json:"auth"`
BankData bank.GenesisState `json:"bank"`
StakingData staking.GenesisState `json:"staking"` StakingData staking.GenesisState `json:"staking"`
MintData mint.GenesisState `json:"mint"` MintData mint.GenesisState `json:"mint"`
DistrData distr.GenesisState `json:"distr"` DistrData distr.GenesisState `json:"distr"`
@ -43,6 +46,7 @@ type GenesisState struct {
} }
func NewGenesisState(accounts []GenesisAccount, authData auth.GenesisState, func NewGenesisState(accounts []GenesisAccount, authData auth.GenesisState,
bankData bank.GenesisState,
stakingData staking.GenesisState, mintData mint.GenesisState, stakingData staking.GenesisState, mintData mint.GenesisState,
distrData distr.GenesisState, govData gov.GenesisState, distrData distr.GenesisState, govData gov.GenesisState,
slashingData slashing.GenesisState) GenesisState { slashingData slashing.GenesisState) GenesisState {
@ -50,6 +54,7 @@ func NewGenesisState(accounts []GenesisAccount, authData auth.GenesisState,
return GenesisState{ return GenesisState{
Accounts: accounts, Accounts: accounts,
AuthData: authData, AuthData: authData,
BankData: bankData,
StakingData: stakingData, StakingData: stakingData,
MintData: mintData, MintData: mintData,
DistrData: distrData, DistrData: distrData,
@ -201,6 +206,7 @@ func NewDefaultGenesisState() GenesisState {
return GenesisState{ return GenesisState{
Accounts: nil, Accounts: nil,
AuthData: auth.DefaultGenesisState(), AuthData: auth.DefaultGenesisState(),
BankData: bank.DefaultGenesisState(),
StakingData: staking.DefaultGenesisState(), StakingData: staking.DefaultGenesisState(),
MintData: mint.DefaultGenesisState(), MintData: mint.DefaultGenesisState(),
DistrData: distr.DefaultGenesisState(), DistrData: distr.DefaultGenesisState(),
@ -227,6 +233,9 @@ func GaiaValidateGenesisState(genesisState GenesisState) error {
if err := auth.ValidateGenesis(genesisState.AuthData); err != nil { if err := auth.ValidateGenesis(genesisState.AuthData); err != nil {
return err return err
} }
if err := bank.ValidateGenesis(genesisState.BankData); err != nil {
return err
}
if err := staking.ValidateGenesis(genesisState.StakingData); err != nil { if err := staking.ValidateGenesis(genesisState.StakingData); err != nil {
return err return err
} }

View File

@ -20,6 +20,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth"
authsim "github.com/cosmos/cosmos-sdk/x/auth/simulation" authsim "github.com/cosmos/cosmos-sdk/x/auth/simulation"
"github.com/cosmos/cosmos-sdk/x/bank"
banksim "github.com/cosmos/cosmos-sdk/x/bank/simulation" banksim "github.com/cosmos/cosmos-sdk/x/bank/simulation"
distr "github.com/cosmos/cosmos-sdk/x/distribution" distr "github.com/cosmos/cosmos-sdk/x/distribution"
distrsim "github.com/cosmos/cosmos-sdk/x/distribution/simulation" distrsim "github.com/cosmos/cosmos-sdk/x/distribution/simulation"
@ -118,6 +119,9 @@ func appStateFn(r *rand.Rand, accs []simulation.Account, genesisTimestamp time.T
} }
fmt.Printf("Selected randomly generated auth parameters:\n\t%+v\n", authGenesis) fmt.Printf("Selected randomly generated auth parameters:\n\t%+v\n", authGenesis)
bankGenesis := bank.NewGenesisState(r.Int63n(2) == 0)
fmt.Printf("Selected randomly generated bank parameters:\n\t%+v\n", bankGenesis)
// Random genesis states // Random genesis states
vp := time.Duration(r.Intn(2*172800)) * time.Second vp := time.Duration(r.Intn(2*172800)) * time.Second
govGenesis := gov.GenesisState{ govGenesis := gov.GenesisState{
@ -203,6 +207,7 @@ func appStateFn(r *rand.Rand, accs []simulation.Account, genesisTimestamp time.T
genesis := GenesisState{ genesis := GenesisState{
Accounts: genesisAccounts, Accounts: genesisAccounts,
AuthData: authGenesis, AuthData: authGenesis,
BankData: bankGenesis,
StakingData: stakingGenesis, StakingData: stakingGenesis,
MintData: mintGenesis, MintData: mintGenesis,
DistrData: distrGenesis, DistrData: distrGenesis,

View File

@ -178,7 +178,7 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, baseAppOptions ...func(*bam.BaseAp
) )
// add handlers // add handlers
app.bankKeeper = bank.NewBaseKeeper(app.accountKeeper) app.bankKeeper = bank.NewBaseKeeper(app.accountKeeper, app.paramsKeeper.Subspace(bank.DefaultParamspace), bank.DefaultCodespace)
app.stakingKeeper = staking.NewKeeper(app.cdc, app.keyStaking, app.tkeyStaking, app.bankKeeper, app.paramsKeeper.Subspace(staking.DefaultParamspace), staking.DefaultCodespace) app.stakingKeeper = staking.NewKeeper(app.cdc, app.keyStaking, app.tkeyStaking, app.bankKeeper, app.paramsKeeper.Subspace(staking.DefaultParamspace), staking.DefaultCodespace)
app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, app.stakingKeeper, app.paramsKeeper.Subspace(slashing.DefaultParamspace), slashing.DefaultCodespace) app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, app.stakingKeeper, app.paramsKeeper.Subspace(slashing.DefaultParamspace), slashing.DefaultCodespace)

View File

@ -91,6 +91,17 @@ func getMockApp(t *testing.T) *mock.App {
return mapp return mapp
} }
// overwrite the mock init chainer
func getInitChainer(mapp *mock.App, keeper BaseKeeper) sdk.InitChainer {
return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
mapp.InitChainer(ctx, req)
bankGenesis := DefaultGenesisState()
InitGenesis(ctx, keeper, bankGenesis)
return abci.ResponseInitChain{}
}
}
func TestMsgSendWithAccounts(t *testing.T) { func TestMsgSendWithAccounts(t *testing.T) {
mapp := getMockApp(t) mapp := getMockApp(t)
acc := &auth.BaseAccount{ acc := &auth.BaseAccount{

View File

@ -16,8 +16,13 @@ func getBenchmarkMockApp() (*mock.App, error) {
mapp := mock.NewApp() mapp := mock.NewApp()
RegisterCodec(mapp.Cdc) RegisterCodec(mapp.Cdc)
bankKeeper := NewBaseKeeper(mapp.AccountKeeper) bankKeeper := NewBaseKeeper(
mapp.AccountKeeper,
mapp.ParamsKeeper.Subspace(DefaultParamspace),
DefaultCodespace,
)
mapp.Router().AddRoute("bank", NewHandler(bankKeeper)) mapp.Router().AddRoute("bank", NewHandler(bankKeeper))
mapp.SetInitChainer(getInitChainer(mapp, bankKeeper))
err := mapp.CompleteSetup() err := mapp.CompleteSetup()
return mapp, err return mapp, err

View File

@ -11,6 +11,7 @@ const (
CodeInvalidInput sdk.CodeType = 101 CodeInvalidInput sdk.CodeType = 101
CodeInvalidOutput sdk.CodeType = 102 CodeInvalidOutput sdk.CodeType = 102
CodeSendDisabled sdk.CodeType = 103
) )
// NOTE: Don't stringer this, we'll put better messages in later. // NOTE: Don't stringer this, we'll put better messages in later.
@ -44,6 +45,10 @@ func ErrNoOutputs(codespace sdk.CodespaceType) sdk.Error {
return newError(codespace, CodeInvalidOutput, "") return newError(codespace, CodeInvalidOutput, "")
} }
func ErrSendDisabled(codespace sdk.CodespaceType) sdk.Error {
return newError(codespace, CodeSendDisabled, "")
}
//---------------------------------------- //----------------------------------------
func msgOrDefaultMsg(msg string, code sdk.CodeType) string { func msgOrDefaultMsg(msg string, code sdk.CodeType) string {

32
x/bank/genesis.go Normal file
View File

@ -0,0 +1,32 @@
package bank
import (
sdk "github.com/cosmos/cosmos-sdk/types"
)
// GenesisState is the bank state that must be provided at genesis.
type GenesisState struct {
SendEnabled bool `json:"send_enabled"`
}
// NewGenesisState creates a new genesis state.
func NewGenesisState(sendEnabled bool) GenesisState {
return GenesisState{SendEnabled: sendEnabled}
}
// Return a default genesis state
func DefaultGenesisState() GenesisState { return NewGenesisState(true) }
// InitGenesis sets distribution information for genesis.
func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) {
keeper.SetSendEnabled(ctx, data.SendEnabled)
}
// ExportGenesis returns a GenesisState for a given context and keeper.
func ExportGenesis(ctx sdk.Context, keeper Keeper) GenesisState {
return NewGenesisState(keeper.GetSendEnabled(ctx))
}
// ValidateGenesis performs basic validation of bank genesis data returning an
// error for any failed validation criteria.
func ValidateGenesis(data GenesisState) error { return nil }

View File

@ -20,6 +20,9 @@ func NewHandler(k Keeper) sdk.Handler {
// Handle MsgSend. // Handle MsgSend.
func handleMsgSend(ctx sdk.Context, k Keeper, msg MsgSend) sdk.Result { func handleMsgSend(ctx sdk.Context, k Keeper, msg MsgSend) sdk.Result {
// NOTE: totalIn == totalOut should already have been checked // NOTE: totalIn == totalOut should already have been checked
if !k.GetSendEnabled(ctx) {
return ErrSendDisabled(k.Codespace()).Result()
}
tags, err := k.InputOutputCoins(ctx, msg.Inputs, msg.Outputs) tags, err := k.InputOutputCoins(ctx, msg.Inputs, msg.Outputs)
if err != nil { if err != nil {
return err.Result() return err.Result()

View File

@ -6,6 +6,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/params"
) )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -32,14 +33,20 @@ type Keeper interface {
type BaseKeeper struct { type BaseKeeper struct {
BaseSendKeeper BaseSendKeeper
ak auth.AccountKeeper ak auth.AccountKeeper
paramSpace params.Subspace
} }
// NewBaseKeeper returns a new BaseKeeper // NewBaseKeeper returns a new BaseKeeper
func NewBaseKeeper(ak auth.AccountKeeper) BaseKeeper { func NewBaseKeeper(ak auth.AccountKeeper,
paramSpace params.Subspace,
codespace sdk.CodespaceType) BaseKeeper {
ps := paramSpace.WithTypeTable(ParamTypeTable())
return BaseKeeper{ return BaseKeeper{
BaseSendKeeper: NewBaseSendKeeper(ak), BaseSendKeeper: NewBaseSendKeeper(ak, ps, codespace),
ak: ak, ak: ak,
paramSpace: ps,
} }
} }
@ -95,6 +102,9 @@ type SendKeeper interface {
ViewKeeper ViewKeeper
SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) (sdk.Tags, sdk.Error)
GetSendEnabled(ctx sdk.Context) bool
SetSendEnabled(ctx sdk.Context, enabled bool)
} }
var _ SendKeeper = (*BaseSendKeeper)(nil) var _ SendKeeper = (*BaseSendKeeper)(nil)
@ -104,14 +114,18 @@ var _ SendKeeper = (*BaseSendKeeper)(nil)
type BaseSendKeeper struct { type BaseSendKeeper struct {
BaseViewKeeper BaseViewKeeper
ak auth.AccountKeeper ak auth.AccountKeeper
paramSpace params.Subspace
} }
// NewBaseSendKeeper returns a new BaseSendKeeper. // NewBaseSendKeeper returns a new BaseSendKeeper.
func NewBaseSendKeeper(ak auth.AccountKeeper) BaseSendKeeper { func NewBaseSendKeeper(ak auth.AccountKeeper,
paramSpace params.Subspace, codespace sdk.CodespaceType) BaseSendKeeper {
return BaseSendKeeper{ return BaseSendKeeper{
BaseViewKeeper: NewBaseViewKeeper(ak), BaseViewKeeper: NewBaseViewKeeper(ak, codespace),
ak: ak, ak: ak,
paramSpace: paramSpace,
} }
} }
@ -119,10 +133,22 @@ func NewBaseSendKeeper(ak auth.AccountKeeper) BaseSendKeeper {
func (keeper BaseSendKeeper) SendCoins( func (keeper BaseSendKeeper) SendCoins(
ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins, ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins,
) (sdk.Tags, sdk.Error) { ) (sdk.Tags, sdk.Error) {
return sendCoins(ctx, keeper.ak, fromAddr, toAddr, amt) return sendCoins(ctx, keeper.ak, fromAddr, toAddr, amt)
} }
// GetSendEnabled returns the current SendEnabled
// nolint: errcheck
func (keeper BaseSendKeeper) GetSendEnabled(ctx sdk.Context) bool {
var enabled bool
keeper.paramSpace.Get(ctx, ParamStoreKeySendEnabled, &enabled)
return enabled
}
// nolint: errcheck
func (keeper BaseSendKeeper) SetSendEnabled(ctx sdk.Context, enabled bool) {
keeper.paramSpace.Set(ctx, ParamStoreKeySendEnabled, &enabled)
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// View Keeper // View Keeper
@ -133,18 +159,19 @@ var _ ViewKeeper = (*BaseViewKeeper)(nil)
type ViewKeeper interface { type ViewKeeper interface {
GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) bool HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) bool
Codespace() sdk.CodespaceType
} }
// BaseViewKeeper implements a read only keeper implementation of ViewKeeper. // BaseViewKeeper implements a read only keeper implementation of ViewKeeper.
type BaseViewKeeper struct { type BaseViewKeeper struct {
ak auth.AccountKeeper ak auth.AccountKeeper
codespace sdk.CodespaceType
} }
// NewBaseViewKeeper returns a new BaseViewKeeper. // NewBaseViewKeeper returns a new BaseViewKeeper.
func NewBaseViewKeeper(ak auth.AccountKeeper) BaseViewKeeper { func NewBaseViewKeeper(ak auth.AccountKeeper, codespace sdk.CodespaceType) BaseViewKeeper {
return BaseViewKeeper{ return BaseViewKeeper{ak: ak, codespace: codespace}
ak: ak,
}
} }
// GetCoins returns the coins at the addr. // GetCoins returns the coins at the addr.
@ -157,6 +184,11 @@ func (keeper BaseViewKeeper) HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt
return hasCoins(ctx, keeper.ak, addr, amt) return hasCoins(ctx, keeper.ak, addr, amt)
} }
// Codespace returns the keeper's codespace.
func (keeper BaseViewKeeper) Codespace() sdk.CodespaceType {
return keeper.codespace
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Auxiliary // Auxiliary

View File

@ -21,6 +21,7 @@ type testInput struct {
cdc *codec.Codec cdc *codec.Codec
ctx sdk.Context ctx sdk.Context
ak auth.AccountKeeper ak auth.AccountKeeper
pk params.Keeper
} }
func setupTestInput() testInput { func setupTestInput() testInput {
@ -49,13 +50,14 @@ func setupTestInput() testInput {
ak.SetParams(ctx, auth.DefaultParams()) ak.SetParams(ctx, auth.DefaultParams())
return testInput{cdc: cdc, ctx: ctx, ak: ak} return testInput{cdc: cdc, ctx: ctx, ak: ak, pk: pk}
} }
func TestKeeper(t *testing.T) { func TestKeeper(t *testing.T) {
input := setupTestInput() input := setupTestInput()
ctx := input.ctx ctx := input.ctx
bankKeeper := NewBaseKeeper(input.ak) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace)
bankKeeper.SetSendEnabled(ctx, true)
addr := sdk.AccAddress([]byte("addr1")) addr := sdk.AccAddress([]byte("addr1"))
addr2 := sdk.AccAddress([]byte("addr2")) addr2 := sdk.AccAddress([]byte("addr2"))
@ -134,8 +136,10 @@ func TestKeeper(t *testing.T) {
func TestSendKeeper(t *testing.T) { func TestSendKeeper(t *testing.T) {
input := setupTestInput() input := setupTestInput()
ctx := input.ctx ctx := input.ctx
bankKeeper := NewBaseKeeper(input.ak) paramSpace := input.pk.Subspace(DefaultParamspace)
sendKeeper := NewBaseSendKeeper(input.ak) bankKeeper := NewBaseKeeper(input.ak, paramSpace, DefaultCodespace)
sendKeeper := NewBaseSendKeeper(input.ak, paramSpace, DefaultCodespace)
bankKeeper.SetSendEnabled(ctx, true)
addr := sdk.AccAddress([]byte("addr1")) addr := sdk.AccAddress([]byte("addr1"))
addr2 := sdk.AccAddress([]byte("addr2")) addr2 := sdk.AccAddress([]byte("addr2"))
@ -181,8 +185,10 @@ func TestSendKeeper(t *testing.T) {
func TestViewKeeper(t *testing.T) { func TestViewKeeper(t *testing.T) {
input := setupTestInput() input := setupTestInput()
ctx := input.ctx ctx := input.ctx
bankKeeper := NewBaseKeeper(input.ak) paramSpace := input.pk.Subspace(DefaultParamspace)
viewKeeper := NewBaseViewKeeper(input.ak) bankKeeper := NewBaseKeeper(input.ak, paramSpace, DefaultCodespace)
bankKeeper.SetSendEnabled(ctx, true)
viewKeeper := NewBaseViewKeeper(input.ak, DefaultCodespace)
addr := sdk.AccAddress([]byte("addr1")) addr := sdk.AccAddress([]byte("addr1"))
acc := input.ak.NewAccountWithAddress(ctx, addr) acc := input.ak.NewAccountWithAddress(ctx, addr)
@ -209,7 +215,8 @@ func TestVestingAccountSend(t *testing.T) {
origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)}
sendCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} sendCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)}
bankKeeper := NewBaseKeeper(input.ak) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace)
bankKeeper.SetSendEnabled(ctx, true)
addr1 := sdk.AccAddress([]byte("addr1")) addr1 := sdk.AccAddress([]byte("addr1"))
addr2 := sdk.AccAddress([]byte("addr2")) addr2 := sdk.AccAddress([]byte("addr2"))
@ -242,7 +249,8 @@ func TestVestingAccountReceive(t *testing.T) {
origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)}
sendCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} sendCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)}
bankKeeper := NewBaseKeeper(input.ak) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace)
bankKeeper.SetSendEnabled(ctx, true)
addr1 := sdk.AccAddress([]byte("addr1")) addr1 := sdk.AccAddress([]byte("addr1"))
addr2 := sdk.AccAddress([]byte("addr2")) addr2 := sdk.AccAddress([]byte("addr2"))
@ -275,7 +283,8 @@ func TestDelegateCoins(t *testing.T) {
origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)}
delCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} delCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)}
bankKeeper := NewBaseKeeper(input.ak) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace)
bankKeeper.SetSendEnabled(ctx, true)
addr1 := sdk.AccAddress([]byte("addr1")) addr1 := sdk.AccAddress([]byte("addr1"))
addr2 := sdk.AccAddress([]byte("addr2")) addr2 := sdk.AccAddress([]byte("addr2"))
@ -311,7 +320,8 @@ func TestUndelegateCoins(t *testing.T) {
origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)}
delCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} delCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)}
bankKeeper := NewBaseKeeper(input.ak) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace)
bankKeeper.SetSendEnabled(ctx, true)
addr1 := sdk.AccAddress([]byte("addr1")) addr1 := sdk.AccAddress([]byte("addr1"))
addr2 := sdk.AccAddress([]byte("addr2")) addr2 := sdk.AccAddress([]byte("addr2"))

22
x/bank/params.go Normal file
View File

@ -0,0 +1,22 @@
package bank
import (
"github.com/cosmos/cosmos-sdk/x/params"
)
const (
// default paramspace for params keeper
DefaultParamspace = "bank"
// default send enabled
DefaultSendEnabled = true
)
// ParamStoreKeySendEnabled is store's key for SendEnabled
var ParamStoreKeySendEnabled = []byte("sendenabled")
// type declaration for parameters
func ParamTypeTable() params.TypeTable {
return params.NewTypeTable(
ParamStoreKeySendEnabled, false,
)
}

View File

@ -112,6 +112,9 @@ func sendAndVerifyMsgSend(app *baseapp.BaseApp, mapper auth.AccountKeeper, msg b
if handler != nil { if handler != nil {
res := handler(ctx, msg) res := handler(ctx, msg)
if !res.IsOK() { if !res.IsOK() {
if res.Code == bank.CodeSendDisabled {
return nil
}
// TODO: Do this in a more 'canonical' way // TODO: Do this in a more 'canonical' way
return fmt.Errorf("handling msg failed %v", res) return fmt.Errorf("handling msg failed %v", res)
} }

View File

@ -110,7 +110,7 @@ func CreateTestInputAdvanced(t *testing.T, isCheckTx bool, initCoins int64,
ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, log.NewNopLogger()) ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, log.NewNopLogger())
accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, pk.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount) accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, pk.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount)
ck := bank.NewBaseKeeper(accountKeeper) ck := bank.NewBaseKeeper(accountKeeper, pk.Subspace(bank.DefaultParamspace), bank.DefaultCodespace)
sk := staking.NewKeeper(cdc, keyStaking, tkeyStaking, ck, pk.Subspace(staking.DefaultParamspace), staking.DefaultCodespace) sk := staking.NewKeeper(cdc, keyStaking, tkeyStaking, ck, pk.Subspace(staking.DefaultParamspace), staking.DefaultCodespace)
sk.SetPool(ctx, staking.InitialPool()) sk.SetPool(ctx, staking.InitialPool())
sk.SetParams(ctx, staking.DefaultParams()) sk.SetParams(ctx, staking.DefaultParams())

View File

@ -16,6 +16,7 @@ func TestTickExpiredDepositPeriod(t *testing.T) {
mapp, keeper, _, addrs, _, _ := getMockApp(t, 10, GenesisState{}, nil) mapp, keeper, _, addrs, _, _ := getMockApp(t, 10, GenesisState{}, nil)
mapp.BeginBlock(abci.RequestBeginBlock{}) mapp.BeginBlock(abci.RequestBeginBlock{})
ctx := mapp.BaseApp.NewContext(false, abci.Header{}) ctx := mapp.BaseApp.NewContext(false, abci.Header{})
keeper.ck.SetSendEnabled(ctx, true)
govHandler := NewHandler(keeper) govHandler := NewHandler(keeper)
inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time) inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)
@ -58,6 +59,7 @@ func TestTickMultipleExpiredDepositPeriod(t *testing.T) {
mapp, keeper, _, addrs, _, _ := getMockApp(t, 10, GenesisState{}, nil) mapp, keeper, _, addrs, _, _ := getMockApp(t, 10, GenesisState{}, nil)
mapp.BeginBlock(abci.RequestBeginBlock{}) mapp.BeginBlock(abci.RequestBeginBlock{})
ctx := mapp.BaseApp.NewContext(false, abci.Header{}) ctx := mapp.BaseApp.NewContext(false, abci.Header{})
keeper.ck.SetSendEnabled(ctx, true)
govHandler := NewHandler(keeper) govHandler := NewHandler(keeper)
inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time) inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)
@ -114,6 +116,7 @@ func TestTickPassedDepositPeriod(t *testing.T) {
mapp, keeper, _, addrs, _, _ := getMockApp(t, 10, GenesisState{}, nil) mapp, keeper, _, addrs, _, _ := getMockApp(t, 10, GenesisState{}, nil)
mapp.BeginBlock(abci.RequestBeginBlock{}) mapp.BeginBlock(abci.RequestBeginBlock{})
ctx := mapp.BaseApp.NewContext(false, abci.Header{}) ctx := mapp.BaseApp.NewContext(false, abci.Header{})
keeper.ck.SetSendEnabled(ctx, true)
govHandler := NewHandler(keeper) govHandler := NewHandler(keeper)
inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time) inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)
@ -156,6 +159,7 @@ func TestTickPassedVotingPeriod(t *testing.T) {
SortAddresses(addrs) SortAddresses(addrs)
mapp.BeginBlock(abci.RequestBeginBlock{}) mapp.BeginBlock(abci.RequestBeginBlock{})
ctx := mapp.BaseApp.NewContext(false, abci.Header{}) ctx := mapp.BaseApp.NewContext(false, abci.Header{})
keeper.ck.SetSendEnabled(ctx, true)
govHandler := NewHandler(keeper) govHandler := NewHandler(keeper)
inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time) inactiveQueue := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)

View File

@ -31,7 +31,7 @@ func getMockApp(t *testing.T, numGenAccs int, genState GenesisState, genAccs []a
keyGov := sdk.NewKVStoreKey(StoreKey) keyGov := sdk.NewKVStoreKey(StoreKey)
pk := mapp.ParamsKeeper pk := mapp.ParamsKeeper
ck := bank.NewBaseKeeper(mapp.AccountKeeper) ck := bank.NewBaseKeeper(mapp.AccountKeeper, mapp.ParamsKeeper.Subspace(bank.DefaultParamspace), bank.DefaultCodespace)
sk = staking.NewKeeper(mapp.Cdc, keyStaking, tkeyStaking, ck, pk.Subspace(staking.DefaultParamspace), staking.DefaultCodespace) sk = staking.NewKeeper(mapp.Cdc, keyStaking, tkeyStaking, ck, pk.Subspace(staking.DefaultParamspace), staking.DefaultCodespace)
keeper = NewKeeper(mapp.Cdc, keyGov, pk, pk.Subspace("testgov"), ck, sk, DefaultCodespace) keeper = NewKeeper(mapp.Cdc, keyGov, pk, pk.Subspace("testgov"), ck, sk, DefaultCodespace)

View File

@ -21,7 +21,9 @@ func getMockApp(t *testing.T) *mock.App {
RegisterCodec(mapp.Cdc) RegisterCodec(mapp.Cdc)
keyIBC := sdk.NewKVStoreKey("ibc") keyIBC := sdk.NewKVStoreKey("ibc")
ibcMapper := NewMapper(mapp.Cdc, keyIBC, DefaultCodespace) ibcMapper := NewMapper(mapp.Cdc, keyIBC, DefaultCodespace)
bankKeeper := bank.NewBaseKeeper(mapp.AccountKeeper) bankKeeper := bank.NewBaseKeeper(mapp.AccountKeeper,
mapp.ParamsKeeper.Subspace(bank.DefaultParamspace),
bank.DefaultCodespace)
mapp.Router().AddRoute("ibc", NewHandler(ibcMapper, bankKeeper)) mapp.Router().AddRoute("ibc", NewHandler(ibcMapper, bankKeeper))
require.NoError(t, mapp.CompleteSetup(keyIBC)) require.NoError(t, mapp.CompleteSetup(keyIBC))

View File

@ -50,7 +50,7 @@ func setupTestInput() testInput {
ak := auth.NewAccountKeeper( ak := auth.NewAccountKeeper(
cdc, authCapKey, pk.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount, cdc, authCapKey, pk.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount,
) )
bk := bank.NewBaseKeeper(ak) bk := bank.NewBaseKeeper(ak, pk.Subspace(bank.DefaultParamspace), bank.DefaultCodespace)
ctx := sdk.NewContext(ms, abci.Header{ChainID: "test-chain-id"}, false, log.NewNopLogger()) ctx := sdk.NewContext(ms, abci.Header{ChainID: "test-chain-id"}, false, log.NewNopLogger())
ak.SetParams(ctx, auth.DefaultParams()) ak.SetParams(ctx, auth.DefaultParams())

View File

@ -30,7 +30,7 @@ func getMockApp(t *testing.T) (*mock.App, staking.Keeper, Keeper) {
tkeyStaking := sdk.NewTransientStoreKey(staking.TStoreKey) tkeyStaking := sdk.NewTransientStoreKey(staking.TStoreKey)
keySlashing := sdk.NewKVStoreKey(StoreKey) keySlashing := sdk.NewKVStoreKey(StoreKey)
bankKeeper := bank.NewBaseKeeper(mapp.AccountKeeper) bankKeeper := bank.NewBaseKeeper(mapp.AccountKeeper, mapp.ParamsKeeper.Subspace(bank.DefaultParamspace), bank.DefaultCodespace)
stakingKeeper := staking.NewKeeper(mapp.Cdc, keyStaking, tkeyStaking, bankKeeper, mapp.ParamsKeeper.Subspace(staking.DefaultParamspace), staking.DefaultCodespace) stakingKeeper := staking.NewKeeper(mapp.Cdc, keyStaking, tkeyStaking, bankKeeper, mapp.ParamsKeeper.Subspace(staking.DefaultParamspace), staking.DefaultCodespace)
keeper := NewKeeper(mapp.Cdc, keySlashing, stakingKeeper, mapp.ParamsKeeper.Subspace(DefaultParamspace), DefaultCodespace) keeper := NewKeeper(mapp.Cdc, keySlashing, stakingKeeper, mapp.ParamsKeeper.Subspace(DefaultParamspace), DefaultCodespace)
mapp.Router().AddRoute(staking.RouterKey, staking.NewHandler(stakingKeeper)) mapp.Router().AddRoute(staking.RouterKey, staking.NewHandler(stakingKeeper))

View File

@ -72,7 +72,7 @@ func createTestInput(t *testing.T, defaults Params) (sdk.Context, bank.Keeper, s
paramsKeeper := params.NewKeeper(cdc, keyParams, tkeyParams) paramsKeeper := params.NewKeeper(cdc, keyParams, tkeyParams)
accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, paramsKeeper.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount) accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, paramsKeeper.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount)
ck := bank.NewBaseKeeper(accountKeeper) ck := bank.NewBaseKeeper(accountKeeper, paramsKeeper.Subspace(bank.DefaultParamspace), bank.DefaultCodespace)
sk := staking.NewKeeper(cdc, keyStaking, tkeyStaking, ck, paramsKeeper.Subspace(staking.DefaultParamspace), staking.DefaultCodespace) sk := staking.NewKeeper(cdc, keyStaking, tkeyStaking, ck, paramsKeeper.Subspace(staking.DefaultParamspace), staking.DefaultCodespace)
genesis := staking.DefaultGenesisState() genesis := staking.DefaultGenesisState()

View File

@ -22,7 +22,7 @@ func getMockApp(t *testing.T) (*mock.App, Keeper) {
keyStaking := sdk.NewKVStoreKey(StoreKey) keyStaking := sdk.NewKVStoreKey(StoreKey)
tkeyStaking := sdk.NewTransientStoreKey(TStoreKey) tkeyStaking := sdk.NewTransientStoreKey(TStoreKey)
bankKeeper := bank.NewBaseKeeper(mApp.AccountKeeper) bankKeeper := bank.NewBaseKeeper(mApp.AccountKeeper, mApp.ParamsKeeper.Subspace(bank.DefaultParamspace), bank.DefaultCodespace)
keeper := NewKeeper(mApp.Cdc, keyStaking, tkeyStaking, bankKeeper, mApp.ParamsKeeper.Subspace(DefaultParamspace), DefaultCodespace) keeper := NewKeeper(mApp.Cdc, keyStaking, tkeyStaking, bankKeeper, mApp.ParamsKeeper.Subspace(DefaultParamspace), DefaultCodespace)
mApp.Router().AddRoute(RouterKey, NewHandler(keeper)) mApp.Router().AddRoute(RouterKey, NewHandler(keeper))

View File

@ -112,7 +112,11 @@ func CreateTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context
auth.ProtoBaseAccount, // prototype auth.ProtoBaseAccount, // prototype
) )
ck := bank.NewBaseKeeper(accountKeeper) ck := bank.NewBaseKeeper(
accountKeeper,
pk.Subspace(bank.DefaultParamspace),
bank.DefaultCodespace,
)
keeper := NewKeeper(cdc, keyStaking, tkeyStaking, ck, pk.Subspace(DefaultParamspace), types.DefaultCodespace) keeper := NewKeeper(cdc, keyStaking, tkeyStaking, ck, pk.Subspace(DefaultParamspace), types.DefaultCodespace)
keeper.SetPool(ctx, types.InitialPool()) keeper.SetPool(ctx, types.InitialPool())