Skip to content

Instantly share code, notes, and snippets.

@cuiweixie
Created March 26, 2025 06:20
Show Gist options
  • Save cuiweixie/b149a7d87f2b575724049d7198ea0b4e to your computer and use it in GitHub Desktop.
Save cuiweixie/b149a7d87f2b575724049d7198ea0b4e to your computer and use it in GitHub Desktop.
extract_event_id.go
package main
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"io/fs"
"os"
"path/filepath"
"slices"
"strings"
"sync"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
)
var mutex sync.Mutex
var result = make(map[common.Hash]Event)
func main() {
dir := flag.String("dir", "/Users/cui/code/opstack/optimism/packages/contracts-bedrock/forge-artifacts", "directory to scan")
flag.Parse()
var wg sync.WaitGroup
err := filepath.Walk(*dir, func(path string, info fs.FileInfo, err error) error {
if info.IsDir() {
return nil
}
if !strings.HasSuffix(path, ".json") {
return nil
}
go func() {
wg.Add(1)
defer wg.Add(-1)
err = processOneJSONFile(path)
}()
return err
})
wg.Wait()
if err != nil {
panic(err)
}
var errSlice []Event
for _, e := range result {
errSlice = append(errSlice, e)
}
slices.SortFunc(errSlice, func(a, b Event) int {
if a.Sig < b.Sig {
return -1
} else if a.Sig == b.Sig {
return 0
} else {
return 1
}
})
bs, err := json.MarshalIndent(errSlice, "", " ")
if err != nil {
panic(err)
}
println(string(bs))
f, err := os.OpenFile("event.json", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
panic(err)
}
err = f.Truncate(0)
if err != nil {
panic(err)
}
_, err = f.Write(bs)
if err != nil {
panic(err)
}
}
func processOneJSONFile(path string) error {
var data struct {
ABI json.RawMessage `json"abi"`
}
file, err := os.Open(path)
if err != nil {
_ = fmt.Errorf("open %s, err: %v\n", path, err)
return nil
}
err = json.NewDecoder(file).Decode(&data)
if err != nil {
_ = fmt.Errorf("handle json %s, err: %v\n", path, err)
return nil
}
if len(data.ABI) == 0 {
return nil
}
abiObj, err := abi.JSON(bytes.NewReader(data.ABI))
if err != nil {
_ = fmt.Errorf("handle abi %s, err: %v\n", path, err)
return nil
}
for _, e := range abiObj.Events {
var err Event
err.ID = e.ID
err.Sig = e.String()
err.Event = e
err.Path = path
mutex.Lock()
result[err.ID] = err
mutex.Unlock()
}
return nil
}
type Event struct {
ID common.Hash
Sig string
Path string
Event abi.Event
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment