From e870163ec0118cdd4ef3613b1623f4f86a0b0a6b Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 12 Apr 2018 13:03:29 +0200 Subject: [PATCH] Implement fee pool pseudo-account in sdk.AccountMapper --- types/account.go | 2 ++ x/auth/ante.go | 3 +++ x/auth/mapper.go | 27 +++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/types/account.go b/types/account.go index 91ad49979..5217fa850 100644 --- a/types/account.go +++ b/types/account.go @@ -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 diff --git a/x/auth/ante.go b/x/auth/ante.go index 6801769a4..20852b5d7 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -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 } diff --git a/x/auth/mapper.go b/x/auth/mapper.go index 7bc23aee1..552e10691 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -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()