rpc, feemarket: store base fee in event (#673)

* store base fee in event

* update changelog
This commit is contained in:
Thomas Nguy
2021-10-15 08:59:26 +00:00
committed by GitHub
parent b1b12945c0
commit cd3b0be5ed
9 changed files with 70 additions and 23 deletions
+11 -9
View File
@@ -826,22 +826,24 @@ func (e *EVMBackend) BaseFee(height int64) (*big.Int, error) {
return nil, nil
}
res, err := e.queryClient.FeeMarket.BaseFee(types.ContextWithHeight(height), &feemarkettypes.QueryBaseFeeRequest{})
blockRes, err := e.clientCtx.Client.BlockResults(e.ctx, &height)
if err != nil {
return nil, err
}
if res.BaseFee != nil {
baseFee := types.BaseFeeFromEvents(blockRes.EndBlockEvents)
if baseFee != nil {
return baseFee, nil
}
// If we cannot find in events, we tried to get it from the state.
// It will return feemarket.baseFee if london is activated but feemarket is not enable
res, err := e.queryClient.FeeMarket.BaseFee(types.ContextWithHeight(height), &feemarkettypes.QueryBaseFeeRequest{})
if err == nil && res.BaseFee != nil {
return res.BaseFee.BigInt(), nil
}
resParams, err := e.queryClient.FeeMarket.Params(types.ContextWithHeight(height), &feemarkettypes.QueryParamsRequest{})
if err != nil {
return nil, err
}
baseFee := big.NewInt(resParams.Params.InitialBaseFee)
return baseFee, nil
return nil, nil
}
// GetFilteredBlocks returns the block height list match the given bloom filters.
+4 -8
View File
@@ -3,7 +3,6 @@ package filters
import (
"context"
"fmt"
"math/big"
"sync"
"time"
@@ -18,7 +17,6 @@ import (
"github.com/ethereum/go-ethereum/common"
ethtypes "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/eth/filters"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"
evmtypes "github.com/tharsis/ethermint/x/evm/types"
@@ -239,9 +237,6 @@ func (api *PublicFilterAPI) NewBlockFilter() rpc.ID {
return rpc.ID(fmt.Sprintf("error creating block filter: %s", err.Error()))
}
// TODO: use events to get the base fee amount
baseFee := big.NewInt(params.InitialBaseFee)
api.filters[headerSub.ID()] = &filter{typ: filters.BlocksSubscription, deadline: time.NewTimer(deadline), hashes: []common.Hash{}, s: headerSub}
go func(headersCh <-chan coretypes.ResultEvent, errCh <-chan error) {
@@ -263,6 +258,8 @@ func (api *PublicFilterAPI) NewBlockFilter() rpc.ID {
continue
}
baseFee := types.BaseFeeFromEvents(data.ResultEndBlock.Events)
header := types.EthHeaderFromTendermint(data.Header, baseFee)
api.filtersMu.Lock()
if f, found := api.filters[headerSub.ID()]; found {
@@ -296,9 +293,6 @@ func (api *PublicFilterAPI) NewHeads(ctx context.Context) (*rpc.Subscription, er
return &rpc.Subscription{}, err
}
// TODO: use events to get the base fee amount
baseFee := big.NewInt(params.InitialBaseFee)
go func(headersCh <-chan coretypes.ResultEvent) {
defer cancelSubs()
@@ -316,6 +310,8 @@ func (api *PublicFilterAPI) NewHeads(ctx context.Context) (*rpc.Subscription, er
continue
}
baseFee := types.BaseFeeFromEvents(data.ResultEndBlock.Events)
header := types.EthHeaderFromTendermint(data.Header, baseFee)
err = notifier.Notify(rpcSub.ID, header)
if err != nil {
+25
View File
@@ -1,11 +1,15 @@
package types
import (
"bytes"
"context"
"encoding/hex"
"fmt"
"math/big"
abci "github.com/tendermint/tendermint/abci/types"
feemarkettypes "github.com/tharsis/ethermint/x/feemarket/types"
tmbytes "github.com/tendermint/tendermint/libs/bytes"
tmtypes "github.com/tendermint/tendermint/types"
@@ -244,3 +248,24 @@ func NewRPCTransaction(
}
return result, nil
}
// BaseFeeFromEvents parses the feemarket basefee from cosmos events
func BaseFeeFromEvents(events []abci.Event) *big.Int {
for _, event := range events {
if event.Type != feemarkettypes.EventTypeFeeMarket {
continue
}
for _, attr := range event.Attributes {
if bytes.Equal(attr.Key, []byte(feemarkettypes.AttributeKeyBaseFee)) {
result, success := new(big.Int).SetString(string(attr.Value), 10)
if success {
return result
}
return nil
}
}
}
return nil
}