1+ package main
2+
3+ import (
4+ "encoding/json"
5+ "fmt"
6+ "io"
7+ "net/http"
8+ "os"
9+ "strings"
10+ "log"
11+ "context"
12+ "github.com/urfave/cli/v3"
13+ )
14+
15+ type Info struct {
16+ Repo string `json:"repo"`
17+ Tag string `json:"tag"`
18+ Commit string `json:"commit"`
19+ }
20+
21+ type Dependencies struct {
22+ Op_Node Info `json:"op_node"`
23+ Op_Geth Info `json:"op_geth"`
24+ Op_Reth Info `json:"op_reth"`
25+ Nethermind Info `json:"nethermind"`
26+ Base_Reth_Node Info `json:"base_reth_node"`
27+ }
28+
29+ type VersionTag []struct {
30+ Tag string `json:"tag_name"`
31+ }
32+
33+ type Commit struct {
34+ Commit string `json:"sha"`
35+ }
36+
37+ func main () {
38+ cmd := & cli.Command {
39+ Name : "updater" ,
40+ Usage : "Updates the dependencies in the geth, nethermind and reth Dockerfiles" ,
41+ Action : func (context.Context , * cli.Command ) error {
42+ err := updater ()
43+ if err != nil {
44+ return fmt .Errorf ("error running updater: %s" , err )
45+ }
46+ return nil
47+ },
48+ }
49+
50+ if err := cmd .Run (context .Background (), os .Args ); err != nil {
51+ log .Fatal (err )
52+ }
53+ }
54+
55+ func updater () error {
56+ var err error
57+
58+ f , err := os .ReadFile ("../versions.json" )
59+ if err != nil {
60+ return fmt .Errorf ("error reading versions JSON: %s" , err )
61+ }
62+
63+ var dependencies Dependencies
64+
65+ err = json .Unmarshal (f , & dependencies )
66+ if err != nil {
67+ return fmt .Errorf ("error unmarshaling versions JSON to dependencies: %s" , err )
68+ }
69+
70+ token := os .Getenv ("GITHUB_TOKEN" )
71+
72+ // updating op reth version
73+ err = get_and_update_version_commit (
74+ "https://api.github.com/repos/paradigmxyz/reth/commits/" + dependencies .Op_Reth .Tag ,
75+ "https://api.github.com/repos/paradigmxyz/reth/releases" ,
76+ "op_reth" ,
77+ token ,
78+ & dependencies ,
79+ )
80+ if err != nil {
81+ return fmt .Errorf ("error getting and updating version/commit for reth: %s" , err )
82+ }
83+
84+ // updating op geth version
85+ err = get_and_update_version_commit (
86+ "https://api.github.com/repos/ethereum-optimism/op-geth/commits/" + dependencies .Op_Geth .Tag ,
87+ "https://api.github.com/repos/ethereum-optimism/op-geth/releases" ,
88+ "op_geth" ,
89+ token ,
90+ & dependencies ,
91+ )
92+ if err != nil {
93+ return fmt .Errorf ("error getting and updating version/commit for op geth: %s" , err )
94+ }
95+
96+ // updating op node version
97+ err = get_and_update_version_commit (
98+ "https://api.github.com/repos/ethereum-optimism/optimism/commits/" + dependencies .Op_Node .Tag ,
99+ "https://api.github.com/repos/ethereum-optimism/optimism/releases" ,
100+ "op_node" ,
101+ token ,
102+ & dependencies ,
103+ )
104+ if err != nil {
105+ return fmt .Errorf ("error getting and updating version/commit for op node: %s" , err )
106+ }
107+ // updating nethermind version
108+ err = get_and_update_version_commit (
109+ "https://api.github.com/repos/NethermindEth/nethermind/commits/" + dependencies .Nethermind .Tag ,
110+ "https://api.github.com/repos/NethermindEth/nethermind/releases" ,
111+ "nethermind" ,
112+ token ,
113+ & dependencies ,
114+ )
115+ if err != nil {
116+ return fmt .Errorf ("error getting and updating version/commit for nethermind: %s" , err )
117+ }
118+
119+ // updating base reth node version
120+ err = get_and_update_version_commit (
121+ "https://api.github.com/repos/base/node-reth/commits/" + dependencies .Base_Reth_Node .Tag ,
122+ "https://api.github.com/repos/base/node-reth/releases" ,
123+ "base_reth_node" ,
124+ token ,
125+ & dependencies ,
126+ )
127+ if err != nil {
128+ return fmt .Errorf ("error getting and updating version/commit for base reth node: %s" , err )
129+ }
130+
131+ e := create_versions_env (dependencies )
132+ if e != nil {
133+ return fmt .Errorf ("error creating versions.env: %s" , e )
134+ }
135+
136+ return nil
137+ }
138+
139+ func get_and_update_version_commit (
140+ commitUrl string ,
141+ versionUrl string ,
142+ dependency_type ,
143+ token string ,
144+ dependencies * Dependencies ) error {
145+ tag , err := get_version_tag (versionUrl , token )
146+ if err != nil {
147+ return fmt .Errorf ("error getting " + dependency_type , " version tag: %s" , err )
148+ }
149+
150+ commit , err := get_commit (commitUrl , token )
151+ if err != nil {
152+ return fmt .Errorf ("error getting " + dependency_type , " commit: %s" , err )
153+ }
154+
155+ e := update_version_tag_and_commit (commit , tag , dependency_type , dependencies )
156+ if e != nil {
157+ return fmt .Errorf ("error updating version tag and commit: %s" , e )
158+ }
159+
160+ return nil
161+ }
162+
163+ func get_version_tag (url string , token string ) (string , error ) {
164+ req , err := http .NewRequest ("GET" , url , nil )
165+ if err != nil {
166+ return "" , fmt .Errorf ("error creating new GET request (version tag): %s" , err )
167+ }
168+
169+ req .Header .Set ("Accept" , "application/vnd.github+json" )
170+ req .Header .Set ("Authorization" , "Bearer " + token )
171+ req .Header .Set ("X-GitHub-Api-Version" , "2022-11-28" )
172+
173+ jsonBody , err := get_json_body (req )
174+ if err != nil {
175+ return "" , fmt .Errorf ("error getting json body: %s" , err )
176+ }
177+
178+ var versionTag VersionTag
179+
180+ e := json .Unmarshal (jsonBody , & versionTag )
181+ if e != nil {
182+ return "" , fmt .Errorf ("error unmarshaling: %s" , e )
183+ }
184+
185+ // loop to return most recent version of op-node
186+ if url == "https://api.github.com/repos/ethereum-optimism/optimism/releases" {
187+ incrementor := 0
188+ for ! (strings .HasPrefix (versionTag [incrementor ].Tag , "op-node" )) {
189+ incrementor += 1
190+ }
191+ return versionTag [incrementor ].Tag , nil
192+ }
193+
194+ return versionTag [0 ].Tag , nil
195+ }
196+
197+ func get_commit (url string , token string ) (string , error ) {
198+ req , err := http .NewRequest ("GET" , url , nil )
199+ if err != nil {
200+ return "" , fmt .Errorf ("error creating new GET request (commit): %s" , err )
201+ }
202+
203+ req .Header .Set ("Accept" , "application/vnd.github+json" )
204+ req .Header .Set ("Authorization" , "Bearer " + token )
205+ req .Header .Set ("X-GitHub-Api-Version" , "2022-11-28" )
206+
207+ jsonBody , err := get_json_body (req )
208+ if err != nil {
209+ return "" , fmt .Errorf ("error getting json body: %s" , err )
210+ }
211+
212+ var commit Commit
213+
214+ e := json .Unmarshal (jsonBody , & commit )
215+ if e != nil {
216+ fmt .Println ("Error unmarshaling" )
217+ return "" , fmt .Errorf ("error unmarshaling: %s" , e )
218+ }
219+
220+ return string (commit .Commit ), nil
221+ }
222+
223+ func get_json_body (req * http.Request ) ([]byte , error ) {
224+ client := & http.Client {}
225+
226+ resp , err := client .Do (req )
227+ if err != nil {
228+ return nil , fmt .Errorf ("error making GET request to client: %s" , err )
229+ }
230+ defer resp .Body .Close ()
231+
232+ if resp .StatusCode != http .StatusOK {
233+ return nil , fmt .Errorf ("received http status code when getting json body: %s" , resp .Status )
234+ }
235+
236+ jsonBody , err := io .ReadAll (resp .Body )
237+ if err != nil {
238+ return nil , fmt .Errorf ("error reading json body: %s" , err )
239+ }
240+
241+ return jsonBody , nil
242+ }
243+
244+ func update_version_tag_and_commit (
245+ commit string ,
246+ tag string ,
247+ dependency_type string ,
248+ dependencies * Dependencies ) error {
249+ if dependency_type == "op_reth" {
250+ dependencies .Op_Reth .Tag = tag
251+ dependencies .Op_Reth .Commit = commit
252+ err := write_to_versions_env (* dependencies )
253+ if err != nil {
254+ return fmt .Errorf ("error writing to versions (op reth): %s" , err )
255+ }
256+ } else if dependency_type == "op_node" {
257+ dependencies .Op_Node .Tag = tag
258+ dependencies .Op_Node .Commit = commit
259+ err := write_to_versions_env (* dependencies )
260+ if err != nil {
261+ return fmt .Errorf ("error writing to versions (op node): %s" , err )
262+ }
263+ } else if dependency_type == "op_geth" {
264+ dependencies .Op_Geth .Tag = tag
265+ dependencies .Op_Geth .Commit = commit
266+ err := write_to_versions_env (* dependencies )
267+ if err != nil {
268+ return fmt .Errorf ("error writing to versions (op geth): %s" , err )
269+ }
270+ } else if dependency_type == "nethermind" {
271+ dependencies .Nethermind .Tag = tag
272+ dependencies .Nethermind .Commit = commit
273+ err := write_to_versions_env (* dependencies )
274+ if err != nil {
275+ return fmt .Errorf ("error writing to versions (nethermind): %s" , err )
276+ }
277+ } else if dependency_type == "base_reth_node" {
278+ dependencies .Base_Reth_Node .Tag = tag
279+ dependencies .Base_Reth_Node .Commit = commit
280+ err := write_to_versions_env (* dependencies )
281+ if err != nil {
282+ return fmt .Errorf ("error writing to versions (base reth node): %s" , err )
283+ }
284+ }
285+
286+ return nil
287+ }
288+
289+ func write_to_versions_env (dependencies Dependencies ) error {
290+ // formatting json
291+ updatedJson , err := json .MarshalIndent (dependencies , "" , " " )
292+ if err != nil {
293+ return fmt .Errorf ("error Marshaling dependencies json: %s" , err )
294+ }
295+
296+ e := os .WriteFile ("../versions.json" , updatedJson , 0644 )
297+ if e != nil {
298+ return fmt .Errorf ("error writing to versions.json: %s" , e )
299+ }
300+
301+ return nil
302+ }
303+
304+ func create_versions_env (dependencies Dependencies ) error {
305+ env := "export OP_NODE_TAG=" + dependencies .Op_Node .Tag + "\n " +
306+ "export OP_NODE_COMMIT=" + dependencies .Op_Node .Commit + "\n " +
307+ "export OP_NODE_REPO=https://github.com/ethereum-optimism/optimism.git" + "\n \n " +
308+ "export OP_GETH_TAG=" + dependencies .Op_Geth .Tag + "\n " +
309+ "export OP_GETH_COMMIT=" + dependencies .Op_Geth .Commit + "\n " +
310+ "export OP_GETH_REPO=https://github.com/ethereum-optimism/op-geth.git" + "\n \n " +
311+ "export OP_RETH_TAG=" + dependencies .Op_Reth .Tag + "\n " +
312+ "export OP_RETH_COMMIT=" + dependencies .Op_Reth .Commit + "\n " +
313+ "export OP_RETH_REPO=https://github.com/paradigmxyz/reth.git" + "\n \n " +
314+ "export NETHERMIND_TAG=" + dependencies .Nethermind .Tag + "\n " +
315+ "export NETHERMIND_COMMIT=" + dependencies .Nethermind .Commit + "\n " +
316+ "export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git" + "\n \n " +
317+ "export BASE_RETH_NODE_TAG=" + dependencies .Base_Reth_Node .Tag + "\n " +
318+ "export BASE_RETH_NODE_COMMIT=" + dependencies .Base_Reth_Node .Commit + "\n " +
319+ "export BASE_RETH_NODE_REPO=https://github.com/base/node-reth.git " + "\n \n "
320+
321+ file , err := os .Create ("../versions.env" )
322+ if err != nil {
323+ return fmt .Errorf ("error creating versions.env file: %s" , err )
324+ }
325+ defer file .Close ()
326+
327+ _ , err = file .WriteString (env )
328+ if err != nil {
329+ return fmt .Errorf ("error writing to versions.env file: %s" , err )
330+ }
331+
332+ return nil
333+ }
0 commit comments