diff --git a/cmd/soroban-rpc/internal/methods/get_transaction.go b/cmd/soroban-rpc/internal/methods/get_transaction.go index 7a2fe6575..de58be649 100644 --- a/cmd/soroban-rpc/internal/methods/get_transaction.go +++ b/cmd/soroban-rpc/internal/methods/get_transaction.go @@ -56,6 +56,10 @@ type GetTransactionResponse struct { Ledger uint32 `json:"ledger,omitempty"` // LedgerCloseTime is the unix timestamp of when the transaction was included in the ledger. LedgerCloseTime int64 `json:"createdAt,string,omitempty"` + + // DiagnosticEventsXDR is present only if Status is equal to TransactionFailed. + // DiagnosticEventsXDR is a base64-encoded slice of xdr.DiagnosticEvent + DiagnosticEventsXDR []string `json:"diagnosticEventsXdr,omitempty"` } type GetTransactionRequest struct { @@ -104,6 +108,8 @@ func GetTransaction(getter transactionGetter, request GetTransactionRequest) (Ge response.ResultXdr = base64.StdEncoding.EncodeToString(tx.Result) response.EnvelopeXdr = base64.StdEncoding.EncodeToString(tx.Envelope) response.ResultMetaXdr = base64.StdEncoding.EncodeToString(tx.Meta) + response.DiagnosticEventsXDR = base64EncodeSlice(tx.Events) + if tx.Successful { response.Status = TransactionStatusSuccess } else { diff --git a/cmd/soroban-rpc/internal/methods/get_transaction_test.go b/cmd/soroban-rpc/internal/methods/get_transaction_test.go index 85847f00c..dd5f96378 100644 --- a/cmd/soroban-rpc/internal/methods/get_transaction_test.go +++ b/cmd/soroban-rpc/internal/methods/get_transaction_test.go @@ -154,6 +154,7 @@ func TestGetTransaction(t *testing.T) { ResultMetaXdr: expectedTxMeta, Ledger: 101, LedgerCloseTime: 2625, + DiagnosticEventsXDR: []string{}, }, tx) // ingest another (failed) transaction @@ -177,6 +178,7 @@ func TestGetTransaction(t *testing.T) { ResultMetaXdr: expectedTxMeta, Ledger: 101, LedgerCloseTime: 2625, + DiagnosticEventsXDR: []string{}, }, tx) // the new transaction should also be there @@ -206,5 +208,6 @@ func TestGetTransaction(t *testing.T) { ResultMetaXdr: expectedTxMeta, Ledger: 102, LedgerCloseTime: 2650, + DiagnosticEventsXDR: []string{}, }, tx) } diff --git a/cmd/soroban-rpc/internal/transactions/transactions.go b/cmd/soroban-rpc/internal/transactions/transactions.go index 5ed719ade..91f4aaad1 100644 --- a/cmd/soroban-rpc/internal/transactions/transactions.go +++ b/cmd/soroban-rpc/internal/transactions/transactions.go @@ -146,9 +146,10 @@ type LedgerInfo struct { } type Transaction struct { - Result []byte // XDR encoded xdr.TransactionResult - Meta []byte // XDR encoded xdr.TransactionMeta - Envelope []byte // XDR encoded xdr.TransactionEnvelope + Result []byte // XDR encoded xdr.TransactionResult + Meta []byte // XDR encoded xdr.TransactionMeta + Envelope []byte // XDR encoded xdr.TransactionEnvelope + Events [][]byte // XDR encoded xdr.DiagnosticEvent FeeBump bool ApplicationOrder int32 Successful bool @@ -198,10 +199,33 @@ func (m *MemoryStore) GetTransaction(hash xdr.Hash) (Transaction, bool, StoreRan if !ok { return Transaction{}, false, storeRange } + + var tx_meta xdr.TransactionMeta + err := tx_meta.UnmarshalBinary(internalTx.meta) + if err != nil { + return Transaction{}, false, storeRange + } + + txEvents, err := tx_meta.GetDiagnosticEvents() + if err != nil { + return Transaction{}, false, storeRange + } + + var events [][]byte + + for _, e := range txEvents { + diagnosticEventXDR, err := e.MarshalBinary() + if err != nil { + return Transaction{}, false, storeRange + } + events = append(events, diagnosticEventXDR) + } + tx := Transaction{ Result: internalTx.result, Meta: internalTx.meta, Envelope: internalTx.envelope, + Events: events, FeeBump: internalTx.feeBump, Successful: internalTx.successful, ApplicationOrder: internalTx.applicationOrder, diff --git a/cmd/soroban-rpc/internal/transactions/transactions_test.go b/cmd/soroban-rpc/internal/transactions/transactions_test.go index d32a62c6d..888d53292 100644 --- a/cmd/soroban-rpc/internal/transactions/transactions_test.go +++ b/cmd/soroban-rpc/internal/transactions/transactions_test.go @@ -204,6 +204,42 @@ func txMeta(ledgerSequence uint32, feeBump bool) xdr.LedgerCloseMeta { } } +func txMetaWithEvents(ledgerSequence uint32, feeBump bool) xdr.LedgerCloseMeta { + tx := txMeta(ledgerSequence, feeBump) + contractIDBytes, _ := hex.DecodeString("df06d62447fd25da07c0135eed7557e5a5497ee7d15b7fe345bd47e191d8f577") + var contractID xdr.Hash + copy(contractID[:], contractIDBytes) + counter := xdr.ScSymbol("COUNTER") + + tx.V1.TxProcessing[0].TxApplyProcessing.V3 = &xdr.TransactionMetaV3{ + SorobanMeta: &xdr.SorobanTransactionMeta{ + Events: []xdr.ContractEvent{{ + ContractId: &contractID, + Type: xdr.ContractEventTypeContract, + Body: xdr.ContractEventBody{ + V: 0, + V0: &xdr.ContractEventV0{ + Topics: []xdr.ScVal{{ + Type: xdr.ScValTypeScvSymbol, + Sym: &counter, + }}, + Data: xdr.ScVal{ + Type: xdr.ScValTypeScvSymbol, + Sym: &counter, + }, + }, + }, + }}, + ReturnValue: xdr.ScVal{ + Type: xdr.ScValTypeScvSymbol, + Sym: &counter, + }, + }, + } + + return tx +} + func txEnvelope(ledgerSequence uint32, feeBump bool) xdr.TransactionEnvelope { var envelope xdr.TransactionEnvelope var err error @@ -311,6 +347,21 @@ func TestIngestTransactions(t *testing.T) { require.Len(t, store.transactions, 3) } +func TestGetTransactionsWithEventData(t *testing.T) { + store := NewMemoryStore(interfaces.MakeNoOpDeamon(), "passphrase", 100) + + // Insert ledger 1 + metaWithEvents := txMetaWithEvents(1, false) + require.NoError(t, store.IngestTransactions(metaWithEvents)) + require.Len(t, store.transactions, 1) + + // check events data + tx, ok, _ := store.GetTransaction(txHash(1, false)) + require.True(t, ok) + require.NotNil(t, tx.Events) + +} + func stableHeapInUse() int64 { var ( m = runtime.MemStats{} diff --git a/go.mod b/go.mod index d7c19cf49..52a105e13 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stellar/go v0.0.0-20240202231803-b0df9f046eb4 + github.com/stellar/go v0.0.0-20240207003209-73de95c8eb55 github.com/stretchr/testify v1.8.4 golang.org/x/mod v0.13.0 gotest.tools/v3 v3.5.0 diff --git a/go.sum b/go.sum index 56e9fc7a1..32930a087 100644 --- a/go.sum +++ b/go.sum @@ -366,8 +366,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= -github.com/stellar/go v0.0.0-20240202231803-b0df9f046eb4 h1:1DQT7eta18GSv+z6wF7AMUf7NqQ0qOrr2uJPGMRakRg= -github.com/stellar/go v0.0.0-20240202231803-b0df9f046eb4/go.mod h1:Ka4piwZT4Q9799f+BZeaKkAiYo4UpIWXyu0oSUbCVfM= +github.com/stellar/go v0.0.0-20240207003209-73de95c8eb55 h1:YBpAp7uPf/lzGxKPOGh1D05bX7uDVybA39BYoPXpRu4= +github.com/stellar/go v0.0.0-20240207003209-73de95c8eb55/go.mod h1:Ka4piwZT4Q9799f+BZeaKkAiYo4UpIWXyu0oSUbCVfM= github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 h1:OzCVd0SV5qE3ZcDeSFCmOWLZfEWZ3Oe8KtmSOYKEVWE= github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2/go.mod h1:yoxyU/M8nl9LKeWIoBrbDPQ7Cy+4jxRcWcOayZ4BMps= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=