Implement fee pool pseudo-account in sdk.AccountMapper

This commit is contained in:
Christopher Goes 2018-04-12 13:03:29 +02:00
parent b846559ac1
commit e870163ec0
No known key found for this signature in database
GPG Key ID: E828D98232D328D3
3 changed files with 32 additions and 0 deletions

View File

@ -48,6 +48,8 @@ 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

@ -74,6 +74,9 @@ 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)
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

@ -51,6 +51,33 @@ 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()