Merge pull request #852 from cosmos/cwgoes/fee-account
Implement fee handler function in AnteHandler, add default BurnFeeHandler
This commit is contained in:
commit
0f2aa6bb14
|
@ -6,6 +6,7 @@ FEATURES:
|
||||||
|
|
||||||
* Add CacheContext
|
* Add CacheContext
|
||||||
* Add auto sequencing to client
|
* Add auto sequencing to client
|
||||||
|
* Add FeeHandler to ante handler
|
||||||
|
|
||||||
BREAKING CHANGES
|
BREAKING CHANGES
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
@ -69,11 +72,14 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp {
|
||||||
AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)).
|
AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)).
|
||||||
AddRoute("simplestake", simplestake.NewHandler(stakeKeeper))
|
AddRoute("simplestake", simplestake.NewHandler(stakeKeeper))
|
||||||
|
|
||||||
|
// Define the feeHandler.
|
||||||
|
app.feeHandler = auth.BurnFeeHandler
|
||||||
|
|
||||||
// Initialize BaseApp.
|
// Initialize BaseApp.
|
||||||
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())
|
||||||
|
|
|
@ -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 {
|
||||||
|
@ -79,11 +82,14 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp {
|
||||||
AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)).
|
AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)).
|
||||||
AddRoute("simplestake", simplestake.NewHandler(stakeKeeper))
|
AddRoute("simplestake", simplestake.NewHandler(stakeKeeper))
|
||||||
|
|
||||||
|
// Define the feeHandler.
|
||||||
|
app.feeHandler = auth.BurnFeeHandler
|
||||||
|
|
||||||
// Initialize BaseApp.
|
// Initialize BaseApp.
|
||||||
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())
|
||||||
|
|
|
@ -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, tx Tx, 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)
|
||||||
|
|
|
@ -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,6 +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)
|
||||||
|
feeHandler(ctx, tx, fee.Amount)
|
||||||
if !res.IsOK() {
|
if !res.IsOK() {
|
||||||
return ctx, res, true
|
return ctx, res, true
|
||||||
}
|
}
|
||||||
|
@ -156,3 +157,7 @@ func deductFees(acc sdk.Account, fee sdk.StdFee) (sdk.Account, sdk.Result) {
|
||||||
acc.SetCoins(newCoins)
|
acc.SetCoins(newCoins)
|
||||||
return acc, sdk.Result{}
|
return acc, sdk.Result{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BurnFeeHandler burns all fees (decreasing total supply)
|
||||||
|
func BurnFeeHandler(ctx sdk.Context, tx sdk.Tx, fee sdk.Coins) {
|
||||||
|
}
|
||||||
|
|
|
@ -72,7 +72,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, BurnFeeHandler)
|
||||||
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 +113,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, BurnFeeHandler)
|
||||||
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 +179,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, BurnFeeHandler)
|
||||||
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 +216,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, BurnFeeHandler)
|
||||||
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 +291,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, BurnFeeHandler)
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue