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
GetAccount(ctx Context, addr Address) Account
SetAccount(ctx Context, acc Account)
GetFeePool(ctx Context) Coins
SetFeePool(ctx Context, coins Coins)
}
// AccountDecoder unmarshals account bytes

View File

@ -74,6 +74,9 @@ func NewAnteHandler(accountMapper sdk.AccountMapper) sdk.AnteHandler {
// TODO: min fee
if !fee.Amount.IsZero() {
signerAcc, res = deductFees(signerAcc, fee)
pool := accountMapper.GetFeePool(ctx)
pool = pool.Plus(fee.Amount)
accountMapper.SetFeePool(ctx, pool)
if !res.IsOK() {
return ctx, res, true
}

View File

@ -51,6 +51,33 @@ func (am accountMapper) Seal() sealedAccountMapper {
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.
func (am accountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) sdk.Account {
acc := am.clonePrototype()