Wallet system (sats ledger + deposit + spend), HydraProxy fulfillment queue, paid IP-quality scorer (85/100 verified)

This commit is contained in:
drjones
2026-09-20 18:51:47 -07:00
parent 16dde93ce2
commit a7d6b98183
8 changed files with 481 additions and 12 deletions

55
db.py
View File

@@ -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