Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Github] Max fee per gas issue #1892

Merged
merged 8 commits into from
Sep 8, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions docker/local/polygon-edge.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,6 @@

set -e

# Check if jq is installed. If not exit and inform user.
if ! command -v jq >/dev/null 2>&1; then
echo "The jq utility is not installed or is not in the PATH. Please install it and run the script again."
exit 1
fi


Stefan-Ethernal marked this conversation as resolved.
Show resolved Hide resolved
POLYGON_EDGE_BIN=./polygon-edge
CHAIN_CUSTOM_OPTIONS=$(tr "\n" " " << EOL
--block-gas-limit 10000000
Expand Down Expand Up @@ -61,6 +54,7 @@ case "$1" in
--validators-prefix data- \
--reward-wallet 0xDEADBEEF:1000000 \
--native-token-config "Polygon:MATIC:18:true:$(echo "$secrets" | jq -r '.[0] | .address')" \
--governor-admin "$(echo "$secrets" | jq -r '.[0] | .address')" \
--bootnode "/dns4/node-1/tcp/1478/p2p/$(echo "$secrets" | jq -r '.[0] | .node_id')" \
--bootnode "/dns4/node-2/tcp/1478/p2p/$(echo "$secrets" | jq -r '.[1] | .node_id')" \
--bootnode "/dns4/node-3/tcp/1478/p2p/$(echo "$secrets" | jq -r '.[2] | .node_id')" \
Expand Down
53 changes: 47 additions & 6 deletions jsonrpc/eth_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type ethTxPoolStore interface {
// GetNonce returns the next nonce for this address
GetNonce(addr types.Address) uint64

// returns the current base fee of TxPool
// GetBaseFee returns the current base fee of TxPool
GetBaseFee() uint64
}

Expand Down Expand Up @@ -393,23 +393,53 @@ func (e *Eth) GetStorageAt(
return argBytesPtr(result), nil
}

// GasPrice returns the average gas price based on the last x blocks
// taking into consideration operator defined price limit
// GasPrice exposes "getGasPrice"'s function logic to public RPC interface
func (e *Eth) GasPrice() (interface{}, error) {
gasPrice, err := e.getGasPrice()
if err != nil {
return nil, err
}

return argUint64(gasPrice), nil
}

// getGasPrice returns the average gas price based on the last x blocks
// taking into consideration operator defined price limit
func (e *Eth) getGasPrice() (uint64, error) {
// Return --price-limit flag defined value if it is greater than avgGasPrice/baseFee+priorityFee
if e.store.GetForksInTime(e.store.Header().Number).London {
priorityFee, err := e.store.MaxPriorityFeePerGas()
if err != nil {
return nil, err
return 0, err
}

return argUint64(common.Max(e.priceLimit, priorityFee.Uint64()+e.store.GetBaseFee())), nil
return common.Max(e.priceLimit, priorityFee.Uint64()+e.store.GetBaseFee()), nil
}

// Fetch average gas price in uint64
avgGasPrice := e.store.GetAvgGasPrice().Uint64()

return argUint64(common.Max(e.priceLimit, avgGasPrice)), nil
return common.Max(e.priceLimit, avgGasPrice), nil
}

// fillTransactionGasPrice fills transaction gas price if no provided
func (e *Eth) fillTransactionGasPrice(tx *types.Transaction) error {
if tx.GetGasPrice(e.store.GetBaseFee()).BitLen() > 0 {
return nil
}

estimatedGasPrice, err := e.getGasPrice()
if err != nil {
return err
}

if tx.Type == types.DynamicFeeTx {
tx.GasFeeCap = new(big.Int).SetUint64(estimatedGasPrice)
rachit77 marked this conversation as resolved.
Show resolved Hide resolved
} else {
tx.GasPrice = new(big.Int).SetUint64(estimatedGasPrice)
}

return nil
}

type overrideAccount struct {
Expand Down Expand Up @@ -460,11 +490,17 @@ func (e *Eth) Call(arg *txnArgs, filter BlockNumberOrHash, apiOverride *stateOve
if err != nil {
return nil, err
}

// If the caller didn't supply the gas limit in the message, then we set it to maximum possible => block gas limit
if transaction.Gas == 0 {
transaction.Gas = header.GasLimit
}

// Force transaction gas price if empty
if err = e.fillTransactionGasPrice(transaction); err != nil {
return nil, err
}

var override types.StateOverride
if apiOverride != nil {
override = types.StateOverride{}
Expand Down Expand Up @@ -510,6 +546,11 @@ func (e *Eth) EstimateGas(arg *txnArgs, rawNum *BlockNumber) (interface{}, error
return nil, err
}

// Force transaction gas price if empty
if err = e.fillTransactionGasPrice(transaction); err != nil {
return nil, err
}

forksInTime := e.store.GetForksInTime(header.Number)

var standardGas uint64
Expand Down
6 changes: 3 additions & 3 deletions state/londonFix_fork.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ func (l *LondonFixForkV2) checkDynamicFees(msg *types.Transaction, t *Transition

// This will panic if baseFee is nil, but basefee presence is verified
// as part of header validation.
if msg.GetGasFeeCap().Cmp(t.ctx.BaseFee) < 0 {
return fmt.Errorf("%w: address %v, GasFeeCap: %s, BaseFee: %s", ErrFeeCapTooLow,
msg.From.String(), msg.GasFeeCap, t.ctx.BaseFee)
if gasFeeCap := msg.GetGasFeeCap(); gasFeeCap.Cmp(t.ctx.BaseFee) < 0 {
return fmt.Errorf("%w: address %v, GasFeeCap/GasPrice: %s, BaseFee: %s", ErrFeeCapTooLow,
msg.From.String(), gasFeeCap, t.ctx.BaseFee)
}

return nil
Expand Down
Loading