Skip to content

Add chronological event insertion for different application phases - #459

Merged
Shaptic merged 15 commits into
protocol-23from
event-ordering
Jun 18, 2025
Merged

Add chronological event insertion for different application phases#459
Shaptic merged 15 commits into
protocol-23from
event-ordering

Conversation

@Shaptic

@Shaptic Shaptic commented Jun 11, 2025

Copy link
Copy Markdown
Contributor

What

TL;DR: This accomplishes three goals for getEvents:


With Protocol 23, the chronological order of event generation is as follows:

  • ALL transaction-level pre-events (fee debiting, etc.)
  • EACH operation's events (contract + unified events, etc.)
  • EACH transaction's post-apply events
  • ALL transaction-level post-events (fee refunds, etc.)

We need to gather these out of the meta in the right order. We also need to maintain two important properties of events stored in the database:

  • Sortability at query time
  • Trimability at truncation time

To accomplish this, we leverage/abuse the 1-indexed semantics of the transaction index in a TOID to maintain the following properties for the IDs in the format <TOID>-<event index>:

  • Pre-application events have a TOID with { ledger seq, 0, 0 } <
  • Operation events have a TOID with { ledger seq, tx index, op index } <
  • Post-transaction events have a TOID with { ledger seq, tx index, op max } <
  • Post-application events have a TOID with { ledger seq, tx max, 0 }

Here, tx max and op max reflect the respective mask specified by the TOID spec.

Note that this means operation-level events, the only types of events that existed before, still have their same ID as they did beforehand (as evidenced by the lack of changes to the unit tests in that domain).

Why

So that getEvents returns events in the same chronological order that Core generated them in, see #414.

Known limitations

n/a

@Shaptic
Shaptic requested review from a team, 2opremio and karthikiyer56 June 11, 2025 18:56
@Shaptic Shaptic added this to the platform sprint 60 milestone Jun 11, 2025
@Shaptic Shaptic moved this from To Do to Needs Review in Platform Scrum Jun 11, 2025
@Shaptic Shaptic linked an issue Jun 11, 2025 that may be closed by this pull request
@Shaptic
Shaptic requested a review from urvisavla June 11, 2025 19:07
Comment thread cmd/stellar-rpc/internal/db/event.go Outdated
Comment thread cmd/stellar-rpc/internal/db/event.go
@karthikiyer56

karthikiyer56 commented Jun 16, 2025

Copy link
Copy Markdown
Contributor

Meta feedback about the PR (not specific to any file)

1/
@Shaptic - in the prologue, you mention

TL;DR: This accomplishes three goals for getEvents:

stop storing diagnostic events, closing https://github.com/stellar/stellar-rpc/issues/402
storing events for failed transactions, closing https://github.com/stellar/stellar-rpc/issues/416
ordering post-Protocol 23 events in the right order, closing https://github.com/stellar/stellar-rpc/issues/414

Dont these need to be captured in the ChangeLog as well.

2/
I realize that there is a change in behavior and we will no longer include the diagnosticEvents as emitted by core in the getEvents output.
That wud then mean that the develper docs need to change as well, right?
https://developers.stellar.org/docs/data/apis/rpc/api-reference/methods/getEvents .
specifically the type is no longer true. It will only be "contract" going forward.
shud we earmark the type for soft-delete in this RPC release and then remove the field in a subsequent RPC major release?
By "earmark for soft delete", I mean include some commentary about this type field going away in the next P24 release, in the ChangeLog.

Ditto for the inSuccessfulContractCall as well. Shud we earmark that for soft-delete as well.
This is related to what Leigh suggested here: #459 (comment)

@leighmcculloch

leighmcculloch commented Jun 16, 2025

Copy link
Copy Markdown
Member

specifically the type is no longer true. It will only be "contract" going forward.

The type should also be possible to be "system". Is that right?

@karthikiyer56

Copy link
Copy Markdown
Contributor

specifically the type is no longer true. It will only be "contract" going forward.

