diff --git a/adapters/feeder2core/feeder2core.go b/adapters/feeder2core/feeder2core.go index b0d5611d47..29c26cf747 100644 --- a/adapters/feeder2core/feeder2core.go +++ b/adapters/feeder2core/feeder2core.go @@ -73,6 +73,7 @@ func AdaptTransactionReceipt(response *feeder.TransactionReceipt) *core.Transact ExecutionResources: AdaptExecutionResources(response.ExecutionResources), L1ToL2Message: AdaptL1ToL2Message(response.L1ToL2Message), L2ToL1Message: l2ToL1Messages, + Reverted: response.ExecutionStatus == feeder.Reverted, } } diff --git a/adapters/feeder2core/feeder2core_test.go b/adapters/feeder2core/feeder2core_test.go index 4cd11427a8..4c42a2687f 100644 --- a/adapters/feeder2core/feeder2core_test.go +++ b/adapters/feeder2core/feeder2core_test.go @@ -51,7 +51,11 @@ func TestAdaptBlock(t *testing.T) { assert.Equal(t, response.Timestamp, block.Timestamp) assert.Equal(t, len(response.Transactions), len(block.Transactions)) assert.Equal(t, uint64(len(response.Transactions)), block.TransactionCount) - assert.Equal(t, len(response.Receipts), len(block.Receipts)) + if assert.Equal(t, len(response.Receipts), len(block.Receipts)) { + for i, feederReceipt := range response.Receipts { + assert.Equal(t, feederReceipt.ExecutionStatus == feeder.Reverted, block.Receipts[i].Reverted) + } + } assert.Equal(t, expectedEventCount, block.EventCount) assert.Equal(t, test.protocolVersion, block.ProtocolVersion) assert.Nil(t, block.ExtraData) diff --git a/clients/feeder/transaction.go b/clients/feeder/transaction.go index 47fe6374b8..094b8bad2c 100644 --- a/clients/feeder/transaction.go +++ b/clients/feeder/transaction.go @@ -1,9 +1,49 @@ package feeder import ( + "errors" + "github.com/NethermindEth/juno/core/felt" ) +type ExecutionStatus uint8 + +const ( + Succeeded ExecutionStatus = iota + 1 + Reverted +) + +func (es *ExecutionStatus) UnmarshalJSON(data []byte) error { + switch string(data) { + case "SUCCEEDED": + *es = Succeeded + case "REVERTED": + *es = Reverted + default: + return errors.New("unknown ExecutionStatus") + } + return nil +} + +type FinalityStatus uint8 + +const ( + AcceptedOnL2 FinalityStatus = iota + 1 + AcceptedOnL1 +) + +func (fs *FinalityStatus) UnmarshalJSON(data []byte) error { + switch string(data) { + case "ACCEPTED_ON_L2": + *fs = AcceptedOnL2 + case "ACCEPTED_ON_L1": + *fs = AcceptedOnL1 + default: + return errors.New("unknown FinalityStatus") + } + return nil +} + // Transaction object returned by the feeder in JSON format for multiple endpoints type Transaction struct { Hash *felt.Felt `json:"transaction_hash,omitempty" copier:"must,nopanic"` @@ -23,11 +63,13 @@ type Transaction struct { } type TransactionStatus struct { - Status string `json:"status"` - BlockHash *felt.Felt `json:"block_hash"` - BlockNumber uint64 `json:"block_number"` - TransactionIndex uint64 `json:"transaction_index"` - Transaction *Transaction `json:"transaction"` + Status string `json:"status"` + FinalityStatus FinalityStatus `json:"finality_status"` + ExecutionStatus ExecutionStatus `json:"execution_status"` + BlockHash *felt.Felt `json:"block_hash"` + BlockNumber uint64 `json:"block_number"` + TransactionIndex uint64 `json:"transaction_index"` + Transaction *Transaction `json:"transaction"` } type Event struct { @@ -68,6 +110,7 @@ type BuiltinInstanceCounter struct { type TransactionReceipt struct { ActualFee *felt.Felt `json:"actual_fee"` Events []*Event `json:"events"` + ExecutionStatus ExecutionStatus `json:"execution_status"` ExecutionResources *ExecutionResources `json:"execution_resources"` L1ToL2Message *L1ToL2Message `json:"l1_to_l2_consumed_message"` L2ToL1Message []*L2ToL1Message `json:"l2_to_l1_messages"` diff --git a/clients/feeder/transaction_test.go b/clients/feeder/transaction_test.go new file mode 100644 index 0000000000..35a5b3988f --- /dev/null +++ b/clients/feeder/transaction_test.go @@ -0,0 +1,31 @@ +package feeder_test + +import ( + "testing" + + "github.com/NethermindEth/juno/clients/feeder" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestUnmarshalExecutionStatus(t *testing.T) { + es := new(feeder.ExecutionStatus) + require.NoError(t, es.UnmarshalJSON([]byte("SUCCEEDED"))) + assert.Equal(t, feeder.Succeeded, *es) + + require.NoError(t, es.UnmarshalJSON([]byte("REVERTED"))) + assert.Equal(t, feeder.Reverted, *es) + + require.ErrorContains(t, es.UnmarshalJSON([]byte("ABC")), "unknown ExecutionStatus") +} + +func TestUnmarshalFinalityStatus(t *testing.T) { + fs := new(feeder.FinalityStatus) + require.NoError(t, fs.UnmarshalJSON([]byte("ACCEPTED_ON_L1"))) + assert.Equal(t, feeder.AcceptedOnL1, *fs) + + require.NoError(t, fs.UnmarshalJSON([]byte("ACCEPTED_ON_L2"))) + assert.Equal(t, feeder.AcceptedOnL2, *fs) + + require.ErrorContains(t, fs.UnmarshalJSON([]byte("ABC")), "unknown FinalityStatus") +} diff --git a/core/transaction.go b/core/transaction.go index 3a48fa7b2c..99395f2548 100644 --- a/core/transaction.go +++ b/core/transaction.go @@ -57,6 +57,7 @@ type TransactionReceipt struct { L1ToL2Message *L1ToL2Message L2ToL1Message []*L2ToL1Message TransactionHash *felt.Felt + Reverted bool } type Transaction interface {