@@ -52,6 +52,55 @@ type DecodedTransaction struct {
5252 Decoded DecodedTransactionData `json:"decodedData"`
5353}
5454
55+ func DecodeTransactions (chainId string , txs []Transaction ) []* DecodedTransaction {
56+ decodedTxs := []* DecodedTransaction {}
57+ abis := make (map [string ]* abi.ABI )
58+
59+ decodeTxFunc := func (transaction * Transaction ) * DecodedTransaction {
60+ decodedTransaction := DecodedTransaction {Transaction : * transaction }
61+ abi , ok := abis [transaction .ToAddress ]
62+ // ABI not found yet
63+ if ! ok {
64+ abiResult , err := GetABIForContract (chainId , transaction .ToAddress )
65+ if err != nil {
66+ abis [transaction .ToAddress ] = nil
67+ return & decodedTransaction
68+ } else {
69+ abis [transaction .ToAddress ] = abiResult
70+ }
71+ }
72+
73+ if abi == nil {
74+ return & decodedTransaction
75+ }
76+
77+ decodedData , err := hex .DecodeString (strings .TrimPrefix (transaction .Data , "0x" ))
78+ if err != nil {
79+ return & decodedTransaction
80+ }
81+
82+ if len (decodedData ) < 4 {
83+ return & decodedTransaction
84+ }
85+ methodID := decodedData [:4 ]
86+ method , err := abi .MethodById (methodID )
87+ if err != nil {
88+ log .Debug ().Msgf ("failed to get method by id: %v" , err )
89+ return & decodedTransaction
90+ }
91+ if method == nil {
92+ return & decodedTransaction
93+ }
94+ return transaction .Decode (method )
95+ }
96+
97+ for _ , transaction := range txs {
98+ decodedTx := decodeTxFunc (& transaction )
99+ decodedTxs = append (decodedTxs , decodedTx )
100+ }
101+ return decodedTxs
102+ }
103+
55104func (t * Transaction ) Decode (functionABI * abi.Method ) * DecodedTransaction {
56105 decodedData , err := hex .DecodeString (strings .TrimPrefix (t .Data , "0x" ))
57106 if err != nil {
0 commit comments