The type should also be possible to be "system". Is that right?

not anymore with this most recent change from George.
There will effectively be no more diagnostic events emitted from core that will be saved to db, since we are no longer reading that variable from TxMeta.
And that includes system events, diagnostic events and the (double dipped) contract events.

@leighmcculloch

leighmcculloch commented Jun 17, 2025

Copy link
Copy Markdown
Member

Hmm, but in protocol 22 system events are not diagnostic events, they show up in the non-diagnostic event list.

For example, in transaction a130817e905f2102a01bd02874cd21dda236e7a79637865549f018430293e416 in ledger 1544215 on testnet, the ledger close meta is:

{"v1":{"ext":"v0","ledger_header":{"hash":"97fd77288b59b4decde667d1c1a16b80ae07232361784ef4e3232a4cd452ac89","header":{"ledger_version":22,"previous_ledger_hash":"6f9fa8589a936b90810413da0542e03cb8d2f2655d029adc0ac5a2c967509c18","scp_value":{"tx_set_hash":"964b94104cab5dda7f901c38fb056210373bbdf2fe85593f96ebe80a67d83f80","close_time":1750133351,"upgrades":[],"ext":{"signed":{"node_id":"GCUCJTIYXSOXKBSNFGNFWW5MUQ54HKRPGJUTQFJ5RQXZXNOLNXYDHRAP","signature":"ca1967048a3114d29855f563274c337aa139554b291c945b92d73dec381ca339e464d9153d46c9c322e48c48c84e77bab4e10cbe07dedd0564509f710391a80b"}}},"tx_set_result_hash":"7d14f31c8791447f2dc51cc54dc3a6490ebe403ad926f1b5050bb6aadb6591f8","bucket_list_hash":"424c1bc5b3900559bd0ebafd26846cb03d53ea98b6467f0f7bce8163ea796b6d","ledger_seq":1544215,"total_coins":1000000000000000000,"fee_pool":1147371827130,"inflation_seq":0,"id_pool":32429,"base_fee":100,"base_reserve":5000000,"max_tx_set_size":200,"skip_list":["88409f229233e7ee2c1637bb31f61c0ac598fb636ffc1e1ad05d625c590b4c9a","eb60c2cc4083afd0f5f77d1ea54a0a0ff6a2272d3cba58842ea21949f72a935b","b4744b374f44323a1d3bd5319f4ae311cbe558243d6b29afbb2504d83700032e","14697d36f8d8f4e34738770a137d85b4d0203ae19eeeca9d997e70f0df951e1e"],"ext":"v0"},"ext":"v0"},"tx_set":{"v1":{"previous_ledger_hash":"6f9fa8589a936b90810413da0542e03cb8d2f2655d029adc0ac5a2c967509c18","phases":[{"v0":[]},{"v0":[{"txset_comp_txs_maybe_discounted_fee":{"base_fee":100,"txs":[{"tx":{"tx":{"source_account":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","fee":100207,"seq_num":5095695228862537,"cond":"none","memo":"none","operations":[{"source_account":null,"body":{"invoke_host_function":{"host_function":{"invoke_contract":{"contract_address":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","function_name":"upgrade","args":[{"bytes":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}]}},"auth":[{"credentials":"source_account","root_invocation":{"function":{"contract_fn":{"contract_address":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","function_name":"upgrade","args":[{"bytes":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}]}},"sub_invocations":[]}}]}}}],"ext":{"v1":{"ext":"v0","resources":{"footprint":{"read_only":[{"contract_code":{"hash":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}},{"contract_code":{"hash":"1d6f290f62afa4bfdb04435da1b335242566dae02f7e25c2ec491764c89eea46"}}],"read_write":[{"contract_data":{"contract":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","key":"ledger_key_contract_instance","durability":"persistent"}}]},"instructions":1180826,"read_bytes":3032,"write_bytes":180},"resource_fee":100107}}},"signatures":[{"hint":"1e193d9c","signature":"93fe5de9b29ad99fa6bff703c192aec91ee620f5f6092825ad7f6ac851a13866d5df802dd49eebfca8a13cf74f977d5be38c57cd925b41c6b5d9a5b56365f907"}]}}]}}]}]}},"tx_processing":[{"result":{"transaction_hash":"a130817e905f2102a01bd02874cd21dda236e7a79637865549f018430293e416","result":{"fee_charged":54981,"result":{"tx_success":[{"op_inner":{"invoke_host_function":{"success":"5a4330705560a94d339db17f1cdc680aab541e2b015b4e26f37418d894cf92e9"}}}]},"ext":"v0"}},"fee_processing":[{"state":{"last_modified_ledger_seq":1544202,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616111584,"seq_num":5095695228862536,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544202,"seq_time":1750133286}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862536,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544202,"seq_time":1750133286}}}}}}}},"ext":"v0"}}],"tx_apply_processing":{"v3":{"ext":"v0","tx_changes_before":[{"state":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862536,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544202,"seq_time":1750133286}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862537,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544215,"seq_time":1750133351}}}}}}}},"ext":"v0"}}],"operations":[{"changes":[{"state":{"last_modified_ledger_seq":1544185,"data":{"contract_data":{"ext":"v0","contract":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","key":"ledger_key_contract_instance","durability":"persistent","val":{"contract_instance":{"executable":{"wasm":"1d6f290f62afa4bfdb04435da1b335242566dae02f7e25c2ec491764c89eea46"},"storage":[{"key":{"vec":[{"symbol":"Admin"}]},"val":{"address":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL"}}]}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"contract_data":{"ext":"v0","contract":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","key":"ledger_key_contract_instance","durability":"persistent","val":{"contract_instance":{"executable":{"wasm":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"},"storage":[{"key":{"vec":[{"symbol":"Admin"}]},"val":{"address":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL"}}]}}}},"ext":"v0"}}]}],"tx_changes_after":[{"state":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862537,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544215,"seq_time":1750133351}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616056603,"seq_num":5095695228862537,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544215,"seq_time":1750133351}}}}}}}},"ext":"v0"}}],"soroban_meta":{"ext":"v0","events":[{"ext":"v0","contract_id":"ac5cc9ae771e930efdf6dc4441ae00cd4a52d967380a2d3952c80bbfcf925bee","type_":"system","body":{"v0":{"topics":[{"symbol":"executable_update"},{"vec":[{"symbol":"Wasm"},{"bytes":"1d6f290f62afa4bfdb04435da1b335242566dae02f7e25c2ec491764c89eea46"}]},{"vec":[{"symbol":"Wasm"},{"bytes":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}]}],"data":{"vec":[]}}}}],"return_value":"void","diagnostic_events":[]}}}}],"upgrades_processing":[],"scp_info":[],"total_byte_size_of_bucket_list":265396726,"evicted_temporary_ledger_keys":[],"evicted_persistent_ledger_entries":[]}}
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

Looking at the transactions soroban_meta, the system event is part of the non-diagnostic events:

Screenshot 2025-06-17 at 2 15 42 pm

@sisuresh Will system events still show up in the non-diagnostic events, and show up in the events stored in the operation and transaction-level events?

@sisuresh

Copy link
Copy Markdown
Contributor

Hmm, but in protocol 22 system events are not diagnostic events, they show up in the non-diagnostic event list.

For example, in transaction a130817e905f2102a01bd02874cd21dda236e7a79637865549f018430293e416 in ledger 1544215 on testnet, the ledger close meta is:

{"v1":{"ext":"v0","ledger_header":{"hash":"97fd77288b59b4decde667d1c1a16b80ae07232361784ef4e3232a4cd452ac89","header":{"ledger_version":22,"previous_ledger_hash":"6f9fa8589a936b90810413da0542e03cb8d2f2655d029adc0ac5a2c967509c18","scp_value":{"tx_set_hash":"964b94104cab5dda7f901c38fb056210373bbdf2fe85593f96ebe80a67d83f80","close_time":1750133351,"upgrades":[],"ext":{"signed":{"node_id":"GCUCJTIYXSOXKBSNFGNFWW5MUQ54HKRPGJUTQFJ5RQXZXNOLNXYDHRAP","signature":"ca1967048a3114d29855f563274c337aa139554b291c945b92d73dec381ca339e464d9153d46c9c322e48c48c84e77bab4e10cbe07dedd0564509f710391a80b"}}},"tx_set_result_hash":"7d14f31c8791447f2dc51cc54dc3a6490ebe403ad926f1b5050bb6aadb6591f8","bucket_list_hash":"424c1bc5b3900559bd0ebafd26846cb03d53ea98b6467f0f7bce8163ea796b6d","ledger_seq":1544215,"total_coins":1000000000000000000,"fee_pool":1147371827130,"inflation_seq":0,"id_pool":32429,"base_fee":100,"base_reserve":5000000,"max_tx_set_size":200,"skip_list":["88409f229233e7ee2c1637bb31f61c0ac598fb636ffc1e1ad05d625c590b4c9a","eb60c2cc4083afd0f5f77d1ea54a0a0ff6a2272d3cba58842ea21949f72a935b","b4744b374f44323a1d3bd5319f4ae311cbe558243d6b29afbb2504d83700032e","14697d36f8d8f4e34738770a137d85b4d0203ae19eeeca9d997e70f0df951e1e"],"ext":"v0"},"ext":"v0"},"tx_set":{"v1":{"previous_ledger_hash":"6f9fa8589a936b90810413da0542e03cb8d2f2655d029adc0ac5a2c967509c18","phases":[{"v0":[]},{"v0":[{"txset_comp_txs_maybe_discounted_fee":{"base_fee":100,"txs":[{"tx":{"tx":{"source_account":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","fee":100207,"seq_num":5095695228862537,"cond":"none","memo":"none","operations":[{"source_account":null,"body":{"invoke_host_function":{"host_function":{"invoke_contract":{"contract_address":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","function_name":"upgrade","args":[{"bytes":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}]}},"auth":[{"credentials":"source_account","root_invocation":{"function":{"contract_fn":{"contract_address":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","function_name":"upgrade","args":[{"bytes":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}]}},"sub_invocations":[]}}]}}}],"ext":{"v1":{"ext":"v0","resources":{"footprint":{"read_only":[{"contract_code":{"hash":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}},{"contract_code":{"hash":"1d6f290f62afa4bfdb04435da1b335242566dae02f7e25c2ec491764c89eea46"}}],"read_write":[{"contract_data":{"contract":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","key":"ledger_key_contract_instance","durability":"persistent"}}]},"instructions":1180826,"read_bytes":3032,"write_bytes":180},"resource_fee":100107}}},"signatures":[{"hint":"1e193d9c","signature":"93fe5de9b29ad99fa6bff703c192aec91ee620f5f6092825ad7f6ac851a13866d5df802dd49eebfca8a13cf74f977d5be38c57cd925b41c6b5d9a5b56365f907"}]}}]}}]}]}},"tx_processing":[{"result":{"transaction_hash":"a130817e905f2102a01bd02874cd21dda236e7a79637865549f018430293e416","result":{"fee_charged":54981,"result":{"tx_success":[{"op_inner":{"invoke_host_function":{"success":"5a4330705560a94d339db17f1cdc680aab541e2b015b4e26f37418d894cf92e9"}}}]},"ext":"v0"}},"fee_processing":[{"state":{"last_modified_ledger_seq":1544202,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616111584,"seq_num":5095695228862536,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544202,"seq_time":1750133286}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862536,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544202,"seq_time":1750133286}}}}}}}},"ext":"v0"}}],"tx_apply_processing":{"v3":{"ext":"v0","tx_changes_before":[{"state":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862536,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544202,"seq_time":1750133286}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862537,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544215,"seq_time":1750133351}}}}}}}},"ext":"v0"}}],"operations":[{"changes":[{"state":{"last_modified_ledger_seq":1544185,"data":{"contract_data":{"ext":"v0","contract":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","key":"ledger_key_contract_instance","durability":"persistent","val":{"contract_instance":{"executable":{"wasm":"1d6f290f62afa4bfdb04435da1b335242566dae02f7e25c2ec491764c89eea46"},"storage":[{"key":{"vec":[{"symbol":"Admin"}]},"val":{"address":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL"}}]}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"contract_data":{"ext":"v0","contract":"CCWFZSNOO4PJGDX563OEIQNOADGUUUWZM44AULJZKLEAXP6PSJN64CQX","key":"ledger_key_contract_instance","durability":"persistent","val":{"contract_instance":{"executable":{"wasm":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"},"storage":[{"key":{"vec":[{"symbol":"Admin"}]},"val":{"address":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL"}}]}}}},"ext":"v0"}}]}],"tx_changes_after":[{"state":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616011377,"seq_num":5095695228862537,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544215,"seq_time":1750133351}}}}}}}},"ext":"v0"}},{"updated":{"last_modified_ledger_seq":1544215,"data":{"account":{"account_id":"GAZMNKR7VTGSTW4NBTDYD5FL7ZFG5ANYTSA2FJJC7X7L7RA6DE6ZZDYL","balance":99616056603,"seq_num":5095695228862537,"num_sub_entries":0,"inflation_dest":null,"flags":0,"home_domain":"","thresholds":"01000000","signers":[],"ext":{"v1":{"liabilities":{"buying":0,"selling":0},"ext":{"v2":{"num_sponsored":0,"num_sponsoring":0,"signer_sponsoring_i_ds":[],"ext":{"v3":{"ext":"v0","seq_ledger":1544215,"seq_time":1750133351}}}}}}}},"ext":"v0"}}],"soroban_meta":{"ext":"v0","events":[{"ext":"v0","contract_id":"ac5cc9ae771e930efdf6dc4441ae00cd4a52d967380a2d3952c80bbfcf925bee","type_":"system","body":{"v0":{"topics":[{"symbol":"executable_update"},{"vec":[{"symbol":"Wasm"},{"bytes":"1d6f290f62afa4bfdb04435da1b335242566dae02f7e25c2ec491764c89eea46"}]},{"vec":[{"symbol":"Wasm"},{"bytes":"010cbf093498c3f8582505bd0f383c6ad196f51d00d764fa3a7f28f90f6c49d6"}]}],"data":{"vec":[]}}}}],"return_value":"void","diagnostic_events":[]}}}}],"upgrades_processing":[],"scp_info":[],"total_byte_size_of_bucket_list":265396726,"evicted_temporary_ledger_keys":[],"evicted_persistent_ledger_entries":[]}}
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

