Add balance monitor, low-balance admin banner, dry-run auto-topup (sweep) framework
This commit is contained in:
52
sweep.py
Normal file
52
sweep.py
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Auto-top-up (sweep): send BTC to IPRoyal when reseller balance is low.
|
||||
|
||||
SAFETY: DRY-RUN by default — prints what it *would* do, never moves money.
|
||||
To go live you must:
|
||||
1. set sweep.iproyal_btc_address in config.json (IPRoyal's BTC deposit address),
|
||||
2. wire the send() function to your source wallet (BTCPay hot wallet / Alby),
|
||||
3. pass --live, with a hard cap via --cap-sats.
|
||||
"""
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
import iproyal
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--live", action="store_true", help="actually send (default: dry-run)")
|
||||
ap.add_argument("--cap-sats", type=int, default=0, help="hard cap on sats to send")
|
||||
args = ap.parse_args()
|
||||
|
||||
cfg = iproyal.CFG.get("sweep", {})
|
||||
threshold = iproyal.CFG.get("alerts", {}).get("low_balance_threshold", 10.0)
|
||||
max_sats = args.cap_sats or int(cfg.get("max_sats", 100000))
|
||||
dest = cfg.get("iproyal_btc_address", "")
|
||||
|
||||
try:
|
||||
bal = iproyal.get_balance()
|
||||
except Exception as e:
|
||||
print(f"balance check failed: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
if bal >= threshold:
|
||||
print(f"balance ${bal} >= threshold ${threshold} — no top-up needed")
|
||||
return
|
||||
|
||||
if not dest:
|
||||
print("NO destination set (sweep.iproyal_btc_address). "
|
||||
"Set it in config.json before going live.")
|
||||
return
|
||||
|
||||
if args.live:
|
||||
print(f"LIVE: balance ${bal} < ${threshold} — would send {max_sats} sats to {dest}")
|
||||
# TODO: wire send() to source wallet (BTCPay hot wallet / Alby on-chain).
|
||||
# Hard cap enforced here: never exceed max_sats.
|
||||
print("WARNING: send() not yet wired — this is a no-op placeholder.")
|
||||
else:
|
||||
print(f"DRY-RUN: balance ${bal} < ${threshold} — would top up {max_sats} sats to {dest}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user