diff --git a/api/groups/baseTransactionGroup.go b/api/groups/baseTransactionGroup.go index 59a64037..23e95fc5 100644 --- a/api/groups/baseTransactionGroup.go +++ b/api/groups/baseTransactionGroup.go @@ -261,7 +261,7 @@ func (group *transactionGroup) getProcessedTransactionStatus(c *gin.Context) { return } - shared.RespondWith(c, http.StatusOK, gin.H{"status": status}, "", data.ReturnCodeSuccess) + shared.RespondWith(c, http.StatusOK, gin.H{"status": status.Status, "reason": status.Reason}, "", data.ReturnCodeSuccess) } func getTransactionByHashAndSenderAddress(c *gin.Context, ef TransactionFacadeHandler, txHash string, sndAddr string, withEvents bool) { diff --git a/api/groups/baseTransactionGroup_test.go b/api/groups/baseTransactionGroup_test.go index f067abcd..161d23e3 100644 --- a/api/groups/baseTransactionGroup_test.go +++ b/api/groups/baseTransactionGroup_test.go @@ -75,6 +75,7 @@ type txProcessedStatusResp struct { GeneralResponse Data struct { Status string `json:"status"` + Reason string `json:"reason"` } `json:"data"` } @@ -776,9 +777,9 @@ func TestTransactionGroup_getProcessedTransactionStatus(t *testing.T) { t.Parallel() facade := &mock.FacadeStub{ - GetProcessedTransactionStatusHandler: func(txHash string) (string, error) { + GetProcessedTransactionStatusHandler: func(txHash string) (*data.ProcessStatusResponse, error) { assert.Equal(t, hash, txHash) - return "", expectedErr + return &data.ProcessStatusResponse{}, expectedErr }, } transactionsGroup, err := groups.NewTransactionGroup(facade) @@ -799,9 +800,12 @@ func TestTransactionGroup_getProcessedTransactionStatus(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - status := "status" + status := &data.ProcessStatusResponse{ + Status: "status", + Reason: "some error", + } facade := &mock.FacadeStub{ - GetProcessedTransactionStatusHandler: func(txHash string) (string, error) { + GetProcessedTransactionStatusHandler: func(txHash string) (*data.ProcessStatusResponse, error) { assert.Equal(t, hash, txHash) return status, nil }, @@ -820,6 +824,7 @@ func TestTransactionGroup_getProcessedTransactionStatus(t *testing.T) { assert.Equal(t, http.StatusOK, resp.Code) assert.Empty(t, response.Error) - assert.Equal(t, status, response.Data.Status) + assert.Equal(t, status.Status, response.Data.Status) + assert.Equal(t, status.Reason, response.Data.Reason) }) } diff --git a/api/groups/interface.go b/api/groups/interface.go index d58a6906..a4c18868 100644 --- a/api/groups/interface.go +++ b/api/groups/interface.go @@ -100,7 +100,7 @@ type TransactionFacadeHandler interface { SendUserFunds(receiver string, value *big.Int) error TransactionCostRequest(tx *data.Transaction) (*data.TxCostResponseData, error) GetTransactionStatus(txHash string, sender string) (string, error) - GetProcessedTransactionStatus(txHash string) (string, error) + GetProcessedTransactionStatus(txHash string) (*data.ProcessStatusResponse, error) GetTransaction(txHash string, withResults bool) (*transaction.ApiTransactionResult, error) GetTransactionByHashAndSenderAddress(txHash string, sndAddr string, withEvents bool) (*transaction.ApiTransactionResult, int, error) GetTransactionsPool(fields string) (*data.TransactionsPool, error) diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index 71e38b2d..27888b72 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -40,7 +40,7 @@ type FacadeStub struct { AuctionListHandler func() ([]*data.AuctionListValidatorAPIResponse, error) TransactionCostRequestHandler func(tx *data.Transaction) (*data.TxCostResponseData, error) GetTransactionStatusHandler func(txHash string, sender string) (string, error) - GetProcessedTransactionStatusHandler func(txHash string) (string, error) + GetProcessedTransactionStatusHandler func(txHash string) (*data.ProcessStatusResponse, error) GetConfigMetricsHandler func() (*data.GenericAPIResponse, error) GetNetworkMetricsHandler func(shardID uint32) (*data.GenericAPIResponse, error) GetAllIssuedESDTsHandler func(tokenType string) (*data.GenericAPIResponse, error) @@ -424,7 +424,7 @@ func (f *FacadeStub) GetTransactionStatus(txHash string, sender string) (string, } // GetProcessedTransactionStatus - -func (f *FacadeStub) GetProcessedTransactionStatus(txHash string) (string, error) { +func (f *FacadeStub) GetProcessedTransactionStatus(txHash string) (*data.ProcessStatusResponse, error) { return f.GetProcessedTransactionStatusHandler(txHash) } diff --git a/data/transaction.go b/data/transaction.go index b2ea4d10..e60ed8c2 100644 --- a/data/transaction.go +++ b/data/transaction.go @@ -267,3 +267,9 @@ type TransactionsPoolNonceGapsForSenderApiResponse struct { Error string `json:"error"` Code string `json:"code"` } + +// ProcessStatusResponse represents a structure that holds the process status of a transaction +type ProcessStatusResponse struct { + Status string `json:"status"` + Reason string `json:"reason"` +} diff --git a/facade/baseFacade.go b/facade/baseFacade.go index 49a5d3b9..01e04910 100644 --- a/facade/baseFacade.go +++ b/facade/baseFacade.go @@ -222,7 +222,7 @@ func (pf *ProxyFacade) GetTransactionStatus(txHash string, sender string) (strin } // GetProcessedTransactionStatus should return transaction status after internal processing of the transaction results -func (pf *ProxyFacade) GetProcessedTransactionStatus(txHash string) (string, error) { +func (pf *ProxyFacade) GetProcessedTransactionStatus(txHash string) (*data.ProcessStatusResponse, error) { return pf.txProc.GetProcessedTransactionStatus(txHash) } diff --git a/facade/interface.go b/facade/interface.go index 6dda0787..a76d8edc 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -43,7 +43,7 @@ type TransactionProcessor interface { TransactionCostRequest(tx *data.Transaction) (*data.TxCostResponseData, error) GetTransactionStatus(txHash string, sender string) (string, error) GetTransaction(txHash string, withEvents bool) (*transaction.ApiTransactionResult, error) - GetProcessedTransactionStatus(txHash string) (string, error) + GetProcessedTransactionStatus(txHash string) (*data.ProcessStatusResponse, error) GetTransactionByHashAndSenderAddress(txHash string, sndAddr string, withEvents bool) (*transaction.ApiTransactionResult, int, error) ComputeTransactionHash(tx *data.Transaction) (string, error) GetTransactionsPool(fields string) (*data.TransactionsPool, error) diff --git a/facade/mock/transactionProcessorStub.go b/facade/mock/transactionProcessorStub.go index 488efc25..599cb80d 100644 --- a/facade/mock/transactionProcessorStub.go +++ b/facade/mock/transactionProcessorStub.go @@ -18,7 +18,7 @@ type TransactionProcessorStub struct { SendUserFundsCalled func(receiver string, value *big.Int) error TransactionCostRequestCalled func(tx *data.Transaction) (*data.TxCostResponseData, error) GetTransactionStatusCalled func(txHash string, sender string) (string, error) - GetProcessedTransactionStatusCalled func(txHash string) (string, error) + GetProcessedTransactionStatusCalled func(txHash string) (*data.ProcessStatusResponse, error) GetTransactionCalled func(txHash string, withEvents bool) (*transaction.ApiTransactionResult, error) GetTransactionByHashAndSenderAddressCalled func(txHash string, sndAddr string, withEvents bool) (*transaction.ApiTransactionResult, int, error) ComputeTransactionHashCalled func(tx *data.Transaction) (string, error) @@ -84,12 +84,12 @@ func (tps *TransactionProcessorStub) GetTransactionStatus(txHash string, sender } // GetProcessedTransactionStatus - -func (tps *TransactionProcessorStub) GetProcessedTransactionStatus(txHash string) (string, error) { +func (tps *TransactionProcessorStub) GetProcessedTransactionStatus(txHash string) (*data.ProcessStatusResponse, error) { if tps.GetProcessedTransactionStatusCalled != nil { return tps.GetProcessedTransactionStatusCalled(txHash) } - return "", errNotImplemented + return &data.ProcessStatusResponse{}, errNotImplemented } // GetTransaction - diff --git a/process/export_test.go b/process/export_test.go index 6a3c08bd..be16c7f7 100644 --- a/process/export_test.go +++ b/process/export_test.go @@ -31,6 +31,11 @@ func GetShortHashSize() int { } // ComputeTransactionStatus - -func (tp *TransactionProcessor) ComputeTransactionStatus(tx *transaction.ApiTransactionResult, withResults bool) transaction.TxStatus { +func (tp *TransactionProcessor) ComputeTransactionStatus(tx *transaction.ApiTransactionResult, withResults bool) *proxyData.ProcessStatusResponse { return tp.computeTransactionStatus(tx, withResults) } + +// CheckIfFailed - +func CheckIfFailed(logs []*transaction.ApiLogs) (bool, string) { + return checkIfFailed(logs) +} diff --git a/process/transactionProcessor.go b/process/transactionProcessor.go index ed41b274..05cae2b5 100644 --- a/process/transactionProcessor.go +++ b/process/transactionProcessor.go @@ -45,6 +45,7 @@ const ( relayedTxV1DataMarker = "relayedTx@" relayedTxV2DataMarker = "relayedTxV2" argumentsSeparator = "@" + emptyDataStr = "" ) type requestType int @@ -417,76 +418,108 @@ func (tp *TransactionProcessor) getTransaction(txHash string, sender string, wit } // GetProcessedTransactionStatus returns the status of a transaction after local processing -func (tp *TransactionProcessor) GetProcessedTransactionStatus(txHash string) (string, error) { +func (tp *TransactionProcessor) GetProcessedTransactionStatus(txHash string) (*data.ProcessStatusResponse, error) { const withResults = true tx, err := tp.getTxFromObservers(txHash, requestTypeObservers, withResults) if err != nil { - return string(data.TxStatusUnknown), err + return &data.ProcessStatusResponse{ + Status: string(data.TxStatusUnknown), + }, err } - return string(tp.computeTransactionStatus(tx, withResults)), nil + return tp.computeTransactionStatus(tx, withResults), nil } -func (tp *TransactionProcessor) computeTransactionStatus(tx *transaction.ApiTransactionResult, withResults bool) transaction.TxStatus { +func (tp *TransactionProcessor) computeTransactionStatus(tx *transaction.ApiTransactionResult, withResults bool) *data.ProcessStatusResponse { if !withResults { - return data.TxStatusUnknown + return &data.ProcessStatusResponse{ + Status: string(data.TxStatusUnknown), + } } if tx.Status == transaction.TxStatusInvalid { - return transaction.TxStatusFail + return &data.ProcessStatusResponse{ + Status: string(transaction.TxStatusFail), + } } if tx.Status != transaction.TxStatusSuccess { - return tx.Status + return &data.ProcessStatusResponse{ + Status: string(tx.Status), + } } if checkIfMoveBalanceNotarized(tx) { - return tx.Status + return &data.ProcessStatusResponse{ + Status: string(tx.Status), + } } txLogsOnFirstLevel := []*transaction.ApiLogs{tx.Logs} - if checkIfFailed(txLogsOnFirstLevel) { - return transaction.TxStatusFail + failed, reason := checkIfFailed(txLogsOnFirstLevel) + if failed { + return &data.ProcessStatusResponse{ + Status: string(transaction.TxStatusFail), + Reason: reason, + } } allLogs, allScrs, err := tp.gatherAllLogsAndScrs(tx) if err != nil { log.Warn("error in TransactionProcessor.computeTransactionStatus", "error", err) - return data.TxStatusUnknown + return &data.ProcessStatusResponse{ + Status: string(data.TxStatusUnknown), + } } allLogs, err = tp.addMissingLogsOnProcessingExceptions(tx, allLogs, allScrs) if err != nil { log.Warn("error in TransactionProcessor.computeTransactionStatus on addMissingLogsOnProcessingExceptions call", "error", err) - return data.TxStatusUnknown + return &data.ProcessStatusResponse{ + Status: string(data.TxStatusUnknown), + } } - if checkIfFailed(allLogs) { - return transaction.TxStatusFail + failed, reason = checkIfFailed(allLogs) + if failed { + return &data.ProcessStatusResponse{ + Status: string(transaction.TxStatusFail), + Reason: reason, + } } if checkIfCompleted(allLogs) { - return transaction.TxStatusSuccess + return &data.ProcessStatusResponse{ + Status: string(transaction.TxStatusSuccess), + } } - return transaction.TxStatusPending + return &data.ProcessStatusResponse{ + Status: string(transaction.TxStatusPending), + } } -func checkIfFailed(logs []*transaction.ApiLogs) bool { - if findIdentifierInLogs(logs, internalVMErrorsEventIdentifier) || - findIdentifierInLogs(logs, core.SignalErrorOperation) { - return true +func checkIfFailed(logs []*transaction.ApiLogs) (bool, string) { + found, reason := findIdentifierInLogs(logs, internalVMErrorsEventIdentifier) + if found { + return true, reason } - return false + found, reason = findIdentifierInLogs(logs, core.SignalErrorOperation) + if found { + return true, reason + } + + return false, emptyDataStr } func checkIfCompleted(logs []*transaction.ApiLogs) bool { - if findIdentifierInLogs(logs, core.CompletedTxEventIdentifier) || - findIdentifierInLogs(logs, core.SCDeployIdentifier) { + found, _ := findIdentifierInLogs(logs, core.CompletedTxEventIdentifier) + if found { return true } - return false + found, _ = findIdentifierInLogs(logs, core.SCDeployIdentifier) + return found } func checkIfMoveBalanceNotarized(tx *transaction.ApiTransactionResult) bool { @@ -641,9 +674,9 @@ func (tp *TransactionProcessor) isSameShardSenderReceiverOfInnerTxV2( return tp.proc.GetShardCoordinator().SameShard(relayedSender, receiver), nil } -func findIdentifierInLogs(logs []*transaction.ApiLogs, identifier string) bool { +func findIdentifierInLogs(logs []*transaction.ApiLogs, identifier string) (bool, string) { if len(logs) == 0 { - return false + return false, emptyDataStr } for _, logInstance := range logs { @@ -651,23 +684,23 @@ func findIdentifierInLogs(logs []*transaction.ApiLogs, identifier string) bool { continue } - found := findIdentifierInSingleLog(logInstance, identifier) + found, reason := findIdentifierInSingleLog(logInstance, identifier) if found { - return true + return true, string(reason) } } - return false + return false, emptyDataStr } -func findIdentifierInSingleLog(log *transaction.ApiLogs, identifier string) bool { +func findIdentifierInSingleLog(log *transaction.ApiLogs, identifier string) (bool, []byte) { for _, event := range log.Events { if event.Identifier == identifier { - return true + return true, event.Data } } - return false + return false, []byte(emptyDataStr) } func (tp *TransactionProcessor) gatherAllLogsAndScrs(tx *transaction.ApiTransactionResult) ([]*transaction.ApiLogs, []*transaction.ApiTransactionResult, error) { diff --git a/process/transactionProcessor_test.go b/process/transactionProcessor_test.go index e8191280..c1329261 100644 --- a/process/transactionProcessor_test.go +++ b/process/transactionProcessor_test.go @@ -1769,7 +1769,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/pendingNewMoveBalance.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, false) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) withResults := true t.Run("Move balance", func(t *testing.T) { @@ -1779,7 +1779,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/pendingNewMoveBalance.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusPending, status) + require.Equal(t, string(transaction.TxStatusPending), status.Status) }) t.Run("executed", func(t *testing.T) { t.Parallel() @@ -1787,7 +1787,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKMoveBalance.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) }) t.Run("SC calls", func(t *testing.T) { @@ -1797,7 +1797,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/pendingNewSCCall.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusPending, status) + require.Equal(t, string(transaction.TxStatusPending), status.Status) }) t.Run("executing", func(t *testing.T) { t.Parallel() @@ -1805,7 +1805,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/executingSCCall.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusPending, status) + require.Equal(t, string(transaction.TxStatusPending), status.Status) }) t.Run("tx ok", func(t *testing.T) { t.Parallel() @@ -1813,7 +1813,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKSCCall.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) t.Run("tx ok but with nil logs", func(t *testing.T) { t.Parallel() @@ -1822,7 +1822,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) testData.Transaction.Logs = nil status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusPending, status) + require.Equal(t, string(transaction.TxStatusPending), status.Status) }) t.Run("tx failed", func(t *testing.T) { t.Parallel() @@ -1830,7 +1830,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedFailedSCCall.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) }) t.Run("SC deploy", func(t *testing.T) { @@ -1840,7 +1840,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKSCDeploy.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) t.Run("ok SC deploy with transfer value", func(t *testing.T) { t.Parallel() @@ -1848,7 +1848,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKSCDeployWithTransfer.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) t.Run("failed SC deploy with transfer value", func(t *testing.T) { t.Parallel() @@ -1856,7 +1856,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedFailedSCDeployWithTransfer.json") tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) }) t.Run("complex scenarios with failed async calls", func(t *testing.T) { @@ -1867,7 +1867,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) t.Run("scenario 2: tx failed with ESDTs and SC calls", func(t *testing.T) { t.Parallel() @@ -1876,7 +1876,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) t.Run("scenario 3: tx failed with ESDTs and SC calls", func(t *testing.T) { t.Parallel() @@ -1885,7 +1885,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) }) t.Run("relayed transaction", func(t *testing.T) { @@ -1896,7 +1896,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) t.Run("failed relayed transaction with SC call", func(t *testing.T) { t.Parallel() @@ -1905,7 +1905,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) t.Run("failed relayed move balance intra shard transaction", func(t *testing.T) { t.Parallel() @@ -1914,7 +1914,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) t.Run("ok relayed move balance intra shard transaction", func(t *testing.T) { t.Parallel() @@ -1923,7 +1923,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) t.Run("ok relayed v2 move balance intra shard transaction", func(t *testing.T) { t.Parallel() @@ -1932,7 +1932,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) t.Run("ok relayed sc call function balance intra shard transaction still pending", func(t *testing.T) { t.Parallel() @@ -1944,7 +1944,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.SCRs[0].ProcessingTypeOnDestination = "SCInvoking" status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusPending, status) + require.Equal(t, string(transaction.TxStatusPending), status.Status) }) t.Run("ok relayed move balance cross shard transaction", func(t *testing.T) { t.Parallel() @@ -1953,7 +1953,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) t.Run("tx ok", func(t *testing.T) { t.Parallel() @@ -1962,7 +1962,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) }) t.Run("reward transaction", func(t *testing.T) { @@ -1972,7 +1972,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusSuccess, status) + require.Equal(t, string(transaction.TxStatusSuccess), status.Status) }) t.Run("invalid transaction", func(t *testing.T) { t.Parallel() @@ -1981,7 +1981,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, transaction.TxStatusFail, status) + require.Equal(t, string(transaction.TxStatusFail), status.Status) }) t.Run("malformed transactions", func(t *testing.T) { t.Parallel() @@ -1995,7 +1995,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.Transaction.Sender = "not a sender" status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v1 inner transaction - wrong receiver", func(t *testing.T) { t.Parallel() @@ -2006,7 +2006,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.Transaction.Receiver = "not a sender" status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v1 - relayed v1 marker on wrong position", func(t *testing.T) { t.Parallel() @@ -2017,7 +2017,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.Transaction.Data = append([]byte("A"), testData.Transaction.Data...) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v2 - missing marker", func(t *testing.T) { t.Parallel() @@ -2028,7 +2028,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.Transaction.Data = []byte("aa") status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v2 - not enough arguments", func(t *testing.T) { t.Parallel() @@ -2039,7 +2039,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.Transaction.Data = []byte(process.RelayedTxV2DataMarker) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v1 - not a hex character after the marker", func(t *testing.T) { t.Parallel() @@ -2050,7 +2050,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.Transaction.Data[45] = byte('T') status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v1 - marshaller will fail", func(t *testing.T) { t.Parallel() @@ -2061,7 +2061,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.Transaction.Data = append(testData.Transaction.Data, []byte("aaaaaa")...) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v1 - missing scrs", func(t *testing.T) { t.Parallel() @@ -2072,7 +2072,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { testData.SCRs = nil status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v1 - no scr generated", func(t *testing.T) { t.Parallel() @@ -2081,7 +2081,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) t.Run("malformed relayed v2 - no scr generated", func(t *testing.T) { t.Parallel() @@ -2090,7 +2090,7 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) { tp := createTestProcessorFromScenarioData(testData) status := tp.ComputeTransactionStatus(testData.Transaction, withResults) - require.Equal(t, data.TxStatusUnknown, status) + require.Equal(t, string(data.TxStatusUnknown), status.Status) }) }) } @@ -2138,5 +2138,46 @@ func TestTransactionProcessor_GetProcessedTransactionStatus(t *testing.T) { status, err := tp.GetProcessedTransactionStatus(string(hash0)) assert.Nil(t, err) - assert.Equal(t, string(transaction.TxStatusPending), status) // not a move balance tx with missing finish markers + assert.Equal(t, string(transaction.TxStatusPending), status.Status) // not a move balance tx with missing finish markers +} + +func TestCheckIfFailed(t *testing.T) { + t.Parallel() + + logs := `{ + "address": "erd1qqqqqqqqqqqqqpgqzhpcdd8jg77m06zwqmhgw9xdmukn6pfeh2uslry9u8", + "events": [ + { + "address": "erd1qqqqqqqqqqqqqpgqzhpcdd8jg77m06zwqmhgw9xdmukn6pfeh2uslry9u8", + "identifier": "signalError", + "topics": [ + "Y7snvmIze+8YqIYkhNMYG8zZ7Q8PzaroT/Z7+3rEdCU=", + "ZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3Q=" + ], + "data": "QDY1Nzg2NTYzNzU3NDY5NmY2ZTIwNjY2MTY5NmM2NTY0", + "additionalData": [ + "QDY1Nzg2NTYzNzU3NDY5NmY2ZTIwNjY2MTY5NmM2NTY0" + ] + }, + { + "address": "erd1vwaj00nzxda77x9gscjgf5ccr0xdnmg0plx646z07ealk7kywsjsqf596y", + "identifier": "internalVMErrors", + "topics": [ + "AAAAAAAAAAAFABXDhrTyR7236E4G7ocUzd8tPQU5urk=", + "ZnVsZmlsbA==" + ], + "data": "CglydW50aW1lLmdvOjgzMCBbZXhlY3V0aW9uIGZhaWxlZF0gW2Z1bGZpbGxdCglydW50aW1lLmdvOjgzMCBbZXhlY3V0aW9uIGZhaWxlZF0gW2Z1bGZpbGxdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdIFtjbG9zZVRyYWRlTWFya2V0Q2FsbGJhY2tdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdIFtjbG9zZVRyYWRlTWFya2V0Q2FsbGJhY2tdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdIFtjbG9zZVRyYWRlTWFya2V0Q2FsbGJhY2tdCglydW50aW1lLmdvOjgyNyBbc3RvcmFnZSBkZWNvZGUgZXJyb3I6IGlucHV0IHRvbyBzaG9ydF0=", + "additionalData": [ + "CglydW50aW1lLmdvOjgzMCBbZXhlY3V0aW9uIGZhaWxlZF0gW2Z1bGZpbGxdCglydW50aW1lLmdvOjgzMCBbZXhlY3V0aW9uIGZhaWxlZF0gW2Z1bGZpbGxdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdIFtjbG9zZVRyYWRlTWFya2V0Q2FsbGJhY2tdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdIFtjbG9zZVRyYWRlTWFya2V0Q2FsbGJhY2tdCglydW50aW1lLmdvOjgzMCBbZXJyb3Igc2lnbmFsbGVkIGJ5IHNtYXJ0Y29udHJhY3RdIFtjbG9zZVRyYWRlTWFya2V0Q2FsbGJhY2tdCglydW50aW1lLmdvOjgyNyBbc3RvcmFnZSBkZWNvZGUgZXJyb3I6IGlucHV0IHRvbyBzaG9ydF0=" + ] + } + ] + }` + var txLogsOnFirstLevel = &transaction.ApiLogs{} + err := json.Unmarshal([]byte(logs), txLogsOnFirstLevel) + require.NoError(t, err) + + ok, str := process.CheckIfFailed([]*transaction.ApiLogs{txLogsOnFirstLevel}) + require.True(t, ok) + require.True(t, strings.Contains(str, "storage decode error: input too short")) }