Looking at the transactions soroban_meta, the system event is part of the non-diagnostic events:
Screenshot 2025-06-17 at 2 15 42 pm

@sisuresh Will system events still show up in the non-diagnostic events, and show up in the events stored in the operation and transaction-level events?

Yeah system events will still show up in non-diagnostic operation events. System events are just events emitted by the system during an invocation, and get hashed into the ledger.

@karthikiyer56

karthikiyer56 commented Jun 17, 2025

Copy link
Copy Markdown
Contributor

@sisuresh Will system events still show up in the non-diagnostic events, and show up in the events stored in the operation and transaction-level events?

Yeah system events will still show up in non-diagnostic operation events. System events are just events emitted by the system during an invocation, and get hashed into the ledger.

This is totally my bad,
As a point of clarification
In TxMetaV3.SorobanMeta::

type SorobanTransactionMeta struct {
	Ext              SorobanTransactionMetaExt
	Events           []ContractEvent. ---> this includes system events + smart contract emitted events
	ReturnValue      ScVal
	DiagnosticEvents []DiagnosticEvent
}

I was under the incorrect impression that System events will appear under DiagnosticEvents []DiagnosticEvent

@sisuresh : one more clarification.
So, in TxMetaV4, the system events will now appear at the per transaction level.
i.e Inside OperationMetaV2 ?
if so, then we are good.
as in, system events will still show up in RPC getEvents output

