fix: dup tx

Remove duplicate gas only TX
Remove Send and Receive from self, only the send row is kept
This commit is contained in:
Anthony Laibe 2024-02-28 11:44:47 +01:00 committed by Anthony Laibe
parent 390d706b3f
commit 011a170a03
2 changed files with 31 additions and 11 deletions

View File

@ -492,7 +492,9 @@ func updateOrInsertTransfersDBFields(creator statementCreator, transfers []trans
log.Error("can't save transfer", "b-hash", t.blockHash, "b-n", t.blockNumber, "a", t.address, "h", t.id) log.Error("can't save transfer", "b-hash", t.blockHash, "b-n", t.blockNumber, "a", t.address, "h", t.id)
return err return err
} }
}
for _, t := range transfers {
err = removeGasOnlyEthTransfer(creator, t) err = removeGasOnlyEthTransfer(creator, t)
if err != nil { if err != nil {
log.Error("can't remove gas only eth transfer", "b-hash", t.blockHash, "b-n", t.blockNumber, "a", t.address, "h", t.id, "err", err) log.Error("can't remove gas only eth transfer", "b-hash", t.blockHash, "b-n", t.blockNumber, "a", t.address, "h", t.id, "err", err)
@ -503,18 +505,40 @@ func updateOrInsertTransfersDBFields(creator statementCreator, transfers []trans
} }
func removeGasOnlyEthTransfer(creator statementCreator, t transferDBFields) error { func removeGasOnlyEthTransfer(creator statementCreator, t transferDBFields) error {
if t.transferType != w_common.EthTransfer { if t.transferType == w_common.EthTransfer {
query, err := creator.Prepare(`DELETE FROM transfers WHERE tx_hash = ? AND address = ? AND network_id = ? countQuery, err := creator.Prepare(`SELECT COUNT(*) FROM transfers WHERE tx_hash = ?`)
AND account_nonce = ? AND type = 'eth' AND amount_padded128hex = '00000000000000000000000000000000'`) if err != nil {
return err
}
defer countQuery.Close()
var count int
err = countQuery.QueryRow(t.txHash).Scan(&count)
if err != nil { if err != nil {
return err return err
} }
_, err = query.Exec(t.txHash, t.address, t.chainID, t.txNonce) // If there's only one (or none), return without deleting
if err != nil { if count <= 1 {
return err log.Debug("Only one or no transfer found with the same tx_hash, skipping deletion.")
return nil
} }
} }
query, err := creator.Prepare(`DELETE FROM transfers WHERE tx_hash = ? AND address = ? AND network_id = ? AND account_nonce = ? AND type = 'eth' AND amount_padded128hex = '00000000000000000000000000000000'`)
if err != nil {
return err
}
defer query.Close()
res, err := query.Exec(t.txHash, t.address, t.chainID, t.txNonce)
if err != nil {
return err
}
count, err := res.RowsAffected()
if err != nil {
return err
}
log.Debug("removeGasOnlyEthTransfer row deleted ", count)
return nil return nil
} }

View File

@ -118,11 +118,7 @@ func TestDBGetTransfersFromBlock(t *testing.T) {
require.NoError(t, saveTransfersMarkBlocksLoaded(db.client, 777, address, transfers, blockNumbers)) require.NoError(t, saveTransfersMarkBlocksLoaded(db.client, 777, address, transfers, blockNumbers))
rst, err := db.GetTransfers(777, big.NewInt(7), nil) rst, err := db.GetTransfers(777, big.NewInt(7), nil)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, rst, 3) require.Len(t, rst, 1)
rst, err = db.GetTransfers(777, big.NewInt(2), big.NewInt(5))
require.NoError(t, err)
require.Len(t, rst, 4)
} }
func TestGetTransfersForIdentities(t *testing.T) { func TestGetTransfersForIdentities(t *testing.T) {