From dea8eb2a48a5d02c011f1645309544870b2fe361 Mon Sep 17 00:00:00 2001
From: clarkchenc <651044554@qq.com>
Date: Thu, 17 Aug 2023 18:35:53 +0800
Subject: [PATCH] cater ethclient finalized and safe blocks

---
 ethclient/ethclient.go             | 11 +++++++++++
 ethclient/gethclient/gethclient.go | 11 +++++++++++
 rpc/types.go                       |  8 +++++---
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go
index 8d904a772..5f879ead0 100644
--- a/ethclient/ethclient.go
+++ b/ethclient/ethclient.go
@@ -541,6 +541,17 @@ func toBlockNumArg(number *big.Int) string {
 	if number.Cmp(pending) == 0 {
 		return "pending"
 	}
+
+	finalized := big.NewInt(int64(rpc.FinalizedBlockNumber))
+	if number.Cmp(finalized) == 0 {
+		return "finalized"
+	}
+
+	safe := big.NewInt(int64(rpc.SafeBlockNumber))
+	if number.Cmp(safe) == 0 {
+		return "safe"
+	}
+
 	return hexutil.EncodeBig(number)
 }
 
diff --git a/ethclient/gethclient/gethclient.go b/ethclient/gethclient/gethclient.go
index 538e23727..b2fa51677 100644
--- a/ethclient/gethclient/gethclient.go
+++ b/ethclient/gethclient/gethclient.go
@@ -187,6 +187,17 @@ func toBlockNumArg(number *big.Int) string {
 	if number.Cmp(pending) == 0 {
 		return "pending"
 	}
+
+	finalized := big.NewInt(int64(rpc.FinalizedBlockNumber))
+	if number.Cmp(finalized) == 0 {
+		return "finalized"
+	}
+
+	safe := big.NewInt(int64(rpc.SafeBlockNumber))
+	if number.Cmp(safe) == 0 {
+		return "safe"
+	}
+
 	return hexutil.EncodeBig(number)
 }
 
diff --git a/rpc/types.go b/rpc/types.go
index d9c2317a7..7f62f6277 100644
--- a/rpc/types.go
+++ b/rpc/types.go
@@ -58,9 +58,11 @@ type jsonWriter interface {
 type BlockNumber int64
 
 const (
-	PendingBlockNumber  = BlockNumber(-2)
-	LatestBlockNumber   = BlockNumber(-1)
-	EarliestBlockNumber = BlockNumber(0)
+	SafeBlockNumber      = BlockNumber(-4)
+	FinalizedBlockNumber = BlockNumber(-3)
+	PendingBlockNumber   = BlockNumber(-2)
+	LatestBlockNumber    = BlockNumber(-1)
+	EarliestBlockNumber  = BlockNumber(0)
 )
 
 // UnmarshalJSON parses the given JSON fragment into a BlockNumber. It supports: