├── .gitignore ├── LICENSE ├── go.mod ├── api.go ├── types.go ├── ws.go ├── README.md ├── main.go ├── storage.go ├── manager.go ├── mempool.go ├── blockchain.go ├── go.sum └── example_data ├── block_21910220.json ├── block_21910222.json ├── block_21910223.json └── block_21910225.json /.gitignore: -------------------------------------------------------------------------------- 1 | gasflow-server 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 duoxehyon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/duoxehyon/gasflow-server 2 | 3 | go 1.23.0 4 | 5 | require ( 6 | github.com/ethereum/go-ethereum v1.15.2 7 | github.com/gorilla/websocket v1.5.3 8 | ) 9 | 10 | require ( 11 | github.com/Microsoft/go-winio v0.6.2 // indirect 12 | github.com/StackExchange/wmi v1.2.1 // indirect 13 | github.com/bits-and-blooms/bitset v1.17.0 // indirect 14 | github.com/consensys/bavard v0.1.22 // indirect 15 | github.com/consensys/gnark-crypto v0.14.0 // indirect 16 | github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect 17 | github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect 18 | github.com/deckarep/golang-set/v2 v2.6.0 // indirect 19 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect 20 | github.com/ethereum/c-kzg-4844 v1.0.0 // indirect 21 | github.com/ethereum/go-verkle v0.2.2 // indirect 22 | github.com/go-ole/go-ole v1.3.0 // indirect 23 | github.com/holiman/uint256 v1.3.2 // indirect 24 | github.com/mmcloughlin/addchain v0.4.0 // indirect 25 | github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect 26 | github.com/sirupsen/logrus v1.9.3 // indirect 27 | github.com/supranational/blst v0.3.14 // indirect 28 | github.com/tklauser/go-sysconf v0.3.12 // indirect 29 | github.com/tklauser/numcpus v0.6.1 // indirect 30 | golang.org/x/crypto v0.32.0 // indirect 31 | golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect 32 | golang.org/x/sync v0.10.0 // indirect 33 | golang.org/x/sys v0.29.0 // indirect 34 | rsc.io/tmplfunc v0.0.3 // indirect 35 | ) 36 | -------------------------------------------------------------------------------- /api.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "log" 7 | "net/http" 8 | "strconv" 9 | ) 10 | 11 | type APIServer struct { 12 | port string 13 | manager *DataManager 14 | } 15 | 16 | func NewAPIServer(port string, manager *DataManager) *APIServer { 17 | return &APIServer{ 18 | port: port, 19 | manager: manager, 20 | } 21 | } 22 | 23 | func (s *APIServer) Start() error { 24 | // Internal endpoints 25 | http.HandleFunc("/internal/network", s.handleInternalRequest(s.handleNetworkData)) 26 | http.HandleFunc("/internal/block", s.handleInternalRequest(s.handleBlockData)) 27 | 28 | log.Printf("🔒 Internal API server starting on %s", s.port) 29 | go func() { 30 | if err := http.ListenAndServe(s.port, nil); err != nil { 31 | log.Printf("API server error: %v", err) 32 | } 33 | }() 34 | 35 | return nil 36 | } 37 | 38 | func (s *APIServer) handleInternalRequest(handler func(http.ResponseWriter, *http.Request)) http.HandlerFunc { 39 | return func(w http.ResponseWriter, r *http.Request) { 40 | // Only allow GET requests 41 | if r.Method != http.MethodGet { 42 | http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) 43 | return 44 | } 45 | 46 | handler(w, r) 47 | } 48 | } 49 | 50 | func (s *APIServer) handleNetworkData(w http.ResponseWriter, r *http.Request) { 51 | response, err := s.manager.GetAPIResponse() 52 | if err != nil { 53 | http.Error(w, fmt.Sprintf("Failed to get network data: %v", err), http.StatusInternalServerError) 54 | return 55 | } 56 | 57 | w.Header().Set("Content-Type", "application/json") 58 | json.NewEncoder(w).Encode(response) 59 | } 60 | 61 | func (s *APIServer) handleBlockData(w http.ResponseWriter, r *http.Request) { 62 | blockNum := r.URL.Query().Get("block") 63 | if blockNum == "" { 64 | http.Error(w, "Block number required", http.StatusBadRequest) 65 | return 66 | } 67 | 68 | num, err := strconv.ParseUint(blockNum, 10, 64) 69 | if err != nil { 70 | http.Error(w, "Invalid block number", http.StatusBadRequest) 71 | return 72 | } 73 | 74 | // Use manager to get block data 75 | block := s.manager.blockchain.GetCurrentBlock() 76 | if block.Block.Number != num { 77 | http.Error(w, "Block not found", http.StatusNotFound) 78 | return 79 | } 80 | 81 | w.Header().Set("Content-Type", "application/json") 82 | json.NewEncoder(w).Encode(block) 83 | } 84 | -------------------------------------------------------------------------------- /types.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | type BlockData struct { 4 | Block Block `json:"block"` 5 | Network Network `json:"network"` 6 | Txs []Tx `json:"txs"` 7 | } 8 | 9 | type Block struct { 10 | Number uint64 `json:"number"` 11 | Timestamp uint64 `json:"timestamp"` 12 | BaseFee string `json:"base_fee"` 13 | GasUsed uint64 `json:"gas_used"` 14 | } 15 | 16 | type Network struct { 17 | Mempool APIMempoolStats `json:"mempool"` 18 | History BlockHistory `json:"history"` 19 | } 20 | 21 | type BlockHistory struct { 22 | GasRatio5 float64 `json:"gas_ratio_5"` 23 | GasSpikes25 int `json:"gas_spikes_25"` 24 | FeeEWMA10 float64 `json:"fee_ewma_10"` 25 | FeeEWMA25 float64 `json:"fee_ewma_25"` 26 | } 27 | 28 | type Tx struct { 29 | Hash string `json:"hash"` 30 | SubmissionBlock uint64 `json:"submission_block"` 31 | MaxFee string `json:"max_fee"` // Wei as string 32 | MaxPriorityFee string `json:"max_priority_fee"` // Wei as string 33 | BaseFee string `json:"base_fee"` // Wei as string 34 | Gas uint64 `json:"gas"` 35 | InclusionBlocks uint64 `json:"inclusion_blocks"` 36 | } 37 | 38 | type NetworkData struct { 39 | Mempool MempoolData `json:"mempool"` 40 | Block BlockData `json:"block"` 41 | History BlockHistory `json:"history"` 42 | } 43 | 44 | // WebSocket specific response 45 | type WSResponse struct { 46 | // Mempool stats with histogram 47 | Count uint64 `json:"count"` 48 | FeeHistogram map[string]int `json:"fee_histogram"` 49 | BaseFeeTrend float64 `json:"base_fee_trend"` 50 | 51 | NextBaseFee float64 `json:"next_base_fee"` 52 | 53 | CurrentBlockNumber uint64 `json:"current_block"` 54 | 55 | LastBlockTime int64 `json:"last_block_time"` 56 | 57 | // Block history data 58 | GasRatio5 float64 `json:"gas_ratio_5"` 59 | GasSpikes25 int `json:"gas_spikes_25"` 60 | FeeEWMA10 float64 `json:"fee_ewma_10"` 61 | FeeEWMA25 float64 `json:"fee_ewma_25"` 62 | } 63 | 64 | // API specific response 65 | type APIResponse struct { 66 | // Mempool percentile stats 67 | Count uint64 `json:"count"` 68 | P10 float64 `json:"p10"` 69 | P30 float64 `json:"p30"` 70 | P50 float64 `json:"p50"` 71 | P70 float64 `json:"p70"` 72 | P90 float64 `json:"p90"` 73 | 74 | NextBlock uint64 `json:"next_block"` 75 | NextBaseFee float64 `json:"next_base_fee"` 76 | 77 | History BlockHistory `json:"history"` 78 | } 79 | -------------------------------------------------------------------------------- /ws.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | "net/http" 7 | "sync" 8 | 9 | "github.com/gorilla/websocket" 10 | "github.com/sirupsen/logrus" 11 | ) 12 | 13 | var upgrader = websocket.Upgrader{ 14 | CheckOrigin: func(r *http.Request) bool { return true }, 15 | } 16 | 17 | type WSServer struct { 18 | port string 19 | 20 | // Client management 21 | clients map[*websocket.Conn]bool 22 | mu sync.RWMutex 23 | 24 | // Shutdown 25 | shutdown chan struct{} 26 | } 27 | 28 | func NewWSServer(port string) *WSServer { 29 | return &WSServer{ 30 | port: port, 31 | clients: make(map[*websocket.Conn]bool), 32 | shutdown: make(chan struct{}), 33 | } 34 | } 35 | 36 | func (ws *WSServer) handleConnection(w http.ResponseWriter, r *http.Request) { 37 | conn, err := upgrader.Upgrade(w, r, nil) 38 | if err != nil { 39 | log.Printf("Failed to upgrade connection: %v", err) 40 | return 41 | } 42 | defer conn.Close() 43 | 44 | // Register client 45 | ws.mu.Lock() 46 | ws.clients[conn] = true 47 | clientCount := len(ws.clients) 48 | ws.mu.Unlock() 49 | 50 | logger.WithFields(logrus.Fields{ 51 | "total_clients": clientCount, 52 | "remote_addr": r.RemoteAddr, 53 | }).Info("🔌 New WebSocket client connected") 54 | 55 | // Handle client disconnection 56 | defer func() { 57 | ws.mu.Lock() 58 | delete(ws.clients, conn) 59 | clientCount := len(ws.clients) 60 | ws.mu.Unlock() 61 | 62 | // 🔹 Log client disconnection 63 | logger.WithFields(logrus.Fields{ 64 | "total_clients": clientCount, 65 | "remote_addr": r.RemoteAddr, 66 | }).Info("WebSocket client disconnected") 67 | }() 68 | 69 | // Keep connection alive 70 | for { 71 | _, _, err := conn.ReadMessage() 72 | if err != nil { 73 | break 74 | } 75 | } 76 | } 77 | 78 | func (ws *WSServer) BroadcastUpdate(update WSResponse) { 79 | data, err := json.Marshal(update) 80 | if err != nil { 81 | log.Printf("Failed to marshal update: %v", err) 82 | return 83 | } 84 | 85 | ws.mu.RLock() 86 | for client := range ws.clients { 87 | err := client.WriteMessage(websocket.TextMessage, data) 88 | if err != nil { 89 | log.Printf("Failed to send message to client: %v", err) 90 | client.Close() 91 | ws.mu.RUnlock() 92 | ws.mu.Lock() 93 | delete(ws.clients, client) 94 | ws.mu.Unlock() 95 | ws.mu.RLock() 96 | } 97 | } 98 | ws.mu.RUnlock() 99 | } 100 | 101 | func (ws *WSServer) Start() error { 102 | // Set up WebSocket endpoint 103 | http.HandleFunc("/ws", ws.handleConnection) 104 | 105 | // Start HTTP server 106 | log.Printf("🌍 WebSocket server starting on %s", ws.port) 107 | go func() { 108 | if err := http.ListenAndServe(ws.port, nil); err != nil { 109 | log.Printf("WebSocket server error: %v", err) 110 | } 111 | }() 112 | 113 | return nil 114 | } 115 | 116 | func (ws *WSServer) Stop() { 117 | // Close all client connections 118 | ws.mu.Lock() 119 | for client := range ws.clients { 120 | client.Close() 121 | delete(ws.clients, client) 122 | } 123 | ws.mu.Unlock() 124 | 125 | close(ws.shutdown) 126 | } 127 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gasflow Server 2 | 3 | Gasflow Server is a blockchain transaction monitoring and mempool data collection engine for Ethereum. It streams transaction data, processes mempool statistics, and provides a WebSocket and API interface. 4 | 5 | ## Features 6 | - Collects Ethereum mempool transactions in real-time. 7 | - Provides a WebSocket server for live transaction streaming. 8 | - Offers an internal API for querying mempool and block data. 9 | - Saves processed block data for further analysis. 10 | 11 | ## Installation 12 | ### Prerequisites 13 | - Go 1.20+ 14 | - An Ethereum node (e.g., Geth, Erigon) with WebSocket enabled. 15 | 16 | ### Clone the repository: 17 | ```sh 18 | git clone https://github.com/duoxehyon/gasflow-server.git 19 | cd gasflow-server 20 | ``` 21 | 22 | ### Build: 23 | ```sh 24 | go build -o gasflow-server 25 | ``` 26 | 27 | ### Run: 28 | ```sh 29 | ./gasflow-server -eth ws://localhost:8546 -enable-ws -enable-api -enable-saving 30 | ``` 31 | 32 | ## Configuration 33 | The server can be configured via command-line flags: 34 | 35 | | Flag | Description | Default | 36 | |-----------------|--------------------------------|-----------------------------| 37 | | `-eth` | Ethereum node WebSocket URL | `ws://localhost:8546` | 38 | | `-ws-port` | WebSocket server port | `:8080` | 39 | | `-api-port` | Internal API server port | `:8081` | 40 | | `-enable-ws` | Enable WebSocket server | `false` | 41 | | `-enable-api` | Enable internal API server | `false` | 42 | | `-enable-saving`| Enable block data saving | `false` | 43 | | `-output` | Directory to store block data | `data/` | 44 | 45 | Example: 46 | ```sh 47 | ./gasflow-server -eth ws://your-ethereum-node:8546 -ws-port :9000 -api-port :9001 -enable-ws -enable-api -enable-saving -output storage/ 48 | ``` 49 | 50 | ## API Endpoints 51 | The internal API is only accessible from `localhost`. 52 | 53 | ### **GET /internal/network** 54 | Returns mempool and network statistics. 55 | 56 | **Example Response:** 57 | ```json 58 | { 59 | "count": 12000, 60 | "p10": 20.3, 61 | "p30": 22.5, 62 | "p50": 30.1, 63 | "p70": 40.2, 64 | "p90": 60.7, 65 | "next_block": 1928391, 66 | "next_base_fee": 25.0 67 | } 68 | ``` 69 | 70 | ### **GET /internal/block?block={block_number}** 71 | Retrieves data for a specific block. 72 | 73 | **Example Request:** 74 | ```sh 75 | curl "http://localhost:8081/internal/block?block=1928390" 76 | ``` 77 | 78 | **Example Response:** 79 | ```json 80 | { 81 | "block": { 82 | "number": 1928390, 83 | "timestamp": 1700000000, 84 | "base_fee": "20.0", 85 | "gas_used": 15000000 86 | }, 87 | "network": { 88 | "mempool": { ... }, 89 | "history": { ... } 90 | }, 91 | "txs": [ 92 | { 93 | "hash": "0xabc...", 94 | "max_fee": "30.5", 95 | "gas": 21000 96 | ... 97 | } 98 | ] 99 | } 100 | ``` 101 | 102 | ## WebSocket API 103 | The WebSocket server provides real-time updates. 104 | 105 | ### **Connect:** 106 | ``` 107 | ws://localhost:8080/ws 108 | ``` 109 | 110 | ### **Messages Sent:** 111 | WebSocket clients receive mempool updates in JSON format. 112 | 113 | **Example Response:** 114 | ```json 115 | { 116 | "count": 12345, 117 | "fee_histogram": { "10.0": 200, "15.0": 500 }, 118 | "next_base_fee": 25.3 119 | } 120 | ``` 121 | 122 | ## Data Storage 123 | If `-enable-saving` is enabled, block data is saved as JSON files in the specified `-output` directory. 124 | 125 | - Example file: `storage/block_1928390.json` 126 | 127 | ## Development 128 | ### Run Tests: 129 | ```sh 130 | go test ./... 131 | ``` 132 | 133 | ### Code Formatting: 134 | ```sh 135 | gofmt -s -w . 136 | ``` 137 | 138 | Note: This is an initial version and may have areas for improvement. Contributions and feedback are welcome. 139 | 140 | ## License 141 | MIT License. 142 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "os" 6 | "os/signal" 7 | "syscall" 8 | "time" 9 | 10 | "github.com/sirupsen/logrus" 11 | ) 12 | 13 | // Config stores application settings 14 | type Config struct { 15 | // Ethereum connection 16 | EthEndpoint string 17 | 18 | // Server ports 19 | WSPort string 20 | APIPort string 21 | 22 | // Feature flags 23 | EnableWS bool 24 | EnableAPI bool 25 | EnableSaving bool 26 | 27 | // Storage 28 | OutputDir string 29 | } 30 | 31 | // Initialize logger 32 | var logger = logrus.New() 33 | 34 | func initLogger() { 35 | logger.SetFormatter(&logrus.TextFormatter{ 36 | TimestampFormat: time.RFC3339, // ISO 8601 format 37 | FullTimestamp: true, 38 | }) 39 | logger.SetOutput(os.Stdout) // Log to console 40 | logger.SetLevel(logrus.InfoLevel) // Default log level 41 | } 42 | 43 | func parseConfig() *Config { 44 | cfg := &Config{} 45 | 46 | // Ethereum settings 47 | flag.StringVar(&cfg.EthEndpoint, "eth", "ws://localhost:8546", "Ethereum node websocket endpoint") 48 | 49 | // Server ports 50 | flag.StringVar(&cfg.WSPort, "ws-port", ":8080", "WebSocket server port") 51 | flag.StringVar(&cfg.APIPort, "api-port", ":8081", "Internal API server port") 52 | 53 | // Feature flags 54 | flag.BoolVar(&cfg.EnableWS, "enable-ws", false, "Enable WebSocket server") 55 | flag.BoolVar(&cfg.EnableAPI, "enable-api", false, "Enable internal API server") 56 | flag.BoolVar(&cfg.EnableSaving, "enable-saving", false, "Enable block data saving") 57 | 58 | // Storage settings (only used if enable-saving is true) 59 | flag.StringVar(&cfg.OutputDir, "output", "data", "Directory for saved block data") 60 | 61 | // Parse flags 62 | flag.Parse() 63 | 64 | // Validate configuration 65 | if cfg.EthEndpoint == "" { 66 | logger.Fatal("Ethereum endpoint is required") 67 | } 68 | 69 | // Create output directory if saving is enabled 70 | if cfg.EnableSaving { 71 | if err := os.MkdirAll(cfg.OutputDir, 0755); err != nil { 72 | logger.Fatalf("Failed to create output directory: %v", err) 73 | } 74 | } 75 | 76 | return cfg 77 | } 78 | 79 | func printBanner(cfg *Config) { 80 | logger.Info("🚀 Starting Blockchain Data Engine") 81 | logger.WithFields(logrus.Fields{ 82 | "Ethereum Node": cfg.EthEndpoint, 83 | "WebSocket": cfg.EnableWS, 84 | "API Server": cfg.EnableAPI, 85 | "Block Saving": cfg.EnableSaving, 86 | }).Info("Configuration Loaded") 87 | } 88 | 89 | func main() { 90 | initLogger() 91 | cfg := parseConfig() 92 | printBanner(cfg) 93 | 94 | outputDir := "" 95 | if cfg.EnableSaving { 96 | outputDir = cfg.OutputDir 97 | } 98 | 99 | manager, err := NewDataManager(cfg.EthEndpoint, outputDir) 100 | if err != nil { 101 | logger.Fatalf("Failed to create data manager: %v", err) 102 | } 103 | 104 | var wsServer *WSServer 105 | if cfg.EnableWS { 106 | wsServer = NewWSServer(cfg.WSPort) 107 | manager.SetWSCallback(wsServer.BroadcastUpdate) 108 | 109 | if err := wsServer.Start(); err != nil { 110 | logger.Fatalf("Failed to start WebSocket server: %v", err) 111 | } 112 | logger.Infof("WebSocket server running on %s", cfg.WSPort) 113 | } 114 | 115 | var apiServer *APIServer 116 | if cfg.EnableAPI { 117 | apiServer = NewAPIServer(cfg.APIPort, manager) 118 | if err := apiServer.Start(); err != nil { 119 | logger.Fatalf("Failed to start API server: %v", err) 120 | } 121 | logger.Infof("Internal API server running on %s", cfg.APIPort) 122 | } 123 | 124 | // Start the manager 125 | if err := manager.Start(); err != nil { 126 | logger.Fatalf("Failed to start data manager: %v", err) 127 | } 128 | logger.Info("Data manager started successfully") 129 | 130 | // Handle shutdown signals 131 | sigChan := make(chan os.Signal, 1) 132 | signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) 133 | sig := <-sigChan 134 | logger.Warnf("Received signal %v, shutting down...", sig) 135 | 136 | // Graceful shutdown 137 | if cfg.EnableWS { 138 | wsServer.Stop() 139 | logger.Info("WebSocket server stopped") 140 | } 141 | 142 | manager.Stop() 143 | logger.Info("Data manager stopped") 144 | logger.Info("Shutdown complete") 145 | } 146 | -------------------------------------------------------------------------------- /storage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "log" 7 | "os" 8 | "path/filepath" 9 | "sort" 10 | "sync" 11 | 12 | "github.com/sirupsen/logrus" 13 | ) 14 | 15 | type Storage struct { 16 | outputDir string 17 | saveQueue chan *BlockData 18 | wg sync.WaitGroup 19 | shutdown chan struct{} 20 | } 21 | 22 | func NewStorage(outputDir string) (*Storage, error) { 23 | if err := os.MkdirAll(outputDir, 0755); err != nil { 24 | return nil, fmt.Errorf("failed to create output directory: %v", err) 25 | } 26 | 27 | return &Storage{ 28 | outputDir: outputDir, 29 | saveQueue: make(chan *BlockData, 100), // Buffer 100 blocks 30 | shutdown: make(chan struct{}), 31 | }, nil 32 | } 33 | 34 | func (s *Storage) Start() { 35 | s.wg.Add(1) 36 | go s.processQueue() 37 | } 38 | 39 | func (s *Storage) Stop() { 40 | close(s.shutdown) 41 | s.wg.Wait() 42 | } 43 | 44 | func (s *Storage) SaveBlock(data *BlockData) { 45 | select { 46 | case s.saveQueue <- data: 47 | default: 48 | log.Printf("Warning: Block save queue is full, dropping block %d", data.Block.Number) 49 | } 50 | } 51 | 52 | func (s *Storage) processQueue() { 53 | defer s.wg.Done() 54 | 55 | for { 56 | select { 57 | case <-s.shutdown: 58 | // Process remaining items in queue before shutting down 59 | for len(s.saveQueue) > 0 { 60 | data := <-s.saveQueue 61 | s.saveBlockToFile(data) 62 | } 63 | return 64 | 65 | case data := <-s.saveQueue: 66 | s.saveBlockToFile(data) 67 | } 68 | } 69 | } 70 | 71 | func (s *Storage) saveBlockToFile(data *BlockData) { 72 | filename := filepath.Join(s.outputDir, fmt.Sprintf("block_%d.json", data.Block.Number)) 73 | 74 | if _, err := os.Stat(filename); err == nil { 75 | log.Printf("Block %d already saved, skipping", data.Block.Number) 76 | return 77 | } 78 | 79 | file, err := os.Create(filename) 80 | if err != nil { 81 | log.Printf("Failed to create file for block %d: %v", data.Block.Number, err) 82 | return 83 | } 84 | defer file.Close() 85 | 86 | encoder := json.NewEncoder(file) 87 | encoder.SetIndent("", " ") 88 | if err := encoder.Encode(data); err != nil { 89 | log.Printf("Failed to save block %d: %v", data.Block.Number, err) 90 | // If we failed to write, try to clean up the file 91 | file.Close() 92 | os.Remove(filename) 93 | return 94 | } 95 | 96 | logger.WithFields(logrus.Fields{ 97 | "block_number": data.Block.Number, 98 | "tx_count": len(data.Txs), 99 | }).Info("Block data saved") 100 | } 101 | 102 | // GetBlock retrieves a specific block from storage 103 | func (s *Storage) GetBlock(blockNum uint64) (*BlockData, error) { 104 | // Try the standard filename first 105 | filename := filepath.Join(s.outputDir, fmt.Sprintf("block_%d.json", blockNum)) 106 | 107 | // If not found, try to find a timestamped version 108 | if _, err := os.Stat(filename); os.IsNotExist(err) { 109 | pattern := filepath.Join(s.outputDir, fmt.Sprintf("block_%d_*.json", blockNum)) 110 | matches, err := filepath.Glob(pattern) 111 | if err != nil { 112 | return nil, err 113 | } 114 | if len(matches) == 0 { 115 | return nil, fmt.Errorf("block %d not found", blockNum) 116 | } 117 | // Use the most recent version if multiple exist 118 | sort.Strings(matches) 119 | filename = matches[len(matches)-1] 120 | } 121 | 122 | file, err := os.Open(filename) 123 | if err != nil { 124 | return nil, err 125 | } 126 | defer file.Close() 127 | 128 | var blockData BlockData 129 | if err := json.NewDecoder(file).Decode(&blockData); err != nil { 130 | return nil, err 131 | } 132 | 133 | return &blockData, nil 134 | } 135 | 136 | // ListBlocks returns a sorted list of all block numbers in storage 137 | func (s *Storage) ListBlocks() ([]uint64, error) { 138 | pattern := filepath.Join(s.outputDir, "block_*.json") 139 | files, err := filepath.Glob(pattern) 140 | if err != nil { 141 | return nil, err 142 | } 143 | 144 | blockMap := make(map[uint64]struct{}) 145 | for _, file := range files { 146 | base := filepath.Base(file) 147 | var blockNum uint64 148 | // Try both formats: block_X.json and block_X_timestamp.json 149 | _, err := fmt.Sscanf(base, "block_%d.json", &blockNum) 150 | if err != nil { 151 | _, err = fmt.Sscanf(base, "block_%d_", &blockNum) 152 | if err != nil { 153 | continue 154 | } 155 | } 156 | blockMap[blockNum] = struct{}{} 157 | } 158 | 159 | blocks := make([]uint64, 0, len(blockMap)) 160 | for blockNum := range blockMap { 161 | blocks = append(blocks, blockNum) 162 | } 163 | sort.Slice(blocks, func(i, j int) bool { 164 | return blocks[i] < blocks[j] 165 | }) 166 | 167 | return blocks, nil 168 | } 169 | 170 | // GetLatestBlock retrieves the most recent block from storage 171 | func (s *Storage) GetLatestBlock() (*BlockData, error) { 172 | blocks, err := s.ListBlocks() 173 | if err != nil { 174 | return nil, err 175 | } 176 | if len(blocks) == 0 { 177 | return nil, fmt.Errorf("no blocks in storage") 178 | } 179 | return s.GetBlock(blocks[len(blocks)-1]) 180 | } 181 | 182 | // GetBlockRange retrieves a range of blocks [start, end] 183 | func (s *Storage) GetBlockRange(start, end uint64) ([]*BlockData, error) { 184 | if start > end { 185 | return nil, fmt.Errorf("invalid range: start > end") 186 | } 187 | 188 | var blocks []*BlockData 189 | for i := start; i <= end; i++ { 190 | block, err := s.GetBlock(i) 191 | if err != nil { 192 | // Skip blocks that don't exist 193 | continue 194 | } 195 | blocks = append(blocks, block) 196 | } 197 | 198 | if len(blocks) == 0 { 199 | return nil, fmt.Errorf("no blocks found in range %d-%d", start, end) 200 | } 201 | 202 | return blocks, nil 203 | } 204 | -------------------------------------------------------------------------------- /manager.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "math/big" 7 | "sync" 8 | "time" 9 | 10 | "github.com/ethereum/go-ethereum/common" 11 | "github.com/ethereum/go-ethereum/core/types" 12 | ) 13 | 14 | type DataManager struct { 15 | mempool *Mempool 16 | blockchain *Blockchain 17 | storage *Storage 18 | ready bool 19 | mu sync.RWMutex 20 | 21 | // Callbacks 22 | onWSUpdate func(WSResponse) 23 | } 24 | 25 | func NewDataManager(endpoint string, outputDir string) (*DataManager, error) { 26 | blockchain, err := NewBlockchain(endpoint) 27 | if err != nil { 28 | return nil, fmt.Errorf("failed to create blockchain: %v", err) 29 | } 30 | 31 | mempool := NewMempool() 32 | 33 | var storage *Storage 34 | if outputDir != "" { // Only create storage if outputDir is provided 35 | storage, err = NewStorage(outputDir) 36 | if err != nil { 37 | return nil, fmt.Errorf("failed to create storage: %v", err) 38 | } 39 | } 40 | 41 | manager := &DataManager{ 42 | mempool: mempool, 43 | blockchain: blockchain, 44 | storage: storage, 45 | } 46 | 47 | // Set up blockchain handlers 48 | blockchain.SetTxHandler(manager.handleNewTx) 49 | blockchain.SetBlockHandler(manager.handleNewBlock) 50 | blockchain.SetBaseFeeHandler(manager.handleBaseFee) 51 | 52 | return manager, nil 53 | } 54 | 55 | func (m *DataManager) handleNewBlock(txHashes []common.Hash) { 56 | m.mu.RLock() 57 | ready := m.ready 58 | m.mu.RUnlock() 59 | 60 | if !ready { 61 | logger.Warn("Skipping block save - warmup not complete") 62 | return 63 | } 64 | 65 | // Get block data first 66 | currentBlock := m.blockchain.GetCurrentBlock() 67 | blockHistory, err := m.blockchain.GetBlockHistory() 68 | if err != nil { 69 | log.Printf("Failed to get block history: %v", err) 70 | return 71 | } 72 | 73 | // Collect transaction data before removing from mempool 74 | txs := make([]Tx, 0, len(txHashes)) 75 | for _, hash := range txHashes { 76 | if mempoolTx, exists := m.mempool.GetTxByHash(hash); exists { 77 | tx := Tx{ 78 | Hash: hash.Hex(), 79 | SubmissionBlock: mempoolTx.FirstSeen, 80 | MaxFee: weiToString(mempoolTx.MaxFee), 81 | MaxPriorityFee: weiToString(mempoolTx.MaxPriorityFee), 82 | BaseFee: currentBlock.Block.BaseFee, 83 | Gas: mempoolTx.Gas, 84 | InclusionBlocks: currentBlock.Block.Number - mempoolTx.FirstSeen, 85 | } 86 | txs = append(txs, tx) 87 | } 88 | } 89 | 90 | // Remove from mempool 91 | m.mempool.RemoveConfirmed(txHashes) 92 | 93 | // Save complete block data 94 | if m.storage != nil { 95 | fullBlockData := BlockData{ 96 | Block: currentBlock.Block, 97 | Network: Network{ 98 | Mempool: m.mempool.GetAPIStats(), 99 | History: *blockHistory, 100 | }, 101 | Txs: txs, 102 | } 103 | m.storage.SaveBlock(&fullBlockData) 104 | } 105 | 106 | m.notifyUpdates() 107 | } 108 | 109 | func (m *DataManager) handleNewTx(tx *types.Transaction, sender common.Address) { 110 | currentBlock := m.blockchain.GetCurrentBlock() 111 | m.mempool.Add(tx, currentBlock.Block.Number) 112 | m.notifyUpdates() 113 | } 114 | 115 | func (m *DataManager) handleBaseFee(baseFee *big.Int, blockNum uint64) { 116 | currentBlock := m.blockchain.GetCurrentBlock() 117 | m.mempool.UpdateBlockData(baseFee, blockNum, currentBlock.Block.GasUsed, 35950000) // Default gas limit 118 | m.notifyUpdates() 119 | } 120 | 121 | func (m *DataManager) notifyUpdates() { 122 | if m.onWSUpdate == nil { 123 | return 124 | } 125 | 126 | // Get current data 127 | mempoolStats := m.mempool.GetWSStats() 128 | blockHistory, err := m.blockchain.GetBlockHistory() 129 | if err != nil { 130 | log.Printf("Failed to get block history: %v", err) 131 | return 132 | } 133 | 134 | // Combine data for WebSocket response 135 | response := WSResponse{ 136 | Count: mempoolStats.Count, 137 | FeeHistogram: mempoolStats.FeeHistogram, 138 | BaseFeeTrend: mempoolStats.BaseFeeTrend, 139 | NextBaseFee: mempoolStats.NextBaseFee, 140 | LastBlockTime: mempoolStats.LastBlockTime, 141 | CurrentBlockNumber: mempoolStats.NextBlock - 1, 142 | GasRatio5: blockHistory.GasRatio5, 143 | GasSpikes25: blockHistory.GasSpikes25, 144 | FeeEWMA10: blockHistory.FeeEWMA10, 145 | FeeEWMA25: blockHistory.FeeEWMA25, 146 | } 147 | 148 | m.onWSUpdate(response) 149 | } 150 | 151 | func (m *DataManager) GetAPIResponse() (*APIResponse, error) { 152 | mempoolStats := m.mempool.GetAPIStats() 153 | blockHistory, err := m.blockchain.GetBlockHistory() 154 | if err != nil { 155 | return nil, err 156 | } 157 | 158 | return &APIResponse{ 159 | Count: mempoolStats.Count, 160 | P10: mempoolStats.P10, 161 | P30: mempoolStats.P30, 162 | P50: mempoolStats.P50, 163 | P70: mempoolStats.P70, 164 | P90: mempoolStats.P90, 165 | NextBlock: mempoolStats.NextBlock, 166 | NextBaseFee: mempoolStats.NextBaseFee, 167 | History: *blockHistory, 168 | }, nil 169 | } 170 | 171 | func (m *DataManager) SetWSCallback(callback func(WSResponse)) { 172 | m.onWSUpdate = callback 173 | } 174 | 175 | func (m *DataManager) Start() error { 176 | if m.storage != nil { 177 | m.storage.Start() 178 | } 179 | 180 | // Start blockchain first 181 | if err := m.blockchain.Start(); err != nil { 182 | return err 183 | } 184 | 185 | // Warmup in background to not block startup 186 | go func() { 187 | logger.Info("Warming up mempool for 10 seconds...") 188 | time.Sleep(10 * time.Second) 189 | 190 | m.mu.Lock() 191 | m.ready = true 192 | m.mu.Unlock() 193 | 194 | logger.Info("✅ Warmup complete") 195 | }() 196 | 197 | return nil 198 | } 199 | 200 | func (m *DataManager) Stop() { 201 | m.blockchain.Stop() 202 | if m.storage != nil { 203 | m.storage.Stop() 204 | } 205 | } 206 | 207 | func weiToString(gweiValue float64) string { 208 | // Convert Gwei back to Wei 209 | weiFloat := gweiValue * 1e9 210 | return fmt.Sprintf("%.0f", weiFloat) 211 | } 212 | -------------------------------------------------------------------------------- /mempool.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "math" 6 | "math/big" 7 | "sort" 8 | "sync" 9 | "time" 10 | 11 | "github.com/ethereum/go-ethereum/common" 12 | "github.com/ethereum/go-ethereum/core/types" 13 | ) 14 | 15 | const maxMempoolSize = 10000 16 | 17 | // Core mempool data structures 18 | type MempoolTx struct { 19 | Hash common.Hash 20 | MaxFee float64 21 | MaxPriorityFee float64 22 | Gas uint64 23 | FirstSeen uint64 24 | Timestamp time.Time 25 | } 26 | 27 | // Shared data structure that holds all mempool data 28 | type MempoolData struct { 29 | Count uint64 30 | // Mempool base fee and block time 31 | CurrentBaseFee float64 32 | CurrentBlockNumber uint64 33 | 34 | LastBlockTime int64 35 | LastBaseFee float64 36 | 37 | BaseFeeTrend float64 38 | Transactions map[common.Hash]*MempoolTx 39 | } 40 | 41 | // WebSocket response format 42 | type WSMempoolStats struct { 43 | Count uint64 44 | FeeHistogram map[string]int 45 | 46 | NextBaseFee float64 47 | NextBlock uint64 48 | 49 | LastBlockTime int64 50 | 51 | BaseFeeTrend float64 52 | } 53 | 54 | // API response format 55 | type APIMempoolStats struct { 56 | Count uint64 57 | P10 float64 58 | P30 float64 59 | P50 float64 60 | P70 float64 61 | P90 float64 62 | NextBlock uint64 63 | NextBaseFee float64 64 | } 65 | 66 | type Mempool struct { 67 | data MempoolData 68 | mu sync.RWMutex 69 | ttl time.Duration 70 | 71 | // Callbacks 72 | onWSUpdate func(WSMempoolStats) 73 | onAPIUpdate func(APIMempoolStats) 74 | } 75 | 76 | func NewMempool() *Mempool { 77 | m := &Mempool{ 78 | data: MempoolData{ 79 | Transactions: make(map[common.Hash]*MempoolTx), 80 | }, 81 | ttl: time.Minute, 82 | } 83 | go m.startCleanupRoutine() 84 | return m 85 | } 86 | 87 | func (m *Mempool) Add(tx *types.Transaction, blockNum uint64) { 88 | m.mu.Lock() 89 | defer m.mu.Unlock() 90 | 91 | if len(m.data.Transactions) >= maxMempoolSize { 92 | m.evictOldestTx() 93 | } 94 | 95 | maxFee := weiToGwei(tx.GasFeeCap()) 96 | maxPriorityFee := weiToGwei(tx.GasTipCap()) 97 | 98 | m.data.Transactions[tx.Hash()] = &MempoolTx{ 99 | Hash: tx.Hash(), 100 | MaxFee: maxFee, 101 | MaxPriorityFee: maxPriorityFee, 102 | Gas: tx.Gas(), 103 | FirstSeen: uint64(m.data.LastBlockTime), 104 | Timestamp: time.Now(), 105 | } 106 | m.data.Count = uint64(len(m.data.Transactions)) 107 | 108 | m.notifyUpdates() 109 | } 110 | 111 | func (m *Mempool) evictOldestTx() { 112 | var oldestTxHash common.Hash 113 | var oldestTimestamp time.Time 114 | 115 | for hash, tx := range m.data.Transactions { 116 | if oldestTimestamp.IsZero() || tx.Timestamp.Before(oldestTimestamp) { 117 | oldestTimestamp = tx.Timestamp 118 | oldestTxHash = hash 119 | } 120 | } 121 | 122 | // Remove the oldest transaction 123 | if oldestTxHash != (common.Hash{}) { 124 | delete(m.data.Transactions, oldestTxHash) 125 | } 126 | } 127 | 128 | func calculateNextBaseFee(currentBaseFee float64, gasUsed, gasTarget uint64) float64 { 129 | if gasUsed == 0 { 130 | return currentBaseFee * 0.875 // Decrease by 12.5% 131 | } 132 | gasUsedFloat := float64(gasUsed) 133 | gasTargetFloat := float64(gasTarget) 134 | if gasUsedFloat == gasTargetFloat { 135 | return currentBaseFee 136 | } 137 | delta := (gasUsedFloat - gasTargetFloat) / gasTargetFloat 138 | changeFactor := 1.0 + math.Max(math.Min(delta/8.0, 0.125), -0.125) 139 | return currentBaseFee * changeFactor 140 | } 141 | 142 | func (m *Mempool) UpdateBlockData(baseFee *big.Int, blockNum uint64, gasUsed, gasLimit uint64) { 143 | m.mu.Lock() 144 | defer m.mu.Unlock() 145 | 146 | m.data.CurrentBaseFee = calculateNextBaseFee(weiToGwei(baseFee), gasUsed, gasLimit/2) 147 | m.data.CurrentBlockNumber = blockNum + 1 148 | m.data.LastBlockTime = time.Now().Unix() 149 | m.data.LastBaseFee = weiToGwei(baseFee) 150 | 151 | if m.data.LastBaseFee > 0 { 152 | m.data.BaseFeeTrend = ((m.data.CurrentBaseFee - m.data.LastBaseFee) / m.data.LastBaseFee) * 100 153 | } 154 | } 155 | 156 | func (m *Mempool) RemoveConfirmed(txHashes []common.Hash) { 157 | m.mu.Lock() 158 | defer m.mu.Unlock() 159 | 160 | for _, hash := range txHashes { 161 | delete(m.data.Transactions, hash) 162 | } 163 | m.data.Count = uint64(len(m.data.Transactions)) 164 | 165 | m.notifyUpdates() 166 | } 167 | 168 | func (m *Mempool) GetTxByHash(hash common.Hash) (*MempoolTx, bool) { 169 | m.mu.RLock() 170 | defer m.mu.RUnlock() 171 | 172 | tx, exists := m.data.Transactions[hash] 173 | return tx, exists 174 | } 175 | 176 | // GetWSStats returns mempool statistics for WebSocket clients 177 | func (m *Mempool) GetWSStats() WSMempoolStats { 178 | m.mu.RLock() 179 | defer m.mu.RUnlock() 180 | 181 | histogram := make(map[string]int) 182 | for _, tx := range m.data.Transactions { 183 | bucketStr := fmt.Sprintf("%.1f", tx.MaxPriorityFee) 184 | histogram[bucketStr]++ 185 | } 186 | 187 | return WSMempoolStats{ 188 | Count: uint64(len(m.data.Transactions)), 189 | FeeHistogram: histogram, 190 | BaseFeeTrend: m.data.BaseFeeTrend, 191 | NextBlock: m.data.CurrentBlockNumber, 192 | NextBaseFee: m.data.CurrentBaseFee, 193 | LastBlockTime: m.data.LastBlockTime, 194 | } 195 | } 196 | 197 | // GetAPIStats returns mempool statistics for API clients 198 | func (m *Mempool) GetAPIStats() APIMempoolStats { 199 | m.mu.RLock() 200 | defer m.mu.RUnlock() 201 | 202 | fees := make([]float64, 0, len(m.data.Transactions)) 203 | for _, tx := range m.data.Transactions { 204 | fees = append(fees, tx.MaxPriorityFee) 205 | } 206 | sort.Float64s(fees) 207 | 208 | return APIMempoolStats{ 209 | Count: m.data.Count, 210 | P10: getPercentile(fees, 10), 211 | P30: getPercentile(fees, 30), 212 | P50: getPercentile(fees, 50), 213 | P70: getPercentile(fees, 70), 214 | P90: getPercentile(fees, 90), 215 | NextBlock: m.data.CurrentBlockNumber, 216 | NextBaseFee: m.data.CurrentBaseFee, // Next == Current in mempool 217 | } 218 | } 219 | 220 | func (m *Mempool) SetWSCallback(callback func(WSMempoolStats)) { 221 | m.mu.Lock() 222 | defer m.mu.Unlock() 223 | m.onWSUpdate = callback 224 | } 225 | 226 | func (m *Mempool) SetAPICallback(callback func(APIMempoolStats)) { 227 | m.mu.Lock() 228 | defer m.mu.Unlock() 229 | m.onAPIUpdate = callback 230 | } 231 | 232 | func (m *Mempool) notifyUpdates() { 233 | if m.onWSUpdate != nil { 234 | m.onWSUpdate(m.GetWSStats()) 235 | } 236 | if m.onAPIUpdate != nil { 237 | m.onAPIUpdate(m.GetAPIStats()) 238 | } 239 | } 240 | 241 | func (m *Mempool) startCleanupRoutine() { 242 | ticker := time.NewTicker(10 * time.Second) 243 | defer ticker.Stop() 244 | 245 | for range ticker.C { 246 | m.mu.Lock() 247 | cutoff := time.Now().Add(-m.ttl) 248 | for hash, tx := range m.data.Transactions { 249 | if tx.Timestamp.Before(cutoff) { 250 | delete(m.data.Transactions, hash) 251 | } 252 | } 253 | m.data.Count = uint64(len(m.data.Transactions)) 254 | m.mu.Unlock() 255 | 256 | m.notifyUpdates() 257 | } 258 | } 259 | 260 | // Helper functions (getPercentile and weiToGwei remain the same) 261 | func getPercentile(values []float64, percentile float64) float64 { 262 | if len(values) == 0 { 263 | return 0 264 | } 265 | 266 | idx := int(float64(len(values)) * percentile / 100) 267 | if idx >= len(values) { 268 | idx = len(values) - 1 269 | } 270 | return values[idx] 271 | } 272 | 273 | func weiToGwei(wei *big.Int) float64 { 274 | if wei == nil { 275 | return 0 276 | } 277 | gwei := new(big.Float).Quo(new(big.Float).SetInt(wei), new(big.Float).SetInt64(1e9)) 278 | result, _ := gwei.Float64() 279 | return result 280 | } 281 | -------------------------------------------------------------------------------- /blockchain.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "log" 7 | "math/big" 8 | "sync" 9 | 10 | "github.com/ethereum/go-ethereum/common" 11 | "github.com/ethereum/go-ethereum/core/types" 12 | "github.com/ethereum/go-ethereum/ethclient" 13 | "github.com/ethereum/go-ethereum/rpc" 14 | ) 15 | 16 | type TxHandler func(*types.Transaction, common.Address) 17 | type BlockHandler func([]common.Hash) 18 | type BaseFeeHandler func(*big.Int, uint64) 19 | 20 | type Blockchain struct { 21 | client *ethclient.Client 22 | rpcClient *rpc.Client 23 | ctx context.Context 24 | cancel context.CancelFunc 25 | 26 | // Block window 27 | blockWindow struct { 28 | blocks [25]*types.Block 29 | lastIndex int 30 | initialized bool 31 | mu sync.RWMutex 32 | } 33 | 34 | // Current block data 35 | currentBlock struct { 36 | data BlockData 37 | mu sync.RWMutex 38 | } 39 | 40 | // Handlers 41 | handleTx TxHandler 42 | handleBlock BlockHandler 43 | handleBaseFee BaseFeeHandler 44 | } 45 | 46 | func NewBlockchain(endpoint string) (*Blockchain, error) { 47 | ctx, cancel := context.WithCancel(context.Background()) 48 | 49 | client, err := ethclient.Dial(endpoint) 50 | if err != nil { 51 | cancel() 52 | return nil, fmt.Errorf("failed to connect to Ethereum client: %v", err) 53 | } 54 | 55 | rpcClient, err := rpc.Dial(endpoint) 56 | if err != nil { 57 | cancel() 58 | return nil, fmt.Errorf("failed to connect to RPC client: %v", err) 59 | } 60 | 61 | return &Blockchain{ 62 | client: client, 63 | rpcClient: rpcClient, 64 | ctx: ctx, 65 | cancel: cancel, 66 | }, nil 67 | } 68 | 69 | func (b *Blockchain) updateBlockWindow(newBlock *types.Block) error { 70 | b.blockWindow.mu.Lock() 71 | defer b.blockWindow.mu.Unlock() 72 | 73 | if !b.blockWindow.initialized { 74 | for i := 24; i >= 0; i-- { 75 | blockNum := newBlock.NumberU64() - uint64(i) - 1 76 | block, err := b.client.BlockByNumber(b.ctx, big.NewInt(int64(blockNum))) 77 | if err != nil { 78 | return fmt.Errorf("failed to get historical block %d: %v", blockNum, err) 79 | } 80 | b.blockWindow.blocks[24-i] = block 81 | } 82 | b.blockWindow.initialized = true 83 | b.blockWindow.lastIndex = 24 84 | return nil 85 | } 86 | 87 | b.blockWindow.lastIndex = (b.blockWindow.lastIndex + 1) % 25 88 | b.blockWindow.blocks[b.blockWindow.lastIndex] = newBlock 89 | return nil 90 | } 91 | 92 | func (b *Blockchain) GetBlockHistory() (*BlockHistory, error) { 93 | b.blockWindow.mu.RLock() 94 | defer b.blockWindow.mu.RUnlock() 95 | 96 | if !b.blockWindow.initialized { 97 | return nil, fmt.Errorf("block window not initialized") 98 | } 99 | 100 | var gasRatios []float64 101 | var gasSpikes int 102 | var fees []float64 103 | 104 | blocks := make([]*types.Block, 25) 105 | for i := 0; i < 25; i++ { 106 | idx := (b.blockWindow.lastIndex - i + 25) % 25 107 | blocks[i] = b.blockWindow.blocks[idx] 108 | } 109 | 110 | for _, block := range blocks { 111 | gasRatio := float64(block.GasUsed()) / float64(block.GasLimit()) 112 | gasRatios = append(gasRatios, gasRatio) 113 | 114 | if gasRatio > 0.9 { 115 | gasSpikes++ 116 | } 117 | 118 | fees = append(fees, weiToGwei(block.BaseFee())) 119 | } 120 | 121 | return &BlockHistory{ 122 | GasRatio5: average(gasRatios[:5]), 123 | GasSpikes25: gasSpikes, 124 | FeeEWMA10: calculateEWMA(fees[:10], 0.2), 125 | FeeEWMA25: calculateEWMA(fees, 0.1), 126 | }, nil 127 | } 128 | 129 | func (b *Blockchain) updateCurrentBlock(block *types.Block) { 130 | b.currentBlock.mu.Lock() 131 | defer b.currentBlock.mu.Unlock() 132 | 133 | b.currentBlock.data = BlockData{ 134 | Block: Block{ 135 | Number: block.NumberU64(), 136 | Timestamp: block.Time(), 137 | BaseFee: block.BaseFee().String(), 138 | GasUsed: block.GasUsed(), 139 | }, 140 | Network: Network{ 141 | Mempool: APIMempoolStats{}, 142 | History: BlockHistory{}, 143 | }, 144 | Txs: []Tx{}, 145 | } 146 | } 147 | 148 | func (b *Blockchain) GetCurrentBlock() BlockData { 149 | b.currentBlock.mu.RLock() 150 | defer b.currentBlock.mu.RUnlock() 151 | return b.currentBlock.data 152 | } 153 | 154 | func (b *Blockchain) SetTxHandler(handler TxHandler) { 155 | b.handleTx = handler 156 | } 157 | 158 | func (b *Blockchain) SetBlockHandler(handler BlockHandler) { 159 | b.handleBlock = handler 160 | } 161 | 162 | func (b *Blockchain) SetBaseFeeHandler(handler BaseFeeHandler) { 163 | b.handleBaseFee = handler 164 | } 165 | 166 | func (b *Blockchain) Start() error { 167 | header, err := b.client.HeaderByNumber(context.Background(), nil) 168 | if err != nil { 169 | return fmt.Errorf("failed to get latest block: %v", err) 170 | } 171 | 172 | block, err := b.client.BlockByHash(context.Background(), header.Hash()) 173 | if err != nil { 174 | return fmt.Errorf("failed to get latest block: %v", err) 175 | } 176 | 177 | if err := b.updateBlockWindow(block); err != nil { 178 | return fmt.Errorf("failed to initialize block window: %v", err) 179 | } 180 | b.updateCurrentBlock(block) 181 | 182 | logger.Info("Block window initialized") 183 | 184 | pendingTxs := make(chan common.Hash) 185 | pendingSub, err := b.rpcClient.EthSubscribe(context.Background(), pendingTxs, "newPendingTransactions") 186 | if err != nil { 187 | return fmt.Errorf("failed to subscribe to pending transactions: %v", err) 188 | } 189 | 190 | headers := make(chan *types.Header) 191 | headerSub, err := b.client.SubscribeNewHead(b.ctx, headers) 192 | if err != nil { 193 | pendingSub.Unsubscribe() 194 | return fmt.Errorf("failed to subscribe to new headers: %v", err) 195 | } 196 | 197 | logger.Info("Connected to Ethereum network") 198 | 199 | go func() { 200 | defer pendingSub.Unsubscribe() 201 | defer headerSub.Unsubscribe() 202 | 203 | for { 204 | select { 205 | case <-b.ctx.Done(): 206 | return 207 | 208 | case err := <-pendingSub.Err(): 209 | log.Printf("Pending tx subscription error: %v", err) 210 | return 211 | 212 | case err := <-headerSub.Err(): 213 | log.Printf("Header subscription error: %v", err) 214 | return 215 | 216 | case txHash := <-pendingTxs: 217 | if b.handleTx == nil { 218 | continue 219 | } 220 | 221 | tx, isPending, err := b.client.TransactionByHash(context.Background(), txHash) 222 | if err != nil || !isPending { 223 | continue 224 | } 225 | 226 | sender, err := types.Sender(types.NewCancunSigner(tx.ChainId()), tx) 227 | if err != nil { 228 | continue 229 | } 230 | 231 | b.handleTx(tx, sender) 232 | 233 | case header := <-headers: 234 | block, err := b.client.BlockByHash(b.ctx, header.Hash()) 235 | if err != nil { 236 | continue 237 | } 238 | 239 | if err := b.updateBlockWindow(block); err != nil { 240 | log.Printf("Failed to update block window: %v", err) 241 | } 242 | b.updateCurrentBlock(block) 243 | 244 | // Handle base fee updates 245 | if b.handleBaseFee != nil { 246 | b.handleBaseFee(header.BaseFee, header.Number.Uint64()) 247 | } 248 | 249 | // Handle confirmed transactions 250 | if b.handleBlock != nil { 251 | var txHashes []common.Hash 252 | for _, tx := range block.Transactions() { 253 | txHashes = append(txHashes, tx.Hash()) 254 | } 255 | b.handleBlock(txHashes) 256 | } 257 | } 258 | } 259 | }() 260 | 261 | return nil 262 | } 263 | 264 | func (b *Blockchain) Stop() { 265 | b.cancel() 266 | } 267 | 268 | // Helper functions 269 | func average(values []float64) float64 { 270 | if len(values) == 0 { 271 | return 0 272 | } 273 | sum := 0.0 274 | for _, v := range values { 275 | sum += v 276 | } 277 | return sum / float64(len(values)) 278 | } 279 | 280 | func calculateEWMA(values []float64, alpha float64) float64 { 281 | if len(values) == 0 { 282 | return 0 283 | } 284 | 285 | ewma := values[0] 286 | for i := 1; i < len(values); i++ { 287 | ewma = alpha*values[i] + (1-alpha)*ewma 288 | } 289 | return ewma 290 | } 291 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= 2 | github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= 3 | github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= 4 | github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= 5 | github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= 6 | github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= 7 | github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= 8 | github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= 9 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 10 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 11 | github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI= 12 | github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= 13 | github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 14 | github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 15 | github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= 16 | github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= 17 | github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= 18 | github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= 19 | github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= 20 | github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= 21 | github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= 22 | github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= 23 | github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= 24 | github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= 25 | github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= 26 | github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= 27 | github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= 28 | github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= 29 | github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= 30 | github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= 31 | github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= 32 | github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 33 | github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= 34 | github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= 35 | github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= 36 | github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= 37 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 38 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 39 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 40 | github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= 41 | github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= 42 | github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= 43 | github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= 44 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= 45 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= 46 | github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= 47 | github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= 48 | github.com/ethereum/go-ethereum v1.15.2 h1:CcU13w1IXOo6FvS60JGCTVcAJ5Ik6RkWoVIvziiHdTU= 49 | github.com/ethereum/go-ethereum v1.15.2/go.mod h1:wGQINJKEVUunCeoaA9C9qKMQ9GEOsEIunzzqTUO2F6Y= 50 | github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= 51 | github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= 52 | github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= 53 | github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= 54 | github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= 55 | github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= 56 | github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 57 | github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= 58 | github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= 59 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 60 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 61 | github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= 62 | github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= 63 | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 64 | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 65 | github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= 66 | github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 67 | github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= 68 | github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= 69 | github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 70 | github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= 71 | github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= 72 | github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= 73 | github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= 74 | github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= 75 | github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= 76 | github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= 77 | github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= 78 | github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= 79 | github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= 80 | github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= 81 | github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= 82 | github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= 83 | github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= 84 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 85 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 86 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 87 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 88 | github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= 89 | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 90 | github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= 91 | github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= 92 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 93 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 94 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 95 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 96 | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= 97 | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 98 | github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= 99 | github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 100 | github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= 101 | github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 102 | github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= 103 | github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= 104 | github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= 105 | github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= 106 | github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= 107 | github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= 108 | github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 109 | github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= 110 | github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= 111 | github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= 112 | github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= 113 | github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= 114 | github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= 115 | github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c= 116 | github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= 117 | github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= 118 | github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= 119 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 120 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 121 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 122 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 123 | github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg= 124 | github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= 125 | github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y= 126 | github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= 127 | github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= 128 | github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= 129 | github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= 130 | github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 131 | github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= 132 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 133 | github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= 134 | github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= 135 | github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= 136 | github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= 137 | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 138 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 139 | github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= 140 | github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= 141 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 142 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 143 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 144 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 145 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 146 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 147 | github.com/supranational/blst v0.3.14 h1:xNMoHRJOTwMn63ip6qoWJ2Ymgvj7E2b9jY2FAwY+qRo= 148 | github.com/supranational/blst v0.3.14/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= 149 | github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= 150 | github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= 151 | github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= 152 | github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= 153 | github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= 154 | github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= 155 | github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= 156 | github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= 157 | github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= 158 | github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= 159 | golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= 160 | golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= 161 | golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= 162 | golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= 163 | golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= 164 | golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 165 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 166 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 167 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 168 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 169 | golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 170 | golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= 171 | golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 172 | golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= 173 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 174 | golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= 175 | golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 176 | google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= 177 | google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 178 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 179 | gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= 180 | gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= 181 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 182 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 183 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 184 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 185 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 186 | rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= 187 | rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= 188 | -------------------------------------------------------------------------------- /example_data/block_21910220.json: -------------------------------------------------------------------------------- 1 | { 2 | "block": { 3 | "number": 21910220, 4 | "timestamp": 1740328139, 5 | "base_fee": "969658236", 6 | "gas_used": 14487817 7 | }, 8 | "network": { 9 | "mempool": { 10 | "Count": 24, 11 | "P10": 0.001250353, 12 | "P30": 0.1, 13 | "P50": 0.6, 14 | "P70": 1, 15 | "P90": 1.172151032, 16 | "NextBlock": 21910221, 17 | "NextBaseFee": 0.9461438012545954 18 | }, 19 | "history": { 20 | "gas_ratio_5": 0.5221931449416731, 21 | "gas_spikes_25": 2, 22 | "fee_ewma_10": 0.8935750743980182, 23 | "fee_ewma_25": 0.8842990131350978 24 | } 25 | }, 26 | "txs": [ 27 | { 28 | "hash": "0x3f4b3fb4c436d669507e9c35f9ff675eea33203cb721d05a0a25ff9e10a76c41", 29 | "submission_block": 1740328131, 30 | "max_fee": "25000000000", 31 | "max_priority_fee": "25000000000", 32 | "base_fee": "969658236", 33 | "gas": 250000, 34 | "inclusion_blocks": 18446744071991133705 35 | }, 36 | { 37 | "hash": "0x34b7e3284ba567d1f3a5b73793099daeaadaaac9338a850cc5e63eea7d3e1ece", 38 | "submission_block": 1740328131, 39 | "max_fee": "10000000000", 40 | "max_priority_fee": "10000000000", 41 | "base_fee": "969658236", 42 | "gas": 500000, 43 | "inclusion_blocks": 18446744071991133705 44 | }, 45 | { 46 | "hash": "0xc64e395ff9419f55f04bf529aada3a4e4346554c35e535995dae0ead7c6bc921", 47 | "submission_block": 1740328131, 48 | "max_fee": "10000000000", 49 | "max_priority_fee": "10000000000", 50 | "base_fee": "969658236", 51 | "gas": 500000, 52 | "inclusion_blocks": 18446744071991133705 53 | }, 54 | { 55 | "hash": "0xa74352fd1673c084a57d8cdfa4f119ca87928720c2942397b134c5da4b782f29", 56 | "submission_block": 1740328131, 57 | "max_fee": "15030000000", 58 | "max_priority_fee": "5010000000", 59 | "base_fee": "969658236", 60 | "gas": 21000, 61 | "inclusion_blocks": 18446744071991133705 62 | }, 63 | { 64 | "hash": "0x5228e3694b1e488d0ed7bda8f17daa5e2c6fb04749607753747158a7e6868db8", 65 | "submission_block": 1740328131, 66 | "max_fee": "3056670447", 67 | "max_priority_fee": "3056670447", 68 | "base_fee": "969658236", 69 | "gas": 65000, 70 | "inclusion_blocks": 18446744071991133705 71 | }, 72 | { 73 | "hash": "0x94ea0a9e07eb26f0fd265a9730e0c035fb09746484f82e15449917051704acf5", 74 | "submission_block": 1740328131, 75 | "max_fee": "102000000000", 76 | "max_priority_fee": "2000000000", 77 | "base_fee": "969658236", 78 | "gas": 207128, 79 | "inclusion_blocks": 18446744071991133705 80 | }, 81 | { 82 | "hash": "0x7ce85ea8fb01cae899725826c33bde8054303a07bf2d118c6f337a0377e93b7d", 83 | "submission_block": 1740328131, 84 | "max_fee": "3423600258", 85 | "max_priority_fee": "2000000000", 86 | "base_fee": "969658236", 87 | "gas": 100000, 88 | "inclusion_blocks": 18446744071991133705 89 | }, 90 | { 91 | "hash": "0x9cdfa664b98085f2514dac8ebcb1f58eee91a4453185876f17c779f0beee04cf", 92 | "submission_block": 0, 93 | "max_fee": "10000000000", 94 | "max_priority_fee": "2000000000", 95 | "base_fee": "969658236", 96 | "gas": 150000, 97 | "inclusion_blocks": 21910220 98 | }, 99 | { 100 | "hash": "0xaa3079af45d6a5a2dab54de1966ea1808d98f08fcbf46f1f73999ef6ead2b512", 101 | "submission_block": 0, 102 | "max_fee": "60000000000", 103 | "max_priority_fee": "2000000000", 104 | "base_fee": "969658236", 105 | "gas": 207128, 106 | "inclusion_blocks": 21910220 107 | }, 108 | { 109 | "hash": "0x2e62c83dca3152546385b437fe8f021203799af8c6c7b6a9f71e374897777aee", 110 | "submission_block": 1740328131, 111 | "max_fee": "6250000000", 112 | "max_priority_fee": "2000000000", 113 | "base_fee": "969658236", 114 | "gas": 80000, 115 | "inclusion_blocks": 18446744071991133705 116 | }, 117 | { 118 | "hash": "0xcbd6e63c2f466fe418467a895d6d22c63e7977d1d62a13c3c2614ffa5b9ab1b0", 119 | "submission_block": 1740328131, 120 | "max_fee": "102000000000", 121 | "max_priority_fee": "2000000000", 122 | "base_fee": "969658236", 123 | "gas": 220436, 124 | "inclusion_blocks": 18446744071991133705 125 | }, 126 | { 127 | "hash": "0x899ae6b628202d6ce2f4b2635bc4664cd30235790250bf7b6b027e50c2d4614d", 128 | "submission_block": 1740328131, 129 | "max_fee": "102000000000", 130 | "max_priority_fee": "2000000000", 131 | "base_fee": "969658236", 132 | "gas": 220436, 133 | "inclusion_blocks": 18446744071991133705 134 | }, 135 | { 136 | "hash": "0xf35f3088cd99a3f9bf4b6cc1590c519309f0e1d160856d93835a56a6a1ee34df", 137 | "submission_block": 1740328131, 138 | "max_fee": "102000000000", 139 | "max_priority_fee": "2000000000", 140 | "base_fee": "969658236", 141 | "gas": 207128, 142 | "inclusion_blocks": 18446744071991133705 143 | }, 144 | { 145 | "hash": "0xf58ad7bb05f75498fdeeda940fe08469909cd2af02cf71cd36ecfc22610384e7", 146 | "submission_block": 1740328131, 147 | "max_fee": "102000000000", 148 | "max_priority_fee": "2000000000", 149 | "base_fee": "969658236", 150 | "gas": 220436, 151 | "inclusion_blocks": 18446744071991133705 152 | }, 153 | { 154 | "hash": "0xc319705c9023febf8c5cf29cbfac42977cf128d65955f9dc380d8a73ca8d596c", 155 | "submission_block": 1740328131, 156 | "max_fee": "102000000000", 157 | "max_priority_fee": "2000000000", 158 | "base_fee": "969658236", 159 | "gas": 207128, 160 | "inclusion_blocks": 18446744071991133705 161 | }, 162 | { 163 | "hash": "0x79150a72070b725be8129e00b29294ae8636445446f4b0f9754f05a07a77e77f", 164 | "submission_block": 1740328131, 165 | "max_fee": "2004416027", 166 | "max_priority_fee": "600000000", 167 | "base_fee": "969658236", 168 | "gas": 192729, 169 | "inclusion_blocks": 18446744071991133705 170 | }, 171 | { 172 | "hash": "0xb296f5d5e23f415e8711b7eee0c99fd3678078727ca5e7fc0a368146dcc5f288", 173 | "submission_block": 1740328131, 174 | "max_fee": "2002283144", 175 | "max_priority_fee": "2002283144", 176 | "base_fee": "969658236", 177 | "gas": 90000, 178 | "inclusion_blocks": 18446744071991133705 179 | }, 180 | { 181 | "hash": "0xa06085cfccb485246f5e1bf89e2900906e932b117eaaa0eceb8206f55323a1af", 182 | "submission_block": 1740328131, 183 | "max_fee": "3000000000", 184 | "max_priority_fee": "1000000000", 185 | "base_fee": "969658236", 186 | "gas": 21532, 187 | "inclusion_blocks": 18446744071991133705 188 | }, 189 | { 190 | "hash": "0xacec0daea9fa3bb7473d265e112d3d3f84dd4b2acd1c6c607a56441602b1be4f", 191 | "submission_block": 1740328131, 192 | "max_fee": "2289666413", 193 | "max_priority_fee": "987744732", 194 | "base_fee": "969658236", 195 | "gas": 21000, 196 | "inclusion_blocks": 18446744071991133705 197 | }, 198 | { 199 | "hash": "0x8976092a7cc78f209e418581b76439cfb5523bd25ceb82ae20535664bb0fd5d0", 200 | "submission_block": 1740328131, 201 | "max_fee": "2433339150", 202 | "max_priority_fee": "500000000", 203 | "base_fee": "969658236", 204 | "gas": 393585, 205 | "inclusion_blocks": 18446744071991133705 206 | }, 207 | { 208 | "hash": "0xb213d25175b4fc566446b505698828eb1ba0f6b06aa79eee1276fbdde0607ac0", 209 | "submission_block": 1740328131, 210 | "max_fee": "1570000000", 211 | "max_priority_fee": "1570000000", 212 | "base_fee": "969658236", 213 | "gas": 65000, 214 | "inclusion_blocks": 18446744071991133705 215 | }, 216 | { 217 | "hash": "0xcd0ccafaa213f0c5d43129db4fe9ab0b8e4ae6dd486f959f7df4e1cb5dcb225a", 218 | "submission_block": 1740328131, 219 | "max_fee": "1794416026", 220 | "max_priority_fee": "600000000", 221 | "base_fee": "969658236", 222 | "gas": 430647, 223 | "inclusion_blocks": 18446744071991133705 224 | }, 225 | { 226 | "hash": "0x8fc76c05b45834d0145652858e2e9ca4d5aa63313d25c545328e7703b0007db1", 227 | "submission_block": 1740328131, 228 | "max_fee": "1870000000", 229 | "max_priority_fee": "600000000", 230 | "base_fee": "969658236", 231 | "gas": 21000, 232 | "inclusion_blocks": 18446744071991133705 233 | }, 234 | { 235 | "hash": "0x5407ebc7d1a4f70564b8a3d121693451c56e6dff78c93f224408bcfe2cf18abc", 236 | "submission_block": 1740328131, 237 | "max_fee": "1870000000", 238 | "max_priority_fee": "600000000", 239 | "base_fee": "969658236", 240 | "gas": 21000, 241 | "inclusion_blocks": 18446744071991133705 242 | }, 243 | { 244 | "hash": "0x1432848abaa040d8d333da9118135bccc03441e2a1ec09197c7ef2bee0ad47c7", 245 | "submission_block": 0, 246 | "max_fee": "1794416026", 247 | "max_priority_fee": "600000000", 248 | "base_fee": "969658236", 249 | "gas": 1257246, 250 | "inclusion_blocks": 21910220 251 | }, 252 | { 253 | "hash": "0x4aa8bb9f6c6ae07a02ae2c9568eabe3b055b6ec778ad3c1be5c0d356ab48994e", 254 | "submission_block": 0, 255 | "max_fee": "1794416026", 256 | "max_priority_fee": "600000000", 257 | "base_fee": "969658236", 258 | "gas": 494370, 259 | "inclusion_blocks": 21910220 260 | }, 261 | { 262 | "hash": "0xc6db279754875d4ac4e05036a8589aba4e965e3d28787e08395dd9aebef54602", 263 | "submission_block": 1740328131, 264 | "max_fee": "1855377575", 265 | "max_priority_fee": "500000000", 266 | "base_fee": "969658236", 267 | "gas": 219201, 268 | "inclusion_blocks": 18446744071991133705 269 | }, 270 | { 271 | "hash": "0x87653d12870a26d61f46c492e6c9bbba7ce9bf5e6c11a41c3c9ad794615ab32f", 272 | "submission_block": 1740328131, 273 | "max_fee": "1448455176", 274 | "max_priority_fee": "1448455176", 275 | "base_fee": "969658236", 276 | "gas": 52006, 277 | "inclusion_blocks": 18446744071991133705 278 | }, 279 | { 280 | "hash": "0x84dfef0b431b220feb6b355ffb000943a0a9493f32fce1f4c7d63adccb78d588", 281 | "submission_block": 1740328131, 282 | "max_fee": "2101922085", 283 | "max_priority_fee": "428404527", 284 | "base_fee": "969658236", 285 | "gas": 134043, 286 | "inclusion_blocks": 18446744071991133705 287 | }, 288 | { 289 | "hash": "0x19b76cd0236a7f84eafffae9826bdee5f40e0e93734d735b2ce45cd499a465cb", 290 | "submission_block": 1740328131, 291 | "max_fee": "1393804696", 292 | "max_priority_fee": "1393804696", 293 | "base_fee": "969658236", 294 | "gas": 21000, 295 | "inclusion_blocks": 18446744071991133705 296 | }, 297 | { 298 | "hash": "0xabe3875208d2a939a6f4e49924db25dd8f6cbf99cf4cf68f688b630160a6af14", 299 | "submission_block": 1740328131, 300 | "max_fee": "1429828249", 301 | "max_priority_fee": "306192432", 302 | "base_fee": "969658236", 303 | "gas": 63221, 304 | "inclusion_blocks": 18446744071991133705 305 | }, 306 | { 307 | "hash": "0xf456be10cad96ea227a73a9d4695b1707ea7367b57b11a2e1f3b589cc8ca7365", 308 | "submission_block": 1740328131, 309 | "max_fee": "1429828249", 310 | "max_priority_fee": "306192432", 311 | "base_fee": "969658236", 312 | "gas": 356678, 313 | "inclusion_blocks": 18446744071991133705 314 | }, 315 | { 316 | "hash": "0xc2af2bdd555f6abaf6e24f6fca2fb778cff1b67324ac69530f6891f8a0795999", 317 | "submission_block": 1740328131, 318 | "max_fee": "1909815716", 319 | "max_priority_fee": "261864002", 320 | "base_fee": "969658236", 321 | "gas": 216952, 322 | "inclusion_blocks": 18446744071991133705 323 | }, 324 | { 325 | "hash": "0x3727a332940bd253d5a3b3659a4939f2c673adf17a7a20a5f88ddc3d3d378872", 326 | "submission_block": 1740328131, 327 | "max_fee": "1909815716", 328 | "max_priority_fee": "261864002", 329 | "base_fee": "969658236", 330 | "gas": 199808, 331 | "inclusion_blocks": 18446744071991133705 332 | }, 333 | { 334 | "hash": "0x2e0a0b89ead5a5fb45266072812f943a1b36af122d0a762f9f72ae61fcd022a6", 335 | "submission_block": 1740328131, 336 | "max_fee": "2255193190", 337 | "max_priority_fee": "575000000", 338 | "base_fee": "969658236", 339 | "gas": 198855, 340 | "inclusion_blocks": 18446744071991133705 341 | }, 342 | { 343 | "hash": "0x6374113c5cf3c4fcb653d56e28d11fcdcf94d01e5fe2523c636ba260cd83fc78", 344 | "submission_block": 1740328131, 345 | "max_fee": "1288435558", 346 | "max_priority_fee": "221811498", 347 | "base_fee": "969658236", 348 | "gas": 21000, 349 | "inclusion_blocks": 18446744071991133705 350 | }, 351 | { 352 | "hash": "0x62887b09726b35f6eec9dc50fd53c31ec988d34d9a0c2e47344fa6d03d579d2e", 353 | "submission_block": 1740328131, 354 | "max_fee": "1120006626", 355 | "max_priority_fee": "1120006626", 356 | "base_fee": "969658236", 357 | "gas": 21000, 358 | "inclusion_blocks": 18446744071991133705 359 | }, 360 | { 361 | "hash": "0xc69a77604c26c56e8ece7bc104f4313e30dbfd9ed94d3c34ee94cdb5b796dca0", 362 | "submission_block": 0, 363 | "max_fee": "1081773060", 364 | "max_priority_fee": "1081773060", 365 | "base_fee": "969658236", 366 | "gas": 74386, 367 | "inclusion_blocks": 21910220 368 | }, 369 | { 370 | "hash": "0x15797c69649ef1f9e17ae14963211488053d1308ed840d722e90b24caf65a8ff", 371 | "submission_block": 0, 372 | "max_fee": "1081773060", 373 | "max_priority_fee": "1081773060", 374 | "base_fee": "969658236", 375 | "gas": 21000, 376 | "inclusion_blocks": 21910220 377 | }, 378 | { 379 | "hash": "0x277a8a7d2d3a23ea10afabdbb3360808d31166bf83d7b330eca18f9e00336d55", 380 | "submission_block": 1740328131, 381 | "max_fee": "1073639331", 382 | "max_priority_fee": "1073639331", 383 | "base_fee": "969658236", 384 | "gas": 21000, 385 | "inclusion_blocks": 18446744071991133705 386 | }, 387 | { 388 | "hash": "0xbf3064ec4df9cb6a975acd2d5658a1b7366134f372b893b3a0ddb03b367babd7", 389 | "submission_block": 1740328131, 390 | "max_fee": "11066669575", 391 | "max_priority_fee": "100000000", 392 | "base_fee": "969658236", 393 | "gas": 408879, 394 | "inclusion_blocks": 18446744071991133705 395 | }, 396 | { 397 | "hash": "0x63a3468be08eb8fed3f7fc5635ef49fa148bb320d3a17d416e18f1d0f1f58ee2", 398 | "submission_block": 1740328131, 399 | "max_fee": "1094990247", 400 | "max_priority_fee": "100000000", 401 | "base_fee": "969658236", 402 | "gas": 21000, 403 | "inclusion_blocks": 18446744071991133705 404 | }, 405 | { 406 | "hash": "0x45fda9a399bf33968ba993a89c56b4b30ad6e0280e94d339ce3a3df30eca6bcb", 407 | "submission_block": 1740328131, 408 | "max_fee": "1106148687", 409 | "max_priority_fee": "100000000", 410 | "base_fee": "969658236", 411 | "gas": 21000, 412 | "inclusion_blocks": 18446744071991133705 413 | }, 414 | { 415 | "hash": "0x0ffe78be34502412d01ad74dabcf5bbd67edf1e25d8715dc69a5547caef20937", 416 | "submission_block": 0, 417 | "max_fee": "1155293543", 418 | "max_priority_fee": "89000000", 419 | "base_fee": "969658236", 420 | "gas": 70434, 421 | "inclusion_blocks": 21910220 422 | }, 423 | { 424 | "hash": "0xaa3bc969dd00a42a5fdb51c4e9cd55af266d56a0aa42066acf305c4eec3910f8", 425 | "submission_block": 1740328131, 426 | "max_fee": "2010000000", 427 | "max_priority_fee": "79000000", 428 | "base_fee": "969658236", 429 | "gas": 51127, 430 | "inclusion_blocks": 18446744071991133705 431 | }, 432 | { 433 | "hash": "0xc13ebcf0cca0aef5588f580da72c8c785a7ce3921795d3b9a7933a1fca68fbff", 434 | "submission_block": 1740328131, 435 | "max_fee": "1970000000", 436 | "max_priority_fee": "79000000", 437 | "base_fee": "969658236", 438 | "gas": 376691, 439 | "inclusion_blocks": 18446744071991133705 440 | }, 441 | { 442 | "hash": "0x5b5155560a29c40f774d5578d019772cdfbe40907820aec37811fdbc9a564b3e", 443 | "submission_block": 1740328131, 444 | "max_fee": "2010000000", 445 | "max_priority_fee": "79000000", 446 | "base_fee": "969658236", 447 | "gas": 364077, 448 | "inclusion_blocks": 18446744071991133705 449 | }, 450 | { 451 | "hash": "0xf088c0b9734739b9b1c6166133683b890efdb109421637af650b5fd35e4c48d1", 452 | "submission_block": 1740328131, 453 | "max_fee": "1015600000", 454 | "max_priority_fee": "1015600000", 455 | "base_fee": "969658236", 456 | "gas": 46468, 457 | "inclusion_blocks": 18446744071991133705 458 | }, 459 | { 460 | "hash": "0x16e5c924621ebc9c3d8238e2f0f31b7da873ad0a0b13d8fd05698eaf0bcfa16a", 461 | "submission_block": 1740328131, 462 | "max_fee": "1015600000", 463 | "max_priority_fee": "1015600000", 464 | "base_fee": "969658236", 465 | "gas": 46468, 466 | "inclusion_blocks": 18446744071991133705 467 | }, 468 | { 469 | "hash": "0x63d86774ec6db901f0ec7566cdf34107df46aec62a04735094933c398593ef72", 470 | "submission_block": 1740328131, 471 | "max_fee": "1015600000", 472 | "max_priority_fee": "1015600000", 473 | "base_fee": "969658236", 474 | "gas": 54790, 475 | "inclusion_blocks": 18446744071991133705 476 | }, 477 | { 478 | "hash": "0xd1d6f0309ab8dba516dac277958ca02eae1e86d8d5b30194a73039a00390bada", 479 | "submission_block": 1740328131, 480 | "max_fee": "1015600000", 481 | "max_priority_fee": "1015600000", 482 | "base_fee": "969658236", 483 | "gas": 46468, 484 | "inclusion_blocks": 18446744071991133705 485 | }, 486 | { 487 | "hash": "0x2d68dcc280decc8921f763cbad1721d35352c6a0362f63d700703e80c9e70d5f", 488 | "submission_block": 1740328131, 489 | "max_fee": "1015600000", 490 | "max_priority_fee": "1015600000", 491 | "base_fee": "969658236", 492 | "gas": 64020, 493 | "inclusion_blocks": 18446744071991133705 494 | }, 495 | { 496 | "hash": "0x9a2ea60124686cd6b0070fba4840bb7e813c66b18916ab20c56d5e2e27ad3787", 497 | "submission_block": 1740328131, 498 | "max_fee": "1015600000", 499 | "max_priority_fee": "1015600000", 500 | "base_fee": "969658236", 501 | "gas": 46468, 502 | "inclusion_blocks": 18446744071991133705 503 | }, 504 | { 505 | "hash": "0xf74744bdfd8f9e1480a1125ccfed3fa9e92e3e0514dfd7e531cdd917fcfe6e99", 506 | "submission_block": 1740328131, 507 | "max_fee": "1015600000", 508 | "max_priority_fee": "1015600000", 509 | "base_fee": "969658236", 510 | "gas": 46468, 511 | "inclusion_blocks": 18446744071991133705 512 | }, 513 | { 514 | "hash": "0xad82ae45d9f98ae89d061510016d52bace00a491914db9ee6ef7b50de229adde", 515 | "submission_block": 1740328131, 516 | "max_fee": "1015600000", 517 | "max_priority_fee": "1015600000", 518 | "base_fee": "969658236", 519 | "gas": 46468, 520 | "inclusion_blocks": 18446744071991133705 521 | }, 522 | { 523 | "hash": "0x3a9ead6a872bbcf487a90049bace3773b4a1b1937afeb570748ca69025f16eb9", 524 | "submission_block": 1740328131, 525 | "max_fee": "1969728466", 526 | "max_priority_fee": "40955604", 527 | "base_fee": "969658236", 528 | "gas": 199808, 529 | "inclusion_blocks": 18446744071991133705 530 | }, 531 | { 532 | "hash": "0xb6eff219267a73a97e6ed07f65a02c5025bf0e3dd897575a70680bb70c4b620c", 533 | "submission_block": 1740328131, 534 | "max_fee": "1000000000", 535 | "max_priority_fee": "1000000000", 536 | "base_fee": "969658236", 537 | "gas": 21000, 538 | "inclusion_blocks": 18446744071991133705 539 | }, 540 | { 541 | "hash": "0x117a5b6d76a2efe922cf0b9ce968bb4e420671443caf543c05bbb33ab1a1965e", 542 | "submission_block": 1740328131, 543 | "max_fee": "1000000000", 544 | "max_priority_fee": "1000000000", 545 | "base_fee": "969658236", 546 | "gas": 22000, 547 | "inclusion_blocks": 18446744071991133705 548 | }, 549 | { 550 | "hash": "0xfa080b04385a8dd120f93050d184b61afcd99dec234fc736c36360bf14158c9d", 551 | "submission_block": 0, 552 | "max_fee": "1000000000", 553 | "max_priority_fee": "1000000000", 554 | "base_fee": "969658236", 555 | "gas": 75000, 556 | "inclusion_blocks": 21910220 557 | }, 558 | { 559 | "hash": "0x03cb22c51c54d4ee2049e9c8ae00b97af3eb6e3ba396f22f722f0aed1a6e7754", 560 | "submission_block": 1740328131, 561 | "max_fee": "1000000000", 562 | "max_priority_fee": "1000000000", 563 | "base_fee": "969658236", 564 | "gas": 22000, 565 | "inclusion_blocks": 18446744071991133705 566 | }, 567 | { 568 | "hash": "0x96fa3097445d08514cad76d90e3201b1ed02e29b2829ce355ddecb11c60bc9a5", 569 | "submission_block": 1740328131, 570 | "max_fee": "1000000000", 571 | "max_priority_fee": "1000000000", 572 | "base_fee": "969658236", 573 | "gas": 2400000, 574 | "inclusion_blocks": 18446744071991133705 575 | }, 576 | { 577 | "hash": "0xa6255aa605dcb765da970a9b3b63ee79bb3fdd32c25dcabdd63c4f2636ab6b51", 578 | "submission_block": 1740328131, 579 | "max_fee": "997141824", 580 | "max_priority_fee": "112389212", 581 | "base_fee": "969658236", 582 | "gas": 70000, 583 | "inclusion_blocks": 18446744071991133705 584 | }, 585 | { 586 | "hash": "0xbd14b88fbe1147b713ee3bcdd903dfb710a64c5250cd191926ef46ebb8ba55a4", 587 | "submission_block": 0, 588 | "max_fee": "1328693574", 589 | "max_priority_fee": "2500706", 590 | "base_fee": "969658236", 591 | "gas": 93776, 592 | "inclusion_blocks": 21910220 593 | }, 594 | { 595 | "hash": "0x22d60425c019248d9cd740cc75d4b29d6d34c0ddb7e7194dc2d914ae75f77a4d", 596 | "submission_block": 1740328131, 597 | "max_fee": "1165090306", 598 | "max_priority_fee": "1500423", 599 | "base_fee": "969658236", 600 | "gas": 1024604, 601 | "inclusion_blocks": 18446744071991133705 602 | }, 603 | { 604 | "hash": "0x4abab8831660db8cfeca872f3b11b1654ca1da11ddf3fd77e8d78439cd5172f3", 605 | "submission_block": 1740328131, 606 | "max_fee": "1062075428", 607 | "max_priority_fee": "1250353", 608 | "base_fee": "969658236", 609 | "gas": 21000, 610 | "inclusion_blocks": 18446744071991133705 611 | }, 612 | { 613 | "hash": "0x28e8a51336a5270ddad5ce02f8ab65bdf7b5ecf66e4ea8bf02cfa123e60f12d0", 614 | "submission_block": 1740328131, 615 | "max_fee": "1937090209", 616 | "max_priority_fee": "1250353", 617 | "base_fee": "969658236", 618 | "gas": 145719, 619 | "inclusion_blocks": 18446744071991133705 620 | } 621 | ] 622 | } 623 | -------------------------------------------------------------------------------- /example_data/block_21910222.json: -------------------------------------------------------------------------------- 1 | { 2 | "block": { 3 | "number": 21910222, 4 | "timestamp": 1740328163, 5 | "base_fee": "944702645", 6 | "gas_used": 10760698 7 | }, 8 | "network": { 9 | "mempool": { 10 | "Count": 17, 11 | "P10": 0.1, 12 | "P30": 0.509366181, 13 | "P50": 0.7, 14 | "P70": 1.172151032, 15 | "P90": 6.875, 16 | "NextBlock": 21910223, 17 | "NextBaseFee": 0.8973078593169068 18 | }, 19 | "history": { 20 | "gas_ratio_5": 0.4280070640269084, 21 | "gas_spikes_25": 2, 22 | "fee_ewma_10": 0.9079839211626872, 23 | "fee_ewma_25": 0.8850302818774229 24 | } 25 | }, 26 | "txs": [ 27 | { 28 | "hash": "0xcd7e601d242614de6d5e9588e496ffe8ae851fc0745255eb8cf7eb84eb21cdce", 29 | "submission_block": 1740328141, 30 | "max_fee": "11005271805", 31 | "max_priority_fee": "11005271805", 32 | "base_fee": "944702645", 33 | "gas": 21000, 34 | "inclusion_blocks": 18446744071991133697 35 | }, 36 | { 37 | "hash": "0xb78958e1fa7ba6b28d6356ef50c0e89b56a39e9bc60639a972a2467cdf3d0c0b", 38 | "submission_block": 1740328141, 39 | "max_fee": "10981813062", 40 | "max_priority_fee": "10981813062", 41 | "base_fee": "944702645", 42 | "gas": 21000, 43 | "inclusion_blocks": 18446744071991133697 44 | }, 45 | { 46 | "hash": "0x1c0801fb87e7fe126d72abb897333074075a1186c79dd434fa8debe410032443", 47 | "submission_block": 1740328159, 48 | "max_fee": "10000000000", 49 | "max_priority_fee": "10000000000", 50 | "base_fee": "944702645", 51 | "gas": 500000, 52 | "inclusion_blocks": 18446744071991133679 53 | }, 54 | { 55 | "hash": "0x77c2f6c47e935048313afac0b91a76ab9d9516767d81e26ca453e6cc87928baf", 56 | "submission_block": 1740328141, 57 | "max_fee": "8970908589", 58 | "max_priority_fee": "8000000000", 59 | "base_fee": "944702645", 60 | "gas": 80000, 61 | "inclusion_blocks": 18446744071991133697 62 | }, 63 | { 64 | "hash": "0x62bcbdac3b2ed4bb578cd1e85f0bb27044c259f9fb15c2611884cee08646ca4c", 65 | "submission_block": 1740328141, 66 | "max_fee": "4469658236", 67 | "max_priority_fee": "4469658236", 68 | "base_fee": "944702645", 69 | "gas": 50000, 70 | "inclusion_blocks": 18446744071991133697 71 | }, 72 | { 73 | "hash": "0x12aa3986257474b486910ac8201f32b7fecf1a6b1c87dcb9fab143fdb778d13a", 74 | "submission_block": 1740328141, 75 | "max_fee": "4469658236", 76 | "max_priority_fee": "4469658236", 77 | "base_fee": "944702645", 78 | "gas": 50000, 79 | "inclusion_blocks": 18446744071991133697 80 | }, 81 | { 82 | "hash": "0x20eb7ada3a287b671dd06e30aabce93fa63737e5af030d6dafdae97f9470dedb", 83 | "submission_block": 1740328141, 84 | "max_fee": "4469658236", 85 | "max_priority_fee": "4469658236", 86 | "base_fee": "944702645", 87 | "gas": 79660, 88 | "inclusion_blocks": 18446744071991133697 89 | }, 90 | { 91 | "hash": "0xa1a7f4a34ca1c79cc43a918a1306b6e01f26fcff0cbabae837b1a491826f1b42", 92 | "submission_block": 1740328141, 93 | "max_fee": "4469658236", 94 | "max_priority_fee": "4469658236", 95 | "base_fee": "944702645", 96 | "gas": 94017, 97 | "inclusion_blocks": 18446744071991133697 98 | }, 99 | { 100 | "hash": "0x2d62976e51ba7ca9df64b2f828e556945529bc78dd41c1f59f556c946bb82bd0", 101 | "submission_block": 1740328159, 102 | "max_fee": "4469658236", 103 | "max_priority_fee": "4469658236", 104 | "base_fee": "944702645", 105 | "gas": 2000000, 106 | "inclusion_blocks": 18446744071991133679 107 | }, 108 | { 109 | "hash": "0x5b6cbc4a0bf7ec58a7b4d508f42fe9bfb84a0c7dd3756ec9e96dd63baf7ed70d", 110 | "submission_block": 1740328141, 111 | "max_fee": "4939316472", 112 | "max_priority_fee": "3000000000", 113 | "base_fee": "944702645", 114 | "gas": 385417, 115 | "inclusion_blocks": 18446744071991133697 116 | }, 117 | { 118 | "hash": "0x7b4af0998e08b42860ab31972d6088beb0dba84e920acf709875bbb15694a79b", 119 | "submission_block": 1740328141, 120 | "max_fee": "33000000000", 121 | "max_priority_fee": "3000000000", 122 | "base_fee": "944702645", 123 | "gas": 5000000, 124 | "inclusion_blocks": 18446744071991133697 125 | }, 126 | { 127 | "hash": "0x2bc4afe20d24cddfbb09d26992c9438482e28a2d6763690eaed9e527986962b2", 128 | "submission_block": 1740328159, 129 | "max_fee": "3060555706", 130 | "max_priority_fee": "3060555706", 131 | "base_fee": "944702645", 132 | "gas": 65000, 133 | "inclusion_blocks": 18446744071991133679 134 | }, 135 | { 136 | "hash": "0xe249b77917e1f559cb210048c18f04be8b8dea8257ec438e87c2fba919cde0a0", 137 | "submission_block": 1740328141, 138 | "max_fee": "3454487354", 139 | "max_priority_fee": "2000000000", 140 | "base_fee": "944702645", 141 | "gas": 21000, 142 | "inclusion_blocks": 18446744071991133697 143 | }, 144 | { 145 | "hash": "0x3084d6efce667545014aac7e5dadf76b1d84f19a31f3a02ce2c15c9b969a4c63", 146 | "submission_block": 1740328141, 147 | "max_fee": "3454487354", 148 | "max_priority_fee": "2000000000", 149 | "base_fee": "944702645", 150 | "gas": 21000, 151 | "inclusion_blocks": 18446744071991133697 152 | }, 153 | { 154 | "hash": "0x2b2a5865264eef2feaccb3bf61602fd3e1d49676a448739d529d3d71a13df011", 155 | "submission_block": 1740328141, 156 | "max_fee": "502000000000", 157 | "max_priority_fee": "2000000000", 158 | "base_fee": "944702645", 159 | "gas": 210000, 160 | "inclusion_blocks": 18446744071991133697 161 | }, 162 | { 163 | "hash": "0x4d0093bcc8d20e32f4c2168465145c7d97f6cc2c779ffc469e255ac0f099f542", 164 | "submission_block": 1740328141, 165 | "max_fee": "502000000000", 166 | "max_priority_fee": "2000000000", 167 | "base_fee": "944702645", 168 | "gas": 420000, 169 | "inclusion_blocks": 18446744071991133697 170 | }, 171 | { 172 | "hash": "0x5d03a1bfa1324a35cf016a61dfb7df331b09e3f8e6769a839642adceb493dc57", 173 | "submission_block": 1740328141, 174 | "max_fee": "3117698151", 175 | "max_priority_fee": "2000000000", 176 | "base_fee": "944702645", 177 | "gas": 24150, 178 | "inclusion_blocks": 18446744071991133697 179 | }, 180 | { 181 | "hash": "0xbc6737c4c438bf65cac0f13409c1314210eeacee9ae12bce835f6818b17a7f2e", 182 | "submission_block": 1740328141, 183 | "max_fee": "6875000000", 184 | "max_priority_fee": "2000000000", 185 | "base_fee": "944702645", 186 | "gas": 21000, 187 | "inclusion_blocks": 18446744071991133697 188 | }, 189 | { 190 | "hash": "0x8622e094525353de1ee6496f3d80c67d6b54878a196dacfcb8f8637c51ff21e6", 191 | "submission_block": 1740328159, 192 | "max_fee": "200000000000", 193 | "max_priority_fee": "2000000000", 194 | "base_fee": "944702645", 195 | "gas": 90000, 196 | "inclusion_blocks": 18446744071991133679 197 | }, 198 | { 199 | "hash": "0x41b38c2371be7922c705a33e5ba5e4b6223d76306bdc14fcb711c1052c5b96ec", 200 | "submission_block": 1740328159, 201 | "max_fee": "200000000000", 202 | "max_priority_fee": "2000000000", 203 | "base_fee": "944702645", 204 | "gas": 240000, 205 | "inclusion_blocks": 18446744071991133679 206 | }, 207 | { 208 | "hash": "0x4822174df39d69a89571d259b24d9bd34972445bfed04daac9e60ac8792fccd1", 209 | "submission_block": 1740328159, 210 | "max_fee": "200000000000", 211 | "max_priority_fee": "2000000000", 212 | "base_fee": "944702645", 213 | "gas": 90000, 214 | "inclusion_blocks": 18446744071991133679 215 | }, 216 | { 217 | "hash": "0x9b11823b5bb01597ad9bf79bd6423b982aadbf0ff120278792c0c36fb055a9f4", 218 | "submission_block": 1740328141, 219 | "max_fee": "2623610577", 220 | "max_priority_fee": "2623610577", 221 | "base_fee": "944702645", 222 | "gas": 500000, 223 | "inclusion_blocks": 18446744071991133697 224 | }, 225 | { 226 | "hash": "0x20d759f91b1df026c3e9a6f34ab50202c0129628c65f3c8ddf13deb76171ed3c", 227 | "submission_block": 1740328141, 228 | "max_fee": "2000000000", 229 | "max_priority_fee": "2000000000", 230 | "base_fee": "944702645", 231 | "gas": 350000, 232 | "inclusion_blocks": 18446744071991133697 233 | }, 234 | { 235 | "hash": "0x402fb85f102a6dc95aa822fa3b2c84f0ecc3672269c661e867ee465c8919fddd", 236 | "submission_block": 1740328141, 237 | "max_fee": "2000000000", 238 | "max_priority_fee": "2000000000", 239 | "base_fee": "944702645", 240 | "gas": 350000, 241 | "inclusion_blocks": 18446744071991133697 242 | }, 243 | { 244 | "hash": "0xa88ab83b3015600fee57e21edb95e699f18a387db20c895149677d22094d593f", 245 | "submission_block": 1740328141, 246 | "max_fee": "2000000000", 247 | "max_priority_fee": "2000000000", 248 | "base_fee": "944702645", 249 | "gas": 350000, 250 | "inclusion_blocks": 18446744071991133697 251 | }, 252 | { 253 | "hash": "0xb60575bfdc4647d167edbb8c33f1e417d874336b802898ff1f397a499ab7afeb", 254 | "submission_block": 1740328141, 255 | "max_fee": "2000000000", 256 | "max_priority_fee": "2000000000", 257 | "base_fee": "944702645", 258 | "gas": 350000, 259 | "inclusion_blocks": 18446744071991133697 260 | }, 261 | { 262 | "hash": "0x62bd983004d2ac3c834a5c9c74d1ea267cdccf4b0d9f973dbf4895f8e7783a61", 263 | "submission_block": 1740328141, 264 | "max_fee": "2000000000", 265 | "max_priority_fee": "2000000000", 266 | "base_fee": "944702645", 267 | "gas": 350000, 268 | "inclusion_blocks": 18446744071991133697 269 | }, 270 | { 271 | "hash": "0x622471c99415abe2841d6523df81f2f035fc122dd8cd3f871867be2cc2fabae6", 272 | "submission_block": 1740328141, 273 | "max_fee": "2000000000", 274 | "max_priority_fee": "2000000000", 275 | "base_fee": "944702645", 276 | "gas": 350000, 277 | "inclusion_blocks": 18446744071991133697 278 | }, 279 | { 280 | "hash": "0xe93522f465a3f1569e3deebcc63285937f21821578dbb129a87b06a80875489d", 281 | "submission_block": 1740328159, 282 | "max_fee": "2889405290", 283 | "max_priority_fee": "1000000000", 284 | "base_fee": "944702645", 285 | "gas": 100000, 286 | "inclusion_blocks": 18446744071991133679 287 | }, 288 | { 289 | "hash": "0xd801c81a8b7892af3e713b98b6cfb288457bf11bd67460f54eeea82c324785a2", 290 | "submission_block": 1740328159, 291 | "max_fee": "2289666413", 292 | "max_priority_fee": "987744732", 293 | "base_fee": "944702645", 294 | "gas": 21000, 295 | "inclusion_blocks": 18446744071991133679 296 | }, 297 | { 298 | "hash": "0x4cf32cb31c45bea517386009233616e15ed19a9941ce11699721cd4940376139", 299 | "submission_block": 1740328141, 300 | "max_fee": "180600000000", 301 | "max_priority_fee": "600000000", 302 | "base_fee": "944702645", 303 | "gas": 210000, 304 | "inclusion_blocks": 18446744071991133697 305 | }, 306 | { 307 | "hash": "0x3c3648d154646b7f61ddd6436372e9dde03c4f4bba10a0d2dd5ec15c2a35cd50", 308 | "submission_block": 1740328159, 309 | "max_fee": "6100000000", 310 | "max_priority_fee": "600000000", 311 | "base_fee": "944702645", 312 | "gas": 64302, 313 | "inclusion_blocks": 18446744071991133679 314 | }, 315 | { 316 | "hash": "0x4a0df8b4b3e5dfe0970c333975311e9ea459eb5e9a40fb4f13af6d143da57b29", 317 | "submission_block": 1740328141, 318 | "max_fee": "1456362883", 319 | "max_priority_fee": "1456362883", 320 | "base_fee": "944702645", 321 | "gas": 56774, 322 | "inclusion_blocks": 18446744071991133697 323 | }, 324 | { 325 | "hash": "0xc8a5a784bbdf5143e63ed3edf0a7994a81962453ae5f9e7190c029e398c2e165", 326 | "submission_block": 1740328141, 327 | "max_fee": "1886611278", 328 | "max_priority_fee": "500000000", 329 | "base_fee": "944702645", 330 | "gas": 107965, 331 | "inclusion_blocks": 18446744071991133697 332 | }, 333 | { 334 | "hash": "0x5fd53ac24b44f5d3542b07501a55c271e82da9b1e9749e7a0129215b160c5a97", 335 | "submission_block": 1740328141, 336 | "max_fee": "1886611278", 337 | "max_priority_fee": "500000000", 338 | "base_fee": "944702645", 339 | "gas": 21000, 340 | "inclusion_blocks": 18446744071991133697 341 | }, 342 | { 343 | "hash": "0xd73d253800ae4e90d2f30d41390095eacedc08a00f33c34bbcac42936e9d84ea", 344 | "submission_block": 1740328141, 345 | "max_fee": "1886611278", 346 | "max_priority_fee": "500000000", 347 | "base_fee": "944702645", 348 | "gas": 21000, 349 | "inclusion_blocks": 18446744071991133697 350 | }, 351 | { 352 | "hash": "0x48a7043994fb78adc074cec17324f2c5c4f835b14875e8d1493a79d9786f4b87", 353 | "submission_block": 1740328141, 354 | "max_fee": "1882337493", 355 | "max_priority_fee": "500000000", 356 | "base_fee": "944702645", 357 | "gas": 114254, 358 | "inclusion_blocks": 18446744071991133697 359 | }, 360 | { 361 | "hash": "0xbcda7b8e810ffaf41d0fec33792132bef5b7ef654722ba39ff0614a521b4995d", 362 | "submission_block": 1740328159, 363 | "max_fee": "1917053967", 364 | "max_priority_fee": "500000000", 365 | "base_fee": "944702645", 366 | "gas": 112283, 367 | "inclusion_blocks": 18446744071991133679 368 | }, 369 | { 370 | "hash": "0x679b4ce3a206f9142f2eab6124f8514d05e81224380a6cabfb4680eb5af997ce", 371 | "submission_block": 1740328159, 372 | "max_fee": "1886611278", 373 | "max_priority_fee": "500000000", 374 | "base_fee": "944702645", 375 | "gas": 45528, 376 | "inclusion_blocks": 18446744071991133679 377 | }, 378 | { 379 | "hash": "0x94e3a658edd9fc78b2e9a642c8192cefe141341106c561bfbda3004fbe3d8b4e", 380 | "submission_block": 1740328159, 381 | "max_fee": "1805003926", 382 | "max_priority_fee": "500000000", 383 | "base_fee": "944702645", 384 | "gas": 70029, 385 | "inclusion_blocks": 18446744071991133679 386 | }, 387 | { 388 | "hash": "0x09cca9d36a8be3de2466447aa552275e2d1e35bd48339612c80c9af538474be7", 389 | "submission_block": 1740328159, 390 | "max_fee": "1684508501", 391 | "max_priority_fee": "500000000", 392 | "base_fee": "944702645", 393 | "gas": 21000, 394 | "inclusion_blocks": 18446744071991133679 395 | }, 396 | { 397 | "hash": "0x3bf19f10c5116afb3ec4b81d9d2036f5e5acd5946f753d30f2081a04efedf433", 398 | "submission_block": 1740328141, 399 | "max_fee": "1425332928", 400 | "max_priority_fee": "1425332928", 401 | "base_fee": "944702645", 402 | "gas": 21000, 403 | "inclusion_blocks": 18446744071991133697 404 | }, 405 | { 406 | "hash": "0x8706a7c6e926d80c399aa0b0ba840715992f5f0b0779086b56a2d5608746ca6e", 407 | "submission_block": 1740328141, 408 | "max_fee": "1526955359", 409 | "max_priority_fee": "302184592", 410 | "base_fee": "944702645", 411 | "gas": 294554, 412 | "inclusion_blocks": 18446744071991133697 413 | }, 414 | { 415 | "hash": "0xb1fd42487b5022c464a8a372f5da5de66ea87153c42801421fff2a8479f7ad37", 416 | "submission_block": 1740328159, 417 | "max_fee": "1165090306", 418 | "max_priority_fee": "1165090306", 419 | "base_fee": "944702645", 420 | "gas": 21000, 421 | "inclusion_blocks": 18446744071991133679 422 | }, 423 | { 424 | "hash": "0x5c39707f550081ddeb7302e81e37dfd0c82ec63e12e305a9bc4e2c30d79b57d0", 425 | "submission_block": 1740328141, 426 | "max_fee": "1136939815", 427 | "max_priority_fee": "1136939815", 428 | "base_fee": "944702645", 429 | "gas": 21000, 430 | "inclusion_blocks": 18446744071991133697 431 | }, 432 | { 433 | "hash": "0x56fad4856d95347475cf350b64dc2244ea7f150e9ea5aa7b75114b32e1d425c6", 434 | "submission_block": 1740328141, 435 | "max_fee": "1120717945", 436 | "max_priority_fee": "1120717945", 437 | "base_fee": "944702645", 438 | "gas": 21000, 439 | "inclusion_blocks": 18446744071991133697 440 | }, 441 | { 442 | "hash": "0xefadca5e6ee8565d7af7790f24b8768222d5330619dddbae4571b5269d2b6c2e", 443 | "submission_block": 1740328141, 444 | "max_fee": "1051122241", 445 | "max_priority_fee": "1051122241", 446 | "base_fee": "944702645", 447 | "gas": 21000, 448 | "inclusion_blocks": 18446744071991133697 449 | }, 450 | { 451 | "hash": "0xd8c2ed73b317e12e7a2c2a634ea6b7ae95345dce1970d6fc812f1c4877976f44", 452 | "submission_block": 1740328141, 453 | "max_fee": "1107534918", 454 | "max_priority_fee": "100000000", 455 | "base_fee": "944702645", 456 | "gas": 21000, 457 | "inclusion_blocks": 18446744071991133697 458 | }, 459 | { 460 | "hash": "0x60f9108b7e15a13a8d6e743560b08da3095252f3d2714dc811e32086b4798dca", 461 | "submission_block": 1740328141, 462 | "max_fee": "1961235348", 463 | "max_priority_fee": "100000000", 464 | "base_fee": "944702645", 465 | "gas": 437823, 466 | "inclusion_blocks": 18446744071991133697 467 | }, 468 | { 469 | "hash": "0xb678440a55460a80186eea4e68d325ce0e4e046d983d4422fe732b0aacf9cb9e", 470 | "submission_block": 1740328159, 471 | "max_fee": "1064500475", 472 | "max_priority_fee": "100000000", 473 | "base_fee": "944702645", 474 | "gas": 56849, 475 | "inclusion_blocks": 18446744071991133679 476 | }, 477 | { 478 | "hash": "0xe3f97eba686f8958fa5a1b21c47767392776a90197d1ea0eb53440af4b71835c", 479 | "submission_block": 1740328159, 480 | "max_fee": "1084076015", 481 | "max_priority_fee": "100000000", 482 | "base_fee": "944702645", 483 | "gas": 52027, 484 | "inclusion_blocks": 18446744071991133679 485 | }, 486 | { 487 | "hash": "0x1e4bfb6b473e06a704a23be1043179e08980a127b1580cb80c3aa8f4ac9e8973", 488 | "submission_block": 1740328141, 489 | "max_fee": "1044199493", 490 | "max_priority_fee": "98000000", 491 | "base_fee": "944702645", 492 | "gas": 280419, 493 | "inclusion_blocks": 18446744071991133697 494 | }, 495 | { 496 | "hash": "0xfeb6e45b58eef10b34de87b00c79de95fa97324c82b27b29bcc23a97f773ee46", 497 | "submission_block": 1740328159, 498 | "max_fee": "1042194830", 499 | "max_priority_fee": "1042194830", 500 | "base_fee": "944702645", 501 | "gas": 275255, 502 | "inclusion_blocks": 18446744071991133679 503 | }, 504 | { 505 | "hash": "0x659651f99995e86ff4ccd28c7cfb7968ad3f9e72b8bd8534f46418c33fafd2b9", 506 | "submission_block": 1740328141, 507 | "max_fee": "1099193471", 508 | "max_priority_fee": "89000000", 509 | "base_fee": "944702645", 510 | "gas": 21000, 511 | "inclusion_blocks": 18446744071991133697 512 | }, 513 | { 514 | "hash": "0x5a34dd1c6870d8fead8df3270fd409109604053d4109f84a9d38d64a3cf78fa9", 515 | "submission_block": 1740328141, 516 | "max_fee": "1058658236", 517 | "max_priority_fee": "89000000", 518 | "base_fee": "944702645", 519 | "gas": 55330, 520 | "inclusion_blocks": 18446744071991133697 521 | }, 522 | { 523 | "hash": "0x7f434bd9f7f8f50ca1df6db6a61d62250841d715d037a69806e1c5137282f5b5", 524 | "submission_block": 1740328141, 525 | "max_fee": "1179865515", 526 | "max_priority_fee": "89000000", 527 | "base_fee": "944702645", 528 | "gas": 51126, 529 | "inclusion_blocks": 18446744071991133697 530 | }, 531 | { 532 | "hash": "0x1b0eda0e4ee737b87be0649ec28b8fbc69d1e3f08c9e58332d22f6459241a067", 533 | "submission_block": 1740328141, 534 | "max_fee": "1176503267", 535 | "max_priority_fee": "89000000", 536 | "base_fee": "944702645", 537 | "gas": 69348, 538 | "inclusion_blocks": 18446744071991133697 539 | }, 540 | { 541 | "hash": "0x4c2653c04b2949bb5699f3bedc0d0faf66eb538350560b5f716c3be54759d212", 542 | "submission_block": 1740328141, 543 | "max_fee": "1306455877", 544 | "max_priority_fee": "81685110", 545 | "base_fee": "944702645", 546 | "gas": 342143, 547 | "inclusion_blocks": 18446744071991133697 548 | }, 549 | { 550 | "hash": "0x050b3d6318e7e6f1a157233133437bca859372917de1b688525154fb46490c76", 551 | "submission_block": 1740328141, 552 | "max_fee": "1019454018", 553 | "max_priority_fee": "1019454018", 554 | "base_fee": "944702645", 555 | "gas": 200000, 556 | "inclusion_blocks": 18446744071991133697 557 | }, 558 | { 559 | "hash": "0x434d1a41eee813f49f30595ef12f11024cdf7368f1cbe64d94eccd87b5b2b8af", 560 | "submission_block": 1740328141, 561 | "max_fee": "1000000000", 562 | "max_priority_fee": "1000000000", 563 | "base_fee": "944702645", 564 | "gas": 22000, 565 | "inclusion_blocks": 18446744071991133697 566 | }, 567 | { 568 | "hash": "0xcb0609cf61965392d09ba65c4e9ca07c69c337ca1d4a43e8e2998290205e851b", 569 | "submission_block": 1740328141, 570 | "max_fee": "1000000000", 571 | "max_priority_fee": "1000000000", 572 | "base_fee": "944702645", 573 | "gas": 60000, 574 | "inclusion_blocks": 18446744071991133697 575 | }, 576 | { 577 | "hash": "0xe24a21ae8fbc2942cd5bf9c10c4fdd7b69914a794a9298804ae5088553b94983", 578 | "submission_block": 1740328159, 579 | "max_fee": "1000000000", 580 | "max_priority_fee": "1000000000", 581 | "base_fee": "944702645", 582 | "gas": 90000, 583 | "inclusion_blocks": 18446744071991133679 584 | }, 585 | { 586 | "hash": "0x96cbaa37b2f1a5a8593d73ccb59b6097f00d06f6939149c01854746d0ce1e303", 587 | "submission_block": 1740328159, 588 | "max_fee": "10196582360", 589 | "max_priority_fee": "50000000", 590 | "base_fee": "944702645", 591 | "gas": 216352, 592 | "inclusion_blocks": 18446744071991133679 593 | }, 594 | { 595 | "hash": "0xff66e5932d44d4f6ad3dbce0767d3efe836f391fb373f2e5ae095bd1116456e7", 596 | "submission_block": 1740328141, 597 | "max_fee": "981813062", 598 | "max_priority_fee": "981813062", 599 | "base_fee": "944702645", 600 | "gas": 100000, 601 | "inclusion_blocks": 18446744071991133697 602 | }, 603 | { 604 | "hash": "0xdbd68cca716bfdb0b81928bc6741aedf16b02a11c4f9e6ee73e447fc83a56996", 605 | "submission_block": 1740328141, 606 | "max_fee": "1220384176", 607 | "max_priority_fee": "35613569", 608 | "base_fee": "944702645", 609 | "gas": 21000, 610 | "inclusion_blocks": 18446744071991133697 611 | }, 612 | { 613 | "hash": "0xb5f2cd551ccb0aa144bc98a838f394c0e3b6e218bd7116ac3e53ea96cae411bb", 614 | "submission_block": 1740328141, 615 | "max_fee": "1005271805", 616 | "max_priority_fee": "35613569", 617 | "base_fee": "944702645", 618 | "gas": 81090, 619 | "inclusion_blocks": 18446744071991133697 620 | }, 621 | { 622 | "hash": "0xff99ef8cd09d6a863f175c45e94718a76ea99bda66b94d7322999b4bd76bb033", 623 | "submission_block": 1740328141, 624 | "max_fee": "970908589", 625 | "max_priority_fee": "970908589", 626 | "base_fee": "944702645", 627 | "gas": 1050000, 628 | "inclusion_blocks": 18446744071991133697 629 | }, 630 | { 631 | "hash": "0x2243fd42eceed8a3849fa926f514129e5a6eed2ca3b7881bd6923bf04ff5eeb5", 632 | "submission_block": 1740328141, 633 | "max_fee": "3787298678", 634 | "max_priority_fee": "3751059", 635 | "base_fee": "944702645", 636 | "gas": 90217, 637 | "inclusion_blocks": 18446744071991133697 638 | }, 639 | { 640 | "hash": "0xad44176eb7c4185f34d8947007f9c1aadd4028ad5b43da57adfa3237e53dd309", 641 | "submission_block": 1740328159, 642 | "max_fee": "947449846", 643 | "max_priority_fee": "947449846", 644 | "base_fee": "944702645", 645 | "gas": 46225, 646 | "inclusion_blocks": 18446744071991133679 647 | }, 648 | { 649 | "hash": "0x3a89e95cc5542f07fce982d335e54492e6f462cc23283df5f08ba6dd13b5f9b5", 650 | "submission_block": 1740328159, 651 | "max_fee": "1359272024", 652 | "max_priority_fee": "2500706", 653 | "base_fee": "944702645", 654 | "gas": 21000, 655 | "inclusion_blocks": 18446744071991133679 656 | }, 657 | { 658 | "hash": "0xe0d4fde9fa4b6ab13dd312a56f931b71cd5a810e8ba7c5465552f4c8799dbdef", 659 | "submission_block": 1740328141, 660 | "max_fee": "1136939814", 661 | "max_priority_fee": "1500423", 662 | "base_fee": "944702645", 663 | "gas": 1778896, 664 | "inclusion_blocks": 18446744071991133697 665 | }, 666 | { 667 | "hash": "0xc1d14b031c9eced44a3385399a9959978e23424f3fb2e40f0d27d00625c4e8a4", 668 | "submission_block": 1740328141, 669 | "max_fee": "1136939814", 670 | "max_priority_fee": "1500423", 671 | "base_fee": "944702645", 672 | "gas": 1778896, 673 | "inclusion_blocks": 18446744071991133697 674 | }, 675 | { 676 | "hash": "0xb27a1e1979279972c1b3db2d0a1778c9b8d12fae766830aa9d1c2ea30e789558", 677 | "submission_block": 1740328141, 678 | "max_fee": "1136939814", 679 | "max_priority_fee": "1500423", 680 | "base_fee": "944702645", 681 | "gas": 343476, 682 | "inclusion_blocks": 18446744071991133697 683 | }, 684 | { 685 | "hash": "0xdfddaa789a57a35fced10c23a9aed46d867577d292763f1c851cda8d5218ce67", 686 | "submission_block": 1740328141, 687 | "max_fee": "1136939814", 688 | "max_priority_fee": "1500423", 689 | "base_fee": "944702645", 690 | "gas": 460520, 691 | "inclusion_blocks": 18446744071991133697 692 | }, 693 | { 694 | "hash": "0x7af4a14dac0c48e4404a7351c71b99b94df734d9352d250eb47f945ea6183fcb", 695 | "submission_block": 1740328159, 696 | "max_fee": "1135143597", 697 | "max_priority_fee": "1500423", 698 | "base_fee": "944702645", 699 | "gas": 370356, 700 | "inclusion_blocks": 18446744071991133679 701 | }, 702 | { 703 | "hash": "0xa7dc45fd20c0451459fb99323883eb51bf0bd874b6f6df3cb9fef871281a6fad", 704 | "submission_block": 1740328159, 705 | "max_fee": "1135143597", 706 | "max_priority_fee": "1500423", 707 | "base_fee": "944702645", 708 | "gas": 370356, 709 | "inclusion_blocks": 18446744071991133679 710 | }, 711 | { 712 | "hash": "0x90fef445602912dfd4b890da16b40ae9e0e810b81c188a232efdbcca687619a3", 713 | "submission_block": 1740328141, 714 | "max_fee": "100000000000", 715 | "max_priority_fee": "1250353", 716 | "base_fee": "944702645", 717 | "gas": 21000, 718 | "inclusion_blocks": 18446744071991133697 719 | }, 720 | { 721 | "hash": "0xc5cb1a7b0140f01305eea34c022b9a7aa2fb7787793a035e519d914be6161286", 722 | "submission_block": 1740328141, 723 | "max_fee": "1773256283", 724 | "max_priority_fee": "1250353", 725 | "base_fee": "944702645", 726 | "gas": 21000, 727 | "inclusion_blocks": 18446744071991133697 728 | }, 729 | { 730 | "hash": "0xf21fe88647d3c8521ce7299d969e4cf0168cec2fb425e78efb602d5e4786de1b", 731 | "submission_block": 1740328159, 732 | "max_fee": "1937090209", 733 | "max_priority_fee": "1250353", 734 | "base_fee": "944702645", 735 | "gas": 21000, 736 | "inclusion_blocks": 18446744071991133679 737 | }, 738 | { 739 | "hash": "0xf9de72b50bc3d37bee4527593fe1410d669136a5cb5c55b408685faac0654082", 740 | "submission_block": 1740328159, 741 | "max_fee": "1893649339", 742 | "max_priority_fee": "1250353", 743 | "base_fee": "944702645", 744 | "gas": 192129, 745 | "inclusion_blocks": 18446744071991133679 746 | }, 747 | { 748 | "hash": "0x536bbfd806984db260695492243d09244f01c26fa7e96719e33a2af277292ea9", 749 | "submission_block": 1740328159, 750 | "max_fee": "1943067531", 751 | "max_priority_fee": "1250353", 752 | "base_fee": "944702645", 753 | "gas": 21000, 754 | "inclusion_blocks": 18446744071991133679 755 | } 756 | ] 757 | } 758 | -------------------------------------------------------------------------------- /example_data/block_21910223.json: -------------------------------------------------------------------------------- 1 | { 2 | "block": { 3 | "number": 21910223, 4 | "timestamp": 1740328175, 5 | "base_fee": "897348226", 6 | "gas_used": 6104418 7 | }, 8 | "network": { 9 | "mempool": { 10 | "Count": 34, 11 | "P10": 0.1, 12 | "P30": 0.5, 13 | "P50": 1, 14 | "P70": 1.42017985, 15 | "P90": 2.966269574, 16 | "NextBlock": 21910224, 17 | "NextBaseFee": 0.8232728038909073 18 | }, 19 | "history": { 20 | "gas_ratio_5": 0.3756993910125921, 21 | "gas_spikes_25": 2, 22 | "fee_ewma_10": 0.9041366596744189, 23 | "fee_ewma_25": 0.882331051073979 24 | } 25 | }, 26 | "txs": [ 27 | { 28 | "hash": "0x9d580b8d8c3f82cb3163f6796ccaa041761a7fb5ad66c4b7591d39cdc11f5ee7", 29 | "submission_block": 1740328159, 30 | "max_fee": "10000000000", 31 | "max_priority_fee": "10000000000", 32 | "base_fee": "897348226", 33 | "gas": 80244, 34 | "inclusion_blocks": 18446744071991133680 35 | }, 36 | { 37 | "hash": "0xa141d27e25049ee36d396be08f53d5cb0247cb360e7c238405ff1894376af06d", 38 | "submission_block": 1740328165, 39 | "max_fee": "10000000000", 40 | "max_priority_fee": "10000000000", 41 | "base_fee": "897348226", 42 | "gas": 500000, 43 | "inclusion_blocks": 18446744071991133674 44 | }, 45 | { 46 | "hash": "0x894c8d8d0233296b5d7abf584263f4df0449dd339cb4e1826381ad12055c9e90", 47 | "submission_block": 1740328165, 48 | "max_fee": "7444702645", 49 | "max_priority_fee": "7444702645", 50 | "base_fee": "897348226", 51 | "gas": 69373, 52 | "inclusion_blocks": 18446744071991133674 53 | }, 54 | { 55 | "hash": "0x30be1ded9d4bf60fc4c33aaef5498d0c64668cd184cdc1852a22ab925fda8ea9", 56 | "submission_block": 1740328165, 57 | "max_fee": "7444702645", 58 | "max_priority_fee": "7444702645", 59 | "base_fee": "897348226", 60 | "gas": 69373, 61 | "inclusion_blocks": 18446744071991133674 62 | }, 63 | { 64 | "hash": "0x1079661f7764e0966162cd08a7f98ebfadd44e832eeee19f86adf4a98eff9b7c", 65 | "submission_block": 1740328159, 66 | "max_fee": "6875000000", 67 | "max_priority_fee": "6875000000", 68 | "base_fee": "897348226", 69 | "gas": 21000, 70 | "inclusion_blocks": 18446744071991133680 71 | }, 72 | { 73 | "hash": "0x2b24dd3072786a2d3cc3e39a2ea332466a62ec75ba09c454be26a38ee9cc6bc9", 74 | "submission_block": 1740328165, 75 | "max_fee": "6875000000", 76 | "max_priority_fee": "6875000000", 77 | "base_fee": "897348226", 78 | "gas": 21000, 79 | "inclusion_blocks": 18446744071991133674 80 | }, 81 | { 82 | "hash": "0x89459b3555a2d092e9879e2993d06b67fa690d31739ff5f2a7432b8870b605f0", 83 | "submission_block": 1740328165, 84 | "max_fee": "3410859366", 85 | "max_priority_fee": "2183189006", 86 | "base_fee": "897348226", 87 | "gas": 21000, 88 | "inclusion_blocks": 18446744071991133674 89 | }, 90 | { 91 | "hash": "0xf22eb4f531b71d266b489baf81e2a1c089fabb0022cb5c21c0299b2c02919438", 92 | "submission_block": 1740328165, 93 | "max_fee": "3028113438", 94 | "max_priority_fee": "3028113438", 95 | "base_fee": "897348226", 96 | "gas": 65000, 97 | "inclusion_blocks": 18446744071991133674 98 | }, 99 | { 100 | "hash": "0x1b938755724bd937c586876b9e27605e96aa307df017270bc5ff18731e6f0abc", 101 | "submission_block": 1740328165, 102 | "max_fee": "2945952998", 103 | "max_priority_fee": "2945952998", 104 | "base_fee": "897348226", 105 | "gas": 22680, 106 | "inclusion_blocks": 18446744071991133674 107 | }, 108 | { 109 | "hash": "0x3346b97fd28906672a494d9bbcc2b4b6162d5a6344c1ea5f019a0e52ee0ef56f", 110 | "submission_block": 1740328165, 111 | "max_fee": "200000000000", 112 | "max_priority_fee": "2000000000", 113 | "base_fee": "897348226", 114 | "gas": 90000, 115 | "inclusion_blocks": 18446744071991133674 116 | }, 117 | { 118 | "hash": "0xd57d7bdd968bf1ad4f07221f91673870271c40917979c4c40f34d502216ed7a1", 119 | "submission_block": 1740328165, 120 | "max_fee": "200000000000", 121 | "max_priority_fee": "2000000000", 122 | "base_fee": "897348226", 123 | "gas": 90000, 124 | "inclusion_blocks": 18446744071991133674 125 | }, 126 | { 127 | "hash": "0xc0fcf32fe99ea86e224da473e981446c09cbc28077d1d746f7e886e54ffc8b6d", 128 | "submission_block": 1740328165, 129 | "max_fee": "200000000000", 130 | "max_priority_fee": "2000000000", 131 | "base_fee": "897348226", 132 | "gas": 90000, 133 | "inclusion_blocks": 18446744071991133674 134 | }, 135 | { 136 | "hash": "0x7b42f7cfc0bd0e4ae06a75a078ff319ad2f572ce32f595535d6b06e80450f617", 137 | "submission_block": 1740328165, 138 | "max_fee": "102000000000", 139 | "max_priority_fee": "2000000000", 140 | "base_fee": "897348226", 141 | "gas": 220436, 142 | "inclusion_blocks": 18446744071991133674 143 | }, 144 | { 145 | "hash": "0x3848a088917fd28c252227af0279ed498c92cf69b7cb893943dc8c9bc5a7a120", 146 | "submission_block": 1740328165, 147 | "max_fee": "102000000000", 148 | "max_priority_fee": "2000000000", 149 | "base_fee": "897348226", 150 | "gas": 207128, 151 | "inclusion_blocks": 18446744071991133674 152 | }, 153 | { 154 | "hash": "0xc0cff423809f826c9b599276bbd13586962545300c0cdcc6b792fe512285881a", 155 | "submission_block": 1740328165, 156 | "max_fee": "102000000000", 157 | "max_priority_fee": "2000000000", 158 | "base_fee": "897348226", 159 | "gas": 220436, 160 | "inclusion_blocks": 18446744071991133674 161 | }, 162 | { 163 | "hash": "0x9185651ee5b6327924a9eb344c6c12e220017f0b0cd40cc9bc938f1ab70698ef", 164 | "submission_block": 1740328165, 165 | "max_fee": "75000000000", 166 | "max_priority_fee": "2000000000", 167 | "base_fee": "897348226", 168 | "gas": 56372, 169 | "inclusion_blocks": 18446744071991133674 170 | }, 171 | { 172 | "hash": "0xd1953346b5512b972c65c2f7f52c81475494954a2213d3ea918e5f474a55f040", 173 | "submission_block": 1740328165, 174 | "max_fee": "10000000000", 175 | "max_priority_fee": "2000000000", 176 | "base_fee": "897348226", 177 | "gas": 150000, 178 | "inclusion_blocks": 18446744071991133674 179 | }, 180 | { 181 | "hash": "0xc70adc5d1078e9b177671d9f6211ad7c54c5054f979ca384ff8e0b7408c3a83a", 182 | "submission_block": 1740328165, 183 | "max_fee": "6875000000", 184 | "max_priority_fee": "2000000000", 185 | "base_fee": "897348226", 186 | "gas": 21000, 187 | "inclusion_blocks": 18446744071991133674 188 | }, 189 | { 190 | "hash": "0x468da201370de6ef428461b6c3ff2f7503a29be9a29ae3ec3f74059a25daea7e", 191 | "submission_block": 1740328165, 192 | "max_fee": "6250000000", 193 | "max_priority_fee": "2000000000", 194 | "base_fee": "897348226", 195 | "gas": 21000, 196 | "inclusion_blocks": 18446744071991133674 197 | }, 198 | { 199 | "hash": "0xba3dedf5c0b745167f7b7f8323ad094a9ae97ccb5304f9816107310206d9b0ff", 200 | "submission_block": 1740328165, 201 | "max_fee": "4000000000", 202 | "max_priority_fee": "2000000000", 203 | "base_fee": "897348226", 204 | "gas": 21000, 205 | "inclusion_blocks": 18446744071991133674 206 | }, 207 | { 208 | "hash": "0xfab104bf7748211882c9b153632790f973c1dcbc103def11a4a6965376a2c1c8", 209 | "submission_block": 1740328165, 210 | "max_fee": "3417053967", 211 | "max_priority_fee": "2000000000", 212 | "base_fee": "897348226", 213 | "gas": 21000, 214 | "inclusion_blocks": 18446744071991133674 215 | }, 216 | { 217 | "hash": "0xe8130b8fa3706157978d21c3f2c9106520b09ad47bbf0cd902992c1ec1c78b36", 218 | "submission_block": 1740328165, 219 | "max_fee": "3417053967", 220 | "max_priority_fee": "2000000000", 221 | "base_fee": "897348226", 222 | "gas": 21000, 223 | "inclusion_blocks": 18446744071991133674 224 | }, 225 | { 226 | "hash": "0xb96b80e06e1969cbbbd87c65422b17031fe4681e1d88fff1c82212a4f31fab48", 227 | "submission_block": 1740328165, 228 | "max_fee": "2946199493", 229 | "max_priority_fee": "2000000000", 230 | "base_fee": "897348226", 231 | "gas": 46133, 232 | "inclusion_blocks": 18446744071991133674 233 | }, 234 | { 235 | "hash": "0x6629f6ffed67273e6ee497f6e433a81fd3c0f9fdad80474e86d2e01768e0121b", 236 | "submission_block": 1740328165, 237 | "max_fee": "2946199493", 238 | "max_priority_fee": "2000000000", 239 | "base_fee": "897348226", 240 | "gas": 46133, 241 | "inclusion_blocks": 18446744071991133674 242 | }, 243 | { 244 | "hash": "0x06593335421cc2a350bea6130df6e7249a95bde36bdc5c7459888bc40cbcae06", 245 | "submission_block": 1740328165, 246 | "max_fee": "2946199493", 247 | "max_priority_fee": "2000000000", 248 | "base_fee": "897348226", 249 | "gas": 46133, 250 | "inclusion_blocks": 18446744071991133674 251 | }, 252 | { 253 | "hash": "0x3ad3702e59527e32f60d7badda017dad442e098054440dd3ba6b7739907d497c", 254 | "submission_block": 1740328165, 255 | "max_fee": "2946199493", 256 | "max_priority_fee": "2000000000", 257 | "base_fee": "897348226", 258 | "gas": 46133, 259 | "inclusion_blocks": 18446744071991133674 260 | }, 261 | { 262 | "hash": "0x846db87321e5c58add9b82a2426605d1f56c891672d5e4b7de0b4bb23915032e", 263 | "submission_block": 1740328165, 264 | "max_fee": "2946199493", 265 | "max_priority_fee": "2000000000", 266 | "base_fee": "897348226", 267 | "gas": 46133, 268 | "inclusion_blocks": 18446744071991133674 269 | }, 270 | { 271 | "hash": "0x27faabcdd8be8a87e7e3e1218b7709eac66ea52b64cec756f264f56666615fc3", 272 | "submission_block": 1740328165, 273 | "max_fee": "2946199493", 274 | "max_priority_fee": "2000000000", 275 | "base_fee": "897348226", 276 | "gas": 46133, 277 | "inclusion_blocks": 18446744071991133674 278 | }, 279 | { 280 | "hash": "0xdaa61b4cdee277f903059aa68f445c83538b612599b596cc8a4cd16e5b3a9c09", 281 | "submission_block": 1740328165, 282 | "max_fee": "2946199493", 283 | "max_priority_fee": "2000000000", 284 | "base_fee": "897348226", 285 | "gas": 46133, 286 | "inclusion_blocks": 18446744071991133674 287 | }, 288 | { 289 | "hash": "0x94af1764418ea27c20076d44d920ce919bdcf894ab076b9191019d0cdc145b49", 290 | "submission_block": 1740328165, 291 | "max_fee": "2946199493", 292 | "max_priority_fee": "2000000000", 293 | "base_fee": "897348226", 294 | "gas": 46133, 295 | "inclusion_blocks": 18446744071991133674 296 | }, 297 | { 298 | "hash": "0xc995dedb93409393814aaa457fb6d24fff1235086a423f8e19665df9263f5fb0", 299 | "submission_block": 1740328165, 300 | "max_fee": "2946199493", 301 | "max_priority_fee": "2000000000", 302 | "base_fee": "897348226", 303 | "gas": 46133, 304 | "inclusion_blocks": 18446744071991133674 305 | }, 306 | { 307 | "hash": "0x731bef3f8dbcd48988b60aa3fce52c667df8cdb58710edfeb131c9446712988a", 308 | "submission_block": 1740328159, 309 | "max_fee": "2944702645", 310 | "max_priority_fee": "2000000000", 311 | "base_fee": "897348226", 312 | "gas": 21000, 313 | "inclusion_blocks": 18446744071991133680 314 | }, 315 | { 316 | "hash": "0x9eec799c123496a27778ea31f502575cec372a581798b871cc439a1f831fdd79", 317 | "submission_block": 1740328165, 318 | "max_fee": "2897348226", 319 | "max_priority_fee": "2897348226", 320 | "base_fee": "897348226", 321 | "gas": 1400000, 322 | "inclusion_blocks": 18446744071991133674 323 | }, 324 | { 325 | "hash": "0xdedf865d54d10b8c2f74b10ec6fd8b186f08d37516eb398b4fcf729f794269b5", 326 | "submission_block": 1740328165, 327 | "max_fee": "3000000000", 328 | "max_priority_fee": "1000000000", 329 | "base_fee": "897348226", 330 | "gas": 21000, 331 | "inclusion_blocks": 18446744071991133674 332 | }, 333 | { 334 | "hash": "0xbc0a4d82b680a0aaf5549ddfd051b5a40705bb0794364fbf716b79cab11551ad", 335 | "submission_block": 1740328165, 336 | "max_fee": "3000000000", 337 | "max_priority_fee": "1000000000", 338 | "base_fee": "897348226", 339 | "gas": 23384, 340 | "inclusion_blocks": 18446744071991133674 341 | }, 342 | { 343 | "hash": "0x110bc22a9727368c17a2aab6fa0ce71bb035bbb938a05da727cd36a65b32046d", 344 | "submission_block": 1740328165, 345 | "max_fee": "1801670012", 346 | "max_priority_fee": "690000000", 347 | "base_fee": "897348226", 348 | "gas": 64671, 349 | "inclusion_blocks": 18446744071991133674 350 | }, 351 | { 352 | "hash": "0x30295a18f4664afcdfe1591b410b5b6b1a2329741aac874c5d0d2b883b80a5a8", 353 | "submission_block": 1740328165, 354 | "max_fee": "1418929497", 355 | "max_priority_fee": "1418929497", 356 | "base_fee": "897348226", 357 | "gas": 189343, 358 | "inclusion_blocks": 18446744071991133674 359 | }, 360 | { 361 | "hash": "0x811fa74328ebdc3e2f22ba5a7e0f83e32b414e5a1069da38020b949d86d9c9e5", 362 | "submission_block": 1740328165, 363 | "max_fee": "2013230970", 364 | "max_priority_fee": "500000000", 365 | "base_fee": "897348226", 366 | "gas": 740000, 367 | "inclusion_blocks": 18446744071991133674 368 | }, 369 | { 370 | "hash": "0x4e17f4c7cd78545704088d019ce16ba99f8ef502374d14dd2ba6c0b9471e7769", 371 | "submission_block": 1740328159, 372 | "max_fee": "1886611278", 373 | "max_priority_fee": "500000000", 374 | "base_fee": "897348226", 375 | "gas": 219115, 376 | "inclusion_blocks": 18446744071991133680 377 | }, 378 | { 379 | "hash": "0xefb28d2f6e6fb188f74404b1d0982026bce92207fce5b3050399d5045fc08fe6", 380 | "submission_block": 1740328165, 381 | "max_fee": "1886611278", 382 | "max_priority_fee": "500000000", 383 | "base_fee": "897348226", 384 | "gas": 21000, 385 | "inclusion_blocks": 18446744071991133674 386 | }, 387 | { 388 | "hash": "0xb2a369453470aa1d0679fdce9213328250aff5f4bdd71b3cb23e8638d5eac02a", 389 | "submission_block": 1740328165, 390 | "max_fee": "1805003926", 391 | "max_priority_fee": "500000000", 392 | "base_fee": "897348226", 393 | "gas": 65100, 394 | "inclusion_blocks": 18446744071991133674 395 | }, 396 | { 397 | "hash": "0x58cb98bd45a0e36eda7a3dcded66f4faac674d8b834dbecbee807c8847ccb97f", 398 | "submission_block": 1740328165, 399 | "max_fee": "1730608494", 400 | "max_priority_fee": "500000000", 401 | "base_fee": "897348226", 402 | "gas": 21000, 403 | "inclusion_blocks": 18446744071991133674 404 | }, 405 | { 406 | "hash": "0xa1624405dca3c1abf2028271f5ce8379cca93d9715718ba05d866c557d72855e", 407 | "submission_block": 1740328165, 408 | "max_fee": "1469658236", 409 | "max_priority_fee": "500000000", 410 | "base_fee": "897348226", 411 | "gas": 21000, 412 | "inclusion_blocks": 18446744071991133674 413 | }, 414 | { 415 | "hash": "0x94f8b8021a9e27d480992d02c0bec1cf0fd99d3dc1d897c64bee032b71c68d82", 416 | "submission_block": 1740328165, 417 | "max_fee": "1505240837", 418 | "max_priority_fee": "301513900", 419 | "base_fee": "897348226", 420 | "gas": 63185, 421 | "inclusion_blocks": 18446744071991133674 422 | }, 423 | { 424 | "hash": "0x933590600344cae4c46ff0c58c7ae128d82e567f87e36e0c1913938d8dc37806", 425 | "submission_block": 1740328165, 426 | "max_fee": "1182441248", 427 | "max_priority_fee": "1182441248", 428 | "base_fee": "897348226", 429 | "gas": 21000, 430 | "inclusion_blocks": 18446744071991133674 431 | }, 432 | { 433 | "hash": "0xe0fc72f0ad3a0df8c60bb563cbd1790db72b3e857e8ffad326741f2e22a52a65", 434 | "submission_block": 1740328165, 435 | "max_fee": "1121775574", 436 | "max_priority_fee": "1121775574", 437 | "base_fee": "897348226", 438 | "gas": 21000, 439 | "inclusion_blocks": 18446744071991133674 440 | }, 441 | { 442 | "hash": "0x7fccce5e078aca3638502186ca6ffb7efe6d85cb6c8d4b23dee065ebb801365f", 443 | "submission_block": 1740328165, 444 | "max_fee": "2112424403", 445 | "max_priority_fee": "179085253", 446 | "base_fee": "897348226", 447 | "gas": 116491, 448 | "inclusion_blocks": 18446744071991133674 449 | }, 450 | { 451 | "hash": "0xdc7dc088327294beca3ae89a1fc476e9cc9d60a4d849016ea22186dd3cff039d", 452 | "submission_block": 1740328165, 453 | "max_fee": "1049475708", 454 | "max_priority_fee": "1049475708", 455 | "base_fee": "897348226", 456 | "gas": 21000, 457 | "inclusion_blocks": 18446744071991133674 458 | }, 459 | { 460 | "hash": "0x4caec4a4b26a7fe2d98cd1edd0920bfd97814cbe16f93960251c5576de0f455b", 461 | "submission_block": 1740328165, 462 | "max_fee": "1000000000", 463 | "max_priority_fee": "1000000000", 464 | "base_fee": "897348226", 465 | "gas": 22000, 466 | "inclusion_blocks": 18446744071991133674 467 | }, 468 | { 469 | "hash": "0xa99b66db8f65af5919fee5c94f4d832a13dc46309e5945daa0f6ab47143d1e9d", 470 | "submission_block": 1740328165, 471 | "max_fee": "1000000000", 472 | "max_priority_fee": "1000000000", 473 | "base_fee": "897348226", 474 | "gas": 60000, 475 | "inclusion_blocks": 18446744071991133674 476 | }, 477 | { 478 | "hash": "0x3ba0b3152b21477440d580af48866a8563dc3c581bfce4b40eef72ac422f13f4", 479 | "submission_block": 1740328165, 480 | "max_fee": "1000000000", 481 | "max_priority_fee": "1000000000", 482 | "base_fee": "897348226", 483 | "gas": 35130, 484 | "inclusion_blocks": 18446744071991133674 485 | }, 486 | { 487 | "hash": "0xc50c71896d1f23ff63387667f7a404cb74a9ae87562f95410af8e250bdbd3fd0", 488 | "submission_block": 1740328165, 489 | "max_fee": "1000000000", 490 | "max_priority_fee": "1000000000", 491 | "base_fee": "897348226", 492 | "gas": 22000, 493 | "inclusion_blocks": 18446744071991133674 494 | }, 495 | { 496 | "hash": "0x6122272a235107dc4cd151dc69dc005edcbf9e48110001110ff1672c8e009b82", 497 | "submission_block": 1740328165, 498 | "max_fee": "1000000000", 499 | "max_priority_fee": "1000000000", 500 | "base_fee": "897348226", 501 | "gas": 21000, 502 | "inclusion_blocks": 18446744071991133674 503 | }, 504 | { 505 | "hash": "0x850b4fe937e8d0e55b4fc22c5a61ac9a6363bdf54e0b2bb07f6e3c7552fb56bd", 506 | "submission_block": 1740328165, 507 | "max_fee": "1000000000", 508 | "max_priority_fee": "1000000000", 509 | "base_fee": "897348226", 510 | "gas": 21000, 511 | "inclusion_blocks": 18446744071991133674 512 | }, 513 | { 514 | "hash": "0xa8857ff10e2d96bc0634a384dc52352a90ad163d996b1f9b59f15ca2236b543d", 515 | "submission_block": 1740328159, 516 | "max_fee": "1913848688", 517 | "max_priority_fee": "100000000", 518 | "base_fee": "897348226", 519 | "gas": 36301, 520 | "inclusion_blocks": 18446744071991133680 521 | }, 522 | { 523 | "hash": "0x251dba0b7aef01b1fceb250c45f2fbc96636e33bfdc3fcb8d7dd44e6a8eb3b70", 524 | "submission_block": 1740328165, 525 | "max_fee": "1913848688", 526 | "max_priority_fee": "100000000", 527 | "base_fee": "897348226", 528 | "gas": 422724, 529 | "inclusion_blocks": 18446744071991133674 530 | }, 531 | { 532 | "hash": "0x0a55f2efd1b022b437d8e303deebce854804e542de187de00d56c477509b9d18", 533 | "submission_block": 1740328165, 534 | "max_fee": "1089355185", 535 | "max_priority_fee": "100000000", 536 | "base_fee": "897348226", 537 | "gas": 52056, 538 | "inclusion_blocks": 18446744071991133674 539 | }, 540 | { 541 | "hash": "0x091739a884551faf6dcf8a58ab55e99e891d137fbcee6ac1584defc0a6dd43d9", 542 | "submission_block": 1740328165, 543 | "max_fee": "1088575123", 544 | "max_priority_fee": "100000000", 545 | "base_fee": "897348226", 546 | "gas": 52027, 547 | "inclusion_blocks": 18446744071991133674 548 | }, 549 | { 550 | "hash": "0xc8f1a05d41ba1c194fad503b8b2657accfac537a01fb16509b1f3e704f394c07", 551 | "submission_block": 1740328159, 552 | "max_fee": "1080568382", 553 | "max_priority_fee": "100000000", 554 | "base_fee": "897348226", 555 | "gas": 52056, 556 | "inclusion_blocks": 18446744071991133680 557 | }, 558 | { 559 | "hash": "0x77c5b9785911da3a930ecae69cd9dd7aece3f5b25ebbf7a01616f5a015f4156e", 560 | "submission_block": 1740328165, 561 | "max_fee": "1153474429", 562 | "max_priority_fee": "89000000", 563 | "base_fee": "897348226", 564 | "gas": 50080, 565 | "inclusion_blocks": 18446744071991133674 566 | }, 567 | { 568 | "hash": "0x4315624da47f44108b37bf9e4d42123ba873313c99b9e2f968172e8ff802f533", 569 | "submission_block": 1740328165, 570 | "max_fee": "1055669571", 571 | "max_priority_fee": "89000000", 572 | "base_fee": "897348226", 573 | "gas": 21000, 574 | "inclusion_blocks": 18446744071991133674 575 | }, 576 | { 577 | "hash": "0xd07a68de896087d04c55e9edcd6031f38781afd90102c44aaae5b41278a909ab", 578 | "submission_block": 1740328165, 579 | "max_fee": "970908589", 580 | "max_priority_fee": "970908589", 581 | "base_fee": "897348226", 582 | "gas": 242740, 583 | "inclusion_blocks": 18446744071991133674 584 | }, 585 | { 586 | "hash": "0xc9c2f988388ffe24598e35f60f20bf4b1197354d3dde6ee583bd0451c9a1e5b2", 587 | "submission_block": 1740328165, 588 | "max_fee": "1936120159", 589 | "max_priority_fee": "46714869", 590 | "base_fee": "897348226", 591 | "gas": 35982, 592 | "inclusion_blocks": 18446744071991133674 593 | }, 594 | { 595 | "hash": "0xd3b511fd20ab6c5b7b48b6203708b30d92eba6e1ac76ff0f88553e12818f3c0e", 596 | "submission_block": 1740328165, 597 | "max_fee": "1220384176", 598 | "max_priority_fee": "35613569", 599 | "base_fee": "897348226", 600 | "gas": 21000, 601 | "inclusion_blocks": 18446744071991133674 602 | }, 603 | { 604 | "hash": "0xed98f8348bb57953e32b4aabbb481f8157c482e8bbc93c42041859a74bf1dd79", 605 | "submission_block": 1740328165, 606 | "max_fee": "1220384176", 607 | "max_priority_fee": "35613569", 608 | "base_fee": "897348226", 609 | "gas": 21000, 610 | "inclusion_blocks": 18446744071991133674 611 | }, 612 | { 613 | "hash": "0x62a893fabcabc30bad3ed99afe8faf2466e6f221b4807345c8af6cdf379bad11", 614 | "submission_block": 1740328165, 615 | "max_fee": "919523932", 616 | "max_priority_fee": "919523932", 617 | "base_fee": "897348226", 618 | "gas": 21000, 619 | "inclusion_blocks": 18446744071991133674 620 | }, 621 | { 622 | "hash": "0x8c628daaf44914629ce496f6499c0e032e79039f99f3b7f65e8fbc23ecad7684", 623 | "submission_block": 1740328165, 624 | "max_fee": "908359680", 625 | "max_priority_fee": "908359680", 626 | "base_fee": "897348226", 627 | "gas": 67502, 628 | "inclusion_blocks": 18446744071991133674 629 | }, 630 | { 631 | "hash": "0xc331b8d2fcc8b159d4c7521f4be3af90d68f605b35c8a9f54aebd929c5468acf", 632 | "submission_block": 1740328165, 633 | "max_fee": "1194136788", 634 | "max_priority_fee": "9366181", 635 | "base_fee": "897348226", 636 | "gas": 21000, 637 | "inclusion_blocks": 18446744071991133674 638 | }, 639 | { 640 | "hash": "0xf195993e4734b93ba7d97dea8a7ed300d21777220e7e34040b71be90cd08d32b", 641 | "submission_block": 1740328165, 642 | "max_fee": "1194136788", 643 | "max_priority_fee": "9366181", 644 | "base_fee": "897348226", 645 | "gas": 21000, 646 | "inclusion_blocks": 18446744071991133674 647 | }, 648 | { 649 | "hash": "0x88c01dcd662536c7dc2814d37ddfa035ce85b734ff3ebd5bcc27b604605124ea", 650 | "submission_block": 1740328165, 651 | "max_fee": "1194136788", 652 | "max_priority_fee": "9366181", 653 | "base_fee": "897348226", 654 | "gas": 21000, 655 | "inclusion_blocks": 18446744071991133674 656 | }, 657 | { 658 | "hash": "0x997f364d11bbf4a8499e81ce4d42c38295f949de91da2e1dab8c60eb3fb8bf8d", 659 | "submission_block": 1740328165, 660 | "max_fee": "1194136788", 661 | "max_priority_fee": "9366181", 662 | "base_fee": "897348226", 663 | "gas": 69948, 664 | "inclusion_blocks": 18446744071991133674 665 | }, 666 | { 667 | "hash": "0x28ae223e7b8485d92c7607681863f234332d8f9e6f9e1a35089927cdeffb1efe", 668 | "submission_block": 1740328165, 669 | "max_fee": "1194136788", 670 | "max_priority_fee": "9366181", 671 | "base_fee": "897348226", 672 | "gas": 21000, 673 | "inclusion_blocks": 18446744071991133674 674 | }, 675 | { 676 | "hash": "0xbbb7593031aa12ad110b0a7be5749f4079aeb7389fc54629dd491f244104188e", 677 | "submission_block": 1740328165, 678 | "max_fee": "1194136788", 679 | "max_priority_fee": "9366181", 680 | "base_fee": "897348226", 681 | "gas": 84000, 682 | "inclusion_blocks": 18446744071991133674 683 | }, 684 | { 685 | "hash": "0x756f66bfbcd2cf046f72919c59d002a807d63eba0537dbff878b20e8e66b3b32", 686 | "submission_block": 1740328165, 687 | "max_fee": "910243627", 688 | "max_priority_fee": "2500706", 689 | "base_fee": "897348226", 690 | "gas": 21000, 691 | "inclusion_blocks": 18446744071991133674 692 | }, 693 | { 694 | "hash": "0xd7ac133502e583250db4006a638dce6d3043dd74a07197c020be79f7b9abc172", 695 | "submission_block": 1740328165, 696 | "max_fee": "910243627", 697 | "max_priority_fee": "2500706", 698 | "base_fee": "897348226", 699 | "gas": 21000, 700 | "inclusion_blocks": 18446744071991133674 701 | }, 702 | { 703 | "hash": "0x46611baf698db077f75a0a5824913aa1cd5e0aa24ccd4df2a55ca2052da4e170", 704 | "submission_block": 1740328165, 705 | "max_fee": "1078318294", 706 | "max_priority_fee": "1500423", 707 | "base_fee": "897348226", 708 | "gas": 1024604, 709 | "inclusion_blocks": 18446744071991133674 710 | }, 711 | { 712 | "hash": "0x9b818f117252d56bad3dc1a5f242fbaef99e02e3b95ba5520d31f8fd77d11494", 713 | "submission_block": 1740328165, 714 | "max_fee": "1078318294", 715 | "max_priority_fee": "1500423", 716 | "base_fee": "897348226", 717 | "gas": 1024604, 718 | "inclusion_blocks": 18446744071991133674 719 | }, 720 | { 721 | "hash": "0xb653bbe043360354cd3ca28f2606e5964d3f005d73b1b88582af28834b5096c6", 722 | "submission_block": 1740328165, 723 | "max_fee": "1078318294", 724 | "max_priority_fee": "1500423", 725 | "base_fee": "897348226", 726 | "gas": 1064560, 727 | "inclusion_blocks": 18446744071991133674 728 | }, 729 | { 730 | "hash": "0x40a06113a705e21ca2c3d895dcb96b836c66ff1d3209333928733b79f07dacf5", 731 | "submission_block": 1740328165, 732 | "max_fee": "1891905996", 733 | "max_priority_fee": "1250353", 734 | "base_fee": "897348226", 735 | "gas": 21000, 736 | "inclusion_blocks": 18446744071991133674 737 | }, 738 | { 739 | "hash": "0xa8a13ed2d90b6332510f3e263d37d6e64e507266054ca222ed0816720a8a1845", 740 | "submission_block": 1740328165, 741 | "max_fee": "1890655643", 742 | "max_priority_fee": "1250353", 743 | "base_fee": "897348226", 744 | "gas": 238012, 745 | "inclusion_blocks": 18446744071991133674 746 | }, 747 | { 748 | "hash": "0x8a5fe7dc8c655be86b786549eb7826a29284e7a6ec407440b01e4a8ee61383bf", 749 | "submission_block": 1740328165, 750 | "max_fee": "1795946805", 751 | "max_priority_fee": "1250353", 752 | "base_fee": "897348226", 753 | "gas": 21000, 754 | "inclusion_blocks": 18446744071991133674 755 | }, 756 | { 757 | "hash": "0x1bfc4d4203b383b05912f35659d6b2fa6de6f788b2a28ba8074504eee4925025", 758 | "submission_block": 1740328165, 759 | "max_fee": "1795946805", 760 | "max_priority_fee": "1250353", 761 | "base_fee": "897348226", 762 | "gas": 21000, 763 | "inclusion_blocks": 18446744071991133674 764 | }, 765 | { 766 | "hash": "0x98d0c42b3bfeee1323f54fafd16858aaa901231230e1927f402dd4fcfdc908d8", 767 | "submission_block": 1740328159, 768 | "max_fee": "1138190168", 769 | "max_priority_fee": "1250353", 770 | "base_fee": "897348226", 771 | "gas": 25200, 772 | "inclusion_blocks": 18446744071991133680 773 | }, 774 | { 775 | "hash": "0x22d4f5aad6df90eddd462e5153624fa5c0b9ec50d0bae39b213691727ce8f435", 776 | "submission_block": 1740328165, 777 | "max_fee": "970908589", 778 | "max_priority_fee": "1250353", 779 | "base_fee": "897348226", 780 | "gas": 73301, 781 | "inclusion_blocks": 18446744071991133674 782 | }, 783 | { 784 | "hash": "0x711c2aaccf7720e483b6097eb1e2bdea18c8a4fa6b698b810390e829848bc3ea", 785 | "submission_block": 1740328165, 786 | "max_fee": "907623796", 787 | "max_priority_fee": "1250353", 788 | "base_fee": "897348226", 789 | "gas": 83697, 790 | "inclusion_blocks": 18446744071991133674 791 | }, 792 | { 793 | "hash": "0xf60b726d46d1afa8ad0d26fb078f013877b4143d94771663359b2ad76bd9ba80", 794 | "submission_block": 1740328165, 795 | "max_fee": "947374824", 796 | "max_priority_fee": "1175331", 797 | "base_fee": "897348226", 798 | "gas": 1636601, 799 | "inclusion_blocks": 18446744071991133674 800 | } 801 | ] 802 | } 803 | -------------------------------------------------------------------------------- /example_data/block_21910225.json: -------------------------------------------------------------------------------- 1 | { 2 | "block": { 3 | "number": 21910225, 4 | "timestamp": 1740328199, 5 | "base_fee": "880850135", 6 | "gas_used": 9605092 7 | }, 8 | "network": { 9 | "mempool": { 10 | "Count": 22, 11 | "P10": 0.1, 12 | "P30": 0.998478854, 13 | "P50": 1, 14 | "P70": 2, 15 | "P90": 2, 16 | "NextBlock": 21910226, 17 | "NextBaseFee": 0.8295800752521726 18 | }, 19 | "history": { 20 | "gas_ratio_5": 0.40196024470702796, 21 | "gas_spikes_25": 2, 22 | "fee_ewma_10": 0.9197486677410572, 23 | "fee_ewma_25": 0.8740261404128151 24 | } 25 | }, 26 | "txs": [ 27 | { 28 | "hash": "0x01c05447f0cc7d52fa060baad3a31084a0ecf4dc6f7c64afa373d016840d0692", 29 | "submission_block": 1740328190, 30 | "max_fee": "10000000000", 31 | "max_priority_fee": "10000000000", 32 | "base_fee": "880850135", 33 | "gas": 500000, 34 | "inclusion_blocks": 18446744071991133651 35 | }, 36 | { 37 | "hash": "0x1c2b8b025633830f8355cf86e8ac75bf53fe71c983cb6724b0860ae93d9f56c2", 38 | "submission_block": 1740328190, 39 | "max_fee": "6875000000", 40 | "max_priority_fee": "6875000000", 41 | "base_fee": "880850135", 42 | "gas": 21000, 43 | "inclusion_blocks": 18446744071991133651 44 | }, 45 | { 46 | "hash": "0x5351f21788aceb69228bb330eacc1222197edf19811fa2268745f3fa5bf3b09a", 47 | "submission_block": 1740328165, 48 | "max_fee": "15030000000", 49 | "max_priority_fee": "5010000000", 50 | "base_fee": "880850135", 51 | "gas": 21000, 52 | "inclusion_blocks": 18446744071991133676 53 | }, 54 | { 55 | "hash": "0x84d0cec8237c6a93c8f503824e96b0f4d1647f8944e30846a9258e1b2c1f6d6b", 56 | "submission_block": 1740328190, 57 | "max_fee": "33000000000", 58 | "max_priority_fee": "3000000000", 59 | "base_fee": "880850135", 60 | "gas": 5000000, 61 | "inclusion_blocks": 18446744071991133651 62 | }, 63 | { 64 | "hash": "0xe7325cc4c9fa21c40e641b15bfe651045b73a7493e3e3815c8b4adc988a46ad3", 65 | "submission_block": 1740328190, 66 | "max_fee": "3000000000", 67 | "max_priority_fee": "3000000000", 68 | "base_fee": "880850135", 69 | "gas": 22000, 70 | "inclusion_blocks": 18446744071991133651 71 | }, 72 | { 73 | "hash": "0x60fb4b64da220a0193124d80312964efb9c5966f2e4d0ce587f157aaa182730a", 74 | "submission_block": 1740328190, 75 | "max_fee": "21000000000", 76 | "max_priority_fee": "2001000000", 77 | "base_fee": "880850135", 78 | "gas": 50000, 79 | "inclusion_blocks": 18446744071991133651 80 | }, 81 | { 82 | "hash": "0xb95d06ce96bdea7020321c050442a1d0bcaf92e791da3c5dfa3f173ca505c8f6", 83 | "submission_block": 1740328177, 84 | "max_fee": "21000000000", 85 | "max_priority_fee": "2001000000", 86 | "base_fee": "880850135", 87 | "gas": 50000, 88 | "inclusion_blocks": 18446744071991133664 89 | }, 90 | { 91 | "hash": "0xe9ed8e3a6626dd3cf50e405dad3f599728ae4a9afbe964cb76a053b8dc924e38", 92 | "submission_block": 1740328190, 93 | "max_fee": "21000000000", 94 | "max_priority_fee": "2001000000", 95 | "base_fee": "880850135", 96 | "gas": 50000, 97 | "inclusion_blocks": 18446744071991133651 98 | }, 99 | { 100 | "hash": "0x429d54c6b7c0c75a5a83b26d883c865af8245b44250c010c148884c4b945e170", 101 | "submission_block": 1740328190, 102 | "max_fee": "502000000000", 103 | "max_priority_fee": "2000000000", 104 | "base_fee": "880850135", 105 | "gas": 210000, 106 | "inclusion_blocks": 18446744071991133651 107 | }, 108 | { 109 | "hash": "0x3f85a18a3b9edb0aca6d50a2aa6f0113b4de698a3e8d97d6d6439cd3ba30ca96", 110 | "submission_block": 1740328177, 111 | "max_fee": "502000000000", 112 | "max_priority_fee": "2000000000", 113 | "base_fee": "880850135", 114 | "gas": 210000, 115 | "inclusion_blocks": 18446744071991133664 116 | }, 117 | { 118 | "hash": "0x8150553733004ecdcd504da2a333fba2a9af6d103a7cbe04183394c998c8164b", 119 | "submission_block": 1740328190, 120 | "max_fee": "502000000000", 121 | "max_priority_fee": "2000000000", 122 | "base_fee": "880850135", 123 | "gas": 210000, 124 | "inclusion_blocks": 18446744071991133651 125 | }, 126 | { 127 | "hash": "0x864662acbd2e8e52a0658df5cd771e5988721a18ad73428a7ea9311a4b806759", 128 | "submission_block": 1740328190, 129 | "max_fee": "502000000000", 130 | "max_priority_fee": "2000000000", 131 | "base_fee": "880850135", 132 | "gas": 210000, 133 | "inclusion_blocks": 18446744071991133651 134 | }, 135 | { 136 | "hash": "0x8f4fb8d5936af7d29a8fc772267a68a7775e070e7f56328c297ea3d38b24fd1d", 137 | "submission_block": 1740328190, 138 | "max_fee": "200000000000", 139 | "max_priority_fee": "2000000000", 140 | "base_fee": "880850135", 141 | "gas": 90000, 142 | "inclusion_blocks": 18446744071991133651 143 | }, 144 | { 145 | "hash": "0x94da43b7e400ed1bab4fc4c724e78edfdbbab9b931248805f95936773c7594da", 146 | "submission_block": 1740328190, 147 | "max_fee": "200000000000", 148 | "max_priority_fee": "2000000000", 149 | "base_fee": "880850135", 150 | "gas": 90000, 151 | "inclusion_blocks": 18446744071991133651 152 | }, 153 | { 154 | "hash": "0xe3d167bd10c218828851785970c6903eb38631faa4261ce2f0826b91b20232f7", 155 | "submission_block": 1740328190, 156 | "max_fee": "102000000000", 157 | "max_priority_fee": "2000000000", 158 | "base_fee": "880850135", 159 | "gas": 207128, 160 | "inclusion_blocks": 18446744071991133651 161 | }, 162 | { 163 | "hash": "0xb2120b11a5af5869f1c4e66b157e4f813dd400a48402dcf2217232ed08d654d2", 164 | "submission_block": 1740328190, 165 | "max_fee": "102000000000", 166 | "max_priority_fee": "2000000000", 167 | "base_fee": "880850135", 168 | "gas": 207128, 169 | "inclusion_blocks": 18446744071991133651 170 | }, 171 | { 172 | "hash": "0x7c5067c9ad7adad45676073b21a1771e4dfe5520e42ac8ecaa6879c15efde017", 173 | "submission_block": 1740328190, 174 | "max_fee": "102000000000", 175 | "max_priority_fee": "2000000000", 176 | "base_fee": "880850135", 177 | "gas": 220436, 178 | "inclusion_blocks": 18446744071991133651 179 | }, 180 | { 181 | "hash": "0x0073193fa3ff1ee71fb6ba46048804adac8dd9a4fb72bc27d51a5cbae613e1e2", 182 | "submission_block": 1740328190, 183 | "max_fee": "6875000000", 184 | "max_priority_fee": "2000000000", 185 | "base_fee": "880850135", 186 | "gas": 21000, 187 | "inclusion_blocks": 18446744071991133651 188 | }, 189 | { 190 | "hash": "0x0ddba7786eafa4a0221af84771bb484642002df42a120efad078de3acee60b88", 191 | "submission_block": 1740328190, 192 | "max_fee": "6875000000", 193 | "max_priority_fee": "2000000000", 194 | "base_fee": "880850135", 195 | "gas": 21000, 196 | "inclusion_blocks": 18446744071991133651 197 | }, 198 | { 199 | "hash": "0xad031412f8d60ab2094a244afb47a355f7554c509e8e9df57fec096485346567", 200 | "submission_block": 1740328190, 201 | "max_fee": "6875000000", 202 | "max_priority_fee": "2000000000", 203 | "base_fee": "880850135", 204 | "gas": 80000, 205 | "inclusion_blocks": 18446744071991133651 206 | }, 207 | { 208 | "hash": "0xd9ccf3f4ee7620fe54aae7043222a72bb2b44d4b512b8fa81a9b4b4d83da9170", 209 | "submission_block": 1740328190, 210 | "max_fee": "6250000000", 211 | "max_priority_fee": "2000000000", 212 | "base_fee": "880850135", 213 | "gas": 21000, 214 | "inclusion_blocks": 18446744071991133651 215 | }, 216 | { 217 | "hash": "0x67ab3aed0f48c7e3db132da437455bc8c43d6a055367885a9ffb9091c7bee8f2", 218 | "submission_block": 1740328190, 219 | "max_fee": "6000000000", 220 | "max_priority_fee": "2000000000", 221 | "base_fee": "880850135", 222 | "gas": 60000, 223 | "inclusion_blocks": 18446744071991133651 224 | }, 225 | { 226 | "hash": "0x848fbd6b9616b378d9caeb2419f8aabc28d5bab1c2e4672b032401bcbe7472a5", 227 | "submission_block": 1740328190, 228 | "max_fee": "3234886058", 229 | "max_priority_fee": "2000000000", 230 | "base_fee": "880850135", 231 | "gas": 21000, 232 | "inclusion_blocks": 18446744071991133651 233 | }, 234 | { 235 | "hash": "0xefca939761b629d181e1254cf162770429f2002547ef43e9e4fb98b26f76db05", 236 | "submission_block": 1740328190, 237 | "max_fee": "3000000000", 238 | "max_priority_fee": "2000000000", 239 | "base_fee": "880850135", 240 | "gas": 53956, 241 | "inclusion_blocks": 18446744071991133651 242 | }, 243 | { 244 | "hash": "0x9ee0777f275e6f0b478b02e523673ab71333c612fe7dae030244abb4d712efd7", 245 | "submission_block": 1740328190, 246 | "max_fee": "2880850135", 247 | "max_priority_fee": "2000000000", 248 | "base_fee": "880850135", 249 | "gas": 21000, 250 | "inclusion_blocks": 18446744071991133651 251 | }, 252 | { 253 | "hash": "0xcca0c889fb7c00aa17b5206c05001a18ee69843bb7c4eeb9a994198a4c588dda", 254 | "submission_block": 1740328190, 255 | "max_fee": "2880450134", 256 | "max_priority_fee": "2880450134", 257 | "base_fee": "880850135", 258 | "gas": 630000, 259 | "inclusion_blocks": 18446744071991133651 260 | }, 261 | { 262 | "hash": "0xef67573a09b825ef7b42a3101b718c01d5e9cf57f92a3eeff5072f2425c068a8", 263 | "submission_block": 1740328177, 264 | "max_fee": "3294696452", 265 | "max_priority_fee": "1500000000", 266 | "base_fee": "880850135", 267 | "gas": 171488, 268 | "inclusion_blocks": 18446744071991133664 269 | }, 270 | { 271 | "hash": "0x4ef964f0202e58c9548a29e680e15c437b9449aa24313d38a8edef08e2fb679d", 272 | "submission_block": 1740328190, 273 | "max_fee": "3146514744", 274 | "max_priority_fee": "1500000000", 275 | "base_fee": "880850135", 276 | "gas": 860000, 277 | "inclusion_blocks": 18446744071991133651 278 | }, 279 | { 280 | "hash": "0x12803262e9432eb178de6fb2145d80750e9cf2ab9050493a190eaf919a62bf2e", 281 | "submission_block": 1740328190, 282 | "max_fee": "3146514744", 283 | "max_priority_fee": "1500000000", 284 | "base_fee": "880850135", 285 | "gas": 75000, 286 | "inclusion_blocks": 18446744071991133651 287 | }, 288 | { 289 | "hash": "0x00ff868c68ed07cb938c39cdaa186bd73b4b0eed88b8b085c04166c45086625c", 290 | "submission_block": 1740328190, 291 | "max_fee": "2000000000", 292 | "max_priority_fee": "2000000000", 293 | "base_fee": "880850135", 294 | "gas": 350000, 295 | "inclusion_blocks": 18446744071991133651 296 | }, 297 | { 298 | "hash": "0x993d8fd26d186fd1e0c8d413cbc4e55ea2e029722fe5f5a5c85ca9698dc455cb", 299 | "submission_block": 1740328190, 300 | "max_fee": "2000000000", 301 | "max_priority_fee": "2000000000", 302 | "base_fee": "880850135", 303 | "gas": 350000, 304 | "inclusion_blocks": 18446744071991133651 305 | }, 306 | { 307 | "hash": "0x9bf5d053b4c76e71263b4cd023cec11d6cf95429289bb41e8560a37ec4721ec1", 308 | "submission_block": 1740328190, 309 | "max_fee": "2000000000", 310 | "max_priority_fee": "2000000000", 311 | "base_fee": "880850135", 312 | "gas": 350000, 313 | "inclusion_blocks": 18446744071991133651 314 | }, 315 | { 316 | "hash": "0xe5276b23a4cb2d8f34c4e4dda8dd9ce4da98bdfa6b8c31050353ad2a80c01290", 317 | "submission_block": 1740328190, 318 | "max_fee": "2000000000", 319 | "max_priority_fee": "2000000000", 320 | "base_fee": "880850135", 321 | "gas": 350000, 322 | "inclusion_blocks": 18446744071991133651 323 | }, 324 | { 325 | "hash": "0x572baf49b265730177a44396cb22365084668304489c7430efc6f63c2124b0eb", 326 | "submission_block": 1740328190, 327 | "max_fee": "2000000000", 328 | "max_priority_fee": "2000000000", 329 | "base_fee": "880850135", 330 | "gas": 350000, 331 | "inclusion_blocks": 18446744071991133651 332 | }, 333 | { 334 | "hash": "0x0dee8fa2ee120484a5d0e3caa0d6ba6ab259b69ed3df452d3756398d4d29ec15", 335 | "submission_block": 1740328190, 336 | "max_fee": "3000000000", 337 | "max_priority_fee": "1000000000", 338 | "base_fee": "880850135", 339 | "gas": 23300, 340 | "inclusion_blocks": 18446744071991133651 341 | }, 342 | { 343 | "hash": "0x7b50e7552d0fdfbee16a99977d3f6644849740899fc7ee9af0395322d30e5c96", 344 | "submission_block": 1740328190, 345 | "max_fee": "3000000000", 346 | "max_priority_fee": "1000000000", 347 | "base_fee": "880850135", 348 | "gas": 21000, 349 | "inclusion_blocks": 18446744071991133651 350 | }, 351 | { 352 | "hash": "0x469f8ee5719180d4a73357c8da5da1489d43cd2ea7da8b4353cfa5dce38fc4ee", 353 | "submission_block": 1740328190, 354 | "max_fee": "3000000000", 355 | "max_priority_fee": "1000000000", 356 | "base_fee": "880850135", 357 | "gas": 21000, 358 | "inclusion_blocks": 18446744071991133651 359 | }, 360 | { 361 | "hash": "0x6e64dc71452dfcdd5195b8376f3990b8de20184406f96ddd9b9950433e5eef29", 362 | "submission_block": 1740328190, 363 | "max_fee": "3000000000", 364 | "max_priority_fee": "1000000000", 365 | "base_fee": "880850135", 366 | "gas": 21000, 367 | "inclusion_blocks": 18446744071991133651 368 | }, 369 | { 370 | "hash": "0x3cbe34ef90e6847d250e376b04d60a4872629cbfd16b7ba429b07cc1ab09919d", 371 | "submission_block": 1740328190, 372 | "max_fee": "3000000000", 373 | "max_priority_fee": "1000000000", 374 | "base_fee": "880850135", 375 | "gas": 21000, 376 | "inclusion_blocks": 18446744071991133651 377 | }, 378 | { 379 | "hash": "0x6e9409b3987d71ed4e95506813d9c97a16af765d611a27df3f3609fd8423fd31", 380 | "submission_block": 1740328190, 381 | "max_fee": "3000000000", 382 | "max_priority_fee": "1000000000", 383 | "base_fee": "880850135", 384 | "gas": 21000, 385 | "inclusion_blocks": 18446744071991133651 386 | }, 387 | { 388 | "hash": "0x6be19794e9324888a6bea4cdc0842dd749f6c03fccaa703a9edbe18c3c924c46", 389 | "submission_block": 1740328190, 390 | "max_fee": "3000000000", 391 | "max_priority_fee": "1000000000", 392 | "base_fee": "880850135", 393 | "gas": 21000, 394 | "inclusion_blocks": 18446744071991133651 395 | }, 396 | { 397 | "hash": "0x1dd82359bd1dee488311ab39ba303f0096f6285d60369dfd50ccae448fddb2e4", 398 | "submission_block": 1740328177, 399 | "max_fee": "1783207964", 400 | "max_priority_fee": "500000000", 401 | "base_fee": "880850135", 402 | "gas": 63495, 403 | "inclusion_blocks": 18446744071991133664 404 | }, 405 | { 406 | "hash": "0xa3771556d2df28f4544a20cddec9a0a24b9e415accbd91cb9c391bb81c39437a", 407 | "submission_block": 1740328190, 408 | "max_fee": "1783207964", 409 | "max_priority_fee": "500000000", 410 | "base_fee": "880850135", 411 | "gas": 31500, 412 | "inclusion_blocks": 18446744071991133651 413 | }, 414 | { 415 | "hash": "0x5e99b14b8ae80084d7537441c18d964237d9c7b39071555f694d7f571a35e89d", 416 | "submission_block": 1740328177, 417 | "max_fee": "1777369315", 418 | "max_priority_fee": "500000000", 419 | "base_fee": "880850135", 420 | "gas": 224481, 421 | "inclusion_blocks": 18446744071991133664 422 | }, 423 | { 424 | "hash": "0xdee0bc7ff17413e699e0a8a4119a049b234a22de33587a54533d5101f3d0b8ad", 425 | "submission_block": 1740328177, 426 | "max_fee": "1777369315", 427 | "max_priority_fee": "500000000", 428 | "base_fee": "880850135", 429 | "gas": 66876, 430 | "inclusion_blocks": 18446744071991133664 431 | }, 432 | { 433 | "hash": "0xbdd45fc743a015b43f33b157061041e6c17d8928e67bcb66f9afe47e3581cc13", 434 | "submission_block": 1740328190, 435 | "max_fee": "1775348570", 436 | "max_priority_fee": "500000000", 437 | "base_fee": "880850135", 438 | "gas": 21000, 439 | "inclusion_blocks": 18446744071991133651 440 | }, 441 | { 442 | "hash": "0xa7ee3ad9bc036ceee83dc15dd1300c7ebf5cde8a13a620143e4c7dc7a1d07026", 443 | "submission_block": 1740328190, 444 | "max_fee": "1775348570", 445 | "max_priority_fee": "500000000", 446 | "base_fee": "880850135", 447 | "gas": 58795, 448 | "inclusion_blocks": 18446744071991133651 449 | }, 450 | { 451 | "hash": "0x111e2d8f7f01c7c20d55b7441798f31a2e8e01e2cdb15d13c7a5b4ae1ff97975", 452 | "submission_block": 1740328177, 453 | "max_fee": "1734886058", 454 | "max_priority_fee": "500000000", 455 | "base_fee": "880850135", 456 | "gas": 112100, 457 | "inclusion_blocks": 18446744071991133664 458 | }, 459 | { 460 | "hash": "0x0f85dcc31f4aeb9836e6cb880c81ca475ece24a780522c81623039893838df3e", 461 | "submission_block": 1740328177, 462 | "max_fee": "1507392042", 463 | "max_priority_fee": "305718686", 464 | "base_fee": "880850135", 465 | "gas": 21000, 466 | "inclusion_blocks": 18446744071991133664 467 | }, 468 | { 469 | "hash": "0xafced0b309fd1d2ad5d80913f3aed1a0cb120aef8b0ebecb4cecf486f95166db", 470 | "submission_block": 1740328177, 471 | "max_fee": "1452229659", 472 | "max_priority_fee": "300984098", 473 | "base_fee": "880850135", 474 | "gas": 63710, 475 | "inclusion_blocks": 18446744071991133664 476 | }, 477 | { 478 | "hash": "0x8cba2f5b9ebcd3b2ecff954921884afb6ac7fdbb31481149c99323961379eb88", 479 | "submission_block": 1740328177, 480 | "max_fee": "1448644980", 481 | "max_priority_fee": "296616135", 482 | "base_fee": "880850135", 483 | "gas": 21000, 484 | "inclusion_blocks": 18446744071991133664 485 | }, 486 | { 487 | "hash": "0xf01c1da549b233d2658a425044e4175ce4df9db1a848419418925447ba81a657", 488 | "submission_block": 1740328190, 489 | "max_fee": "1121743989", 490 | "max_priority_fee": "1121743989", 491 | "base_fee": "880850135", 492 | "gas": 21000, 493 | "inclusion_blocks": 18446744071991133651 494 | }, 495 | { 496 | "hash": "0xc0c8470b08e773ff2d6d07835cea387359f98f116a11675833388cc034bb25ec", 497 | "submission_block": 1740328177, 498 | "max_fee": "980316214", 499 | "max_priority_fee": "980316214", 500 | "base_fee": "880850135", 501 | "gas": 21000, 502 | "inclusion_blocks": 18446744071991133664 503 | }, 504 | { 505 | "hash": "0x8bcaef90f67b6eede1a3651b15ddec6fd657fe4b4b0fd9c70f085e5fa0a1c4b5", 506 | "submission_block": 1740328190, 507 | "max_fee": "1053074533", 508 | "max_priority_fee": "1053074533", 509 | "base_fee": "880850135", 510 | "gas": 21000, 511 | "inclusion_blocks": 18446744071991133651 512 | }, 513 | { 514 | "hash": "0xca5819828c4a20146329a8444361f23e402e19e1f6e5a393aaf2dd6374e11fa5", 515 | "submission_block": 1740328190, 516 | "max_fee": "1053074533", 517 | "max_priority_fee": "1053074533", 518 | "base_fee": "880850135", 519 | "gas": 21000, 520 | "inclusion_blocks": 18446744071991133651 521 | }, 522 | { 523 | "hash": "0x081c2a5ed679a5268e5674cf448a80cde121a378ae138bcea078fee92ce750b0", 524 | "submission_block": 1740328190, 525 | "max_fee": "1053074533", 526 | "max_priority_fee": "1053074533", 527 | "base_fee": "880850135", 528 | "gas": 72864, 529 | "inclusion_blocks": 18446744071991133651 530 | }, 531 | { 532 | "hash": "0x6742c9bccc47950e2d0369bc5c2d91c052d1807fa775c4bdfd18f5da89be5d59", 533 | "submission_block": 1740328190, 534 | "max_fee": "1367799102", 535 | "max_priority_fee": "155726307", 536 | "base_fee": "880850135", 537 | "gas": 21000, 538 | "inclusion_blocks": 18446744071991133651 539 | }, 540 | { 541 | "hash": "0xa9c22ad93490c6bf37aecac84db51d9b1d3e8a1229eb0473848021660afd632d", 542 | "submission_block": 1740328190, 543 | "max_fee": "1030634657", 544 | "max_priority_fee": "1030634657", 545 | "base_fee": "880850135", 546 | "gas": 100000, 547 | "inclusion_blocks": 18446744071991133651 548 | }, 549 | { 550 | "hash": "0x6485c349c99583be3f8d7b9146eda30c4ba1ede94a6e3629fd32c1f78a5af822", 551 | "submission_block": 1740328190, 552 | "max_fee": "1030634657", 553 | "max_priority_fee": "1030634657", 554 | "base_fee": "880850135", 555 | "gas": 100000, 556 | "inclusion_blocks": 18446744071991133651 557 | }, 558 | { 559 | "hash": "0xe9fbb9cd61c83b9bdcd71770f911ec6bb4e2a708aea90e04c35e82bc0610ff22", 560 | "submission_block": 1740328190, 561 | "max_fee": "1000000000", 562 | "max_priority_fee": "1000000000", 563 | "base_fee": "880850135", 564 | "gas": 21000, 565 | "inclusion_blocks": 18446744071991133651 566 | }, 567 | { 568 | "hash": "0x6a7a73a0dc06dbfe51eaf6eeb20c5451588ec5b1f3faeca9839b9429d24302f3", 569 | "submission_block": 1740328190, 570 | "max_fee": "1000000000", 571 | "max_priority_fee": "1000000000", 572 | "base_fee": "880850135", 573 | "gas": 21000, 574 | "inclusion_blocks": 18446744071991133651 575 | }, 576 | { 577 | "hash": "0x464fb23ddc644670aede7f3b882fd0d2e210df4d2eb6f84e319d4f9588d09fff", 578 | "submission_block": 1740328190, 579 | "max_fee": "998478854", 580 | "max_priority_fee": "998478854", 581 | "base_fee": "880850135", 582 | "gas": 250000, 583 | "inclusion_blocks": 18446744071991133651 584 | }, 585 | { 586 | "hash": "0xc61f62470d9e81c7ab98ea34952ab968ebb60906ad8bfe971934638b90b34f41", 587 | "submission_block": 1740328190, 588 | "max_fee": "998478854", 589 | "max_priority_fee": "998478854", 590 | "base_fee": "880850135", 591 | "gas": 250000, 592 | "inclusion_blocks": 18446744071991133651 593 | }, 594 | { 595 | "hash": "0xe56760d882f8d90c435051913ef885264eea8420c96210fba3c40560119fddc3", 596 | "submission_block": 1740328190, 597 | "max_fee": "998478854", 598 | "max_priority_fee": "998478854", 599 | "base_fee": "880850135", 600 | "gas": 250000, 601 | "inclusion_blocks": 18446744071991133651 602 | }, 603 | { 604 | "hash": "0x76e6c56fa32955ff00b78ca03c9dc471c1cd51c82d12db0a16b3e6f555556061", 605 | "submission_block": 1740328190, 606 | "max_fee": "998478854", 607 | "max_priority_fee": "998478854", 608 | "base_fee": "880850135", 609 | "gas": 150000, 610 | "inclusion_blocks": 18446744071991133651 611 | }, 612 | { 613 | "hash": "0x13903513f3d38d2f7c917a0f190f7bbd7efdc37b9433ce758b4095a6ba1dee40", 614 | "submission_block": 1740328190, 615 | "max_fee": "1439223548", 616 | "max_priority_fee": "105544537", 617 | "base_fee": "880850135", 618 | "gas": 22050, 619 | "inclusion_blocks": 18446744071991133651 620 | }, 621 | { 622 | "hash": "0x3b738385e002d3a075de3d1f8df6db5c72190a0c7c5587567c82a50473b38d1a", 623 | "submission_block": 1740328190, 624 | "max_fee": "1665505604", 625 | "max_priority_fee": "100000000", 626 | "base_fee": "880850135", 627 | "gas": 162125, 628 | "inclusion_blocks": 18446744071991133651 629 | }, 630 | { 631 | "hash": "0xac74e289e92a9f170bf5e825616063c360ad0286324653ee7c6ac385ffa0eccb", 632 | "submission_block": 1740328190, 633 | "max_fee": "1023178838", 634 | "max_priority_fee": "100000000", 635 | "base_fee": "880850135", 636 | "gas": 21000, 637 | "inclusion_blocks": 18446744071991133651 638 | }, 639 | { 640 | "hash": "0x4c390407efdb31783cf2595956c43851e3f98d22ebe1d726dace8991a1dc390a", 641 | "submission_block": 1740328190, 642 | "max_fee": "999855188", 643 | "max_priority_fee": "100000000", 644 | "base_fee": "880850135", 645 | "gas": 379700, 646 | "inclusion_blocks": 18446744071991133651 647 | }, 648 | { 649 | "hash": "0xf4d8173503cb61ff51b3980fef90de5ae8427add827d04e98256eef50eca6c30", 650 | "submission_block": 1740328190, 651 | "max_fee": "2010000000", 652 | "max_priority_fee": "79000000", 653 | "base_fee": "880850135", 654 | "gas": 23100, 655 | "inclusion_blocks": 18446744071991133651 656 | }, 657 | { 658 | "hash": "0x186e8d7c7067f1c293802f726a38eefc83d6486238c544a0d1f2a218ac952c68", 659 | "submission_block": 1740328190, 660 | "max_fee": "1870000000", 661 | "max_priority_fee": "79000000", 662 | "base_fee": "880850135", 663 | "gas": 193117, 664 | "inclusion_blocks": 18446744071991133651 665 | }, 666 | { 667 | "hash": "0x611a2dab93473b153aebc093a190f8602ed92237bbdb3ce40f5c1b97ed9d013e", 668 | "submission_block": 1740328190, 669 | "max_fee": "959600507", 670 | "max_priority_fee": "100000000", 671 | "base_fee": "880850135", 672 | "gas": 80053, 673 | "inclusion_blocks": 18446744071991133651 674 | }, 675 | { 676 | "hash": "0x6fc263116fcfd224ebdade82b1fadad2038ff702a4b10de7431d735e2c4d3564", 677 | "submission_block": 1740328177, 678 | "max_fee": "1041935111", 679 | "max_priority_fee": "73560363", 680 | "base_fee": "880850135", 681 | "gas": 56035, 682 | "inclusion_blocks": 18446744071991133664 683 | }, 684 | { 685 | "hash": "0x1a758ebd10785680f1caee16c1376abed2c1a18e991d24947087c8efb64ed5b9", 686 | "submission_block": 1740328190, 687 | "max_fee": "920489945", 688 | "max_priority_fee": "920489945", 689 | "base_fee": "880850135", 690 | "gas": 51140, 691 | "inclusion_blocks": 18446744071991133651 692 | }, 693 | { 694 | "hash": "0x817b70f52f3d6909f688e851ce5c707341d5e597127f74354a30aa3db34b0c0f", 695 | "submission_block": 1740328190, 696 | "max_fee": "1242414559", 697 | "max_priority_fee": "30341764", 698 | "base_fee": "880850135", 699 | "gas": 84000, 700 | "inclusion_blocks": 18446744071991133651 701 | }, 702 | { 703 | "hash": "0xd41ae2897f886f8efc42cfca8f570f4925d13762fd2f01cb20f4a8ec5422c84b", 704 | "submission_block": 1740328190, 705 | "max_fee": "1242414559", 706 | "max_priority_fee": "30341764", 707 | "base_fee": "880850135", 708 | "gas": 84000, 709 | "inclusion_blocks": 18446744071991133651 710 | }, 711 | { 712 | "hash": "0x42ed21d55d9d565faf27e5f463789867d727cdb8599dbde38e181d1f9a5eea9c", 713 | "submission_block": 1740328190, 714 | "max_fee": "906875973", 715 | "max_priority_fee": "906875973", 716 | "base_fee": "880850135", 717 | "gas": 21000, 718 | "inclusion_blocks": 18446744071991133651 719 | }, 720 | { 721 | "hash": "0xc8138a659f87102f99583dc856b872495ef5165b688d1159a59d516c2b2cd18c", 722 | "submission_block": 1740328190, 723 | "max_fee": "1233312029", 724 | "max_priority_fee": "21239234", 725 | "base_fee": "880850135", 726 | "gas": 21000, 727 | "inclusion_blocks": 18446744071991133651 728 | }, 729 | { 730 | "hash": "0x749d05c11149ac0bcb0daf47a9235b1be5aa16a1d8396e014af3249dfc7fd125", 731 | "submission_block": 1740328177, 732 | "max_fee": "900000000", 733 | "max_priority_fee": "900000000", 734 | "base_fee": "880850135", 735 | "gas": 2400000, 736 | "inclusion_blocks": 18446744071991133664 737 | }, 738 | { 739 | "hash": "0x0b2ff92e1cd4828baa8757d1ea46dce21a6e2583bfedbed5fdf961f55b80a15c", 740 | "submission_block": 1740328177, 741 | "max_fee": "900000000", 742 | "max_priority_fee": "900000000", 743 | "base_fee": "880850135", 744 | "gas": 2400000, 745 | "inclusion_blocks": 18446744071991133664 746 | }, 747 | { 748 | "hash": "0x76e3e160144430ec576a930ec90cf1efea470d5e331345fb4dceca9b583c732e", 749 | "submission_block": 1740328190, 750 | "max_fee": "897348226", 751 | "max_priority_fee": "897348226", 752 | "base_fee": "880850135", 753 | "gas": 84000, 754 | "inclusion_blocks": 18446744071991133651 755 | }, 756 | { 757 | "hash": "0x26915e017d4248b1bd070929927edc66cb20452348aac9dd878958aa1f2016a4", 758 | "submission_block": 1740328190, 759 | "max_fee": "1258038010", 760 | "max_priority_fee": "2500706", 761 | "base_fee": "880850135", 762 | "gas": 93776, 763 | "inclusion_blocks": 18446744071991133651 764 | }, 765 | { 766 | "hash": "0x1dc300172b2dfa1db0076e0b774069dda5ab0ca8ff7d552e05a42981815df38f", 767 | "submission_block": 1740328190, 768 | "max_fee": "1763575799", 769 | "max_priority_fee": "1875529", 770 | "base_fee": "880850135", 771 | "gas": 21000, 772 | "inclusion_blocks": 18446744071991133651 773 | }, 774 | { 775 | "hash": "0x59129fcc429c58ce5a0a643cc7a3ed75883635af4beecb0d352834afd220f95e", 776 | "submission_block": 1740328190, 777 | "max_fee": "1058520585", 778 | "max_priority_fee": "1500423", 779 | "base_fee": "880850135", 780 | "gas": 343476, 781 | "inclusion_blocks": 18446744071991133651 782 | }, 783 | { 784 | "hash": "0x38ec65cb1433ef56080766deea68b4c931370e4c7d53ead2ba84abbf4c3a91a4", 785 | "submission_block": 1740328190, 786 | "max_fee": "1058520585", 787 | "max_priority_fee": "1500423", 788 | "base_fee": "880850135", 789 | "gas": 343476, 790 | "inclusion_blocks": 18446744071991133651 791 | }, 792 | { 793 | "hash": "0x05cdc71a6aca7f20cb3b8ffdc8ef17e00e082103e28341fe46a8e17da301d6ca", 794 | "submission_block": 1740328190, 795 | "max_fee": "1058520585", 796 | "max_priority_fee": "1500423", 797 | "base_fee": "880850135", 798 | "gas": 764212, 799 | "inclusion_blocks": 18446744071991133651 800 | }, 801 | { 802 | "hash": "0x01f9c1c9203728a95e70645bbec647279d5fcf392a617693cd9fb69b4bee1385", 803 | "submission_block": 1740328190, 804 | "max_fee": "898848649", 805 | "max_priority_fee": "1500423", 806 | "base_fee": "880850135", 807 | "gas": 183940, 808 | "inclusion_blocks": 18446744071991133651 809 | }, 810 | { 811 | "hash": "0x5d500aacf723b28d36d645201face9bdffd8b68ca05830ad2d2d2cc9c948b95f", 812 | "submission_block": 1740328190, 813 | "max_fee": "1795946805", 814 | "max_priority_fee": "1250353", 815 | "base_fee": "880850135", 816 | "gas": 189270, 817 | "inclusion_blocks": 18446744071991133651 818 | } 819 | ] 820 | } 821 | --------------------------------------------------------------------------------