55 "math/big"
66 "regexp"
77 "strings"
8- "unicode"
98)
109
1110func BigIntSliceToChunks (values []* big.Int , chunkSize int ) [][]* big.Int {
@@ -23,143 +22,6 @@ func BigIntSliceToChunks(values []*big.Int, chunkSize int) [][]*big.Int {
2322 return chunks
2423}
2524
26- // StripPayload removes parameter names, 'indexed' keywords,
27- // and extra whitespaces from a Solidity function or event signature.
28- func StripPayload (signature string ) string {
29- // Find the index of the first '(' and last ')'
30- start := strings .Index (signature , "(" )
31- end := strings .LastIndex (signature , ")" )
32- if start == - 1 || end == - 1 || end <= start {
33- // Return the original signature if it doesn't match the expected pattern
34- return signature
35- }
36-
37- functionName := strings .TrimSpace (signature [:start ])
38- paramsStr := signature [start + 1 : end ]
39-
40- // Parse parameters
41- strippedParams := parseParameters (paramsStr )
42-
43- // Reconstruct the cleaned-up signature
44- strippedSignature := fmt .Sprintf ("%s(%s)" , functionName , strings .Join (strippedParams , "," ))
45- return strippedSignature
46- }
47-
48- // parseParameters parses the parameter string and returns a slice of cleaned-up parameter types
49- func parseParameters (paramsStr string ) []string {
50- var params []string
51- var currentParam strings.Builder
52- bracketDepth := 0
53- var inType bool // Indicates if we are currently parsing a type
54-
55- runes := []rune (paramsStr )
56- i := 0
57- for i < len (runes ) {
58- char := runes [i ]
59- switch char {
60- case '(' , '[' , '{' :
61- bracketDepth ++
62- inType = true
63- currentParam .WriteRune (char )
64- i ++
65- case ')' , ']' , '}' :
66- bracketDepth --
67- currentParam .WriteRune (char )
68- i ++
69- case ',' :
70- if bracketDepth == 0 {
71- // End of current parameter
72- paramType := cleanType (currentParam .String ())
73- if paramType != "" {
74- params = append (params , paramType )
75- }
76- currentParam .Reset ()
77- inType = false
78- i ++
79- } else {
80- currentParam .WriteRune (char )
81- i ++
82- }
83- case ' ' :
84- if inType {
85- currentParam .WriteRune (char )
86- }
87- i ++
88- default :
89- // Check if the word is a keyword to ignore
90- if unicode .IsLetter (char ) {
91- wordStart := i
92- for i < len (runes ) && (unicode .IsLetter (runes [i ]) || unicode .IsDigit (runes [i ])) {
93- i ++
94- }
95- word := string (runes [wordStart :i ])
96-
97- // Ignore 'indexed' and parameter names
98- if isType (word ) {
99- inType = true
100- currentParam .WriteString (word )
101- } else if word == "indexed" {
102- // Skip 'indexed'
103- inType = false
104- } else {
105- // Ignore parameter names
106- if inType {
107- // If we are in the middle of parsing a type and encounter a parameter name, skip it
108- inType = false
109- }
110- }
111- } else {
112- if inType {
113- currentParam .WriteRune (char )
114- }
115- i ++
116- }
117- }
118- }
119-
120- // Add the last parameter
121- if currentParam .Len () > 0 {
122- paramType := cleanType (currentParam .String ())
123- if paramType != "" {
124- params = append (params , paramType )
125- }
126- }
127-
128- return params
129- }
130-
131- // cleanType cleans up a parameter type string by removing extra spaces and 'tuple' keyword
132- func cleanType (param string ) string {
133- // Remove 'tuple' keyword
134- param = strings .ReplaceAll (param , "tuple" , "" )
135- // Remove 'indexed' keyword
136- param = strings .ReplaceAll (param , "indexed" , "" )
137- // Remove any parameter names (already handled in parsing)
138- param = strings .TrimSpace (param )
139- // Remove extra whitespaces
140- param = strings .Join (strings .Fields (param ), "" )
141- return param
142- }
143-
144- // isType checks if a word is a Solidity type
145- func isType (word string ) bool {
146- if strings .HasPrefix (word , "uint" ) || strings .HasPrefix (word , "int" ) {
147- return true
148- }
149- types := map [string ]bool {
150- "address" : true ,
151- "bool" : true ,
152- "string" : true ,
153- "bytes" : true ,
154- "fixed" : true ,
155- "ufixed" : true ,
156- "function" : true ,
157- // Add other types as needed
158- }
159-
160- return types [word ]
161- }
162-
16325var allowedFunctions = map [string ]struct {}{
16426 "sum" : {},
16527 "count" : {},
@@ -217,3 +79,35 @@ func ValidateQuery(query string) error {
21779
21880 return nil
21981}
82+
83+ func ConvertBigNumbersToString (data interface {}) interface {} {
84+ switch v := data .(type ) {
85+ case map [string ]interface {}:
86+ for key , value := range v {
87+ v [key ] = ConvertBigNumbersToString (value )
88+ }
89+ return v
90+ case []interface {}:
91+ for i , value := range v {
92+ v [i ] = ConvertBigNumbersToString (value )
93+ }
94+ return v
95+ case []* big.Int :
96+ result := make ([]string , len (v ))
97+ for i , num := range v {
98+ if num == nil {
99+ result [i ] = "0"
100+ } else {
101+ result [i ] = num .String ()
102+ }
103+ }
104+ return result
105+ case * big.Int :
106+ if v == nil {
107+ return "0"
108+ }
109+ return v .String ()
110+ default :
111+ return v
112+ }
113+ }
0 commit comments