type TransactionMetaV4 struct {
	Ext              ExtensionPoint
	TxChangesBefore  LedgerEntryChanges
	Operations       []OperationMetaV2
	TxChangesAfter   LedgerEntryChanges
	SorobanMeta      *SorobanTransactionMetaV2
	Events           []TransactionEvent
	DiagnosticEvents []DiagnosticEvent
}

type OperationMetaV2 struct {
	Ext     ExtensionPoint
	Changes LedgerEntryChanges
	Events  []ContractEvent ---> Will this have System Level events going forward?
}

@sisuresh

Copy link
Copy Markdown
Contributor

@sisuresh Will system events still show up in the non-diagnostic events, and show up in the events stored in the operation and transaction-level events?

Yeah system events will still show up in non-diagnostic operation events. System events are just events emitted by the system during an invocation, and get hashed into the ledger.

This is totally my bad, As a point of clarification In TxMetaV3.SorobanMeta::

type SorobanTransactionMeta struct {
	Ext              SorobanTransactionMetaExt
	Events           []ContractEvent. ---> this includes system events + smart contract emitted events
	ReturnValue      ScVal
	DiagnosticEvents []DiagnosticEvent
}

I was under the incorrect impression that System events will appear under DiagnosticEvents []DiagnosticEvent

@sisuresh : one more clarification. So, in TxMetaV4, the system events will now appear at the per transaction level. i.e Inside OperationMetaV2 ?

