Skip to content

Commit e4b0ea5

Browse files
authored
fix: failure reason for rejected txs (#2981)
* add failure reason for rejected tx * remove revert reason from rpcv7 * test for failure reason * add rpc test for REJECTED txn status * omit if failure reason not present instead of error * test fix
1 parent c9f8849 commit e4b0ea5

File tree

7 files changed

+51
-12
lines changed

7 files changed

+51
-12
lines changed

clients/feeder/feeder_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,18 @@ func TestTransactionStatusRevertError(t *testing.T) {
601601
require.NotEmpty(t, status.RevertError)
602602
}
603603

604+
func TestTransactionStatusTransactionFailureReason(t *testing.T) {
605+
client := feeder.NewTestClient(t, &utils.SepoliaIntegration)
606+
607+
txnHash := utils.HexToFelt(t, "0x1111")
608+
expectedMessage := "some error"
609+
expectedErrorCode := "SOME_ERROR_CODE"
610+
status, err := client.Transaction(t.Context(), txnHash)
611+
require.NoError(t, err)
612+
require.Equal(t, expectedMessage, status.FailureReason.Message)
613+
require.Equal(t, expectedErrorCode, status.FailureReason.Code)
614+
}
615+
604616
func TestPublicKey(t *testing.T) {
605617
client := feeder.NewTestClient(t, &utils.Integration)
606618

clients/feeder/testdata/sepolia-integration/transaction/0x1111.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
{
2+
"transaction_failure_reason": {
3+
"code" : "SOME_ERROR_CODE",
4+
"error_message" :"some error"
5+
},
26
"execution_status": "REJECTED",
37
"finality_status": "RECEIVED",
48
"status": "this is deprecated",

rpc/v7/transaction.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -679,10 +679,8 @@ func adaptTransactionStatus(txStatus *starknet.TransactionStatus) (*TransactionS
679679
status.Execution = TxnSuccess
680680
case starknet.Reverted:
681681
status.Execution = TxnFailure
682-
status.FailureReason = txStatus.RevertError
683682
case starknet.Rejected:
684683
status.Finality = TxnStatusRejected
685-
status.FailureReason = txStatus.RevertError
686684
default: // Omit the field on error. It's optional in the spec.
687685
}
688686

rpc/v8/subscriptions_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ func TestSubscribeTxnStatus(t *testing.T) {
304304
mockChain.EXPECT().TransactionByHash(txHash).Return(nil, db.ErrKeyNotFound)
305305
mockSyncer.EXPECT().PendingBlock().Return(nil)
306306
id, conn := createTestTxStatusWebsocket(t, handler, txHash)
307-
assertNextTxnStatus(t, conn, id, txHash, TxnStatusRejected, 0, "")
307+
assertNextTxnStatus(t, conn, id, txHash, TxnStatusRejected, 0, "some error")
308308
})
309309

310310
t.Run("accepted on L1", func(t *testing.T) {

rpc/v8/transaction.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,9 @@ func adaptTransactionStatus(txStatus *starknet.TransactionStatus) (*TransactionS
947947
status.FailureReason = txStatus.RevertError
948948
case starknet.Rejected:
949949
status.Finality = TxnStatusRejected
950-
status.FailureReason = txStatus.RevertError
950+
if txStatus.FailureReason != nil {
951+
status.FailureReason = txStatus.FailureReason.Message
952+
}
951953
default: // Omit the field on error. It's optional in the spec.
952954
}
953955

rpc/v8/transaction_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1448,6 +1448,23 @@ func TestTransactionStatus(t *testing.T) {
14481448
})
14491449
})
14501450
}
1451+
1452+
t.Run("Rejected transaction found in feeder", func(t *testing.T) {
1453+
mockReader := mocks.NewMockReader(mockCtrl)
1454+
mockSyncReader := mocks.NewMockSyncReader(mockCtrl)
1455+
client := feeder.NewTestClient(t, &utils.SepoliaIntegration)
1456+
txHash, err := new(felt.Felt).SetString("0x1111")
1457+
require.NoError(t, err)
1458+
1459+
handler := rpc.New(mockReader, mockSyncReader, nil, log).WithFeeder(client)
1460+
mockReader.EXPECT().TransactionByHash(txHash).Return(nil, db.ErrKeyNotFound)
1461+
mockSyncReader.EXPECT().PendingBlock().Return(nil)
1462+
1463+
status, rpcErr := handler.TransactionStatus(t.Context(), *txHash)
1464+
require.Nil(t, rpcErr)
1465+
require.Equal(t, status.Finality, rpc.TxnStatusRejected)
1466+
require.Equal(t, status.FailureReason, "some error")
1467+
})
14511468
}
14521469

14531470
func TestResourceMarshalText(t *testing.T) {

starknet/transaction.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,21 @@ type Transaction struct {
180180
PaymasterData *[]*felt.Felt `json:"paymaster_data,omitempty"`
181181
}
182182

183+
type TransactionFailureReason struct {
184+
Code string `json:"code"`
185+
Message string `json:"error_message"`
186+
}
187+
183188
type TransactionStatus struct {
184-
Status string `json:"status"`
185-
FinalityStatus FinalityStatus `json:"finality_status"`
186-
ExecutionStatus ExecutionStatus `json:"execution_status"`
187-
BlockHash *felt.Felt `json:"block_hash"`
188-
BlockNumber uint64 `json:"block_number"`
189-
TransactionIndex uint64 `json:"transaction_index"`
190-
Transaction *Transaction `json:"transaction"`
191-
RevertError string `json:"revert_error"`
189+
Status string `json:"status"`
190+
FinalityStatus FinalityStatus `json:"finality_status"`
191+
ExecutionStatus ExecutionStatus `json:"execution_status"`
192+
BlockHash *felt.Felt `json:"block_hash"`
193+
BlockNumber uint64 `json:"block_number"`
194+
TransactionIndex uint64 `json:"transaction_index"`
195+
Transaction *Transaction `json:"transaction"`
196+
RevertError string `json:"revert_error"`
197+
FailureReason *TransactionFailureReason `json:"transaction_failure_reason,omitempty"`
192198
}
193199

194200
type Event struct {

0 commit comments

Comments
 (0)