dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

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:
Mpkg/actions/actions.go | 119++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mpkg/database/database.go | 3++-
Mpkg/database/tablePokerXmrTransactions.go | 13+++++++++++--
Mpkg/web/public/views/pages/poker.gohtml | 4++--
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>