Skip to content

Commit 0b05930

Browse files
authored
use contract api as a fallback for decoding if signature based fails (#170)
### TL;DR Improved transaction and log decoding logic by adding fallback mechanisms and validation checks. ### What changed? - Extracted decoding logic into separate functions `decodeLogsIfNeeded` and `decodeTransactionsIfNeeded` - Added validation to check if ABI decoding was successful by verifying name and signature fields - Implemented fallback to contract service decoding when ABI decoding fails - Simplified the main handler logic by consolidating decoding paths ### How to test? 1. Test log decoding with valid ABI: - Send request with `decode=true` and valid event ABI - Verify logs are decoded correctly 2. Test transaction decoding with invalid ABI: - Send request with `decode=true` and invalid function ABI - Verify fallback to contract service decoding 3. Test with decoding disabled: - Send request with `decode=false` - Verify raw logs/transactions are returned ### Why make this change? The previous implementation didn't handle ABI decoding failures gracefully. This change ensures more reliable decoding by validating the results and falling back to the contract service when needed, improving the overall robustness of the API.
2 parents f9bf58c + 7c49c60 commit 0b05930

File tree

2 files changed

+53
-26
lines changed

2 files changed

+53
-26
lines changed

internal/handlers/logs_handlers.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -179,27 +179,41 @@ func handleLogsRequest(c *gin.Context) {
179179
api.InternalErrorHandler(c)
180180
return
181181
}
182-
if eventABI != nil {
183-
decodedLogs := []common.DecodedLogModel{}
184-
for _, log := range logsResult.Data {
185-
decodedLog := log.Decode(eventABI)
186-
decodedLogs = append(decodedLogs, decodedLog.Serialize())
187-
}
188-
queryResult.Data = decodedLogs
182+
183+
if decodedLogs := decodeLogsIfNeeded(chainId.String(), logsResult.Data, eventABI, config.Cfg.API.AbiDecodingEnabled && queryParams.Decode); decodedLogs != nil {
184+
queryResult.Data = serializeDecodedLogs(decodedLogs)
189185
} else {
190-
if config.Cfg.API.AbiDecodingEnabled && queryParams.Decode {
191-
decodedLogs := common.DecodeLogs(chainId.String(), logsResult.Data)
192-
queryResult.Data = serializeDecodedLogs(decodedLogs)
193-
} else {
194-
queryResult.Data = serializeLogs(logsResult.Data)
195-
}
186+
queryResult.Data = serializeLogs(logsResult.Data)
196187
}
188+
197189
queryResult.Meta.TotalItems = len(logsResult.Data)
198190
}
199191

200192
sendJSONResponse(c, queryResult)
201193
}
202194

195+
func decodeLogsIfNeeded(chainId string, logs []common.Log, eventABI *abi.Event, useContractService bool) []*common.DecodedLog {
196+
if eventABI != nil {
197+
decodingCompletelySuccessful := true
198+
decodedLogs := []*common.DecodedLog{}
199+
for _, log := range logs {
200+
decodedLog := log.Decode(eventABI)
201+
if decodedLog.Decoded.Name == "" || decodedLog.Decoded.Signature == "" {
202+
decodingCompletelySuccessful = false
203+
}
204+
decodedLogs = append(decodedLogs, decodedLog)
205+
}
206+
if !useContractService || decodingCompletelySuccessful {
207+
// decoding was successful or contract service decoding is disabled
208+
return decodedLogs
209+
}
210+
}
211+
if useContractService {
212+
return common.DecodeLogs(chainId, logs)
213+
}
214+
return nil
215+
}
216+
203217
func getMainStorage() (storage.IMainStorage, error) {
204218
storageOnce.Do(func() {
205219
var err error

internal/handlers/transactions_handlers.go

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -172,27 +172,40 @@ func handleTransactionsRequest(c *gin.Context) {
172172
api.InternalErrorHandler(c)
173173
return
174174
}
175-
if functionABI != nil {
176-
decodedTransactions := []common.DecodedTransactionModel{}
177-
for _, transaction := range transactionsResult.Data {
178-
decodedTransaction := transaction.Decode(functionABI)
179-
decodedTransactions = append(decodedTransactions, decodedTransaction.Serialize())
180-
}
181-
queryResult.Data = decodedTransactions
175+
176+
if decodedTxs := decodeTransactionsIfNeeded(chainId.String(), transactionsResult.Data, functionABI, config.Cfg.API.AbiDecodingEnabled && queryParams.Decode); decodedTxs != nil {
177+
queryResult.Data = serializeDecodedTransactions(decodedTxs)
182178
} else {
183-
if config.Cfg.API.AbiDecodingEnabled && queryParams.Decode {
184-
decodedTransactions := common.DecodeTransactions(chainId.String(), transactionsResult.Data)
185-
queryResult.Data = serializeDecodedTransactions(decodedTransactions)
186-
} else {
187-
queryResult.Data = serializeTransactions(transactionsResult.Data)
188-
}
179+
queryResult.Data = serializeTransactions(transactionsResult.Data)
189180
}
190181
queryResult.Meta.TotalItems = len(transactionsResult.Data)
191182
}
192183

193184
c.JSON(http.StatusOK, queryResult)
194185
}
195186

187+
func decodeTransactionsIfNeeded(chainId string, transactions []common.Transaction, functionABI *abi.Method, useContractService bool) []*common.DecodedTransaction {
188+
if functionABI != nil {
189+
decodingCompletelySuccessful := true
190+
decodedTransactions := []*common.DecodedTransaction{}
191+
for _, transaction := range transactions {
192+
decodedTransaction := transaction.Decode(functionABI)
193+
if decodedTransaction.Decoded.Name == "" || decodedTransaction.Decoded.Signature == "" {
194+
decodingCompletelySuccessful = false
195+
}
196+
decodedTransactions = append(decodedTransactions, decodedTransaction)
197+
}
198+
if !useContractService || decodingCompletelySuccessful {
199+
// decoding was successful or contract service decoding is disabled
200+
return decodedTransactions
201+
}
202+
}
203+
if useContractService {
204+
return common.DecodeTransactions(chainId, transactions)
205+
}
206+
return nil
207+
}
208+
196209
func serializeDecodedTransactions(transactions []*common.DecodedTransaction) []common.DecodedTransactionModel {
197210
decodedTransactionModels := make([]common.DecodedTransactionModel, len(transactions))
198211
for i, transaction := range transactions {

0 commit comments

Comments
 (0)