From 3030eedda7253e53e0dd0c1e6787aadee4fc6759 Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Fri, 23 Jan 2026 14:48:11 +0100 Subject: [PATCH 1/2] Add function to Chainlink Client --- framework/.changeset/v0.13.7.md | 1 + framework/clclient/client.go | 34 +++++++++++++++++++++++++++++++++ framework/clclient/models.go | 14 ++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 framework/.changeset/v0.13.7.md diff --git a/framework/.changeset/v0.13.7.md b/framework/.changeset/v0.13.7.md new file mode 100644 index 000000000..9aaa681c8 --- /dev/null +++ b/framework/.changeset/v0.13.7.md @@ -0,0 +1 @@ +- Add `ReplayLogPollerFromBlock` function to Chainlink Client \ No newline at end of file diff --git a/framework/clclient/client.go b/framework/clclient/client.go index 1f1b63258..4ea593308 100644 --- a/framework/clclient/client.go +++ b/framework/clclient/client.go @@ -9,6 +9,7 @@ import ( "net/http" "os" "regexp" + "strconv" "strings" "sync" "time" @@ -1431,3 +1432,36 @@ func ImportP2PKeys(cl []*ChainlinkClient, keys [][]byte) error { } return eg.Wait() } + +func ReplayLogPollerFromBlock(cl []*ChainlinkClient, fromBlock, evmChainID int64) error { + eg := &errgroup.Group{} + for _, c := range cl { + eg.Go(func() error { + _, _, err := c.ReplayLogPollerFromBlock(fromBlock, evmChainID) + if err != nil { + return err + } + return nil + }) + } + return eg.Wait() +} + +func (c *ChainlinkClient) ReplayLogPollerFromBlock(fromBlock, evmChainID int64) (*ReplayResponse, *http.Response, error) { + specObj := &ReplayResponse{} + resp, err := c.APIClient.R(). + SetResult(&specObj). + SetQueryParams(map[string]string{ + "family": "evm", + "ChainID": strconv.FormatInt(evmChainID, 10), + }). + SetPathParams(map[string]string{ + "fromBlock": strconv.FormatInt(fromBlock, 10), + }). + Post("/v2/replay_from_block/{fromBlock}") + if err != nil { + return nil, nil, err + } + + return specObj, resp.RawResponse, err +} diff --git a/framework/clclient/models.go b/framework/clclient/models.go index 69f9d9d93..c99c5a1b4 100644 --- a/framework/clclient/models.go +++ b/framework/clclient/models.go @@ -3,6 +3,7 @@ package clclient import ( "bytes" "fmt" + "math/big" "text/template" "time" @@ -1419,3 +1420,16 @@ type ForwarderAttributes struct { CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } + +type ReplayResponse struct { + Data ReplayResponseData `json:"data"` +} + +type ReplayResponseData struct { + Attributes ReplayResponseAttributes `json:"attributes"` +} + +type ReplayResponseAttributes struct { + Message string `json:"message"` + EVMChainID *big.Int `json:"evmChainID"` +} From bae2b3244c8ce95f76321017df538f20d6299645 Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Fri, 23 Jan 2026 14:50:47 +0100 Subject: [PATCH 2/2] better return --- framework/clclient/client.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/framework/clclient/client.go b/framework/clclient/client.go index 4ea593308..6f2093687 100644 --- a/framework/clclient/client.go +++ b/framework/clclient/client.go @@ -1438,10 +1438,7 @@ func ReplayLogPollerFromBlock(cl []*ChainlinkClient, fromBlock, evmChainID int64 for _, c := range cl { eg.Go(func() error { _, _, err := c.ReplayLogPollerFromBlock(fromBlock, evmChainID) - if err != nil { - return err - } - return nil + return err }) } return eg.Wait()