Created
March 26, 2025 06:20
-
-
Save cuiweixie/b149a7d87f2b575724049d7198ea0b4e to your computer and use it in GitHub Desktop.
extract_event_id.go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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