diff --git a/services/rfq/relayer/reldb/base/model.go b/services/rfq/relayer/reldb/base/model.go index bc083d0b2e..eb614e7889 100644 --- a/services/rfq/relayer/reldb/base/model.go +++ b/services/rfq/relayer/reldb/base/model.go @@ -93,6 +93,8 @@ type RequestForQuote struct { SendChainGas bool // RelayNonce is the nonce for the relay transaction. RelayNonce uint64 + // Reason is the reason why a transaction may not be processed. + Reason string } // Rebalance is the event model for a rebalance action. @@ -137,6 +139,7 @@ func FromQuoteRequest(request reldb.QuoteRequest) RequestForQuote { Status: request.Status, BlockNumber: request.BlockNumber, RelayNonce: request.RelayNonce, + Reason: request.Reason, } } @@ -225,6 +228,7 @@ func (r RequestForQuote) ToQuoteRequest() (*reldb.QuoteRequest, error) { OriginTxHash: common.HexToHash(r.OriginTxHash.String), DestTxHash: common.HexToHash(r.DestTxHash.String), RelayNonce: r.RelayNonce, + Reason: r.Reason, }, nil } diff --git a/services/rfq/relayer/reldb/db.go b/services/rfq/relayer/reldb/db.go index f4ce0293d6..f75a25cd6e 100644 --- a/services/rfq/relayer/reldb/db.go +++ b/services/rfq/relayer/reldb/db.go @@ -88,6 +88,7 @@ type QuoteRequest struct { DestTxHash common.Hash // RelayNonce is the nonce for the relay transaction. RelayNonce uint64 + Reason string } // GetOriginIDPair gets the origin chain id and token address pair. diff --git a/services/rfq/relayer/service/handlers.go b/services/rfq/relayer/service/handlers.go index 07b3360be2..ef764a1e74 100644 --- a/services/rfq/relayer/service/handlers.go +++ b/services/rfq/relayer/service/handlers.go @@ -91,32 +91,43 @@ func (r *Relayer) handleBridgeRequestedLog(parentCtx context.Context, req *fastb return fmt.Errorf("could not make call: %w", err) } + dbReq := reldb.QuoteRequest{ + BlockNumber: req.Raw.BlockNumber, + RawRequest: req.Request, + TransactionID: req.TransactionId, + Sender: req.Sender, + Transaction: bridgeTx, + Status: reldb.Seen, + OriginTxHash: req.Raw.TxHash, + } + // TODO: you can just pull these out of inventory. If they don't exist mark as invalid. originDecimals, destDecimals, err := r.getDecimalsFromBridgeTx(ctx, bridgeTx) // can't use errors.is here if err != nil && strings.Contains(err.Error(), "no contract code at given address") { - logger.Warnf("invalid token, skipping") + dbReq.Status = reldb.WillNotProcess + dbReq.Reason = "invalid token (no contract code at address)" + err = r.db.StoreQuoteRequest(ctx, dbReq) + if err != nil { + return fmt.Errorf("could not store db request: %w", err) + } return nil } - if err != nil || originDecimals == nil || destDecimals == nil { + dbReq.Status = reldb.WillNotProcess + dbReq.Reason = fmt.Sprintf("could not get decimals: %s", err.Error()) + err = r.db.StoreQuoteRequest(ctx, dbReq) + if err != nil { + return fmt.Errorf("could not store db request: %w", err) + } return fmt.Errorf("could not get decimals: %w", err) } + dbReq.OriginTokenDecimals = *originDecimals + dbReq.DestTokenDecimals = *destDecimals - dbReq := reldb.QuoteRequest{ - BlockNumber: req.Raw.BlockNumber, - RawRequest: req.Request, - OriginTokenDecimals: *originDecimals, - DestTokenDecimals: *destDecimals, - TransactionID: req.TransactionId, - Sender: req.Sender, - Transaction: bridgeTx, - Status: reldb.Seen, - OriginTxHash: req.Raw.TxHash, - } err = r.db.StoreQuoteRequest(ctx, dbReq) if err != nil { - return fmt.Errorf("could not get db: %w", err) + return fmt.Errorf("could not store db request: %w", err) } // immediately forward the request to handleSeen