type TransactionMetaV4 struct {
	Ext              ExtensionPoint
	TxChangesBefore  LedgerEntryChanges
	Operations       []OperationMetaV2
	TxChangesAfter   LedgerEntryChanges
	SorobanMeta      *SorobanTransactionMetaV2
	Events           []TransactionEvent
	DiagnosticEvents []DiagnosticEvent
}

type OperationMetaV2 struct {
	Ext     ExtensionPoint
	Changes LedgerEntryChanges
	Events  []ContractEvent ---> Will this have System Level events going forward?
}

Yeah system events can show up in OperationMetaV2.

@Shaptic

Shaptic commented Jun 17, 2025

Copy link
Copy Markdown
Contributor Author

So long story short, if I understand the discussion correctly:

  • we should deprecate inSuccessfulContractCall
  • we can keep type and just drop the potential of "type" == "diagnostic"
  • I'll update the changelog accordingly

@Shaptic Shaptic removed this from the platform sprint 60 milestone Jun 17, 2025
@Shaptic
Shaptic force-pushed the event-ordering branch 3 times, most recently from b408ae0 to cc84484 Compare June 18, 2025 00:05
@Shaptic Shaptic changed the title [Draft] Add chronological event insertion for different application phases Add chronological event insertion for different application phases Jun 18, 2025
@Shaptic
Shaptic marked this pull request as ready for review June 18, 2025 00:13
Comment thread cmd/stellar-rpc/internal/db/event.go Outdated
Comment thread cmd/stellar-rpc/internal/db/event.go

@tamirms tamirms left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice job coming up with a cursor that handles chronological ordering and preserves the pre-existing events!

Comment thread cmd/stellar-rpc/internal/db/event.go
Comment thread cmd/stellar-rpc/internal/integrationtest/transaction_test.go Outdated
Comment thread cmd/stellar-rpc/internal/integrationtest/transaction_test.go

@sreuland sreuland left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, nice design up front to wrangle complexity of raw events in such a small code footprint!

@Shaptic
Shaptic merged commit a21a7c3 into protocol-23 Jun 18, 2025
@Shaptic
Shaptic deleted the event-ordering branch June 18, 2025 19:09
@github-project-automation github-project-automation Bot moved this from Needs Review to Done in Platform Scrum Jun 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Handle chronological event interleaving

7 participants