Skip to content

Commit

Permalink
feat: check repetitive transaction (#31)
Browse files Browse the repository at this point in the history
  • Loading branch information
ZigBalthazar authored Apr 7, 2024
1 parent 1bca797 commit b38f4f3
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 1 deletion.
17 changes: 17 additions & 0 deletions database/database.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package database

import (
"errors"

"github.com/PACZone/wrapto/types/order"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
Expand Down Expand Up @@ -97,6 +99,21 @@ func (db *DB) GetOrder(id string) (*Order, error) {
return ord, nil
}

func (db *DB) IsOrderExist(txHash string) (bool, error) {
var ord Order
err := db.Where("tx_hash = ?", txHash).First(&ord).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return false, nil
} else if err != nil {
return false, DBError{
TableName: "Orders",
Reason: err.Error(),
}
}

return true, nil
}

func (db *DB) GetOrderWithLogs(id string) (*Order, error) {
var ord *Order
if err := db.Preload("Logs").First(&ord, "id = ?", id).Error; err != nil {
Expand Down
21 changes: 21 additions & 0 deletions database/database_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/PACZone/wrapto/types/order"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/gorm"
)

func setup(t *testing.T) *database.DB {
Expand Down Expand Up @@ -132,3 +133,23 @@ func TestGetOrderLogs(t *testing.T) {
assert.Equal(t, l.Trace, "traceAbcd")
assert.Equal(t, l.OrderID, ordID)
}

func TestIsOrderExist(t *testing.T) {
db := setup(t)

ord, err := order.NewOrder("aaa", "sendet", "rec", 20e9)
assert.NoError(t, err)

ordID, err := db.AddOrder(ord)
assert.NoError(t, err)

isExist, err := db.IsOrderExist("bbb")
assert.Equal(t, isExist, false)
assert.Error(t, gorm.ErrRecordNotFound, err)

isExist, err = db.IsOrderExist("aaa")
assert.Equal(t, isExist, true)
assert.NoError(t, err)

assert.Equal(t, ord.ID, ordID)
}
10 changes: 10 additions & 0 deletions sides/pactus/listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,16 @@ func (l *Listener) processBlocks() error {
continue
}

isExist, err := l.db.IsOrderExist(txHash)
if err != nil {
return err
}
if isExist {
logger.Warn("error repetitive transaction", "actor", l.bypassName, "txHash", txHash)

continue
}

ord, err := order.NewOrder(txHash, sender, destInfo.Addr, amt)
if err != nil {
logger.Error("error while making new order", "actor", l.bypassName, "err", err,
Expand Down
13 changes: 12 additions & 1 deletion sides/polygon/listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,24 @@ func (l *Listener) processOrder() error {
return nil
}

id := strconv.FormatUint(uint64(l.nextOrderNumber), 10)

isExist, err := l.db.IsOrderExist(id)
if err != nil {
return err
}
if isExist {
logger.Warn("error repetitive transaction", "actor", l.bypassName, "txHash", id)

return nil
}

l.nextOrderNumber++

logger.Info("processing new message on listener", "actor", l.bypassName, "orderNumber", l.nextOrderNumber)

amt, _ := o.Amount.Float64()
sender := o.Sender.Hex()
id := strconv.FormatUint(uint64(l.nextOrderNumber), 10)
ord, err := order.NewOrder(id, sender, o.DestinationAddress, amt)
if err != nil {
dbErr := l.db.UpdateOrderStatus(ord.ID, order.FAILED)
Expand Down

0 comments on commit b38f4f3

Please sign in to comment.