@@ -8,13 +8,34 @@ import (
88 "github.com/ethereum/go-ethereum/accounts/abi"
99)
1010
11- func ConstructFunctionABI (signature string ) (* abi.Method , error ) {
11+ func ConstructEventABI (signature string ) (* abi.Event , error ) {
12+ // Regex to extract the event name and parameters
1213 regex := regexp .MustCompile (`^(\w+)\((.*)\)$` )
1314 matches := regex .FindStringSubmatch (strings .TrimSpace (signature ))
1415 if len (matches ) != 3 {
1516 return nil , fmt .Errorf ("invalid event signature format" )
1617 }
1718
19+ eventName := matches [1 ]
20+ parameters := matches [2 ]
21+
22+ inputs , err := parseParamsToAbiArguments (parameters )
23+ if err != nil {
24+ return nil , fmt .Errorf ("failed to parse params to abi arguments '%s': %v" , parameters , err )
25+ }
26+
27+ event := abi .NewEvent (eventName , eventName , false , inputs )
28+
29+ return & event , nil
30+ }
31+
32+ func ConstructFunctionABI (signature string ) (* abi.Method , error ) {
33+ regex := regexp .MustCompile (`^(\w+)\((.*)\)$` )
34+ matches := regex .FindStringSubmatch (strings .TrimSpace (signature ))
35+ if len (matches ) != 3 {
36+ return nil , fmt .Errorf ("invalid function signature format" )
37+ }
38+
1839 functionName := matches [1 ]
1940 params := matches [2 ]
2041
@@ -70,7 +91,7 @@ func splitParams(params string) []string {
7091}
7192
7293func parseParamToAbiArgument (param string , fallbackName string ) (* abi.Argument , error ) {
73- argName , paramType , err := getArgNameAndType (param , fallbackName )
94+ argName , paramType , indexed , err := getArgNameAndType (param , fallbackName )
7495 if err != nil {
7596 return nil , fmt .Errorf ("failed to get arg name and type '%s': %v" , param , err )
7697 }
@@ -80,42 +101,59 @@ func parseParamToAbiArgument(param string, fallbackName string) (*abi.Argument,
80101 return nil , fmt .Errorf ("failed to marshal tuple: %v" , err )
81102 }
82103 return & abi.Argument {
83- Name : argName ,
84- Type : argType ,
104+ Name : argName ,
105+ Type : argType ,
106+ Indexed : indexed ,
85107 }, nil
86108 } else {
87109 argType , err := abi .NewType (paramType , paramType , nil )
88110 if err != nil {
89111 return nil , fmt .Errorf ("failed to parse type '%s': %v" , paramType , err )
90112 }
91113 return & abi.Argument {
92- Name : argName ,
93- Type : argType ,
114+ Name : argName ,
115+ Type : argType ,
116+ Indexed : indexed ,
94117 }, nil
95118 }
96119}
97120
98- func getArgNameAndType (param string , fallbackName string ) (name string , paramType string , err error ) {
121+ func getArgNameAndType (param string , fallbackName string ) (name string , paramType string , indexed bool , err error ) {
122+ param , indexed = checkIfParamIsIndexed (param )
99123 if isTuple (param ) {
100124 lastParenIndex := strings .LastIndex (param , ")" )
101125 if lastParenIndex == - 1 {
102- return "" , "" , fmt .Errorf ("invalid tuple format" )
126+ return "" , "" , false , fmt .Errorf ("invalid tuple format" )
103127 }
104128 if len (param )- 1 == lastParenIndex {
105- return fallbackName , param , nil
129+ return fallbackName , param , indexed , nil
106130 }
107131 paramsEndIdx := lastParenIndex + 1
108132 if strings .HasPrefix (param [paramsEndIdx :], "[]" ) {
109133 paramsEndIdx = lastParenIndex + 3
110134 }
111- return strings .TrimSpace (param [paramsEndIdx :]), param [:paramsEndIdx ], nil
135+ return strings .TrimSpace (param [paramsEndIdx :]), param [:paramsEndIdx ], indexed , nil
112136 } else {
113137 tokens := strings .Fields (param )
114138 if len (tokens ) == 1 {
115- return fallbackName , strings .TrimSpace (tokens [0 ]), nil
139+ return fallbackName , strings .TrimSpace (tokens [0 ]), indexed , nil
140+ }
141+ return strings .TrimSpace (tokens [len (tokens )- 1 ]), strings .Join (tokens [:len (tokens )- 1 ], " " ), indexed , nil
142+ }
143+ }
144+
145+ func checkIfParamIsIndexed (param string ) (string , bool ) {
146+ tokens := strings .Fields (param )
147+ indexed := false
148+ for i , token := range tokens {
149+ if token == "indexed" || strings .HasPrefix (token , "index_topic_" ) {
150+ tokens = append (tokens [:i ], tokens [i + 1 :]... )
151+ indexed = true
152+ break
116153 }
117- return strings .TrimSpace (tokens [len (tokens )- 1 ]), strings .Join (tokens [:len (tokens )- 1 ], " " ), nil
118154 }
155+ param = strings .Join (tokens , " " )
156+ return param , indexed
119157}
120158
121159func isTuple (param string ) bool {
@@ -142,7 +180,7 @@ func marshalParamArguments(param string) ([]abi.ArgumentMarshaling, error) {
142180 paramList := splitParams (param )
143181 components := []abi.ArgumentMarshaling {}
144182 for idx , param := range paramList {
145- argName , paramType , err := getArgNameAndType (param , fmt .Sprintf ("field%d" , idx ))
183+ argName , paramType , indexed , err := getArgNameAndType (param , fmt .Sprintf ("field%d" , idx ))
146184 if err != nil {
147185 return nil , fmt .Errorf ("failed to get arg name and type '%s': %v" , param , err )
148186 }
@@ -155,11 +193,13 @@ func marshalParamArguments(param string) ([]abi.ArgumentMarshaling, error) {
155193 Type : "tuple" ,
156194 Name : argName ,
157195 Components : subComponents ,
196+ Indexed : indexed ,
158197 })
159198 } else {
160199 components = append (components , abi.ArgumentMarshaling {
161- Type : paramType ,
162- Name : argName ,
200+ Type : paramType ,
201+ Name : argName ,
202+ Indexed : indexed ,
163203 })
164204 }
165205 }
0 commit comments