Refactor to use FeeHandler function

This commit is contained in:
Christopher Goes 2018-04-16 14:15:03 +02:00
parent 7fafa9e021
commit 39ee95abe4
No known key found for this signature in database
GPG Key ID: E828D98232D328D3
8 changed files with 27 additions and 56 deletions

View File

@ -36,6 +36,9 @@ type BasecoinApp struct {
// Manage getting and setting accounts // Manage getting and setting accounts
accountMapper sdk.AccountMapper accountMapper sdk.AccountMapper
// Handle fees
feeHandler sdk.FeeHandler
} }
func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp {
@ -60,6 +63,9 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp {
&types.AppAccount{}, // prototype &types.AppAccount{}, // prototype
).Seal() ).Seal()
// Define the feeHandler.
app.feeHandler = func(ctx sdk.Context, fees sdk.Coins) {}
// Add handlers. // Add handlers.
coinKeeper := bank.NewCoinKeeper(app.accountMapper) coinKeeper := bank.NewCoinKeeper(app.accountMapper)
ibcMapper := ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore) ibcMapper := ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore)
@ -73,7 +79,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp {
app.SetTxDecoder(app.txDecoder) app.SetTxDecoder(app.txDecoder)
app.SetInitChainer(app.initChainer) app.SetInitChainer(app.initChainer)
app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyIBCStore, app.capKeyStakingStore) app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyIBCStore, app.capKeyStakingStore)
app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeHandler))
err := app.LoadLatestVersion(app.capKeyMainStore) err := app.LoadLatestVersion(app.capKeyMainStore)
if err != nil { if err != nil {
cmn.Exit(err.Error()) cmn.Exit(err.Error())

View File

@ -40,6 +40,9 @@ type DemocoinApp struct {
// Manage getting and setting accounts // Manage getting and setting accounts
accountMapper sdk.AccountMapper accountMapper sdk.AccountMapper
// Handle fees
feeHandler sdk.FeeHandler
} }
func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp {
@ -65,6 +68,9 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp {
&types.AppAccount{}, // prototype &types.AppAccount{}, // prototype
).Seal() ).Seal()
// Define the feeHandler.
app.feeHandler = func(ctx sdk.Context, fee sdk.Coins) {}
// Add handlers. // Add handlers.
coinKeeper := bank.NewCoinKeeper(app.accountMapper) coinKeeper := bank.NewCoinKeeper(app.accountMapper)
coolKeeper := cool.NewKeeper(app.capKeyMainStore, coinKeeper) coolKeeper := cool.NewKeeper(app.capKeyMainStore, coinKeeper)
@ -83,7 +89,7 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp {
app.SetTxDecoder(app.txDecoder) app.SetTxDecoder(app.txDecoder)
app.SetInitChainer(app.initChainerFn(coolKeeper, powKeeper)) app.SetInitChainer(app.initChainerFn(coolKeeper, powKeeper))
app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyPowStore, app.capKeyIBCStore, app.capKeyStakingStore) app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyPowStore, app.capKeyIBCStore, app.capKeyStakingStore)
app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeHandler))
err := app.LoadLatestVersion(app.capKeyMainStore) err := app.LoadLatestVersion(app.capKeyMainStore)
if err != nil { if err != nil {
cmn.Exit(err.Error()) cmn.Exit(err.Error())

View File

@ -48,8 +48,6 @@ type AccountMapper interface {
NewAccountWithAddress(ctx Context, addr Address) Account NewAccountWithAddress(ctx Context, addr Address) Account
GetAccount(ctx Context, addr Address) Account GetAccount(ctx Context, addr Address) Account
SetAccount(ctx Context, acc Account) SetAccount(ctx Context, acc Account)
GetFeePool(ctx Context) Coins
SetFeePool(ctx Context, coins Coins)
} }
// AccountDecoder unmarshals account bytes // AccountDecoder unmarshals account bytes

View File

@ -3,5 +3,8 @@ package types
// core function variable which application runs for transactions // core function variable which application runs for transactions
type Handler func(ctx Context, msg Msg) Result type Handler func(ctx Context, msg Msg) Result
// core function variable which application runs to handle fees
type FeeHandler func(ctx Context, fee Coins)
// If newCtx.IsZero(), ctx is used instead. // If newCtx.IsZero(), ctx is used instead.
type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool) type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool)

View File

