@@ -2398,3 +2398,81 @@ fn test_prune_history() {
23982398 "is_latest=true entry should be retained even if old"
23992399 ) ;
24002400}
2401+
2402+ #[ test]
2403+ #[ miden_node_test_macro:: enable_logging]
2404+ fn db_roundtrip_transactions ( ) {
2405+ let mut conn = create_db ( ) ;
2406+ let block_num = BlockNumber :: from ( 1 ) ;
2407+ create_block ( & mut conn, block_num) ;
2408+
2409+ let account_id = AccountId :: try_from ( ACCOUNT_ID_PRIVATE_SENDER ) . unwrap ( ) ;
2410+ queries:: upsert_accounts ( & mut conn, & [ mock_block_account_update ( account_id, 0 ) ] , block_num)
2411+ . unwrap ( ) ;
2412+
2413+ // Build two transaction headers with distinct data
2414+ let tx1 = mock_block_transaction ( account_id, 1 ) ;
2415+ let tx2 = mock_block_transaction ( account_id, 2 ) ;
2416+ let ordered = OrderedTransactionHeaders :: new_unchecked ( vec ! [ tx1. clone( ) , tx2. clone( ) ] ) ;
2417+
2418+ // Insert
2419+ let count = queries:: insert_transactions ( & mut conn, block_num, & ordered) . unwrap ( ) ;
2420+ assert_eq ! ( count, 2 , "Should insert 2 transactions" ) ;
2421+
2422+ // Retrieve
2423+ let ( last_block, records) = queries:: select_transactions_records (
2424+ & mut conn,
2425+ & [ account_id] ,
2426+ BlockNumber :: GENESIS ..=block_num,
2427+ )
2428+ . unwrap ( ) ;
2429+ assert_eq ! ( last_block, block_num, "Last block should match" ) ;
2430+ assert_eq ! ( records. len( ) , 2 , "Should retrieve 2 transactions" ) ;
2431+
2432+ // Verify each transaction roundtrips correctly.
2433+ // Records are ordered by (block_num, transaction_id), so match by ID.
2434+ let originals = [ & tx1, & tx2] ;
2435+ for record in & records {
2436+ let original = originals
2437+ . iter ( )
2438+ . find ( |tx| tx. id ( ) == record. transaction_id )
2439+ . expect ( "Retrieved transaction should match one of the originals" ) ;
2440+ assert_eq ! (
2441+ record. transaction_id,
2442+ original. id( ) ,
2443+ "TransactionId DB roundtrip must be symmetric"
2444+ ) ;
2445+ assert_eq ! (
2446+ record. account_id,
2447+ original. account_id( ) ,
2448+ "AccountId DB roundtrip must be symmetric"
2449+ ) ;
2450+ assert_eq ! ( record. block_num, block_num, "Block number must match" ) ;
2451+ assert_eq ! (
2452+ record. initial_state_commitment,
2453+ original. initial_state_commitment( ) ,
2454+ "Initial state commitment DB roundtrip must be symmetric"
2455+ ) ;
2456+ assert_eq ! (
2457+ record. final_state_commitment,
2458+ original. final_state_commitment( ) ,
2459+ "Final state commitment DB roundtrip must be symmetric"
2460+ ) ;
2461+
2462+ // Input notes are stored as nullifiers only
2463+ let expected_nullifiers: Vec < Nullifier > =
2464+ original. input_notes ( ) . iter ( ) . map ( InputNoteCommitment :: nullifier) . collect ( ) ;
2465+ assert_eq ! (
2466+ record. nullifiers, expected_nullifiers,
2467+ "Nullifiers (from input notes) DB roundtrip must be symmetric"
2468+ ) ;
2469+
2470+ // Output notes are stored as note IDs only
2471+ let expected_note_ids: Vec < NoteId > =
2472+ original. output_notes ( ) . iter ( ) . map ( NoteHeader :: id) . collect ( ) ;
2473+ assert_eq ! (
2474+ record. output_notes, expected_note_ids,
2475+ "Output note IDs DB roundtrip must be symmetric"
2476+ ) ;
2477+ }
2478+ }
0 commit comments