diff --git a/CHANGELOG.md b/CHANGELOG.md index a366f96fb..1612f083f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ FEATURES: * Add CacheContext * Add auto sequencing to client +* Add FeeHandler to ante handler BREAKING CHANGES diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index a1b94318a..ae60e8a73 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -36,6 +36,9 @@ type BasecoinApp struct { // Manage getting and setting accounts accountMapper sdk.AccountMapper + + // Handle fees + feeHandler sdk.FeeHandler } func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { @@ -69,11 +72,14 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)). AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) + // Define the feeHandler. + app.feeHandler = auth.BurnFeeHandler + // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainer) 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) if err != nil { cmn.Exit(err.Error()) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index db2614bad..151241d14 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -40,6 +40,9 @@ type DemocoinApp struct { // Manage getting and setting accounts accountMapper sdk.AccountMapper + + // Handle fees + feeHandler sdk.FeeHandler } func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { @@ -79,11 +82,14 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)). AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) + // Define the feeHandler. + app.feeHandler = auth.BurnFeeHandler + // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainerFn(coolKeeper, powKeeper)) 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) if err != nil { cmn.Exit(err.Error()) diff --git a/types/handler.go b/types/handler.go index 129f42647..679a3b1a7 100644 --- a/types/handler.go +++ b/types/handler.go @@ -3,5 +3,8 @@ package types // core function variable which application runs for transactions type Handler func(ctx Context, msg Msg) Result +// core function variable which application runs to handle fees +type FeeHandler func(ctx Context, tx Tx, fee Coins) + // If newCtx.IsZero(), ctx is used instead. type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool) diff --git a/x/auth/ante.go b/x/auth/ante.go index 6801769a4..c7af7e2d9 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -11,7 +11,7 @@ import ( // NewAnteHandler returns an AnteHandler that checks // and increments sequence numbers, checks signatures, // 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( ctx sdk.Context, tx sdk.Tx, ) (_ sdk.Context, _ sdk.Result, abort bool) { @@ -74,6 +74,7 @@ func NewAnteHandler(accountMapper sdk.AccountMapper) sdk.AnteHandler { // TODO: min fee if !fee.Amount.IsZero() { signerAcc, res = deductFees(signerAcc, fee) + feeHandler(ctx, tx, fee.Amount) if !res.IsOK() { return ctx, res, true } @@ -156,3 +157,7 @@ func deductFees(acc sdk.Account, fee sdk.StdFee) (sdk.Account, sdk.Result) { acc.SetCoins(newCoins) return acc, sdk.Result{} } + +// BurnFeeHandler burns all fees (decreasing total supply) +func BurnFeeHandler(ctx sdk.Context, tx sdk.Tx, fee sdk.Coins) { +} diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 2f90701e6..58633ff9a 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -72,7 +72,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -113,7 +113,7 @@ func TestAnteHandlerSequences(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -179,7 +179,7 @@ func TestAnteHandlerFees(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -216,7 +216,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -291,7 +291,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses