commit 740826a0e93b968304801b6f15cbb3e5abca841f
parent 181955800fd96a1469f75a9dd0b2a61ad1a50e31
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Sun, 17 Dec 2023 22:13:36 -0500
rotate user deposit address after a transfer is created
Diffstat:
4 files changed, 76 insertions(+), 63 deletions(-)
diff --git a/pkg/actions/actions.go b/pkg/actions/actions.go
@@ -230,70 +230,73 @@ func xmrWatch(db *database.DkfDB) {
continue
}
for _, transfer := range transfers.In {
- if user, err := db.GetUserByPokerXmrSubAddress(transfer.Address); err == nil {
- userID := user.ID
- pokerTransfer, err := db.GetPokerXmrTransaction(transfer)
- if err != nil {
- db.WithE(func(tx *database.DkfDB) error {
- pokerTransfer, err = tx.CreatePokerXmrInTransaction(userID, transfer)
- if err != nil {
- return err
- }
- // Update user's xmr deposit address
- res, err := config.Xmr().CreateAddress(&wallet1.RequestCreateAddress{})
- if err != nil {
- return err
- }
- if err := tx.SetPokerSubAddress(userID, res.Address); err != nil {
- return err
- }
- return nil
- })
- }
- if pokerTransfer.Processed {
- continue
- }
- pokerTransfer.Confirmations = utils.MinInt(transfer.Confirmations, 10)
- pokerTransfer.DoSave(db)
- if transfer.Confirmations < 10 {
- continue
- }
-
- dutils.RootAdminNotify(db, fmt.Sprintf("new deposit %s xmr by %s", pokerTransfer.Amount.XmrStr(), user.Username))
-
- tx := db.Begin()
- if err := user.IncrXmrBalance(tx, pokerTransfer.Amount); err != nil {
- logrus.Error(err)
- }
- pokerTransfer.Processed = true
- pokerTransfer.DoSave(tx)
- tx.Commit()
+ if processPokerTransfer(db, transfer) {
continue
- } else {
- continue
- //invoice, err := db.GetXmrInvoiceByAddress(transfer.Address)
- //if err != nil {
- // logrus.Error(err, transfer.TxID)
- // continue
- //}
- //origConfirmations := invoice.Confirmations
- //invoice.Confirmations = int64(transfer.Confirmations)
- //amount := int64(transfer.Amount)
- //invoice.AmountReceived = &amount
- //invoice.DoSave(db)
- //if origConfirmations >= 10 {
- // continue
- //} else if transfer.Confirmations < 10 {
- // logrus.Error("payment processing")
- // continue
- //}
- //logrus.Error("payment done")
- //// TODO: execute something
}
}
}
}
+func processPokerTransfer(db *database.DkfDB, transfer *wallet1.Transfer) (found bool) {
+ var user database.User
+ pokerTransfer, err := db.GetPokerXmrTransaction(transfer.TxID)
+ if err != nil {
+ user, err = db.GetUserByPokerXmrSubAddress(transfer.Address)
+ if err != nil {
+ return false // Not a poker deposit address
+ }
+
+ // Create a new transaction and rotate user deposit address
+ if txErr := db.WithE(func(tx *database.DkfDB) error {
+ userID := user.ID
+ pokerTransfer, err = tx.CreatePokerXmrInTransaction(userID, transfer)
+ if err != nil {
+ return err
+ }
+ // Update user's xmr deposit address
+ res, err := config.Xmr().CreateAddress(&wallet1.RequestCreateAddress{})
+ if err != nil {
+ return err
+ }
+ if err := tx.SetPokerSubAddress(userID, res.Address); err != nil {
+ return err
+ }
+ return nil
+ }); txErr != nil {
+ logrus.Error(txErr)
+ return true
+ }
+ } else {
+ if pokerTransfer.Processed {
+ return true
+ }
+ user, _ = db.GetUserByID(pokerTransfer.UserID)
+ }
+
+ pokerTransfer.Confirmations = utils.MinInt(transfer.Confirmations, pokerTransfer.ConfirmationsNeeded())
+ pokerTransfer.DoSave(db)
+
+ if !pokerTransfer.HasEnoughConfirmations() {
+ return true
+ }
+
+ // Increment user's xmr balance, and update transfer status
+ if txErr := db.WithE(func(tx *database.DkfDB) error {
+ if err := user.IncrXmrBalance(tx, pokerTransfer.Amount); err != nil {
+ return err
+ }
+ pokerTransfer.Processed = true
+ pokerTransfer.DoSave(tx)
+ return nil
+ }); txErr != nil {
+ logrus.Error(err)
+ return true
+ }
+
+ dutils.RootAdminNotify(db, fmt.Sprintf("new deposit %s xmr by %s", pokerTransfer.Amount.XmrStr(), user.Username))
+ return true
+}
+
func cleanupDatabase(db *database.DkfDB) {
var once utils.Once
for {
diff --git a/pkg/database/database.go b/pkg/database/database.go
@@ -343,7 +343,7 @@ func (d *DkfDB) With(clb func(tx *DkfDB)) {
})
}
-func (d *DkfDB) WithE(clb func(tx *DkfDB) error) {
+func (d *DkfDB) WithE(clb func(tx *DkfDB) error) error {
tx := d.Begin()
err := clb(tx)
if err != nil {
@@ -351,6 +351,7 @@ func (d *DkfDB) WithE(clb func(tx *DkfDB) error) {
} else {
tx.Commit()
}
+ return err
}
func (d *DkfDB) Begin() *DkfDB {
diff --git a/pkg/database/tablePokerXmrTransactions.go b/pkg/database/tablePokerXmrTransactions.go
@@ -1,6 +1,7 @@
package database
import (
+ "dkforest/pkg/utils"
"github.com/monero-ecosystem/go-monero-rpc-client/wallet"
"github.com/sirupsen/logrus"
"time"
@@ -22,6 +23,14 @@ type PokerXmrTransaction struct {
User User
}
+func (t *PokerXmrTransaction) HasEnoughConfirmations() bool {
+ return t.Confirmations >= t.ConfirmationsNeeded()
+}
+
+func (t *PokerXmrTransaction) ConfirmationsNeeded() uint64 {
+ return utils.Ternary(t.Amount.ToPokerChip() < 20000, uint64(2), 10)
+}
+
func (d *DkfDB) GetPokerXmrTransactionsSumIn() (out Piconero, err error) {
var tmp struct{ Amount Piconero }
err = d.db.Raw(`SELECT SUM(amount) AS amount FROM poker_xmr_transactions WHERE is_in = 1 AND confirmations >= 10`).Scan(&tmp).Error
@@ -44,8 +53,8 @@ func (d *DkfDB) GetUserPokerXmrTransactions(userID UserID) (out []PokerXmrTransa
return
}
-func (d *DkfDB) GetPokerXmrTransaction(transfer *wallet.Transfer) (out PokerXmrTransaction, err error) {
- err = d.db.First(&out, "tx_id = ?", transfer.TxID).Error
+func (d *DkfDB) GetPokerXmrTransaction(txID string) (out PokerXmrTransaction, err error) {
+ err = d.db.First(&out, "tx_id = ?", txID).Error
return
}
diff --git a/pkg/web/public/views/pages/poker.gohtml b/pkg/web/public/views/pages/poker.gohtml
@@ -1,7 +1,7 @@
{{ define "title" }}dkf - poker{{ end }}
{{ define "content" }}
- <div class="container">
+ <div class="container mb-5">
<div class="mb-3">
Deposit xmr address:
{{ if .Data.PokerXmrSubAddress }}<pre style="user-select: all; -webkit-user-select: all; color: #eaac45;">{{ .Data.PokerXmrSubAddress }}</pre>{{ else }}none{{ end }}
@@ -98,7 +98,7 @@
{{ range .Data.Transactions }}
<tr>
<td style="font-family: monospace;">{{ .Amount.XmrStr }}</td>
- <td>{{ if .IsIn }}{{ .Confirmations }}/10{{ else }}-{{ end }}</td>
+ <td>{{ if .IsIn }}{{ .Confirmations }}/{{ .ConfirmationsNeeded }}{{ else }}-{{ end }}</td>
<td>{{ if .IsIn }}IN{{ else }}OUT{{ end }}</td>
<td>{{ .CreatedAt.Format "Jan 02, 2006 15:04:05" }}</td>
</tr>