1 Commits

Author SHA1 Message Date
bfb2b908ab fix: Calculate balance with expired domains
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 1m14s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 1m24s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 1m35s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 27s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 30s
2025-09-15 11:41:19 +10:00
4 changed files with 32 additions and 61 deletions

Binary file not shown.

View File

@@ -45,9 +45,7 @@ if HSD_INTERNAL_NODE:
HSD_API = "firewallet-" + str(int(time.time()))
HSD_IP = "localhost"
SHOW_EXPIRED = os.getenv("SHOW_EXPIRED")
if SHOW_EXPIRED is None:
SHOW_EXPIRED = False
SHOW_EXPIRED = os.getenv("SHOW_EXPIRED","false").lower() in ["1","true","yes"]
HSD_PROCESS = None
SPV_MODE = None
@@ -119,8 +117,6 @@ def check_account(cookie: str | None):
return False
account = cookie.split(":")[0]
if len(account) < 1:
return False
# Check if the account is valid
info = hsw.getAccountInfo(account, 'default')
if 'error' in info:
@@ -368,7 +364,7 @@ def getBalance(account: str):
available = available / 1000000
logger.debug(f"Initial balance for account {account}: total={total}, available={available}, locked={locked}")
domains = getDomains(account)
domains = getDomains(account,True,True)
domainValue = 0
domains_to_update = [] # Track domains that need cache updates
@@ -475,14 +471,14 @@ def getPendingTX(account: str):
return pending
def getDomains(account, own=True):
def getDomains(account, own: bool = True, expired: bool = SHOW_EXPIRED):
if own:
response = requests.get(get_wallet_api_url(f"/wallet/{account}/name?own=true"))
else:
response = requests.get(get_wallet_api_url(f"/wallet/{account}/name"))
info = response.json()
if SHOW_EXPIRED:
if expired:
return info
# Remove any expired domains
@@ -929,14 +925,11 @@ def getNodeSync():
return sync
def getWalletStatus(verbose: bool = False):
def getWalletStatus():
response = hsw.rpc_getWalletInfo()
if 'error' in response and response['error'] is not None:
return "Error"
if verbose:
return response.get('result', {})
# return response
walletHeight = response['result']['height']
# Get the current block height
@@ -1576,12 +1569,6 @@ def getMempoolBids():
def rescan():
try:
response = hsw.walletRescan(0)
if 'success' in response and response['success'] is False:
return {
"error": {
"message": "Rescan already in progress"
}
}
return response
except Exception as e:
return {

62
main.py
View File

@@ -1607,7 +1607,14 @@ def plugin_function(ptype,plugin,function):
#region API Routes
@app.route('/api/v1/hsd/<function>', methods=["GET"])
def api_hsd(function):
# Check if the user is logged in
if request.cookies.get("account") is None:
return jsonify({"error": "Not logged in"})
account = account_module.check_account(request.cookies.get("account"))
if not account:
return jsonify({"error": "Invalid account"})
if function == "sync":
return jsonify({"result": account_module.getNodeSync()})
if function == "version":
@@ -1616,22 +1623,8 @@ def api_hsd(function):
return jsonify({"result": account_module.getBlockHeight()})
if function == "mempool":
return jsonify({"result": account_module.getMempoolTxs()})
# Check if the user is logged in for all other functions
account = None
if request.cookies.get("account") is not None:
account = account_module.check_account(request.cookies.get("account"))
# Allow login using http basic auth
if account is None and request.authorization is not None:
account = account_module.check_account(f"{request.authorization.username}:{request.authorization.password}")
if not account:
return jsonify({"error": "Not logged in"})
if function == "mempoolBids": # This is a heavy function so only allow for logged in users
if function == "mempoolBids":
return jsonify({"result": account_module.getMempoolBids()})
if function == "nextAuctionState":
# Get the domain from the query parameters
domain = request.args.get('domain')
@@ -1715,30 +1708,21 @@ def api_hsd_mobile(function):
@app.route('/api/v1/wallet/<function>', methods=["GET"])
def api_wallet(function):
if function == "sync":
# Check if arg verbose is set
verbose = request.args.get('verbose', 'false').lower() == 'true'
return jsonify({"result": account_module.getWalletStatus(verbose)})
# Check if the user is logged in for all other functions
account = None
password = None
if request.cookies.get("account") is not None:
account = account_module.check_account(request.cookies.get("account"))
password = request.cookies.get("account","").split(":")[1]
# Allow login using http basic auth
if account is None and request.authorization is not None:
account = account_module.check_account(f"{request.authorization.username}:{request.authorization.password}")
password = request.authorization.password
if not account:
# Check if the user is logged in
if request.cookies.get("account") is None:
return jsonify({"error": "Not logged in"})
if function == "balance":
return jsonify({"result": account_module.getBalance(account)})
account = account_module.check_account(request.cookies.get("account"))
if not account:
return jsonify({"error": "Invalid account"})
password = request.cookies.get("account","").split(":")[1]
if not account:
return jsonify({"error": "Invalid account"})
if function == "sync":
return jsonify({"result": account_module.getWalletStatus()})
if function == "available":
return jsonify({"result": account_module.getBalance(account)['available']})
if function == "total":
@@ -2037,8 +2021,8 @@ def get_alerts(account:str) -> list:
wallet_status = account_module.getWalletStatus()
if wallet_status != "Ready":
alerts.append({
"name": "Wallet Not Synced",
"output": "Please wait for it to sync."
"name": "Wallet",
"output": f"The wallet is not synced ({wallet_status}). Please wait for it to sync."
})
# Try to read from notifications sqlite database
if os.path.exists("user_data/notifications.db"):

File diff suppressed because one or more lines are too long