@ -11,7 +11,7 @@ import (
// NewAnteHandler returns an AnteHandler that checks // NewAnteHandler returns an AnteHandler that checks
// and increments sequence numbers, checks signatures, // and increments sequence numbers, checks signatures,
// and deducts fees from the first signer. // and deducts fees from the first signer.
func NewAnteHandler(accountMapper sdk.AccountMapper) sdk.AnteHandler { func NewAnteHandler(accountMapper sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHandler {
return func( return func(
ctx sdk.Context, tx sdk.Tx, ctx sdk.Context, tx sdk.Tx,
) (_ sdk.Context, _ sdk.Result, abort bool) { ) (_ sdk.Context, _ sdk.Result, abort bool) {
@ -74,9 +74,7 @@ func NewAnteHandler(accountMapper sdk.AccountMapper) sdk.AnteHandler {
// TODO: min fee // TODO: min fee
if !fee.Amount.IsZero() { if !fee.Amount.IsZero() {
signerAcc, res = deductFees(signerAcc, fee) signerAcc, res = deductFees(signerAcc, fee)
pool := accountMapper.GetFeePool(ctx) feeHandler(ctx, fee.Amount)
pool = pool.Plus(fee.Amount)
accountMapper.SetFeePool(ctx, pool)
if !res.IsOK() { if !res.IsOK() {
return ctx, res, true return ctx, res, true
} }

View File

@ -12,6 +12,9 @@ import (
wire "github.com/cosmos/cosmos-sdk/wire" wire "github.com/cosmos/cosmos-sdk/wire"
) )
func nopFeeHandler(ctx sdk.Context, fee sdk.Coins) {
}
func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg {
return sdk.NewTestMsg(addrs...) return sdk.NewTestMsg(addrs...)
} }
@ -72,7 +75,7 @@ func TestAnteHandlerSigErrors(t *testing.T) {
cdc := wire.NewCodec() cdc := wire.NewCodec()
RegisterBaseAccount(cdc) RegisterBaseAccount(cdc)
mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{})
anteHandler := NewAnteHandler(mapper) anteHandler := NewAnteHandler(mapper, nopFeeHandler)
ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil)
// keys and addresses // keys and addresses
@ -113,7 +116,7 @@ func TestAnteHandlerSequences(t *testing.T) {
cdc := wire.NewCodec() cdc := wire.NewCodec()
RegisterBaseAccount(cdc) RegisterBaseAccount(cdc)
mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{})
anteHandler := NewAnteHandler(mapper) anteHandler := NewAnteHandler(mapper, nopFeeHandler)
ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil)
// keys and addresses // keys and addresses
@ -179,7 +182,7 @@ func TestAnteHandlerFees(t *testing.T) {
cdc := wire.NewCodec() cdc := wire.NewCodec()
RegisterBaseAccount(cdc) RegisterBaseAccount(cdc)
mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{})
anteHandler := NewAnteHandler(mapper) anteHandler := NewAnteHandler(mapper, nopFeeHandler)
ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil)
// keys and addresses // keys and addresses
@ -216,7 +219,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) {
cdc := wire.NewCodec() cdc := wire.NewCodec()
RegisterBaseAccount(cdc) RegisterBaseAccount(cdc)
mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{})
anteHandler := NewAnteHandler(mapper) anteHandler := NewAnteHandler(mapper, nopFeeHandler)
ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil)
// keys and addresses // keys and addresses
@ -291,7 +294,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) {
cdc := wire.NewCodec() cdc := wire.NewCodec()
RegisterBaseAccount(cdc) RegisterBaseAccount(cdc)
mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{})
anteHandler := NewAnteHandler(mapper) anteHandler := NewAnteHandler(mapper, nopFeeHandler)
ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil)
// keys and addresses // keys and addresses

View File

@ -51,33 +51,6 @@ func (am accountMapper) Seal() sealedAccountMapper {
return sealedAccountMapper{am} return sealedAccountMapper{am}
} }
var feePoolKey = []byte("feePool")
// Implements sdk.AccountMapper.
func (am accountMapper) GetFeePool(ctx sdk.Context) sdk.Coins {
store := ctx.KVStore(am.key)
bz := store.Get(feePoolKey)
if bz == nil {
return sdk.Coins{}
}
var coins sdk.Coins
err := am.cdc.UnmarshalBinaryBare(bz, &coins)
if err != nil {
panic(err)
}
return coins
}
// Implements sdk.AccountMapper.
func (am accountMapper) SetFeePool(ctx sdk.Context, coins sdk.Coins) {
store := ctx.KVStore(am.key)
bz, err := am.cdc.MarshalBinaryBare(coins)
if err != nil {
panic(err)
}
store.Set(feePoolKey, bz)
}
// Implements sdk.AccountMapper. // Implements sdk.AccountMapper.
func (am accountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) sdk.Account { func (am accountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) sdk.Account {
acc := am.clonePrototype() acc := am.clonePrototype()

View File

@ -71,19 +71,3 @@ func TestAccountMapperSealed(t *testing.T) {
mapperSealed := mapper.Seal() mapperSealed := mapper.Seal()
assert.Panics(t, func() { mapperSealed.WireCodec() }) assert.Panics(t, func() { mapperSealed.WireCodec() })
} }
func TestAccountMapperFeePool(t *testing.T) {
ms, capKey := setupMultiStore()
cdc := wire.NewCodec()
ctx := sdk.NewContext(ms, abci.Header{}, false, nil)
mapper := NewAccountMapper(cdc, capKey, &BaseAccount{})
// default empty
pool := mapper.GetFeePool(ctx)
assert.Equal(t, pool, sdk.Coins{})
// get after set
mapper.SetFeePool(ctx, sdk.Coins{sdk.Coin{"doge", 1}})
pool = mapper.GetFeePool(ctx)
assert.Equal(t, pool, sdk.Coins{sdk.Coin{"doge", 1}})
}