Wallet system (sats ledger + deposit + spend), HydraProxy fulfillment queue, paid IP-quality scorer (85/100 verified)
This commit is contained in:
55
db.py
55
db.py
@@ -73,6 +73,29 @@ CREATE TABLE IF NOT EXISTS rate_limits (
|
||||
ip TEXT,
|
||||
ts REAL
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS transactions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER,
|
||||
amount_sats INTEGER, -- positive = deposit/credit, negative = spend
|
||||
type TEXT, -- deposit / gb / dedicated / hydraproxy / quality / admin_credit
|
||||
ref TEXT,
|
||||
ts INTEGER
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS hydraproxy_orders (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER,
|
||||
product TEXT, -- residential / mobile / static
|
||||
location TEXT,
|
||||
price_sats INTEGER,
|
||||
status TEXT DEFAULT 'pending_fulfillment', -- pending_fulfillment/active/failed/refunded
|
||||
hydra_order_id TEXT,
|
||||
proxy_host TEXT,
|
||||
proxy_port TEXT,
|
||||
proxy_user TEXT,
|
||||
proxy_pass TEXT,
|
||||
created_at INTEGER,
|
||||
fulfilled_at INTEGER
|
||||
);
|
||||
"""
|
||||
|
||||
|
||||
@@ -85,6 +108,10 @@ def get_db():
|
||||
def init_db():
|
||||
db = get_db()
|
||||
db.executescript(SCHEMA)
|
||||
# migrate: add wallet column if missing (older DBs)
|
||||
cols = [r[1] for r in db.execute("PRAGMA table_info(users)")]
|
||||
if "balance_sats" not in cols:
|
||||
db.execute("ALTER TABLE users ADD COLUMN balance_sats INTEGER DEFAULT 0")
|
||||
# seed default plans if empty
|
||||
cur = db.execute("SELECT COUNT(*) c FROM plans")
|
||||
if cur.fetchone()["c"] == 0:
|
||||
@@ -142,3 +169,31 @@ def add_usage(user_id, nbytes):
|
||||
|
||||
def random_token(n=24):
|
||||
return base64.urlsafe_b64encode(os.urandom(n)).decode().rstrip("=")
|
||||
|
||||
|
||||
# ---------- wallet ----------
|
||||
def add_transaction(user_id, amount_sats, type_, ref=""):
|
||||
"""Record a ledger entry AND atomically adjust the user's sats balance."""
|
||||
db = get_db()
|
||||
db.execute("INSERT INTO transactions (user_id, amount_sats, type, ref, ts) "
|
||||
"VALUES (?,?,?,?,?)", (user_id, amount_sats, type_, ref, int(time.time())))
|
||||
db.execute("UPDATE users SET balance_sats = balance_sats + ? WHERE id=?",
|
||||
(amount_sats, user_id))
|
||||
db.commit()
|
||||
db.close()
|
||||
|
||||
|
||||
def get_balance_sats(user_id):
|
||||
db = get_db()
|
||||
r = db.execute("SELECT balance_sats FROM users WHERE id=?", (user_id,)).fetchone()
|
||||
db.close()
|
||||
return r["balance_sats"] if r else 0
|
||||
|
||||
|
||||
def get_transactions(user_id, limit=50):
|
||||
db = get_db()
|
||||
rows = [dict(r) for r in db.execute(
|
||||
"SELECT * FROM transactions WHERE user_id=? ORDER BY id DESC LIMIT ?",
|
||||
(user_id, limit))]
|
||||
db.close()
|
||||
return rows
|
||||
|
||||
Reference in New Issue
Block a user