diff --git a/internal/data/accounts_test.go b/internal/data/accounts_test.go index 653c14a05..e4d5a2531 100644 --- a/internal/data/accounts_test.go +++ b/internal/data/accounts_test.go @@ -259,7 +259,7 @@ func TestAccountModelBatchGetByTxHashes(t *testing.T) { require.NoError(t, err) // Insert test transactions first - _, err = m.DB.ExecContext(ctx, "INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) VALUES ($1, 1, 'env1', 'res1', 'meta1', 1, NOW()), ($2, 2, 'env2', 'res2', 'meta2', 2, NOW())", txHash1, txHash2) + _, err = m.DB.ExecContext(ctx, "INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) VALUES ($1, 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, NOW()), ($2, 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, NOW())", txHash1, txHash2) require.NoError(t, err) // Insert test transactions_accounts links @@ -309,7 +309,7 @@ func TestAccountModelBatchGetByOperationIDs(t *testing.T) { require.NoError(t, err) // Insert test transactions first - _, err = m.DB.ExecContext(ctx, "INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) VALUES ('tx1', 1, 'env1', 'res1', 'meta1', 1, NOW()), ('tx2', 2, 'env2', 'res2', 'meta2', 2, NOW())") + _, err = m.DB.ExecContext(ctx, "INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) VALUES ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, NOW()), ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, NOW())") require.NoError(t, err) // Insert test operations first @@ -400,7 +400,7 @@ func TestAccountModelBatchGetByStateChangeIDs(t *testing.T) { require.NoError(t, err) // Insert test transactions first - _, err = m.DB.ExecContext(ctx, "INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) VALUES ('tx1', 1, 'env1', 'res1', 'meta1', 1, NOW()), ('tx2', 2, 'env2', 'res2', 'meta2', 2, NOW())") + _, err = m.DB.ExecContext(ctx, "INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) VALUES ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, NOW()), ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, NOW())") require.NoError(t, err) // Insert test operations first diff --git a/internal/data/ingest_store_test.go b/internal/data/ingest_store_test.go index 4bfdd6550..1b398c53f 100644 --- a/internal/data/ingest_store_test.go +++ b/internal/data/ingest_store_test.go @@ -231,8 +231,8 @@ func Test_IngestStoreModel_GetLedgerGaps(t *testing.T) { // Insert consecutive ledgers: 100, 101, 102 for i, ledger := range []uint32{100, 101, 102} { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, fmt.Sprintf("hash%d", i), i+1, ledger) require.NoError(t, err) } @@ -245,8 +245,8 @@ func Test_IngestStoreModel_GetLedgerGaps(t *testing.T) { // Insert ledgers 100 and 105, creating gap 101-104 for i, ledger := range []uint32{100, 105} { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, fmt.Sprintf("hash%d", i), i+1, ledger) require.NoError(t, err) } @@ -261,8 +261,8 @@ func Test_IngestStoreModel_GetLedgerGaps(t *testing.T) { // Insert ledgers 100, 105, 110, creating gaps 101-104 and 106-109 for i, ledger := range []uint32{100, 105, 110} { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, fmt.Sprintf("hash%d", i), i+1, ledger) require.NoError(t, err) } @@ -278,8 +278,8 @@ func Test_IngestStoreModel_GetLedgerGaps(t *testing.T) { // Insert ledgers 100 and 102, creating gap of just 101 for i, ledger := range []uint32{100, 102} { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, fmt.Sprintf("hash%d", i), i+1, ledger) require.NoError(t, err) } diff --git a/internal/data/operations_test.go b/internal/data/operations_test.go index ab8b95888..8d049c4be 100644 --- a/internal/data/operations_test.go +++ b/internal/data/operations_test.go @@ -68,19 +68,23 @@ func Test_OperationModel_BatchInsert(t *testing.T) { Hash: "tx1", ToID: 1, EnvelopeXDR: &envelope1, - ResultXDR: "result1", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta1, LedgerNumber: 1, LedgerCreatedAt: now, + IsFeeBump: false, } tx2 := types.Transaction{ Hash: "tx2", ToID: 2, EnvelopeXDR: &envelope2, - ResultXDR: "result2", + FeeCharged: 200, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta2, LedgerNumber: 2, LedgerCreatedAt: now, + IsFeeBump: true, } // Insert transactions @@ -251,19 +255,23 @@ func Test_OperationModel_BatchCopy(t *testing.T) { Hash: "tx1", ToID: 1, EnvelopeXDR: &envelope1, - ResultXDR: "result1", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta1, LedgerNumber: 1, LedgerCreatedAt: now, + IsFeeBump: false, } tx2 := types.Transaction{ Hash: "tx2", ToID: 2, EnvelopeXDR: &envelope2, - ResultXDR: "result2", + FeeCharged: 200, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta2, LedgerNumber: 2, LedgerCreatedAt: now, + IsFeeBump: true, } // Insert transactions @@ -417,8 +425,8 @@ func Test_OperationModel_BatchCopy_DuplicateFails(t *testing.T) { // Create a parent transaction that the operation will reference _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ('tx_for_dup_test', 1, 'env', 'res', 'meta', 1, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES ('tx_for_dup_test', 1, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', 1, $1, false) `, now) require.NoError(t, err) @@ -498,18 +506,18 @@ func TestOperationModel_GetAll(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) // Create test operations _, err = dbConnectionPool.ExecContext(ctx, ` INSERT INTO operations (id, tx_hash, operation_type, operation_xdr, ledger_number, ledger_created_at) - VALUES + VALUES (1, 'tx1', 'payment', 'xdr1', 1, $1), (2, 'tx2', 'create_account', 'xdr2', 2, $1), (3, 'tx3', 'payment', 'xdr3', 3, $1) @@ -545,11 +553,11 @@ func TestOperationModel_BatchGetByTxHashes(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -733,17 +741,17 @@ func TestOperationModel_BatchGetByTxHash(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true) `, now) require.NoError(t, err) // Create test operations _, err = dbConnectionPool.ExecContext(ctx, ` INSERT INTO operations (id, tx_hash, operation_type, operation_xdr, ledger_number, ledger_created_at) - VALUES + VALUES (1, 'tx1', 'payment', 'xdr1', 1, $1), (2, 'tx2', 'create_account', 'xdr2', 2, $1), (3, 'tx1', 'payment', 'xdr3', 3, $1) @@ -786,18 +794,18 @@ func TestOperationModel_BatchGetByAccountAddresses(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) // Create test operations _, err = dbConnectionPool.ExecContext(ctx, ` INSERT INTO operations (id, tx_hash, operation_type, operation_xdr, ledger_number, ledger_created_at) - VALUES + VALUES (1, 'tx1', 'payment', 'xdr1', 1, $1), (2, 'tx2', 'create_account', 'xdr2', 2, $1), (3, 'tx3', 'payment', 'xdr3', 3, $1) @@ -834,17 +842,17 @@ func TestOperationModel_GetByID(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true) `, now) require.NoError(t, err) // Create test operations _, err = dbConnectionPool.ExecContext(ctx, ` INSERT INTO operations (id, tx_hash, operation_type, operation_xdr, ledger_number, ledger_created_at) - VALUES + VALUES (1, 'tx1', 'payment', 'xdr1', 1, $1), (2, 'tx2', 'create_account', 'xdr2', 2, $1) `, now) @@ -897,18 +905,18 @@ func TestOperationModel_BatchGetByStateChangeIDs(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) // Create test operations _, err = dbConnectionPool.ExecContext(ctx, ` INSERT INTO operations (id, tx_hash, operation_type, operation_xdr, ledger_number, ledger_created_at) - VALUES + VALUES (1, 'tx1', 'payment', 'xdr1', 1, $1), (2, 'tx2', 'create_account', 'xdr2', 2, $1), (3, 'tx3', 'payment', 'xdr3', 3, $1) @@ -965,8 +973,8 @@ func BenchmarkOperationModel_BatchInsert(b *testing.B) { const txHash = "benchmark_tx_hash" now := time.Now() _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, 1, 'env', 'res', 'meta', 1, $2) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES ($1, 1, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', 1, $2, false) `, txHash, now) if err != nil { b.Fatalf("failed to create parent transaction: %v", err) @@ -1029,8 +1037,8 @@ func BenchmarkOperationModel_BatchCopy(b *testing.B) { const txHash = "benchmark_tx_hash" now := time.Now() _, err = conn.Exec(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, 1, 'env', 'res', 'meta', 1, $2) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES ($1, 1, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', 1, $2, false) `, txHash, now) if err != nil { b.Fatalf("failed to create parent transaction: %v", err) diff --git a/internal/data/statechanges_test.go b/internal/data/statechanges_test.go index 9304f0254..e1300292d 100644 --- a/internal/data/statechanges_test.go +++ b/internal/data/statechanges_test.go @@ -84,19 +84,23 @@ func TestStateChangeModel_BatchInsert(t *testing.T) { Hash: "tx1", ToID: 1, EnvelopeXDR: &envelope1, - ResultXDR: "result1", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta1, LedgerNumber: 1, LedgerCreatedAt: now, + IsFeeBump: false, } tx2 := types.Transaction{ Hash: "tx2", ToID: 2, EnvelopeXDR: &envelope2, - ResultXDR: "result2", + FeeCharged: 200, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta2, LedgerNumber: 2, LedgerCreatedAt: now, + IsFeeBump: true, } sqlxDB, err := dbConnectionPool.SqlxDB(ctx) require.NoError(t, err) @@ -238,19 +242,23 @@ func TestStateChangeModel_BatchCopy(t *testing.T) { Hash: "tx1", ToID: 1, EnvelopeXDR: &envelope1, - ResultXDR: "result1", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta1, LedgerNumber: 1, LedgerCreatedAt: now, + IsFeeBump: false, } tx2 := types.Transaction{ Hash: "tx2", ToID: 2, EnvelopeXDR: &envelope2, - ResultXDR: "result2", + FeeCharged: 200, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta2, LedgerNumber: 2, LedgerCreatedAt: now, + IsFeeBump: true, } sqlxDB, err := dbConnectionPool.SqlxDB(ctx) require.NoError(t, err) @@ -402,8 +410,8 @@ func TestStateChangeModel_BatchCopy_DuplicateFails(t *testing.T) { // Create parent transaction _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ('tx_for_sc_dup_test', 1, 'env', 'res', 'meta', 1, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES ('tx_for_sc_dup_test', 1, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', 1, $1, false) `, now) require.NoError(t, err) @@ -479,11 +487,11 @@ func TestStateChangeModel_BatchGetByAccountAddress(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -541,11 +549,11 @@ func TestStateChangeModel_BatchGetByAccountAddress_WithFilters(t *testing.T) { // Create test transactions _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1) `, now) require.NoError(t, err) @@ -783,11 +791,11 @@ func TestStateChangeModel_GetAll(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -830,11 +838,11 @@ func TestStateChangeModel_BatchGetByTxHashes(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -1042,11 +1050,11 @@ func TestStateChangeModel_BatchGetByOperationIDs(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1), - ('tx3', 3, 'env3', 'res3', 'meta3', 3, $1) + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'env3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -1102,10 +1110,10 @@ func TestStateChangeModel_BatchGetByTxHash(t *testing.T) { // Create test transactions first _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) VALUES - ('tx1', 1, 'env1', 'res1', 'meta1', 1, $1), - ('tx2', 2, 'env2', 'res2', 'meta2', 2, $1) + ('tx1', 1, 'env1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'env2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true) `, now) require.NoError(t, err) @@ -1202,8 +1210,8 @@ func BenchmarkStateChangeModel_BatchInsert(b *testing.B) { accountID := keypair.MustRandom().Address() now := time.Now() _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, 1, 'env', 'res', 'meta', 1, $2) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES ($1, 1, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', 1, $2, false) `, txHash, now) if err != nil { b.Fatalf("failed to create parent transaction: %v", err) @@ -1267,8 +1275,8 @@ func BenchmarkStateChangeModel_BatchCopy(b *testing.B) { accountID := keypair.MustRandom().Address() now := time.Now() _, err = conn.Exec(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, 1, 'env', 'res', 'meta', 1, $2) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES ($1, 1, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', 1, $2, false) `, txHash, now) if err != nil { b.Fatalf("failed to create parent transaction: %v", err) diff --git a/internal/data/transactions.go b/internal/data/transactions.go index 65727f097..6258b3821 100644 --- a/internal/data/transactions.go +++ b/internal/data/transactions.go @@ -180,19 +180,23 @@ func (m *TransactionModel) BatchInsert( hashes := make([]string, len(txs)) toIDs := make([]int64, len(txs)) envelopeXDRs := make([]*string, len(txs)) - resultXDRs := make([]string, len(txs)) + feesCharged := make([]int64, len(txs)) + resultCodes := make([]string, len(txs)) metaXDRs := make([]*string, len(txs)) ledgerNumbers := make([]int, len(txs)) ledgerCreatedAts := make([]time.Time, len(txs)) + isFeeBumps := make([]bool, len(txs)) for i, t := range txs { hashes[i] = t.Hash toIDs[i] = t.ToID envelopeXDRs[i] = t.EnvelopeXDR - resultXDRs[i] = t.ResultXDR + feesCharged[i] = t.FeeCharged + resultCodes[i] = t.ResultCode metaXDRs[i] = t.MetaXDR ledgerNumbers[i] = int(t.LedgerNumber) ledgerCreatedAts[i] = t.LedgerCreatedAt + isFeeBumps[i] = t.IsFeeBump } // 2. Flatten the stellarAddressesByTxHash into parallel slices @@ -210,18 +214,20 @@ func (m *TransactionModel) BatchInsert( -- Insert transactions inserted_transactions AS ( INSERT INTO transactions - (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) SELECT - t.hash, t.to_id, t.envelope_xdr, t.result_xdr, t.meta_xdr, t.ledger_number, t.ledger_created_at + t.hash, t.to_id, t.envelope_xdr, t.fee_charged, t.result_code, t.meta_xdr, t.ledger_number, t.ledger_created_at, t.is_fee_bump FROM ( SELECT UNNEST($1::text[]) AS hash, UNNEST($2::bigint[]) AS to_id, UNNEST($3::text[]) AS envelope_xdr, - UNNEST($4::text[]) AS result_xdr, - UNNEST($5::text[]) AS meta_xdr, - UNNEST($6::bigint[]) AS ledger_number, - UNNEST($7::timestamptz[]) AS ledger_created_at + UNNEST($4::bigint[]) AS fee_charged, + UNNEST($5::text[]) AS result_code, + UNNEST($6::text[]) AS meta_xdr, + UNNEST($7::bigint[]) AS ledger_number, + UNNEST($8::timestamptz[]) AS ledger_created_at, + UNNEST($9::boolean[]) AS is_fee_bump ) t ON CONFLICT (hash) DO NOTHING RETURNING hash @@ -235,8 +241,8 @@ func (m *TransactionModel) BatchInsert( ta.tx_hash, ta.account_id FROM ( SELECT - UNNEST($8::text[]) AS tx_hash, - UNNEST($9::text[]) AS account_id + UNNEST($10::text[]) AS tx_hash, + UNNEST($11::text[]) AS account_id ) ta ON CONFLICT DO NOTHING ) @@ -251,10 +257,12 @@ func (m *TransactionModel) BatchInsert( pq.Array(hashes), pq.Array(toIDs), pq.Array(envelopeXDRs), - pq.Array(resultXDRs), + pq.Array(feesCharged), + pq.Array(resultCodes), pq.Array(metaXDRs), pq.Array(ledgerNumbers), pq.Array(ledgerCreatedAts), + pq.Array(isFeeBumps), pq.Array(txHashes), pq.Array(stellarAddresses), ) @@ -302,17 +310,19 @@ func (m *TransactionModel) BatchCopy( copyCount, err := pgxTx.CopyFrom( ctx, pgx.Identifier{"transactions"}, - []string{"hash", "to_id", "envelope_xdr", "result_xdr", "meta_xdr", "ledger_number", "ledger_created_at"}, + []string{"hash", "to_id", "envelope_xdr", "fee_charged", "result_code", "meta_xdr", "ledger_number", "ledger_created_at", "is_fee_bump"}, pgx.CopyFromSlice(len(txs), func(i int) ([]any, error) { tx := txs[i] return []any{ pgtype.Text{String: tx.Hash, Valid: true}, pgtype.Int8{Int64: tx.ToID, Valid: true}, pgtypeTextFromPtr(tx.EnvelopeXDR), - pgtype.Text{String: tx.ResultXDR, Valid: true}, + pgtype.Int8{Int64: tx.FeeCharged, Valid: true}, + pgtype.Text{String: tx.ResultCode, Valid: true}, pgtypeTextFromPtr(tx.MetaXDR), pgtype.Int4{Int32: int32(tx.LedgerNumber), Valid: true}, pgtype.Timestamptz{Time: tx.LedgerCreatedAt, Valid: true}, + pgtype.Bool{Bool: tx.IsFeeBump, Valid: true}, }, nil }), ) diff --git a/internal/data/transactions_test.go b/internal/data/transactions_test.go index ba29dd6aa..4db075de0 100644 --- a/internal/data/transactions_test.go +++ b/internal/data/transactions_test.go @@ -29,17 +29,18 @@ func generateTestTransactions(n int, startToID int64) ([]*types.Transaction, map hash := fmt.Sprintf("e76b7b0133690fbfb2de8fa9ca2273cb4f2e29447e0cf0e14a5f82d0daa48760-%d", startToID+int64(i)) envelope := "AAAAAgAAAAB/NpQ+s+cP+ztX7ryuKgXrxowZPHd4qAxhseOye/JeUgAehIAC2NL/AAflugAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAwAAAAFQQUxMAAAAAKHc4IKbcW8HPPgy3zOhuqv851y72nfLGa0HVXxIRNzHAAAAAAAAAAAAQ3FwMxshxQAfwV8AAAAAYTGQ3QAAAAAAAAAMAAAAAAAAAAFQQUxMAAAAAKHc4IKbcW8HPPgy3zOhuqv851y72nfLGa0HVXxIRNzHAAAAAAAGXwFksiHwAEXz8QAAAABhoaQjAAAAAAAAAAF78l5SAAAAQD7LgvZA8Pdvfh5L2b9B9RC7DlacGBJuOchuZDHQdVD1P0bn6nGQJXxDDI4oN76J49JxB7bIgDVim39MU43MOgE=" meta := "AAAAAwAAAAAAAAAEAAAAAwM6nhwAAAAAAAAAAJjy0MY1CPlZ/co80nzufVmo4gd7NqWMb+RiGiPhiviJAAAAC4SozKUDMWgAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQM6nhwAAAAAAAAAAJjy0MY1CPlZ/co80nzufVmo4gd7NqWMb+RiGiPhiviJAAAAC4SozKUDMWgAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwM6LTkAAAAAAAAAAKl6DQcpepRdTbO/Vw4hYBENfE/95GevM7SNA0ftK0gtAAAAA8Kuf0AC+zZCAAAATAAAAAMAAAABAAAAAMRxxkNwYslQaok0LlOKGtpATS9Bzx06JV9DIffG4OF1AAAAAAAAAAlsb2JzdHIuY28AAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAyZ54QAAAABmrTXCAAAAAAAAAAEDOp4cAAAAAAAAAACpeg0HKXqUXU2zv1cOIWARDXxP/eRnrzO0jQNH7StILQAAAAPCrn9AAvs2QgAAAE0AAAADAAAAAQAAAADEccZDcGLJUGqJNC5TihraQE0vQc8dOiVfQyH3xuDhdQAAAAAAAAAJbG9ic3RyLmNvAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAADAAAAAAM6nhwAAAAAZyGdHwAAAAAAAAABAAAABAAAAAMDOp4cAAAAAAAAAACpeg0HKXqUXU2zv1cOIWARDXxP/eRnrzO0jQNH7StILQAAAAPCrn9AAvs2QgAAAE0AAAADAAAAAQAAAADEccZDcGLJUGqJNC5TihraQE0vQc8dOiVfQyH3xuDhdQAAAAAAAAAJbG9ic3RyLmNvAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAADAAAAAAM6nhwAAAAAZyGdHwAAAAAAAAABAzqeHAAAAAAAAAAAqXoNByl6lF1Ns79XDiFgEQ18T/3kZ68ztI0DR+0rSC0AAAACmKiNQAL7NkIAAABNAAAAAwAAAAEAAAAAxHHGQ3BiyVBqiTQuU4oa2kBNL0HPHTolX0Mh98bg4XUAAAAAAAAACWxvYnN0ci5jbwAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAADOp4cAAAAAGchnR8AAAAAAAAAAwM6nZoAAAAAAAAAALKxMozkOH3rgpz3/u3+93wsR4p6z4K82HmJ5NTuaZbYAAACZaqAwoIBqycyAABVlQAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAzqSNgAAAABnIVdaAAAAAAAAAAEDOp4cAAAAAAAAAACysTKM5Dh964Kc9/7t/vd8LEeKes+CvNh5ieTU7mmW2AAAAmbUhrSCAasnMgAAVZUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAADAAAAAAM6kjYAAAAAZyFXWgAAAAAAAAAAAAAAAA==" - result := "AAAAAAAAAMgAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAAAAAABAAAAAH82lD6z5w/7O1fuvK4qBevGjBk8d3ioDGGx47J78l5SAAAAAGExkN0AAAABUEFMTAAAAACh3OCCm3FvBzz4Mt8zobqr/Odcu9p3yxmtB1V8SETcxwAAAAAAAAAAAENxcDMbIcUAH8FfAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAQAAAAB/NpQ+s+cP+ztX7ryuKgXrxowZPHd4qAxhseOye/JeUgAAAABhoaQjAAAAAAAAAAFQQUxMAAAAAKHc4IKbcW8HPPgy3zOhuqv851y72nfLGa0HVXxIRNzHAAAAAAkrzGAARfPxZLIh8AAAAAAAAAAAAAAAAA==" address := keypair.MustRandom().Address() txs[i] = &types.Transaction{ Hash: hash, ToID: startToID + int64(i), EnvelopeXDR: &envelope, - ResultXDR: result, + FeeCharged: int64(100 * (i + 1)), + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta, LedgerNumber: uint32(i + 1), LedgerCreatedAt: now, + IsFeeBump: false, } addressesByHash[hash] = set.NewSet(address) } @@ -70,19 +71,23 @@ func Test_TransactionModel_BatchInsert(t *testing.T) { Hash: "tx1", ToID: 1, EnvelopeXDR: &envelope1, - ResultXDR: "result1", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta1, LedgerNumber: 1, LedgerCreatedAt: now, + IsFeeBump: false, } tx2 := types.Transaction{ Hash: "tx2", ToID: 2, EnvelopeXDR: &envelope2, - ResultXDR: "result2", + FeeCharged: 200, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta2, LedgerNumber: 2, LedgerCreatedAt: now, + IsFeeBump: true, } testCases := []struct { @@ -231,29 +236,35 @@ func Test_TransactionModel_BatchCopy(t *testing.T) { Hash: "tx1", ToID: 1, EnvelopeXDR: &envelope1, - ResultXDR: "result1", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta1, LedgerNumber: 1, LedgerCreatedAt: now, + IsFeeBump: false, } tx2 := types.Transaction{ Hash: "tx2", ToID: 2, EnvelopeXDR: &envelope2, - ResultXDR: "result2", + FeeCharged: 200, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta2, LedgerNumber: 2, LedgerCreatedAt: now, + IsFeeBump: true, } // Transaction with nullable fields (nil envelope and meta) tx3 := types.Transaction{ Hash: "tx3", ToID: 3, EnvelopeXDR: nil, - ResultXDR: "result3", + FeeCharged: 300, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: nil, LedgerNumber: 3, LedgerCreatedAt: now, + IsFeeBump: false, } testCases := []struct { @@ -392,10 +403,12 @@ func Test_TransactionModel_BatchCopy_DuplicateFails(t *testing.T) { Hash: "tx_duplicate_test", ToID: 100, EnvelopeXDR: &envelope, - ResultXDR: "result1", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta, LedgerNumber: 1, LedgerCreatedAt: now, + IsFeeBump: false, } // Pre-insert the transaction using BatchInsert (which uses ON CONFLICT DO NOTHING) @@ -466,8 +479,8 @@ func TestTransactionModel_GetByHash(t *testing.T) { // Create test transaction txHash := "test_tx_hash" _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, 1, 'envelope', 'result', 'meta', 1, $2) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) + VALUES ($1, 1, 'envelope', 100, 'TransactionResultCodeTxSuccess', 'meta', 1, $2, false) `, txHash, now) require.NoError(t, err) @@ -502,11 +515,11 @@ func TestTransactionModel_GetAll(t *testing.T) { // Create test transactions _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) VALUES - ('tx1', 1, 'envelope1', 'result1', 'meta1', 1, $1), - ('tx2', 2, 'envelope2', 'result2', 'meta2', 2, $1), - ('tx3', 3, 'envelope3', 'result3', 'meta3', 3, $1) + ('tx1', 1, 'envelope1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'envelope2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'envelope3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -555,11 +568,11 @@ func TestTransactionModel_BatchGetByAccountAddress(t *testing.T) { // Create test transactions _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) VALUES - ('tx1', 1, 'envelope1', 'result1', 'meta1', 1, $1), - ('tx2', 2, 'envelope2', 'result2', 'meta2', 2, $1), - ('tx3', 3, 'envelope3', 'result3', 'meta3', 3, $1) + ('tx1', 1, 'envelope1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'envelope2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'envelope3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -605,11 +618,11 @@ func TestTransactionModel_BatchGetByOperationIDs(t *testing.T) { // Create test transactions _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) VALUES - ('tx1', 1, 'envelope1', 'result1', 'meta1', 1, $1), - ('tx2', 2, 'envelope2', 'result2', 'meta2', 2, $1), - ('tx3', 3, 'envelope3', 'result3', 'meta3', 3, $1) + ('tx1', 1, 'envelope1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'envelope2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'envelope3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) @@ -666,11 +679,11 @@ func TestTransactionModel_BatchGetByStateChangeIDs(t *testing.T) { // Create test transactions _, err = dbConnectionPool.ExecContext(ctx, ` - INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) + INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) VALUES - ('tx1', 1, 'envelope1', 'result1', 'meta1', 1, $1), - ('tx2', 2, 'envelope2', 'result2', 'meta2', 2, $1), - ('tx3', 3, 'envelope3', 'result3', 'meta3', 3, $1) + ('tx1', 1, 'envelope1', 100, 'TransactionResultCodeTxSuccess', 'meta1', 1, $1, false), + ('tx2', 2, 'envelope2', 200, 'TransactionResultCodeTxSuccess', 'meta2', 2, $1, true), + ('tx3', 3, 'envelope3', 300, 'TransactionResultCodeTxSuccess', 'meta3', 3, $1, false) `, now) require.NoError(t, err) diff --git a/internal/db/migrations/2025-06-10.2-create_indexer_table_transactions.sql b/internal/db/migrations/2025-06-10.2-create_indexer_table_transactions.sql index eecf7e0f8..252b4e260 100644 --- a/internal/db/migrations/2025-06-10.2-create_indexer_table_transactions.sql +++ b/internal/db/migrations/2025-06-10.2-create_indexer_table_transactions.sql @@ -5,10 +5,12 @@ CREATE TABLE transactions ( hash TEXT PRIMARY KEY, to_id BIGINT NOT NULL, envelope_xdr TEXT, - result_xdr TEXT, + fee_charged BIGINT NOT NULL, + result_code TEXT NOT NULL, meta_xdr TEXT, ledger_number INTEGER NOT NULL, ledger_created_at TIMESTAMPTZ NOT NULL, + is_fee_bump BOOLEAN NOT NULL DEFAULT false, ingested_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); diff --git a/internal/indexer/processors/utils.go b/internal/indexer/processors/utils.go index 3f43305b0..13c3ec4bf 100644 --- a/internal/indexer/processors/utils.go +++ b/internal/indexer/processors/utils.go @@ -247,10 +247,7 @@ func ConvertTransaction(transaction *ingest.LedgerTransaction, skipTxMeta bool, envelopeXDR = &envelopeXDRStr } - resultXDR, err := xdr.MarshalBase64(transaction.Result) - if err != nil { - return nil, fmt.Errorf("marshalling transaction result: %w", err) - } + feeCharged, _ := transaction.FeeCharged() var metaXDR *string if !skipTxMeta { @@ -289,9 +286,11 @@ func ConvertTransaction(transaction *ingest.LedgerTransaction, skipTxMeta bool, Hash: transaction.Hash.HexString(), LedgerCreatedAt: transaction.Ledger.ClosedAt(), EnvelopeXDR: envelopeXDR, - ResultXDR: resultXDR, + FeeCharged: feeCharged, + ResultCode: transaction.ResultCode(), MetaXDR: metaXDR, LedgerNumber: ledgerSequence, + IsFeeBump: transaction.Envelope.IsFeeBump(), InnerTransactionHash: innerTxHash, }, nil } diff --git a/internal/indexer/processors/utils_test.go b/internal/indexer/processors/utils_test.go index 7d53c8590..74d0fa679 100644 --- a/internal/indexer/processors/utils_test.go +++ b/internal/indexer/processors/utils_test.go @@ -41,10 +41,12 @@ func Test_ConvertTransaction(t *testing.T) { Hash: "64eb94acc50eefc323cea80387fdceefc31466cc3a69eb8d2b312e0b5c3c62f0", ToID: 20929375637504, EnvelopeXDR: &envelopeXDR, - ResultXDR: txResultPairXDRStr, + FeeCharged: 4595918, + ResultCode: "TransactionResultCodeTxFeeBumpInnerSuccess", MetaXDR: &metaXDR, LedgerNumber: 4873, LedgerCreatedAt: time.Date(2025, time.June, 19, 0, 3, 16, 0, time.UTC), + IsFeeBump: true, InnerTransactionHash: "afaef8a1b657ad5d2360cc001eb31b763bfd3430cba20273d49ff44be2a2152e", } assert.Equal(t, wantDataTx, gotDataTx) @@ -70,10 +72,12 @@ func Test_ConvertTransaction_SkipTxEnvelope(t *testing.T) { Hash: "64eb94acc50eefc323cea80387fdceefc31466cc3a69eb8d2b312e0b5c3c62f0", ToID: 20929375637504, EnvelopeXDR: nil, - ResultXDR: txResultPairXDRStr, + FeeCharged: 4595918, + ResultCode: "TransactionResultCodeTxFeeBumpInnerSuccess", MetaXDR: &metaXDR, LedgerNumber: 4873, LedgerCreatedAt: time.Date(2025, time.June, 19, 0, 3, 16, 0, time.UTC), + IsFeeBump: true, InnerTransactionHash: "afaef8a1b657ad5d2360cc001eb31b763bfd3430cba20273d49ff44be2a2152e", } assert.Equal(t, wantDataTx, gotDataTx) diff --git a/internal/indexer/types/types.go b/internal/indexer/types/types.go index 569456060..ad8f7cd74 100644 --- a/internal/indexer/types/types.go +++ b/internal/indexer/types/types.go @@ -136,10 +136,12 @@ type Transaction struct { Hash string `json:"hash,omitempty" db:"hash"` ToID int64 `json:"toId,omitempty" db:"to_id"` EnvelopeXDR *string `json:"envelopeXdr,omitempty" db:"envelope_xdr"` - ResultXDR string `json:"resultXdr,omitempty" db:"result_xdr"` + FeeCharged int64 `json:"feeCharged,omitempty" db:"fee_charged"` + ResultCode string `json:"resultCode,omitempty" db:"result_code"` MetaXDR *string `json:"metaXdr,omitempty" db:"meta_xdr"` LedgerNumber uint32 `json:"ledgerNumber,omitempty" db:"ledger_number"` LedgerCreatedAt time.Time `json:"ledgerCreatedAt,omitempty" db:"ledger_created_at"` + IsFeeBump bool `json:"isFeeBump,omitempty" db:"is_fee_bump"` IngestedAt time.Time `json:"ingestedAt,omitempty" db:"ingested_at"` // Relationships: Operations []Operation `json:"operations,omitempty"` diff --git a/internal/integrationtests/data_validation_test.go b/internal/integrationtests/data_validation_test.go index b209c5aea..74352a567 100644 --- a/internal/integrationtests/data_validation_test.go +++ b/internal/integrationtests/data_validation_test.go @@ -99,12 +99,19 @@ func validateTransactionBase(suite *DataValidationTestSuite, ctx context.Context // Verify transaction fields suite.Require().Equal(txHash, tx.Hash, "transaction hash mismatch") suite.Require().NotEmpty(tx.EnvelopeXdr, "envelope XDR should not be empty") - suite.Require().NotEmpty(tx.ResultXdr, "result XDR should not be empty") + suite.Require().NotZero(tx.FeeCharged, "fee charged should not be zero") + suite.Require().NotEmpty(tx.ResultCode, "result code should not be empty") suite.Require().NotEmpty(tx.MetaXdr, "meta XDR should not be empty") suite.Require().NotZero(tx.LedgerNumber, "ledger number should not be zero") suite.Require().False(tx.LedgerCreatedAt.IsZero(), "ledger created at should not be zero") suite.Require().False(tx.IngestedAt.IsZero(), "ingested at should not be zero") + if tx.IsFeeBump { + suite.Require().Equal("TransactionResultCodeTxFeeBumpInnerSuccess", tx.ResultCode, "result code does not match") + } else { + suite.Require().Equal("TransactionResultCodeTxSuccess", tx.ResultCode, "result code does not match") + } + return tx } diff --git a/internal/serve/graphql/generated/generated.go b/internal/serve/graphql/generated/generated.go index 81b318c9b..5b9ccbf28 100644 --- a/internal/serve/graphql/generated/generated.go +++ b/internal/serve/graphql/generated/generated.go @@ -287,13 +287,15 @@ type ComplexityRoot struct { Transaction struct { Accounts func(childComplexity int) int EnvelopeXDR func(childComplexity int) int + FeeCharged func(childComplexity int) int Hash func(childComplexity int) int IngestedAt func(childComplexity int) int + IsFeeBump func(childComplexity int) int LedgerCreatedAt func(childComplexity int) int LedgerNumber func(childComplexity int) int MetaXDR func(childComplexity int) int Operations func(childComplexity int, first *int32, after *string, last *int32, before *string) int - ResultXDR func(childComplexity int) int + ResultCode func(childComplexity int) int StateChanges func(childComplexity int, first *int32, after *string, last *int32, before *string) int } @@ -1608,6 +1610,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Transaction.EnvelopeXDR(childComplexity), true + case "Transaction.feeCharged": + if e.complexity.Transaction.FeeCharged == nil { + break + } + + return e.complexity.Transaction.FeeCharged(childComplexity), true + case "Transaction.hash": if e.complexity.Transaction.Hash == nil { break @@ -1622,6 +1631,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Transaction.IngestedAt(childComplexity), true + case "Transaction.isFeeBump": + if e.complexity.Transaction.IsFeeBump == nil { + break + } + + return e.complexity.Transaction.IsFeeBump(childComplexity), true + case "Transaction.ledgerCreatedAt": if e.complexity.Transaction.LedgerCreatedAt == nil { break @@ -1655,12 +1671,12 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Transaction.Operations(childComplexity, args["first"].(*int32), args["after"].(*string), args["last"].(*int32), args["before"].(*string)), true - case "Transaction.resultXdr": - if e.complexity.Transaction.ResultXDR == nil { + case "Transaction.resultCode": + if e.complexity.Transaction.ResultCode == nil { break } - return e.complexity.Transaction.ResultXDR(childComplexity), true + return e.complexity.Transaction.ResultCode(childComplexity), true case "Transaction.stateChanges": if e.complexity.Transaction.StateChanges == nil { @@ -2489,10 +2505,12 @@ type BalanceAuthorizationChange implements BaseStateChange{ type Transaction{ hash: String! envelopeXdr: String - resultXdr: String! + feeCharged: Int64! + resultCode: String! metaXdr: String ledgerNumber: UInt32! ledgerCreatedAt: Time! + isFeeBump: Boolean! ingestedAt: Time! # GraphQL Relationships - these fields require resolvers @@ -4280,14 +4298,18 @@ func (ec *executionContext) fieldContext_AccountChange_transaction(_ context.Con return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -4722,14 +4744,18 @@ func (ec *executionContext) fieldContext_BalanceAuthorizationChange_transaction( return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -5554,14 +5580,18 @@ func (ec *executionContext) fieldContext_FlagsChange_transaction(_ context.Conte return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -5999,14 +6029,18 @@ func (ec *executionContext) fieldContext_MetadataChange_transaction(_ context.Co return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -6927,14 +6961,18 @@ func (ec *executionContext) fieldContext_Operation_transaction(_ context.Context return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -7478,14 +7516,18 @@ func (ec *executionContext) fieldContext_Query_transactionByHash(ctx context.Con return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -8542,14 +8584,18 @@ func (ec *executionContext) fieldContext_ReservesChange_transaction(_ context.Co return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -9682,14 +9728,18 @@ func (ec *executionContext) fieldContext_SignerChange_transaction(_ context.Cont return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -10165,14 +10215,18 @@ func (ec *executionContext) fieldContext_SignerThresholdsChange_transaction(_ co return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -10610,14 +10664,18 @@ func (ec *executionContext) fieldContext_StandardBalanceChange_transaction(_ con return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -10992,8 +11050,52 @@ func (ec *executionContext) fieldContext_Transaction_envelopeXdr(_ context.Conte return fc, nil } -func (ec *executionContext) _Transaction_resultXdr(ctx context.Context, field graphql.CollectedField, obj *types.Transaction) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Transaction_resultXdr(ctx, field) +func (ec *executionContext) _Transaction_feeCharged(ctx context.Context, field graphql.CollectedField, obj *types.Transaction) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Transaction_feeCharged(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.FeeCharged, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int64) + fc.Result = res + return ec.marshalNInt642int64(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Transaction_feeCharged(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Transaction", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int64 does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Transaction_resultCode(ctx context.Context, field graphql.CollectedField, obj *types.Transaction) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Transaction_resultCode(ctx, field) if err != nil { return graphql.Null } @@ -11006,7 +11108,7 @@ func (ec *executionContext) _Transaction_resultXdr(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return obj.ResultXDR, nil + return obj.ResultCode, nil }) if err != nil { ec.Error(ctx, err) @@ -11023,7 +11125,7 @@ func (ec *executionContext) _Transaction_resultXdr(ctx context.Context, field gr return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Transaction_resultXdr(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Transaction_resultCode(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Transaction", Field: field, @@ -11165,6 +11267,50 @@ func (ec *executionContext) fieldContext_Transaction_ledgerCreatedAt(_ context.C return fc, nil } +func (ec *executionContext) _Transaction_isFeeBump(ctx context.Context, field graphql.CollectedField, obj *types.Transaction) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Transaction_isFeeBump(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsFeeBump, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Transaction_isFeeBump(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Transaction", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _Transaction_ingestedAt(ctx context.Context, field graphql.CollectedField, obj *types.Transaction) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Transaction_ingestedAt(ctx, field) if err != nil { @@ -11520,14 +11666,18 @@ func (ec *executionContext) fieldContext_TransactionEdge_node(_ context.Context, return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -12493,14 +12643,18 @@ func (ec *executionContext) fieldContext_TrustlineChange_transaction(_ context.C return ec.fieldContext_Transaction_hash(ctx, field) case "envelopeXdr": return ec.fieldContext_Transaction_envelopeXdr(ctx, field) - case "resultXdr": - return ec.fieldContext_Transaction_resultXdr(ctx, field) + case "feeCharged": + return ec.fieldContext_Transaction_feeCharged(ctx, field) + case "resultCode": + return ec.fieldContext_Transaction_resultCode(ctx, field) case "metaXdr": return ec.fieldContext_Transaction_metaXdr(ctx, field) case "ledgerNumber": return ec.fieldContext_Transaction_ledgerNumber(ctx, field) case "ledgerCreatedAt": return ec.fieldContext_Transaction_ledgerCreatedAt(ctx, field) + case "isFeeBump": + return ec.fieldContext_Transaction_isFeeBump(ctx, field) case "ingestedAt": return ec.fieldContext_Transaction_ingestedAt(ctx, field) case "operations": @@ -18494,8 +18648,13 @@ func (ec *executionContext) _Transaction(ctx context.Context, sel ast.SelectionS } case "envelopeXdr": out.Values[i] = ec._Transaction_envelopeXdr(ctx, field, obj) - case "resultXdr": - out.Values[i] = ec._Transaction_resultXdr(ctx, field, obj) + case "feeCharged": + out.Values[i] = ec._Transaction_feeCharged(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "resultCode": + out.Values[i] = ec._Transaction_resultCode(ctx, field, obj) if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } @@ -18511,6 +18670,11 @@ func (ec *executionContext) _Transaction(ctx context.Context, sel ast.SelectionS if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } + case "isFeeBump": + out.Values[i] = ec._Transaction_isFeeBump(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } case "ingestedAt": out.Values[i] = ec._Transaction_ingestedAt(ctx, field, obj) if out.Values[i] == graphql.Null { diff --git a/internal/serve/graphql/resolvers/queries_resolvers_test.go b/internal/serve/graphql/resolvers/queries_resolvers_test.go index 9fa4d4a5f..d3fad1d23 100644 --- a/internal/serve/graphql/resolvers/queries_resolvers_test.go +++ b/internal/serve/graphql/resolvers/queries_resolvers_test.go @@ -32,7 +32,7 @@ func TestQueryResolver_TransactionByHash(t *testing.T) { } t.Run("success", func(t *testing.T) { - ctx := getTestCtx("transactions", []string{"hash", "toId", "envelopeXdr", "resultXdr", "metaXdr", "ledgerNumber", "ledgerCreatedAt"}) + ctx := getTestCtx("transactions", []string{"hash", "toId", "envelopeXdr", "feeCharged", "resultCode", "metaXdr", "ledgerNumber", "ledgerCreatedAt", "isFeeBump"}) tx, err := resolver.TransactionByHash(ctx, "tx1") require.NoError(t, err) @@ -40,7 +40,8 @@ func TestQueryResolver_TransactionByHash(t *testing.T) { assert.Equal(t, toid.New(1000, 1, 0).ToInt64(), tx.ToID) require.NotNil(t, tx.EnvelopeXDR) assert.Equal(t, "envelope1", *tx.EnvelopeXDR) - assert.Equal(t, "result1", tx.ResultXDR) + assert.Equal(t, int64(100), tx.FeeCharged) + assert.Equal(t, "TransactionResultCodeTxSuccess", tx.ResultCode) require.NotNil(t, tx.MetaXDR) assert.Equal(t, "meta1", *tx.MetaXDR) assert.Equal(t, uint32(1), tx.LedgerNumber) diff --git a/internal/serve/graphql/resolvers/test_utils.go b/internal/serve/graphql/resolvers/test_utils.go index 61cd2f966..54a8a329e 100644 --- a/internal/serve/graphql/resolvers/test_utils.go +++ b/internal/serve/graphql/resolvers/test_utils.go @@ -57,10 +57,12 @@ func setupDB(ctx context.Context, t *testing.T, dbConnectionPool db.ConnectionPo Hash: fmt.Sprintf("tx%d", i+1), ToID: toid.New(testLedger, int32(i+1), 0).ToInt64(), EnvelopeXDR: ptr(fmt.Sprintf("envelope%d", i+1)), - ResultXDR: fmt.Sprintf("result%d", i+1), + FeeCharged: int64(100 * (i + 1)), + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: ptr(fmt.Sprintf("meta%d", i+1)), LedgerNumber: 1, LedgerCreatedAt: time.Now(), + IsFeeBump: false, } txns = append(txns, txn) @@ -130,8 +132,8 @@ func setupDB(ctx context.Context, t *testing.T, dbConnectionPool db.ConnectionPo for _, txn := range txns { _, err = tx.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) VALUES ($1, $2, $3, $4, $5, $6, $7)`, - txn.Hash, txn.ToID, txn.EnvelopeXDR, txn.ResultXDR, txn.MetaXDR, txn.LedgerNumber, txn.LedgerCreatedAt) + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at, is_fee_bump) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, + txn.Hash, txn.ToID, txn.EnvelopeXDR, txn.FeeCharged, txn.ResultCode, txn.MetaXDR, txn.LedgerNumber, txn.LedgerCreatedAt, txn.IsFeeBump) require.NoError(t, err) _, err = tx.ExecContext(ctx, diff --git a/internal/serve/graphql/schema/transaction.graphqls b/internal/serve/graphql/schema/transaction.graphqls index 708332442..6a2bd4585 100644 --- a/internal/serve/graphql/schema/transaction.graphqls +++ b/internal/serve/graphql/schema/transaction.graphqls @@ -3,10 +3,12 @@ type Transaction{ hash: String! envelopeXdr: String - resultXdr: String! + feeCharged: Int64! + resultCode: String! metaXdr: String ledgerNumber: UInt32! ledgerCreatedAt: Time! + isFeeBump: Boolean! ingestedAt: Time! # GraphQL Relationships - these fields require resolvers diff --git a/internal/services/ingest_test.go b/internal/services/ingest_test.go index a6066518d..28f6d9db8 100644 --- a/internal/services/ingest_test.go +++ b/internal/services/ingest_test.go @@ -213,8 +213,8 @@ func Test_ingestService_calculateBackfillGaps(t *testing.T) { // Insert transactions for 100-200 (no gaps) for ledger := uint32(100); ledger <= 200; ledger++ { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, "hash"+string(rune(ledger)), ledger, ledger) require.NoError(t, err) } @@ -236,8 +236,8 @@ func Test_ingestService_calculateBackfillGaps(t *testing.T) { // Insert transactions for 100-200 (no gaps) for ledger := uint32(100); ledger <= 200; ledger++ { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, "hash"+string(rune(ledger)), ledger, ledger) require.NoError(t, err) } @@ -257,15 +257,15 @@ func Test_ingestService_calculateBackfillGaps(t *testing.T) { // Insert transactions with gaps: 100-120, 150-200 (gap at 121-149) for ledger := uint32(100); ledger <= 120; ledger++ { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, "hash"+string(rune(ledger)), ledger, ledger) require.NoError(t, err) } for ledger := uint32(150); ledger <= 200; ledger++ { _, err := dbConnectionPool.ExecContext(ctx, - `INSERT INTO transactions (hash, to_id, envelope_xdr, result_xdr, meta_xdr, ledger_number, ledger_created_at) - VALUES ($1, $2, 'env', 'res', 'meta', $3, NOW())`, + `INSERT INTO transactions (hash, to_id, envelope_xdr, fee_charged, result_code, meta_xdr, ledger_number, ledger_created_at) + VALUES ($1, $2, 'env', 100, 'TransactionResultCodeTxSuccess', 'meta', $3, NOW())`, "hash"+string(rune(ledger)), ledger, ledger) require.NoError(t, err) } @@ -499,7 +499,8 @@ func createTestTransaction(hash string, toID int64) types.Transaction { Hash: hash, ToID: toID, EnvelopeXDR: &envelope, - ResultXDR: "test_result_xdr", + FeeCharged: 100, + ResultCode: "TransactionResultCodeTxSuccess", MetaXDR: &meta, LedgerNumber: 1000, LedgerCreatedAt: now, diff --git a/pkg/wbclient/queries.go b/pkg/wbclient/queries.go index 4ed5f9a27..ae7962958 100644 --- a/pkg/wbclient/queries.go +++ b/pkg/wbclient/queries.go @@ -13,10 +13,12 @@ const ( defaultTransactionFields = ` hash envelopeXdr - resultXdr + resultCode + feeCharged metaXdr ledgerNumber ledgerCreatedAt + isFeeBump ingestedAt ` diff --git a/pkg/wbclient/types/types.go b/pkg/wbclient/types/types.go index a9be46093..dee2a5d0e 100644 --- a/pkg/wbclient/types/types.go +++ b/pkg/wbclient/types/types.go @@ -264,10 +264,12 @@ type Transaction struct { type GraphQLTransaction struct { Hash string `json:"hash"` EnvelopeXdr *string `json:"envelopeXdr"` - ResultXdr string `json:"resultXdr"` + FeeCharged int64 `json:"feeCharged"` + ResultCode string `json:"resultCode"` MetaXdr *string `json:"metaXdr,omitempty"` LedgerNumber uint32 `json:"ledgerNumber"` LedgerCreatedAt time.Time `json:"ledgerCreatedAt"` + IsFeeBump bool `json:"isFeeBump"` IngestedAt time.Time `json:"ingestedAt"` }