mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2024-12-23 12:07:17 +00:00
599fc24aed
**Current Problem** When X transactions are created, with M transactions out of them having `gasFeeCap` greater than the current `baseFeePerGas` for the block, and N transactions having `gasFeeCap` lower, all X transactions get added to the yellow pool (baseFee) in the txpool and they never get mined. However when X transactions all having `gasFeeCap` higher than the `baseFeePerGas` are created, they all get added to the green pool (pending) in the txpool and thus get mined. This phenomenon can be inspected in the `signEIP1559TxsLowerAndHigherThanBaseFee2` function where the number of transactions that should have `gasFeeCap` higher than and lower than the current `baseFeePerGas` is specified in its parameter - `func signEIP1559TxsLowerAndHigherThanBaseFee2(amountLower, amountHigher int...`. When `amountLower` is set as `0`, all transactions created from `amountHigher` will be mined because they have `gasFeeCap` > `baseFeePerGas`. When `amountLower` has a value > `0`, all the transactions created (including transactions created with `amountHigher`) will go to the yellow pool (baseFee) and thus do not get mined.
88 lines
2.4 KiB
Go
88 lines
2.4 KiB
Go
package requests
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
|
|
libcommon "github.com/ledgerwatch/erigon-lib/common"
|
|
|
|
"github.com/ledgerwatch/erigon/cmd/devnet/models"
|
|
"github.com/ledgerwatch/erigon/cmd/rpctest/rpctest"
|
|
"github.com/ledgerwatch/erigon/core/types"
|
|
)
|
|
|
|
func GetBlockByNumber(reqId int, blockNum uint64, withTxs bool) (rpctest.EthBlockByNumber, error) {
|
|
reqGen := initialiseRequestGenerator(reqId)
|
|
var b rpctest.EthBlockByNumber
|
|
|
|
req := reqGen.GetBlockByNumber(blockNum, withTxs)
|
|
|
|
res := reqGen.Erigon(models.ETHGetBlockByNumber, req, &b)
|
|
if res.Err != nil {
|
|
return b, fmt.Errorf("error getting block by number: %v", res.Err)
|
|
}
|
|
|
|
if b.Error != nil {
|
|
return b, fmt.Errorf("error populating response object: %v", b.Error)
|
|
}
|
|
|
|
return b, nil
|
|
}
|
|
|
|
func GetBlockByNumberDetails(reqId int, blockNum string, withTxs bool) (map[string]interface{}, error) {
|
|
reqGen := initialiseRequestGenerator(reqId)
|
|
var b struct {
|
|
rpctest.CommonResponse
|
|
Result interface{} `json:"result"`
|
|
}
|
|
|
|
req := reqGen.GetBlockByNumberI(blockNum, withTxs)
|
|
|
|
res := reqGen.Erigon(models.ETHGetBlockByNumber, req, &b)
|
|
if res.Err != nil {
|
|
return nil, fmt.Errorf("error getting block by number: %v", res.Err)
|
|
}
|
|
|
|
if b.Error != nil {
|
|
return nil, fmt.Errorf("error populating response object: %v", b.Error)
|
|
}
|
|
|
|
m, ok := b.Result.(map[string]interface{})
|
|
if !ok {
|
|
return nil, fmt.Errorf("cannot convert type")
|
|
}
|
|
|
|
return m, nil
|
|
}
|
|
|
|
func GetTransactionCount(reqId int, address libcommon.Address, blockNum models.BlockNumber) (rpctest.EthGetTransactionCount, error) {
|
|
reqGen := initialiseRequestGenerator(reqId)
|
|
var b rpctest.EthGetTransactionCount
|
|
|
|
if res := reqGen.Erigon(models.ETHGetTransactionCount, reqGen.GetTransactionCount(address, blockNum), &b); res.Err != nil {
|
|
return b, fmt.Errorf("error getting transaction count: %v", res.Err)
|
|
}
|
|
|
|
if b.Error != nil {
|
|
return b, fmt.Errorf("error populating response object: %v", b.Error)
|
|
}
|
|
|
|
return b, nil
|
|
}
|
|
|
|
func SendTransaction(reqId int, signedTx *types.Transaction) (*libcommon.Hash, error) {
|
|
reqGen := initialiseRequestGenerator(reqId)
|
|
var b rpctest.EthSendRawTransaction
|
|
|
|
var buf bytes.Buffer
|
|
if err := (*signedTx).MarshalBinary(&buf); err != nil {
|
|
return nil, fmt.Errorf("failed to marshal binary: %v", err)
|
|
}
|
|
|
|
if res := reqGen.Erigon(models.ETHSendRawTransaction, reqGen.SendRawTransaction(buf.Bytes()), &b); res.Err != nil {
|
|
return nil, fmt.Errorf("could not make to request to eth_sendRawTransaction: %v", res.Err)
|
|
}
|
|
|
|
return &b.TxnHash, nil
|
|
}
|