64 Commits

Author SHA1 Message Date
6911e3663c feat: Add mempool bids and dynamic loading
All checks were successful
Build Docker / Build Image (push) Successful in 50s
2025-07-16 18:44:18 +10:00
eda690544d feat: Add js to pull bids and auction state 2025-07-16 18:32:32 +10:00
e67c178ea7 feat: Add initial mempool bids function
All checks were successful
Build Docker / Build Image (push) Successful in 55s
2025-07-16 17:41:32 +10:00
631d558377 tmp: Add debugging for bids
All checks were successful
Build Docker / Build Image (push) Successful in 1m1s
2025-07-16 16:53:14 +10:00
1d5ed059b3 fix: Allow rescan while not in bidding
All checks were successful
Build Docker / Build Image (push) Successful in 3m35s
2025-07-16 16:30:08 +10:00
747ac575fa fix: Auto reset cache if incorrect format
All checks were successful
Build Docker / Build Image (push) Successful in 1m53s
2025-07-14 16:28:50 +10:00
e574933302 feat: Add link on names in tx history
All checks were successful
Build Docker / Build Image (push) Successful in 1m11s
2025-07-12 21:47:14 +10:00
c0f0dc5010 fix: Open tx for bid in new tab 2025-07-12 21:35:04 +10:00
060132bfec Merge pull request 'Update Auctions page to include more info and be easier to read' (#1) from dev into main
All checks were successful
Build Docker / Build Image (push) Successful in 1m10s
Reviewed-on: #1
2025-07-12 15:10:56 +10:00
7bc1fad280 feat: Add bid sorting to auction page and add tx links
All checks were successful
Build Docker / Build Image (push) Successful in 1m16s
2025-07-12 14:13:40 +10:00
63e0b1c2f2 fix: Add new better method of validating domain owner
All checks were successful
Build Docker / Build Image (push) Successful in 1m16s
2025-07-12 13:50:30 +10:00
2fab7b3bc0 feat: Add info on when bidding closes
All checks were successful
Build Docker / Build Image (push) Successful in 1m14s
2025-07-12 13:28:21 +10:00
3fa57cc617 feat: Add time estimates to block times
All checks were successful
Build Docker / Build Image (push) Successful in 1m10s
2025-07-12 12:44:31 +10:00
4c3a738e43 feat: Cleanup urls in account module
All checks were successful
Build Docker / Build Image (push) Successful in 1m12s
2025-07-12 12:25:52 +10:00
988d03b48c fix: Update unknown owner message
All checks were successful
Build Docker / Build Image (push) Successful in 1m10s
Remove logging for DNS rendering
2025-07-12 12:03:36 +10:00
21043fc124 fix: Reveal from auction page crash
All checks were successful
Build Docker / Build Image (push) Successful in 2m41s
Reveal from the auction page had a missing function call
2025-07-12 11:56:22 +10:00
67e5276a13 feat: Cleanup any references to Niami
All checks were successful
Build Docker / Build Image (push) Successful in 2m38s
Niami has closed down so links to it no longer work
2025-07-07 12:43:55 +10:00
0164a9c3f2 fix: Remove Niami API requirement for searching for domains
All checks were successful
Build Docker / Build Image (push) Successful in 2m36s
2025-07-07 12:20:16 +10:00
075e432900 feat: Update values to use HNS logo rather than 'HNS'
All checks were successful
Build Docker / Build Image (push) Successful in 2m43s
2025-06-27 15:12:54 +10:00
e5fcf4500a feat: Add count to batch transactions
All checks were successful
Build Docker / Build Image (push) Successful in 1m6s
2025-06-27 14:53:49 +10:00
01c6b4ffba feat: Add values to single bids
All checks were successful
Build Docker / Build Image (push) Successful in 1m9s
2025-06-27 14:46:37 +10:00
0e7a72a136 feat: Only convert namehash to name via cache to make loading quicker
All checks were successful
Build Docker / Build Image (push) Successful in 1m3s
2025-06-27 14:34:46 +10:00
df09a32280 feat: Simplify tx page
All checks were successful
Build Docker / Build Image (push) Successful in 2m45s
2025-06-27 14:08:01 +10:00
eead0d03cc fix: Disable bid text wrapping
All checks were successful
Build Docker / Build Image (push) Successful in 1m8s
2025-06-26 14:40:29 +10:00
84a48a8580 feat: Simplify bid/blind display
All checks were successful
Build Docker / Build Image (push) Successful in 1m8s
2025-06-26 14:32:11 +10:00
7494b77f32 feat: Update actions page for mobile
All checks were successful
Build Docker / Build Image (push) Successful in 1m3s
2025-06-26 14:05:43 +10:00
a3560c2615 feat: Make transactions page nicer for small screens
All checks were successful
Build Docker / Build Image (push) Successful in 1m12s
2025-06-26 13:52:43 +10:00
520a47bcc1 feat: Hide some duplicate info on mobile
All checks were successful
Build Docker / Build Image (push) Successful in 58s
2025-06-26 13:29:51 +10:00
1d26c8cda1 feat: Remove expiry and price paid on mobile devices
All checks were successful
Build Docker / Build Image (push) Successful in 1m1s
2025-06-26 13:16:40 +10:00
85cf5306b5 feat: Update sync format on small screens 2025-06-26 12:50:41 +10:00
a8c7dbe716 fix: Unify api route
All checks were successful
Build Docker / Build Image (push) Successful in 58s
2025-06-26 12:34:46 +10:00
fe960c0c2b feat: Add js loading of /tx page
All checks were successful
Build Docker / Build Image (push) Successful in 2m44s
2025-06-26 12:25:54 +10:00
1e06605feb fix: remove test logging
All checks were successful
Build Docker / Build Image (push) Successful in 3m36s
2025-06-23 16:32:05 +10:00
0082c0e9ec feat: Finish tx revamp
Some checks failed
Build Docker / Build Image (push) Has been cancelled
2025-06-23 16:31:34 +10:00
5d79a534bf feat: Add some more features to the tx page 2025-06-23 15:50:26 +10:00
47b76cf159 fix: Sorting by price to allow numbers with commas
All checks were successful
Build Docker / Build Image (push) Successful in 1m23s
2025-06-17 15:54:35 +10:00
f966b421e2 Merge branch 'dev'
All checks were successful
Build Docker / Build Image (push) Successful in 44s
2025-05-28 11:51:11 +10:00
e5397e1fe0 fix: Speed up the dev server by only using the default host
All checks were successful
Build Docker / Build Image (push) Successful in 51s
2025-05-28 11:48:59 +10:00
fdffa5bd31 fix: Remove circular depends
All checks were successful
Build Docker / Build Image (push) Successful in 47s
2025-05-24 15:40:03 +10:00
9a8472c5cb feat: Finalize emoji rendering
All checks were successful
Build Docker / Build Image (push) Successful in 48s
2025-05-24 15:31:29 +10:00
43efac30a8 feat: Add emoji rendering to dashboard 2025-05-24 15:20:43 +10:00
a67034de27 fix: DNS save to have work correctly
All checks were successful
Build Docker / Build Image (push) Successful in 1m35s
2025-05-21 11:56:23 +10:00
11699834cf fix: Use correct http code
All checks were successful
Build Docker / Build Image (push) Successful in 49s
2025-05-08 12:59:22 +10:00
17ad73ad8b fix: Update format for failed connection
All checks were successful
Build Docker / Build Image (push) Successful in 53s
2025-05-08 12:56:55 +10:00
8ce0e94e67 feat: Add api route for status
All checks were successful
Build Docker / Build Image (push) Successful in 47s
2025-05-08 12:52:13 +10:00
d42dae3263 fix: Add curl to container
All checks were successful
Build Docker / Build Image (push) Successful in 49s
2025-05-08 12:47:59 +10:00
d92cb7c743 Merge branch 'dev'
All checks were successful
Build Docker / Build Image (push) Successful in 1m17s
Update shakeshift explorer and fix unencrypted wallets
2025-05-08 12:09:53 +10:00
fd1ba1d059 fix: Allow wallet acctions from unencrypted wallets
All checks were successful
Build Docker / Build Image (push) Successful in 1m29s
2025-05-08 12:09:04 +10:00
6bbc294116 fix: Correct link for ShakeShift
All checks were successful
Build Docker / Build Image (push) Successful in 40s
2025-03-12 20:28:54 +11:00
80e380b183 feat: Update hns.cymon.de to ShakeShift
All checks were successful
Build Docker / Build Image (push) Successful in 50s
2025-03-12 20:24:48 +11:00
30f61f1505 feat: Use correct a link
All checks were successful
Build Docker / Build Image (push) Successful in 47s
2025-03-07 15:12:33 +11:00
3bee713b9a Merge branch 'dev'
All checks were successful
Build Docker / Build Image (push) Successful in 44s
2025-03-06 10:59:56 +11:00
7bd59a0fd6 feat: Add link to debug tools
All checks were successful
Build Docker / Build Image (push) Successful in 39s
2025-02-28 13:34:43 +11:00
56016b1f6f fix: Update domain sort to stop buggy sorting
All checks were successful
Build Docker / Build Image (push) Successful in 1m15s
2025-02-28 12:57:29 +11:00
3aff724b81 fix: Version check on settings page
All checks were successful
Build Docker / Build Image (push) Successful in 43s
2025-02-05 14:57:51 +11:00
afc227b5b4 fix: Remove some unnecessary logs
All checks were successful
Build Docker / Build Image (push) Successful in 43s
2025-02-05 14:53:33 +11:00
ab7749ef93 fix: Allow desciption to have HTML in plugin output 2025-02-05 14:39:52 +11:00
a568abeb49 fix: Don't import gunicorn unless specified by args
All checks were successful
Build Docker / Build Image (push) Successful in 45s
2025-02-05 13:51:01 +11:00
4652af3a2d feat: Add new server backend to add windows support
All checks were successful
Build Docker / Build Image (push) Successful in 1m18s
2025-02-05 13:20:09 +11:00
65eedff61c Merge branch 'dev' for v1.3
All checks were successful
Build Docker / Build Image (push) Successful in 45s
2025-02-05 12:04:48 +11:00
9aa061691d fix: Update update to make it clearer
All checks were successful
Build Docker / Build Image (push) Successful in 51s
2025-02-04 18:25:27 +11:00
ce8c773db3 fix: Allow reloading modules without a restart
All checks were successful
Build Docker / Build Image (push) Successful in 53s
2025-02-04 16:59:47 +11:00
461e2cdbe9 Merge branch 'dev'
All checks were successful
Build Docker / Build Image (push) Successful in 38s
2025-02-04 15:35:41 +11:00
12884fe696 feat: Default to debug mode off to stop reloads
All checks were successful
Build Docker / Build Image (push) Successful in 47s
2025-02-04 15:33:56 +11:00
43 changed files with 1506 additions and 711 deletions

2
.gitignore vendored
View File

@@ -14,3 +14,5 @@ plugins/signatures.json
user_data/
customPlugins/
cache/
build/
dist/

View File

@@ -10,7 +10,7 @@ COPY . /app
# Add mount point for data volume
# VOLUME /data
RUN apk add git openssl
RUN apk add git openssl curl
ENTRYPOINT ["python3"]
CMD ["server.py"]

Binary file not shown.

View File

@@ -122,7 +122,7 @@ HSD_IP: HSD IP address
THEME: Theme to use (dark-purple, black)
SHOW_EXPIRED: Show expired domains (true/false)
EXCLUDE: Comma separated list of wallets to exclude from the wallet list (default primary)
EXPLORER_TX: URL for exploring transactions (default https://niami.io/tx/)
EXPLORER_TX: URL for exploring transactions (default https://shakeshift.com/transaction/)
HSD_NETWORK: Network to connect to (main, regtest, simnet)
```

File diff suppressed because it is too large Load Diff

View File

@@ -139,35 +139,6 @@ def resolve_TLSA_with_doh(query_name, doh_url="https://hnsdoh.com/dns-query"):
return tlsa
def niami_info(domain: str):
response = requests.get(f"https://api.niami.io/hsd/{domain}")
if response.status_code != 200:
return False
response = response.json()
if response["data"]["owner_tx_data"] is not None:
output = {
"owner": response["data"]["owner_tx_data"]["address"]
}
else:
output = {
"owner": None
}
if 'dnsData' in response["data"]:
output["dns"] = response["data"]["dnsData"]
else:
output["dns"] = []
transactions = requests.get(f"https://api.niami.io/txs/{domain}")
if transactions.status_code != 200:
return False
transactions = transactions.json()
output["txs"] = transactions["txs"]
return output
def emoji_to_punycode(emoji):
try:
return emoji.encode("idna").decode("ascii")

View File

@@ -2,4 +2,4 @@ HSD_API=123480615465636893475aCwyaae6s45
HSD_IP=localhost
THEME=black
SHOW_EXPIRED=false
EXPLORER_TX=https://niami.io/tx/
EXPLORER_TX=https://shakeshift.com/transaction/

380
main.py
View File

@@ -1,6 +1,7 @@
import io
import json
import random
import sys
from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory,send_file
import os
import dotenv
@@ -15,6 +16,8 @@ import importlib
import plugin as plugins_module
import gitinfo
import datetime
import functools
import time
dotenv.load_dotenv()
@@ -29,6 +32,35 @@ revokeCheck = random.randint(100000,999999)
THEME = os.getenv("THEME")
def blocks_to_time(blocks: int) -> str:
"""
Convert blocks to time in a human-readable format.
Blocks are mined approximately every 10 minutes.
"""
if blocks < 0:
return "Invalid time"
if blocks < 6:
return f"{blocks * 10} mins"
elif blocks < 144:
hours = blocks // 6
minutes = (blocks % 6) * 10
if minutes == 0:
return f"{hours} hrs"
return f"{hours} hrs {minutes} mins"
else:
days = blocks // 144
hours = (blocks % 144) // 6
if hours == 0:
return f"{days} days"
return f"{days} days {hours} hrs"
@app.route('/')
def index():
# Check if the user is logged in
@@ -55,7 +87,7 @@ def index():
commit = info['commit']
if commit != latestVersion(branch):
print("New version available",flush=True)
plugins += render_template('components/dashboard-plugin.html', name='Update', output='New version available')
plugins += render_template('components/dashboard-alert.html', name='Update', output='A new version of FireWallet is available')
return render_template("index.html", account=account, plugins=plugins)
@@ -67,6 +99,10 @@ def reverseDirection(direction: str):
#region Transactions
# Add a cache for transactions with a timeout
tx_cache = {}
TX_CACHE_TIMEOUT = 60*5 # Cache timeout in seconds
@app.route('/tx')
def transactions():
# Check if the user is logged in
@@ -74,7 +110,10 @@ def transactions():
return redirect("/login")
account = account_module.check_account(request.cookies.get("account"))
# Get the transactions
if not account:
return redirect("/logout")
# Get the page parameter
page = request.args.get('page')
try:
page = int(page)
@@ -84,12 +123,9 @@ def transactions():
if page < 1:
page = 1
transactions = account_module.getTransactions(account,page)
txCount = len(transactions)
transactions = render.transactions(transactions)
# Return the template with loading state - transactions will be loaded via AJAX
return render_template("tx.html", account=account,
tx=transactions,
page=page,txCount=txCount)
page=page, txCount=0)
@app.route('/send')
@@ -177,7 +213,15 @@ def sendConfirmed():
address = request.args.get("address")
amount = float(request.args.get("amount"))
response = account_module.send(request.cookies.get("account"),address,amount)
if 'error' in response:
if 'error' in response and response['error'] != None:
# If error is a dict get the message
if isinstance(response['error'], dict):
if 'message' in response['error']:
return redirect("/send?message=" + response['error']['message'] + "&address=" + address + "&amount=" + str(amount))
else:
return redirect("/send?message=" + str(response['error']) + "&address=" + address + "&amount=" + str(amount))
# If error is a string
return redirect("/send?message=" + response['error'] + "&address=" + address + "&amount=" + str(amount))
return redirect("/success?tx=" + response['tx'])
@@ -420,20 +464,21 @@ def search():
if 'error' in domain:
return render_template("search.html", account=account,
rendered=renderDomain(search_term),
search_term=search_term, domain=domain['error'],plugins=plugins)
if domain['info'] is None:
return render_template("search.html", account=account,
rendered=renderDomain(search_term),
search_term=search_term,domain=search_term,
state="AVAILABLE", next="Available Now",plugins=plugins)
state = domain['info']['state']
stats = domain['info']['stats']
if state == 'CLOSED':
if domain['info']['registered']:
state = 'REGISTERED'
expires = domain['info']['stats']['daysUntilExpire']
expires = stats['daysUntilExpire']
next = f"Expires in ~{expires} days"
else:
state = 'AVAILABLE'
@@ -441,23 +486,25 @@ def search():
elif state == "REVOKED":
next = "Available Now"
elif state == 'OPENING':
next = "Bidding opens in ~" + str(domain['info']['stats']['blocksUntilBidding']) + " blocks"
next = f"Bidding opens in {str(stats['blocksUntilBidding'])} blocks (~{blocks_to_time(stats['blocksUntilBidding'])})"
elif state == 'BIDDING':
next = "Reveal in ~" + str(domain['info']['stats']['blocksUntilReveal']) + " blocks"
next = f"Reveal in {str(stats['blocksUntilReveal'])} blocks (~{blocks_to_time(stats['blocksUntilReveal'])})"
elif state == 'REVEAL':
next = "Reveal ends in ~" + str(domain['info']['stats']['blocksUntilClose']) + " blocks"
next = f"Reveal ends in {str(stats['blocksUntilClose'])} blocks (~{blocks_to_time(stats['blocksUntilClose'])})"
domain_info = domainLookup.niami_info(search_term)
domain_info = account_module.getDomain(search_term)
owner = 'Unknown'
dns = []
txs = []
if domain_info:
owner = domain_info['owner']
dns = domain_info['dns']
txs = domain_info['txs']
# Check if info and info.owner
if 'info' in domain_info and 'owner' in domain_info['info']:
owner = account_module.getAddressFromCoin(domain_info['info']['owner']['hash'],domain_info['info']['owner']['index'])
dns = account_module.getDNS(search_term)
own_domains = account_module.getDomains(account)
own_domains = [x['name'] for x in own_domains]
@@ -466,13 +513,12 @@ def search():
owner = "You"
dns = render.dns(dns)
txs = render.txs(txs)
return render_template("search.html", account=account,
rendered=renderDomain(search_term),
search_term=search_term,domain=domain['info']['name'],
raw=domain,state=state, next=next, owner=owner,
dns=dns, txs=txs,plugins=plugins)
dns=dns,plugins=plugins)
@app.route('/manage/<domain>')
def manage(domain: str):
@@ -486,19 +532,19 @@ def manage(domain: str):
domain = domain.lower()
own_domains = account_module.getDomains(account)
own_domains = [x['name'] for x in own_domains]
own_domains = [x.lower() for x in own_domains]
if domain not in own_domains:
if not account_module.isOwnDomain(account, domain):
return redirect("/search?q=" + domain)
domain_info = account_module.getDomain(domain)
if 'error' in domain_info:
return render_template("manage.html", account=account,
rendered=renderDomain(domain),
domain=domain, error=domain_info['error'])
expiry = domain_info['info']['stats']['daysUntilExpire']
if domain_info['info'] is not None and 'stats' in domain_info['info'] and 'daysUntilExpire' in domain_info['info']['stats']:
expiry = domain_info['info']['stats']['daysUntilExpire']
else:
expiry = "Unknown"
dns = account_module.getDNS(domain)
raw_dns = str(dns).replace("'",'"')
dns = render.dns(dns)
@@ -532,7 +578,7 @@ def manage(domain: str):
return render_template("manage.html", account=account,
rendered=renderDomain(domain),
error=errorMessage, address=address,
domain=domain,expiry=expiry, dns=dns,
raw_dns=urllib.parse.quote(raw_dns),
@@ -550,7 +596,6 @@ def finalize(domain: str):
return redirect("/logout")
domain = domain.lower()
print(domain)
response = account_module.finalize(request.cookies.get("account"),domain)
if response['error'] != None:
print(response)
@@ -569,7 +614,6 @@ def cancelTransfer(domain: str):
return redirect("/logout")
domain = domain.lower()
print(domain)
response = account_module.cancelTransfer(request.cookies.get("account"),domain)
if 'error' in response:
if response['error'] != None:
@@ -709,7 +753,7 @@ def editPage(domain: str):
return render_template("edit.html", account=account,
rendered=renderDomain(domain),
domain=domain, error=errorMessage,
dns=dns,raw_dns=urllib.parse.quote(raw_dns))
@@ -855,7 +899,7 @@ def auction(domain):
if 'error' in domainInfo:
return render_template("auction.html", account=account,
rendered=renderDomain(search_term),
search_term=search_term, domain=domainInfo['error'],
error=error)
@@ -866,7 +910,7 @@ def auction(domain):
else:
next_action = f'<a href="/auction/{domain}/open">Open Auction</a>'
return render_template("auction.html", account=account,
rendered=renderDomain(search_term),
search_term=search_term,domain=search_term,next_action=next_action,
state="AVAILABLE", next="Open Auction",
error=error)
@@ -874,20 +918,20 @@ def auction(domain):
state = domainInfo['info']['state']
next_action = ''
bids = account_module.getBids(account,search_term)
if bids == []:
bids = "No bids found"
next_action = f'<a href="/auction/{domain}/scan">Rescan Auction</a>'
else:
reveals = account_module.getReveals(account,search_term)
for reveal in reveals:
# Get TX
revealInfo = account_module.getRevealTX(reveal)
reveal['bid'] = revealInfo
print(revealInfo)
bids = render.bids(bids,reveals)
# bids = account_module.getBids(account,search_term)
bids = []
# if bids == []:
# bids = "No bids found"
# next_action = f'<a href="/auction/{domain}/scan">Rescan Auction</a>'
# else:
# reveals = account_module.getReveals(account,search_term)
# for reveal in reveals:
# # Get TX
# revealInfo = account_module.getRevealTX(reveal)
# reveal['bid'] = revealInfo
# bids = render.bids(bids,reveals)
stats = domainInfo['info']['stats'] if 'stats' in domainInfo['info'] else {}
if state == 'CLOSED':
if not domainInfo['info']['registered']:
if account_module.isOwnDomain(account,domain):
@@ -906,20 +950,27 @@ def auction(domain):
expires = domainInfo['info']['stats']['daysUntilExpire']
next = f"Expires in ~{expires} days"
own_domains = account_module.getDomains(account)
own_domains = [x['name'] for x in own_domains]
own_domains = [x.lower() for x in own_domains]
if search_term in own_domains:
if account_module.isOwnDomain(account,domain):
next_action = f'<a href="/manage/{domain}">Manage</a>'
elif state == "REVOKED":
next = "Available Now"
next_action = f'<a href="/auction/{domain}/open">Open Auction</a>'
elif state == 'OPENING':
next = "Bidding opens in ~" + str(domainInfo['info']['stats']['blocksUntilBidding']) + " blocks"
next = f"Bidding opens in {str(stats['blocksUntilBidding'])} blocks (~{blocks_to_time(stats['blocksUntilBidding'])})"
elif state == 'BIDDING':
next = "Reveal in ~" + str(domainInfo['info']['stats']['blocksUntilReveal']) + " blocks"
next = f"Reveal in {stats['blocksUntilReveal']} blocks (~{blocks_to_time(stats['blocksUntilReveal'])})"
if stats['blocksUntilReveal'] == 1:
next += "<br>Bidding no longer possible"
elif stats['blocksUntilReveal'] == 2:
next += "<br>LAST CHANCE TO BID"
elif stats['blocksUntilReveal'] == 3:
next += f"<br>Next block is last chance to bid"
elif stats['blocksUntilReveal'] < 6:
next += f"<br>Last chance to bid in {stats['blocksUntilReveal']-2} blocks"
elif state == 'REVEAL':
next = "Reveal ends in ~" + str(domainInfo['info']['stats']['blocksUntilClose']) + " blocks"
next = f"Reveal ends in {str(stats['blocksUntilClose'])} blocks (~{blocks_to_time(stats['blocksUntilClose'])})"
next_action = f'<a href="/auction/{domain}/reveal">Reveal All</a>'
message = ''
@@ -928,7 +979,7 @@ def auction(domain):
return render_template("auction.html", account=account,
rendered=renderDomain(search_term),
search_term=search_term,domain=domainInfo['info']['name'],
raw=domainInfo,state=state, next=next,
next_action=next_action, bids=bids,error=message)
@@ -946,7 +997,6 @@ def rescan_auction(domain):
domain = domain.lower()
response = account_module.rescan_auction(account,domain)
print(response)
return redirect("/auction/" + domain)
@app.route('/auction/<domain>/bid')
@@ -1022,7 +1072,7 @@ def bid_confirm(domain):
response = account_module.bid(request.cookies.get("account"),domain,
float(bid),
float(blind))
print(response)
if 'error' in response:
return redirect("/auction/" + domain + "?error=" + response['error']['message'])
@@ -1044,7 +1094,7 @@ def open_auction(domain):
if 'error' in response:
if response['error'] != None:
return redirect("/auction/" + domain + "?error=" + response['error']['message'])
print(response)
return redirect("/success?tx=" + response['hash'])
@app.route('/auction/<domain>/reveal')
@@ -1053,11 +1103,12 @@ def reveal_auction(domain):
if request.cookies.get("account") is None:
return redirect("/login")
if not account_module.check_account(request.cookies.get("account")):
return redirect("/logout")
domain = domain.lower()
response = account_module(request.cookies.get("account"),domain)
response = account_module.revealAuction(request.cookies.get("account"),domain)
if 'error' in response:
return redirect("/auction/" + domain + "?message=" + response['error']['message'])
return redirect("/success?tx=" + response['hash'])
@@ -1111,8 +1162,7 @@ def settings():
# import to time from format "2024-02-13 11:24:03"
last_commit = datetime.datetime.strptime(last_commit, "%Y-%m-%d %H:%M:%S")
version = f'{last_commit.strftime("%y-%m-%d")} {branch}'
if info['commit'] != latestVersion(branch):
if info['commit'] != latestVersion(info['refs']):
version += ' (New version available)'
return render_template("settings.html", account=account,
hsd_version=account_module.hsdVersion(False),
@@ -1220,7 +1270,6 @@ def login_post():
wallets = account_module.listWallets()
wallets = render.wallets(wallets)
return render_template("login.html",
error="Invalid account",wallets=wallets)
account = account + ":" + password
@@ -1474,7 +1523,6 @@ def plugin_function(ptype,plugin,function):
return render_template("plugin-output.html", account=account,name=data['name'],
description=data['description'],output=response)
else:
return jsonify({"error": "Function not found"})
@@ -1497,9 +1545,92 @@ def api_hsd(function):
return jsonify({"result": account_module.hsdVersion(False)})
if function == "height":
return jsonify({"result": account_module.getBlockHeight()})
if function == "mempool":
return jsonify({"result": account_module.getMempoolTxs()})
if function == "mempoolBids":
return jsonify({"result": account_module.getMempoolBids()})
if function == "nextAuctionState":
# Get the domain from the query parameters
domain = request.args.get('domain')
if not domain:
return jsonify({"error": "No domain specified"}), 400
domainInfo = account_module.getDomain(domain)
if 'error' in domainInfo and domainInfo['error'] != None:
return jsonify({"error": domainInfo['error']}), 400
stats = domainInfo['info']['stats'] if 'stats' in domainInfo['info'] else {}
state = domainInfo['info']['state']
next_action = ""
if state == 'CLOSED':
if not domainInfo['info']['registered']:
if account_module.isOwnDomain(account,domain):
print("Waiting to be registered")
state = 'PENDING REGISTER'
next = "Pending Register"
next_action = f'<a href="/auction/{domain}/register">Register Domain</a>'
else:
print("Not registered")
state = 'AVAILABLE'
next = "Available Now"
next_action = f'<a href="/auction/{domain}/open">Open Auction</a>'
else:
state = 'REGISTERED'
expires = domainInfo['info']['stats']['daysUntilExpire']
next = f"Expires in ~{expires} days"
elif state == "REVOKED":
next = "Available Now"
next_action = f'<a href="/auction/{domain}/open">Open Auction</a>'
elif state == 'OPENING':
next = f"Bidding opens in {str(stats['blocksUntilBidding'])} blocks (~{blocks_to_time(stats['blocksUntilBidding'])})"
elif state == 'BIDDING':
next = f"Reveal in {stats['blocksUntilReveal']} blocks (~{blocks_to_time(stats['blocksUntilReveal'])})"
if stats['blocksUntilReveal'] == 1:
next += "<br>Bidding no longer possible"
elif stats['blocksUntilReveal'] == 2:
next += "<br>LAST CHANCE TO BID"
elif stats['blocksUntilReveal'] == 3:
next += f"<br>Next block is last chance to bid"
elif stats['blocksUntilReveal'] < 6:
next += f"<br>Last chance to bid in {stats['blocksUntilReveal']-2} blocks"
elif state == 'REVEAL':
next = f"Reveal ends in {str(stats['blocksUntilClose'])} blocks (~{blocks_to_time(stats['blocksUntilClose'])})"
next_action = f'<a href="/auction/{domain}/reveal">Reveal All</a>'
return jsonify({
"state": state,
"next": next,
"next_action": next_action
})
return jsonify({"error": "Invalid function", "result": "Invalid function"}), 400
@app.route('/api/v1/hsd/<function>/mobile', methods=["GET"])
def api_hsd_mobile(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":
sync = account_module.getNodeSync()
if sync == 100:
# Don't show sync percentage on mobile
sync = ""
elif sync == -1:
sync = "HSD Error"
else:
sync = f"{sync}%"
return jsonify({"result": sync})
return jsonify({"error": "Invalid function", "result": "Invalid mobile function"}), 400
@app.route('/api/v1/wallet/<function>', methods=["GET"])
def api_wallet(function):
# Check if the user is logged in
@@ -1543,8 +1674,71 @@ def api_wallet(function):
domains = account_module.getDomains(account)
if 'error' in domains:
return jsonify({"result": [], "error": domains['error']})
# Add nameRender to each domain
for domain in domains:
domain['nameRender'] = renderDomain(domain['name'])
return jsonify({"result": domains})
if function == "transactions":
# Get the page parameter
page = request.args.get('page')
try:
page = int(page)
except:
page = 1
if page < 1:
page = 1
# Check for force refresh parameter
force_refresh = request.args.get('refresh') == 'true'
# Create a cache key based on account and page
cache_key = f"{account}_{page}"
# Check if data is in cache and not expired
current_time = time.time()
if not force_refresh and cache_key in tx_cache and (current_time - tx_cache[cache_key]['time'] < TX_CACHE_TIMEOUT):
transactions = tx_cache[cache_key]['data']
txCount = len(transactions)
transactions_html = render.transactions(transactions)
else:
# Fetch transactions from account module
transactions = account_module.getTransactions(account, page)
txCount = len(transactions)
transactions_html = render.transactions(transactions)
# Store in cache
tx_cache[cache_key] = {
'data': transactions,
'html': transactions_html,
'time': current_time
}
return jsonify({
"html": transactions_html,
"txCount": txCount,
"page": page
})
if function == "domainBids":
domain = request.args.get('domain')
if not domain:
return jsonify({"error": "No domain specified"}), 400
bids = account_module.getBids(account,domain)
if bids == []:
return jsonify({"result": [], "error": "No bids found"}), 404
else:
reveals = account_module.getReveals(account,domain)
for reveal in reveals:
# Get TX
revealInfo = account_module.getRevealTX(reveal)
reveal['bid'] = revealInfo
bids = render.bids(bids,reveals)
return jsonify({"result": bids})
if function == "icon":
# Check if there is an icon
if not os.path.exists(f'user_data/images'):
@@ -1558,6 +1752,30 @@ def api_wallet(function):
return jsonify({"error": "Invalid function", "result": "Invalid function"}), 400
@app.route('/api/v1/wallet/<function>/mobile', methods=["GET"])
def api_wallet_mobile(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"))
password = request.cookies.get("account").split(":")[1]
if not account:
return jsonify({"error": "Invalid account"})
if function == "sync":
sync = account_module.getWalletStatus()
if sync == "Ready":
# Don't show sync percentage on mobile
sync = ""
elif sync == "Error wallet ahead of node":
sync = "HSW Sync Error"
else:
sync = "HSW Syncing"
return jsonify({"result": sync})
return jsonify({"error": "Invalid function", "result": "Invalid mobile function"}), 400
@app.route('/api/v1/icon/<account>')
def api_icon(account):
if not os.path.exists(f'user_data/images'):
@@ -1568,6 +1786,35 @@ def api_icon(account):
return send_file(f'user_data/images/{file}')
return send_file('templates/assets/img/HNS.png')
@app.route('/api/v1/status')
def api_status():
# This doesn't require a login
# Check if the node is connected
if not account_module.hsdConnected():
return jsonify({"status":503,"error": "Node not connected"}), 503
return jsonify({"status": 200,"result": "FireWallet is running"})
#endregion
#region Helper functions
def renderDomain(name: str) -> str:
"""
Render a domain name with emojis and other special characters.
"""
# Convert emoji to punycode
try:
rendered = name.encode("ascii").decode("idna")
if rendered == name:
return f"{name}/"
return f"{rendered}/ ({name})"
except Exception as e:
return f"{name}/"
#endregion
@@ -1594,8 +1841,6 @@ def try_path(path):
if not account_module.hsdConnected():
return redirect("/login?message=Node not connected")
if os.path.isfile("templates/" + path + ".html"):
return render_template(path + ".html")
else:
@@ -1609,4 +1854,9 @@ def page_not_found(e):
#endregion
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0')
#TODO add parsing to allow for custom port and host
# Check to see if --debug is in the command line arguments
if "--debug" in sys.argv:
app.run(debug=True)
else:
app.run()

View File

@@ -6,12 +6,19 @@ import hashlib
import subprocess
def import_module(module_name):
if module_name in sys.modules:
return importlib.reload(sys.modules[module_name])
else:
return importlib.import_module(module_name)
def listPlugins(update=False):
plugins = []
for file in os.listdir("plugins"):
if file.endswith(".py"):
if file != "main.py":
plugin = importlib.import_module("plugins."+file[:-3])
plugin = import_module("plugins."+file[:-3])
if "info" not in dir(plugin):
continue
details = plugin.info
@@ -42,7 +49,7 @@ def listPlugins(update=False):
for file in os.listdir(f"customPlugins/{importPath}"):
if file.endswith(".py"):
if file != "main.py":
plugin = importlib.import_module(f"customPlugins.{importPath}."+file[:-3])
plugin = import_module(f"customPlugins.{importPath}."+file[:-3])
if "info" not in dir(plugin):
continue
details = plugin.info
@@ -106,7 +113,7 @@ def hashPlugin(plugin: str):
def getPluginData(pluginStr: str):
plugin = importlib.import_module(pluginStr.replace("/","."))
plugin = import_module(pluginStr.replace("/","."))
# Check if the plugin is verified
signatures = []
@@ -141,12 +148,12 @@ def getPluginData(pluginStr: str):
def getPluginFunctions(plugin: str):
plugin = importlib.import_module(plugin.replace("/","."))
plugin = import_module(plugin.replace("/","."))
return plugin.functions
def runPluginFunction(plugin: str, function: str, params: dict, authentication: str):
plugin_module = importlib.import_module(plugin.replace("/","."))
plugin_module = import_module(plugin.replace("/","."))
if function not in plugin_module.functions:
return {"error": "Function not found"}
@@ -182,12 +189,12 @@ def runPluginFunction(plugin: str, function: str, params: dict, authentication:
def getPluginFunctionInputs(plugin: str, function: str):
plugin = importlib.import_module(plugin.replace("/","."))
plugin = import_module(plugin.replace("/","."))
return plugin.functions[function]["params"]
def getPluginFunctionReturns(plugin: str, function: str):
plugin = importlib.import_module(plugin.replace("/","."))
plugin = import_module(plugin.replace("/","."))
return plugin.functions[function]["returns"]

View File

@@ -9,7 +9,7 @@ import os
info = {
"name": "Batching Functions",
"description": "This is a plugin that provides multiple functions to batch transactions",
"version": "1.0",
"version": "1.1",
"author": "Nathan.Woodburn/"
}
# https://hsd-dev.org/api-docs/?shell--cli#sendbatch
@@ -394,7 +394,6 @@ def bid(params, authentication):
for domain in domains:
batch.append(['BID', domain, bid, blind])
print(batch)
response = sendBatch(batch, authentication)
if 'error' in response:
return {

348
render.py
View File

@@ -4,13 +4,64 @@ import urllib.parse
from flask import render_template
from domainLookup import punycode_to_emoji
import os
from handywrapper import api
import threading
HSD_API = os.getenv("HSD_API")
HSD_IP = os.getenv("HSD_IP")
if HSD_IP is None:
HSD_IP = "localhost"
HSD_NETWORK = os.getenv("HSD_NETWORK")
HSD_WALLET_PORT = 12039
HSD_NODE_PORT = 12037
if not HSD_NETWORK:
HSD_NETWORK = "main"
else:
HSD_NETWORK = HSD_NETWORK.lower()
if HSD_NETWORK == "simnet":
HSD_WALLET_PORT = 15039
HSD_NODE_PORT = 15037
elif HSD_NETWORK == "testnet":
HSD_WALLET_PORT = 13039
HSD_NODE_PORT = 13037
elif HSD_NETWORK == "regtest":
HSD_WALLET_PORT = 14039
HSD_NODE_PORT = 14037
hsd = api.hsd(HSD_API, HSD_IP, HSD_NODE_PORT)
# Get Explorer URL
TX_EXPLORER_URL = os.getenv("EXPLORER_TX")
if TX_EXPLORER_URL is None:
TX_EXPLORER_URL = "https://niami.io/tx/"
TX_EXPLORER_URL = "https://shakeshift.com/transaction/"
NAMEHASH_CACHE = 'user_data/namehash_cache.json'
# Validate cache version
if os.path.exists(NAMEHASH_CACHE):
with open(NAMEHASH_CACHE, 'r') as f:
cache = json.load(f)
if not isinstance(cache, dict):
print("Invalid namehash cache format. Resetting cache.")
with open(NAMEHASH_CACHE, 'w') as f:
json.dump({}, f)
# Check if cache entries are valid
for key in cache:
if not cache[key].startswith("<a href='/manage/"):
print(f"Invalid cache entry for {key}. Resetting cache.")
with open(NAMEHASH_CACHE, 'w') as f:
json.dump({}, f)
break
CACHE_LOCK = threading.Lock()
HNS_ICON = '<img src="/assets/img/HNS.png" width="20px" style="filter: invert(1);" />'
def domains(domains, mobile=False):
html = ''
@@ -24,10 +75,7 @@ def domains(domains, mobile=False):
paid = paid / 1000000
# Handle punycodes
name = domain['name']
emoji = punycode_to_emoji(name)
if emoji != name:
name = f'{emoji} ({name})'
name = renderDomain(domain['name'])
link = f'/manage/{domain["name"]}'
@@ -43,6 +91,29 @@ def domains(domains, mobile=False):
return html
actionMap = {
"UPDATE": "Updated ",
"REGISTER": "Registered ",
"RENEW": "Renewed ",
"BID": "Bid on ",
"REVEAL": "Revealed bid for ",
"REDEEM": "Redeemed bid for ",
"TRANSFER": "Started transfer for ",
"NONE": "Multiple actions"
}
actionMapPlural = {
"UPDATE": "Updated multiple domains' records",
"REGISTER": "Registered multiple domains",
"RENEW": "Renewed multiple domains",
"BID": "Bid on multiple domains",
"REVEAL": "Revealed multiple bids",
"REDEEM": "Redeemed multiple bids",
"TRANSFER": "Started multiple domain transfers",
"NONE": "Multiple actions"
}
def transactions(txs):
if len(txs) == 0:
@@ -50,38 +121,106 @@ def transactions(txs):
html = ''
for tx in txs:
action = "HNS Transfer"
address = tx["outputs"][0]["address"]
hash = tx["hash"]
txhash = tx["hash"]
confirmations=tx["confirmations"]
mined_date = "Pending"
if confirmations >= 1:
mined_date = tx["mdate"]
if mined_date is None:
mined_date = "Pending"
else:
# Format 2025-06-27T01:49:14Z
mined_date = datetime.datetime.strptime(mined_date, "%Y-%m-%dT%H:%M:%SZ").strftime("%d %b %Y")
incomming = True
amount = 0
incomming = False
if not tx["inputs"][0]["path"]:
incomming = True
bid_value = 0
isMulti = 0
nameHashes = []
for txInput in tx["inputs"]:
if txInput["path"]:
incomming = False
amount -= txInput["value"]
for output in tx["outputs"]:
if output["covenant"]["action"] != "NONE":
if action == "HNS Transfer":
action = output["covenant"]["action"]
elif action == output["covenant"]["action"]:
continue
isMulti += 1
else:
action = "Multiple Actions"
if not output["path"] and not incomming:
amount += output["value"]
elif output["path"] and incomming:
amount += output["value"]
if output["covenant"]["items"] and len(output["covenant"]["items"]) > 0:
nameHashes.append(output["covenant"]["items"][0])
if not incomming:
if output["path"]:
amount += output["value"]
else:
if output["path"] and output["covenant"]["action"] == "NONE":
amount += output["value"]
# Check if this is a bid
if output["covenant"]["action"] == "BID":
bid_value += output["value"]
amount -= output["value"]
if not incomming:
# Subtract fee to make it easier to read
amount += tx["fee"]
amount = amount / 1000000
bid_value = bid_value / 1000000
humanAction = action
hash = f"<a target='_blank' href='{TX_EXPLORER_URL}{hash}'>{hash[:8]}...</a>"
if confirmations < 5:
confirmations = f"<td style='background-color: red;'>{confirmations}</td>"
if action == "HNS Transfer":
if amount >= 0:
humanAction = f"Received {amount:,.2f} {HNS_ICON}"
else:
humanAction = f"Sent {(amount*-1):,.2f} {HNS_ICON}"
elif action == "FINALIZE":
if incomming and not isMulti:
humanAction = f"Received {renderFromNameHash(nameHashes[0])}"
elif incomming and isMulti:
humanAction = f"Received {isMulti + 1} domains"
elif not isMulti:
humanAction = f"Finalized {renderFromNameHash(nameHashes[0])}"
else:
humanAction = f"Finalized {isMulti + 1} domain transfers"
elif action == "BID" and not isMulti:
humanAction = f"Bid {bid_value:,.2f} {HNS_ICON} on {renderFromNameHash(nameHashes[0])}"
elif isMulti:
humanAction = actionMapPlural.get(action, "Unknown Action")
humanAction = humanAction.replace("multiple", f'{isMulti + 1}')
else:
confirmations = f"<td>{confirmations:,}</td>"
humanAction = actionMap.get(action, "Unknown Action")
humanAction += renderFromNameHash(nameHashes[0])
html += f'<tr><td>{action}</td><td>{address}</td><td>{hash}</td>{confirmations}<td>{amount:,.2f} HNS</td></tr>'
if amount < 0:
amount = f"<span style='color: red;'>{amount:,.2f}</span>"
elif amount > 0:
amount = f"<span style='color: green;'>+{amount:,.2f}</span>"
else:
amount = f"<span style='color: gray;'>0.00</span>"
# hash = f"<a target='_blank' href='{TX_EXPLORER_URL}{hash}'>{hash[:8]}...</a>"
txdate = ""
if confirmations < 5:
txdate = f"<span style='color: red;'>{mined_date}</span>"
else:
txdate = f"<span>{mined_date}</span>"
# confirmations = f"<td class='hide-mobile'>{confirmations:,}</td>"
html += f'''
<tr>
<td style='white-space: nowrap;'>{txdate}</td>
<td><a style="color:var(--bs-body-color); text-decoration:none;" target="_blank" href="{TX_EXPLORER_URL}{txhash}">{humanAction}</a></td>
</tr>
'''
return html
@@ -95,28 +234,28 @@ def dns(data, edit=False):
for key, value in entry.items():
if key != 'type':
if isinstance(value, list):
html_output += "<td>\n"
for val in value:
html_output += f"{val}<br>\n"
html_output += "</td>\n"
if len(value) > 1:
html_output += '<td style="white-space: pre-wrap; font-family: monospace;">\n'
for val in value:
html_output += f"{val}<br>\n"
html_output += "</td>\n"
else:
html_output += f'<td style="white-space: pre-wrap; font-family: monospace;">{value[0]}</td>\n'
else:
html_output += f"<td>{value}</td>\n"
html_output += f'<td style="white-space: pre-wrap; font-family: monospace;">{value}</td>\n'
elif entry['type'] == 'DS':
ds = f"{entry['keyTag']} {entry['algorithm']} {entry['digestType']} {entry['digest']}"
html_output += f"<td>{ds}</td>\n"
html_output += f'<td style="white-space: pre-wrap; font-family: monospace;">{ds}</td>\n'
else:
value = ""
for key, val in entry.items():
if key != 'type':
value += f'{val} '
html_output += f"<td>{value}</td>\n"
html_output += f'<td style="white-space: pre-wrap; font-family: monospace;">{value.strip()}</td>\n'
if edit:
# Remove the current entry from the list
keptRecords = str(data[:index] + data[index+1:]).replace("'", '"')
keptRecords = urllib.parse.quote(keptRecords)
html_output += f"<td><a href='edit?dns={keptRecords}'>Remove</a></td>\n"
@@ -125,6 +264,7 @@ def dns(data, edit=False):
index += 1
return html_output
def txs(data):
data = data[::-1]
@@ -156,30 +296,60 @@ def timestamp_to_readable_time(timestamp):
return readable_time
def bids(bids,reveals):
html = ''
# Create a list to hold bid data for sorting
bid_data = []
# Prepare data for sorting
for bid in bids:
lockup = bid['lockup']
lockup = lockup / 1000000
html += "<tr>"
html += f"<td>{lockup:,.2f} HNS</td>"
lockup = bid['lockup'] / 1000000
revealed = False
value = 0
# Check if this bid has been revealed
for reveal in reveals:
if reveal['bid'] == bid['prevout']['hash']:
revealed = True
value = reveal['value']
value = value / 1000000
html += f"<td>{value:,.2f} HNS</td>"
bidValue = lockup - value
html += f"<td>{bidValue:,.2f} HNS</td>"
value = reveal['value'] / 1000000
break
if not revealed:
# Store all relevant information for sorting and display
bid_data.append({
'bid': bid,
'lockup': lockup,
'revealed': revealed,
'value': value,
'sort_value': value if revealed else lockup # Use value for sorting if revealed, otherwise lockup
})
# Sort by the sort_value in descending order (highest first)
bid_data.sort(key=lambda x: x['sort_value'], reverse=True)
# Generate HTML from sorted data
html = ''
for data in bid_data:
bid = data['bid']
lockup = data['lockup']
revealed = data['revealed']
value = data['value']
html += "<tr>"
html += f"<td>{lockup:,.2f} HNS</td>"
if revealed:
bidValue = lockup - value
html += f"<td>{value:,.2f} HNS</td>"
html += f"<td>{bidValue:,.2f} HNS</td>"
else:
html += f"<td>Hidden until reveal</td>"
html += f"<td>Hidden until reveal</td>"
if bid['own']:
html += "<td>You</td>"
else:
html += "<td>Unknown</td>"
html += f"<td>Unknown</td>"
html += f"<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' target='_blank' href='{TX_EXPLORER_URL}{bid['prevout']['hash']}'>Bid TX 🔗</a></td>"
html += "</tr>"
return html
@@ -195,14 +365,17 @@ def bidDomains(bids,domains, sortbyDomains=False):
bidValue = bid['value'] / 1000000
blind = lockup - bidValue
bidDisplay = f'<b>{bidValue:,.2f} HNS</b> + {blind:,.2f} HNS blind'
if blind > 0:
bidDisplay = f'<b>{bidValue:,.2f}</b> (+{blind:,.2f}) HNS'
else:
bidDisplay = f'<b>{bidValue:,.2f}</b> HNS'
html += "<tr>"
html += f"<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' href='/auction/{domain['name']}'>{domain['name']}</a></td>"
html += f"<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' href='/auction/{domain['name']}'>{renderDomain(domain['name'])}</a></td>"
html += f"<td>{domain['state']}</td>"
html += f"<td>{bidDisplay}</td>"
html += f"<td>{domain['height']:,}</td>"
html += f"<td style='white-space: nowrap;'>{bidDisplay}</td>"
html += f"<td class='hide-mobile'>{domain['height']:,}</td>"
html += "</tr>"
else:
for domain in domains:
@@ -215,10 +388,10 @@ def bidDomains(bids,domains, sortbyDomains=False):
bidDisplay = f'<b>{bidValue:,.2f} HNS</b> + {blind:,.2f} HNS blind'
html += "<tr>"
html += f"<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' href='/auction/{domain['name']}'>{domain['name']}</a></td>"
html += f"<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' href='/auction/{domain['name']}'>{renderDomain(domain['name'])}</a></td>"
html += f"<td>{domain['state']}</td>"
html += f"<td>{bidDisplay}</td>"
html += f"<td>{domain['height']:,}</td>"
html += f"<td class='hide-mobile'>{domain['height']:,}</td>"
html += "</tr>"
return html
@@ -352,3 +525,82 @@ def plugin_output_dash(outputs, returns):
continue
html += render_template('components/dashboard-plugin.html', name=returns[returnOutput]["name"], output=outputs[returnOutput])
return html
def renderDomain(name: str) -> str:
"""
Render a domain name with emojis and other special characters.
"""
# Convert emoji to punycode
try:
rendered = name.encode("ascii").decode("idna")
if rendered == name:
return f"{name}/"
return f"{rendered}/ ({name})"
except Exception as e:
return f"{name}/"
def renderDomainAsync(namehash: str) -> None:
"""
Get the domain name from HSD using its name hash and store it in the cache.
This function is meant to be run in the background.
"""
try:
with CACHE_LOCK:
if not os.path.exists(NAMEHASH_CACHE):
with open(NAMEHASH_CACHE, 'w') as f:
json.dump({}, f)
with open(NAMEHASH_CACHE, 'r') as f:
cache = json.load(f)
if namehash in cache:
return
# Fetch the name outside the lock (network call)
name = hsd.rpc_getNameByHash(namehash)
if name["error"] is None:
name = name["result"]
rendered = renderDomain(name)
rendered = f"<a href='/manage/{name}' target='_blank' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));'>{rendered}</a>"
with CACHE_LOCK:
with open(NAMEHASH_CACHE, 'r') as f:
cache = json.load(f)
cache[namehash] = rendered
with open(NAMEHASH_CACHE, 'w') as f:
json.dump(cache, f)
return rendered
else:
print(f"Error fetching name for hash {namehash}: {name['error']}", flush=True)
except Exception as e:
print(f"Exception fetching name for hash {namehash}: {e}", flush=True)
def renderFromNameHash(nameHash: str) -> str:
"""
Render a domain name from its name hash.
Try to retrieve the name from the cache. If not, create a background task to fetch it.
"""
try:
with CACHE_LOCK:
if not os.path.exists(NAMEHASH_CACHE):
with open(NAMEHASH_CACHE, 'w') as f:
json.dump({}, f)
with open(NAMEHASH_CACHE, 'r') as f:
cache = json.load(f)
if nameHash in cache:
return cache[nameHash]
thread = threading.Thread(target=renderDomainAsync, args=(nameHash,))
thread.start()
return "domain"
except Exception as e:
print(f"Exception in renderFromNameHash: {e}", flush=True)
return "domain"

View File

@@ -9,3 +9,4 @@ requests-doh
Flask-QRcode
PySocks
python-git-info
waitress

View File

@@ -1,38 +1,44 @@
from flask import Flask
from main import app
import main
from gunicorn.app.base import BaseApplication
import os
import sys
import platform
from main import app
from waitress import serve
class GunicornApp(BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
threads = 4
def load_config(self):
for key, value in self.options.items():
if key in self.cfg.settings and value is not None:
self.cfg.set(key.lower(), value)
def gunicornServer():
from gunicorn.app.base import BaseApplication
class GunicornApp(BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load(self):
return self.application
def load_config(self):
for key, value in self.options.items():
if key in self.cfg.settings and value is not None:
self.cfg.set(key.lower(), value)
if __name__ == '__main__':
workers = 1
threads = 2
if workers is None:
workers = 1
if threads is None:
threads = 2
workers = int(workers)
threads = int(threads)
def load(self):
return self.application
options = {
'bind': '0.0.0.0:5000',
'workers': workers,
'workers': 2,
'threads': threads,
}
gunicorn_app = GunicornApp(app, options)
print('Starting server with ' + str(workers) + ' workers and ' + str(threads) + ' threads', flush=True)
print(f'Starting server with Gunicorn on {platform.system()} with {threads} threads...', flush=True)
gunicorn_app.run()
if __name__ == '__main__':
# Check if --gunicorn is in the command line arguments
if "--gunicorn" in sys.argv:
gunicornServer()
sys.exit()
print(f'Starting server with Waitress on {platform.system()} with {threads} threads...', flush=True)
print(f'Press Ctrl+C to stop the server', flush=True)
print(f'Serving on http://0.0.0.0:5000/', flush=True)
serve(app, host="0.0.0.0", port=5000, threads=threads)

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -64,7 +64,7 @@
</nav>
<div class="container-fluid">
<div class="text-center mt-5">
<div class="error mx-auto" data-text="404">
<div class="mx-auto error" data-text="404">
<p class="m-0">404</p>
</div>
<p class="text-dark mb-5 lead">Page Not Found</p>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -66,9 +66,9 @@
<div class="container-fluid">
<div class="card">
<div class="card-body">
<div class="stick-right">{{next_action|safe}}</div>
<h4 class="card-title">{{domain}}/</h4>
<h6 class="text-muted card-subtitle mb-2">{{next}}</h6>
<div id="next-action" class="stick-right">{{next_action|safe}}</div>
<h4 class="card-title">{{rendered}}</h4>
<h6 class="text-muted mb-2 card-subtitle" id="next">{{next | safe}}</h6>
</div>
</div>
</div>
@@ -93,13 +93,92 @@
<th>Bid</th>
<th>Blind</th>
<th>Owner</th>
<th></th>
</tr>
</thead>
<tbody>
{{bids | safe}}
<tbody id="bids-tbody">
<tr id="loading-row">
<td colspan="5" class="text-center">
<div class="spinner-border spinner-border-sm me-2" role="status">
<span class="visually-hidden">Loading...</span>
</div>
Loading bids...
</td>
</tr>
</tbody>
</table>
</div>
<script>
async function loadBids(initial = false) {
const tbody = document.getElementById('bids-tbody');
try {
// Fetch all required data
const response = await fetch(`/api/v1/wallet/domainBids?domain={{search_term}}`);
const data = await response.json();
if (initial) {
if (response.ok && data.result) {
tbody.innerHTML = data.result;
} else {
tbody.innerHTML = '<tr><td colspan="5" class="text-center text-muted">No bids found. <a href="/auction/{{search_term}}/scan">Rescan Auction</a></td></tr>';
}
}
const mempoolResponse = await fetch('/api/v1/hsd/mempoolBids');
const nextStateResponse = await fetch(`/api/v1/hsd/nextAuctionState?domain={{search_term}}`);
if (!initial) {
if (response.ok && data.result) {
tbody.innerHTML = data.result;
} else {
tbody.innerHTML = '<tr><td colspan="5" class="text-center text-muted">No bids found. <a href="/auction/{{search_term}}/scan">Rescan Auction</a></td></tr>';
}
}
const nextStateData = await nextStateResponse.json();
if (nextStateResponse.ok && nextStateData.state) {
document.getElementById('next').innerHTML = nextStateData.next;
document.getElementById('next-action').innerHTML = nextStateData.next_action;
} else {
document.getElementById('next').innerHTML = 'Unknown';
document.getElementById('next-action').innerHTML = '';
}
const mempoolData = await mempoolResponse.json();
if (mempoolResponse.ok && mempoolData.result) {
const domainBids = mempoolData.result['{{search_term}}'];
if (domainBids && domainBids.length > 0) {
let mempoolRows = '';
domainBids.forEach(bid => {
const bidValue = bid.revealed ? `${(bid.value / 1000000).toFixed(2)} HNS` : 'Hidden until reveal';
const lockupValue = (bid.lockup / 1000000).toFixed(2);
const blindValue = bid.revealed ? `${((bid.lockup - bid.value) / 1000000).toFixed(2)} HNS` : 'Hidden until reveal';
const type = bid.revealed ? 'Reveal' : 'Bid';
mempoolRows += `<tr class="table-warning">
<td>${lockupValue} HNS</td>
<td>${bidValue}</td>
<td>${blindValue}</td>
<td>${bid.owner}</td>
<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' target='_blank' href='https://shakeshift.com/transaction/${bid.txid}'>Mempool ${type} 🔗</a></td>
</tr>`;
});
tbody.innerHTML += mempoolRows;
}
}
} catch (error) {
console.error('Error loading bids:', error);
}
}
// Load bids when page loads
document.addEventListener('DOMContentLoaded', () => loadBids(true));
// Auto-refresh bids every 20 seconds
setInterval(() => loadBids(false), 20000);
</script>
</div>
</div>
</div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -69,12 +69,12 @@
<h1 class="text-center">{{message}}</h1>
<div class="row">
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-primary py-2">
<div class="card shadow py-2 border-start-primary">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-primary fw-bold text-xs mb-1"><span style="color: var(--bs-dark);">HNS Locked</span></div>
<div class="text-dark fw-bold h5 mb-0"><span><img src="/assets/img/HNS.png" width="20px">&nbsp;<span id="wallet-locked">0.00</span></span></div>
<div class="text-uppercase text-primary mb-1 fw-bold text-xs"><span style="color: var(--bs-dark);">HNS Locked</span></div>
<div class="text-dark mb-0 fw-bold h5"><span><img src="/assets/img/HNS.png" width="20px">&nbsp;<span id="wallet-locked">0.00</span></span></div>
</div>
<div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div>
</div>
@@ -82,26 +82,26 @@
</div>
</div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-success py-2">
<div class="card shadow py-2 border-start-success">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-success fw-bold text-xs mb-1"><span>Total Bids</span></div>
<div class="text-dark fw-bold h5 mb-0"><span id="wallet-bidCount">0</span></div>
<div class="text-uppercase text-success mb-1 fw-bold text-xs"><span>Total Bids</span></div>
<div class="text-dark mb-0 fw-bold h5"><span id="wallet-bidCount">0</span></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-info py-2">
<div class="card shadow py-2 border-start-info">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-info fw-bold text-xs mb-1"><span>Pending Reveal</span></div>
<div class="text-uppercase text-info mb-1 fw-bold text-xs"><span>Pending Reveal</span></div>
<div class="row g-0 align-items-center">
<div class="col-auto">
<div class="text-dark fw-bold h5 mb-0 me-3"><span id="wallet-pendingReveal">0</span></div>
<div class="text-dark me-3 mb-0 fw-bold h5"><span id="wallet-pendingReveal">0</span></div>
</div>
<div class="col"><a class="btn btn-primary" role="button" href="/all/reveal">Reveal All</a></div>
</div>
@@ -111,14 +111,14 @@
</div>
</div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-info py-2">
<div class="card shadow py-2 border-start-info">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-info fw-bold text-xs mb-1"><span>Pending Redeem</span></div>
<div class="text-uppercase text-info mb-1 fw-bold text-xs"><span>Pending Redeem</span></div>
<div class="row g-0 align-items-center">
<div class="col-auto">
<div class="text-dark fw-bold h5 mb-0 me-3"><span id="wallet-pendingRedeem">0</span></div>
<div class="text-dark me-3 mb-0 fw-bold h5"><span id="wallet-pendingRedeem">0</span></div>
</div>
<div class="col"><a class="btn btn-primary" role="button" href="/all/redeem">Redeem All</a></div>
</div>
@@ -128,14 +128,14 @@
</div>
</div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-info py-2">
<div class="card shadow py-2 border-start-info">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-info fw-bold text-xs mb-1"><span>Pending Register</span></div>
<div class="text-uppercase text-info mb-1 fw-bold text-xs"><span>Pending Register</span></div>
<div class="row g-0 align-items-center">
<div class="col-auto">
<div class="text-dark fw-bold h5 mb-0 me-3"><span id="wallet-pendingRegister">0</span></div>
<div class="text-dark me-3 mb-0 fw-bold h5"><span id="wallet-pendingRegister">0</span></div>
</div>
<div class="col"><a class="btn btn-primary" role="button" href="/all/register">Register All</a></div>
</div>
@@ -145,11 +145,11 @@
</div>
</div>{{plugins|safe}}
</div>
<div class="row d-none d-sm-none d-md-block">
<div class="row d-none d-print-block d-sm-none d-md-none d-lg-block d-xl-block d-xxl-block">
<div class="col">
<div class="card shadow mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="text-primary fw-bold m-0">Domains</h6>
<h6 class="text-primary m-0 fw-bold">Domains</h6>
</div>
<div class="card-body"><div class="table-responsive">
<table class="table">
@@ -170,11 +170,11 @@
</div>
</div>
</div>
<div class="row d-block d-sm-block d-md-none">
<div class="row d-block d-print-none d-sm-block d-md-block d-lg-none d-xl-none d-xxl-none">
<div class="col">
<div class="card shadow mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="text-primary fw-bold m-0">Domains</h6>
<h6 class="text-primary m-0 fw-bold">Domains</h6>
</div>
<div class="card-body"><div class="table-responsive">
<table class="table">

View File

@@ -0,0 +1,8 @@
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-warning py-2">
<div class="card-body">
<div class="text-uppercase fw-bold text-xs mb-1"><span style="color: var(--bs-dark);">{{name}}</span></div>
<div class="text-dark fw-bold h5 mb-0"><span>{{output | safe}}</span></div>
</div>
</div>
</div>

View File

@@ -1,5 +1,4 @@
<span style="display: block;font-size: 12px;">TX: {{tx}}</span>
<span style="display: block;">Check your transaction on a block explorer</span>
<a class="card-link" href="https://niami.io/tx/{{tx}}" target="_blank">Niami</a>
<a class="card-link" href="https://shakeshift.com/transaction/{{tx}}" target="_blank">ShakeShift</a>
<a class="card-link" href="https://3xpl.com/handshake/transaction/{{tx}}" target="_blank">3xpl</a>
<a class="card-link" href="https://hns.cymon.de/tx/{{tx}}" target="_blank">Cymon.de</a>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -67,7 +67,7 @@
<div class="card" style="margin-top: 50px;">
<div class="card-body">
<h4 class="card-title">{{action}}</h4>
<h6 class="text-muted card-subtitle mb-2">{{subtitle}}</h6>
<h6 class="text-muted mb-2 card-subtitle">{{subtitle}}</h6>
<p class="card-text">{{content|safe}}</p>
<form method="post" action="{{confirm}}"><input class="form-control" type="password" name="password" placeholder="Password"><input class="btn btn-primary" type="submit" style="display: block;margin-top: 16px;margin-bottom: 16px;"><input class="form-control" type="hidden" name="check" value="{{check}}"></form><a class="card-link" href="{{cancel}}">Cancel</a>
</div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -67,7 +67,7 @@
<div class="card" style="margin-top: 50px;">
<div class="card-body">
<h4 class="card-title">{{action}}</h4>
<h6 class="text-muted card-subtitle mb-2">{{subtitle}}</h6>
<h6 class="text-muted mb-2 card-subtitle">{{subtitle}}</h6>
<p class="card-text">{{content|safe}}</p><a class="card-link" href="{{cancel}}">Cancel</a><a class="card-link" href="{{confirm}}">Confirm</a>
</div>
</div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span>Sync: {{sync}}%</span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ...">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small">{{account}}</span><img class="border rounded-circle img-profile" src="/assets/img/HNS.png"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -66,7 +66,7 @@
<div class="container-fluid">
<div class="card">
<div class="card-body">
<h4 class="card-title">{{domain}}/</h4>
<h4 class="card-title">{{rendered}}</h4>
</div>
</div>
</div>

View File

@@ -17,7 +17,7 @@
<body class="bg-gradient-primary">
<div class="container">
<div class="card shadow-lg o-hidden border-0 my-5">
<div class="card shadow-lg my-5 o-hidden border-0">
<div class="card-body p-0">
<div class="row">
<div class="col-lg-5 d-none d-lg-flex">
@@ -30,12 +30,12 @@
<h4 class="text-dark mb-4">Import a wallet!</h4>
</div>
<form class="user" method="post">
<div class="row mb-3" style="padding-right: 16px;padding-left: 16px;"><input class="form-control form-control-user" type="text" id="exampleLastName" placeholder="Wallet name" name="name" value="{{name}}"></div>
<div class="row mb-3">
<div class="mb-3 row" style="padding-right: 16px;padding-left: 16px;"><input class="form-control form-control-user" type="text" id="exampleLastName" placeholder="Wallet name" name="name" value="{{name}}"></div>
<div class="mb-3 row">
<div class="col-sm-6 mb-3 mb-sm-0"><input class="form-control form-control-user" type="password" id="examplePasswordInput" placeholder="Password" name="password" required="" value="{{password}}"></div>
<div class="col-sm-6"><input class="form-control form-control-user" type="password" id="exampleRepeatPasswordInput" placeholder="Repeat Password" name="password_repeat" required="" value="{{password_repeat}}"></div>
</div>
<div style="margin-bottom: 16px;"><textarea class="form-control form-control-lg" placeholder="Seed Phrase" name="seed" rows="1" style="height: 7em;">{{seed}}</textarea></div><button class="btn btn-primary d-block btn-user w-100" type="submit">Import Wallet</button>
<div style="margin-bottom: 16px;"><textarea class="form-control form-control-lg" placeholder="Seed Phrase" name="seed" rows="1" style="height: 7em;">{{seed}}</textarea></div><button class="btn btn-primary d-block w-100 btn-user" type="submit">Import Wallet</button>
<hr>
</form>
<div class="text-center"><a class="small" href="/login">Didn't mean to create a new wallet? Login!</a></div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link active" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -68,12 +68,12 @@
</div>
<div class="row">
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-primary py-2">
<div class="card shadow py-2 border-start-primary">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-primary fw-bold text-xs mb-1"><span style="color: var(--bs-dark);">HNS Available</span></div>
<div class="text-dark fw-bold h5 mb-0"><span><img src="/assets/img/HNS.png" width="20px">&nbsp;<span id="wallet-available">0.00</span></span></div>
<div class="text-uppercase text-primary mb-1 fw-bold text-xs"><span style="color: var(--bs-dark);">HNS Available</span></div>
<div class="text-dark mb-0 fw-bold h5"><span><img src="/assets/img/HNS.png" width="20px">&nbsp;<span id="wallet-available">0.00</span></span></div>
</div>
<div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div>
</div>
@@ -81,12 +81,12 @@
</div>
</div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-success py-2">
<div class="card shadow py-2 border-start-success">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-success fw-bold text-xs mb-1"><span>HNS Total</span></div>
<div class="text-dark fw-bold h5 mb-0"><span><img src="/assets/img/HNS.png" width="20px">&nbsp;<span id="wallet-total">0.00</span></span></div>
<div class="text-uppercase text-success mb-1 fw-bold text-xs"><span>HNS Total</span></div>
<div class="text-dark mb-0 fw-bold h5"><span><img src="/assets/img/HNS.png" width="20px">&nbsp;<span id="wallet-total">0.00</span></span></div>
</div>
<div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div>
</div>
@@ -94,14 +94,14 @@
</div>
</div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-info py-2">
<div class="card shadow py-2 border-start-info">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-info fw-bold text-xs mb-1"><span>Domains</span></div>
<div class="text-uppercase text-info mb-1 fw-bold text-xs"><span>Domains</span></div>
<div class="row g-0 align-items-center">
<div class="col-auto">
<div class="text-dark fw-bold h5 mb-0 me-3"><span id="wallet-domainCount">0</span></div>
<div class="text-dark me-3 mb-0 fw-bold h5"><span id="wallet-domainCount">0</span></div>
</div>
</div>
</div>
@@ -110,12 +110,12 @@
</div>
</div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-warning py-2">
<div class="card shadow py-2 border-start-warning">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-warning fw-bold text-xs mb-1"><span>Pending Transactions</span></div>
<div class="text-dark fw-bold h5 mb-0"><span id="wallet-pending">0</span></div>
<div class="text-uppercase text-warning mb-1 fw-bold text-xs"><span>Pending Transactions</span></div>
<div class="text-dark mb-0 fw-bold h5"><span id="wallet-pending">0</span></div>
</div>
<div class="col-auto"><svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="1em" viewBox="0 0 24 24" width="1em" fill="currentColor" class="fa-2x text-gray-300">
<g>
@@ -135,20 +135,19 @@
<div class="col">
<div class="card shadow mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="text-primary fw-bold m-0">Domains</h6>
<h6 class="text-primary m-0 fw-bold">Domains</h6>
</div>
<div class="card-body"><div class="table-responsive">
<table class="table" id="data-table">
<thead>
<tr>
<th onclick="sortTable(0)">Domain <span class="sort-indicator"></span></th>
<th onclick="sortTable(1)">Expires <span class="sort-indicator"></span></th>
<th onclick="sortTable(2)">Price Paid <span class="sort-indicator"></span></th>
<th><span class="sort-indicator"></span></th>
<th onclick="sortTable(1)" class="hide-mobile">Expires <span class="sort-indicator"></span></th>
<th onclick="sortTable(2)" class="hide-mobile">Price Paid <span class="sort-indicator"></span></th>
<!-- <th><span class="sort-indicator"></span></th> -->
</tr>
</thead>
<tbody>
<!-- {{domains | safe}} -->
</tbody>
</table>
</div>

View File

@@ -20,7 +20,7 @@
<div class="row justify-content-center">
<div class="col-md-9 col-lg-12 col-xl-10">
<h1 class="text-center" style="color: var(--bs-danger);background: var(--bs-primary);">{{error}}</h1>
<div class="card shadow-lg o-hidden border-0 my-5">
<div class="card shadow-lg my-5 o-hidden border-0">
<div class="card-body p-0">
<div class="row">
<div class="col-lg-6 d-none d-lg-flex">
@@ -47,7 +47,7 @@ document.addEventListener("DOMContentLoaded", function () {
});
</script>
</div>
<div class="mb-3"><input class="form-control form-control-user" type="password" id="exampleInputPassword" placeholder="Password" name="password"></div><button class="btn btn-primary d-block btn-user w-100" type="submit">Login</button>
<div class="mb-3"><input class="form-control form-control-user" type="password" id="exampleInputPassword" placeholder="Password" name="password"></div><button class="btn btn-primary d-block w-100 btn-user" type="submit">Login</button>
<hr>
</form>
<div class="text-center"><a class="small" href="register">Create a wallet</a></div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content" style="padding-bottom: 25px;">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -66,15 +66,16 @@
<div class="container-fluid">
<div class="card">
<div class="card-body">
<h4 class="card-title">{{domain}}/<a class="btn btn-primary stick-right" role="button" href="/manage/{{domain}}/renew">Renew</a></h4>
<h6 class="text-muted card-subtitle mb-2">Expires in {{expiry}} days</h6>
<h4 class="card-title">{{rendered}}<a class="btn btn-primary stick-right" role="button" href="/manage/{{domain}}/renew">Renew</a></h4>
<h6 class="text-muted mb-2 card-subtitle">Expires in {{expiry}} days</h6>
</div>
</div>
</div>{{plugins|safe}}
<div class="container-fluid" style="margin-top: 50px;">
<div class="card">
<div class="card-body">
<h4 class="card-title" style="display: inline-block;">DNS</h4><a class="btn btn-primary" role="button" style="position: absolute; right:16px;" href="/manage/{{domain}}/edit?dns={{raw_dns}}">Edit</a><div class="table-responsive">
<h4 class="card-title" style="display: inline-block;">DNS</h4>
<div style="width: fit-content;position: absolute;right: 0px;top: 16px;"><a class="btn btn-primary" role="button" href="https://tools.c.woodburn.au/?domain={{domain}}&amp;url=https://{{domain}}" style="margin: 0px 16px;" target="_blank">Debug</a><a class="btn btn-primary" role="button" href="/manage/{{domain}}/edit?dns={{raw_dns}}" style="margin: 0px 16px;">Edit</a></div><div class="table-responsive">
<table class="table">
<thead>
<tr>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -64,7 +64,7 @@
</nav>
<div class="container-fluid" style="margin-bottom: 20px;">
<h3 class="text-dark mb-1">{{name}}</h3>
<h4 class="text-dark mb-1">{{description}}</h4>{{output|safe}}
<h4 class="text-dark mb-1">{{description|safe}}</h4>{{output|safe}}
</div>
</div>
<footer class="sticky-footer" style="background: var(--bs-primary-text-emphasis);">

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>

View File

@@ -17,7 +17,7 @@
<body class="bg-gradient-primary">
<div class="container">
<div class="card shadow-lg o-hidden border-0 my-5">
<div class="card shadow-lg my-5 o-hidden border-0">
<div class="card-body p-0">
<div class="row">
<div class="col-lg-5 d-none d-lg-flex">
@@ -30,11 +30,11 @@
<h4 class="text-dark mb-4">Create a new wallet!</h4>
</div>
<form class="user" method="post">
<div class="row mb-3" style="padding-right: 16px;padding-left: 16px;"><input class="form-control form-control-user" type="text" id="exampleLastName" placeholder="Wallet name" name="name" value="{{name}}"></div>
<div class="row mb-3">
<div class="mb-3 row" style="padding-right: 16px;padding-left: 16px;"><input class="form-control form-control-user" type="text" id="exampleLastName" placeholder="Wallet name" name="name" value="{{name}}"></div>
<div class="mb-3 row">
<div class="col-sm-6 mb-3 mb-sm-0"><input class="form-control form-control-user" type="password" id="examplePasswordInput" placeholder="Password" name="password" required="" value="{{password}}"></div>
<div class="col-sm-6"><input class="form-control form-control-user" type="password" id="exampleRepeatPasswordInput" placeholder="Repeat Password" name="password_repeat" required="" value="{{password_repeat}}"></div>
</div><button class="btn btn-primary d-block btn-user w-100" type="submit">Create Wallet</button>
</div><button class="btn btn-primary d-block w-100 btn-user" type="submit">Create Wallet</button>
<hr>
</form>
<div class="text-center"><a class="small" href="/login">Didn't mean to create a new wallet? Login!</a></div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -65,10 +65,10 @@
<div class="container-fluid">
<div class="card">
<div class="card-body">
<h4 class="d-none d-sm-none d-md-none d-lg-inline-block d-xl-inline-block card-title">{{domain}}/<span class="stick-right">{{next}}</span></h4>
<h4 class="d-none d-sm-none d-md-none d-lg-inline-block d-xl-inline-block card-title">{{rendered}}<span class="stick-right">{{next}}</span></h4>
<h4 class="d-print-none d-sm-inline-block d-md-inline-block d-lg-none d-xl-none d-xxl-none card-title">{{domain}}/<br><br><span class="stick-right">{{next}}</span></h4>
<h6 class="text-muted card-subtitle mb-2"><br>{{state}}</h6>
<h6 class="text-muted card-subtitle mb-2">Owner: {{owner}}</h6><a class="btn btn-primary" role="button" style="margin-right: 25px;" href="/manage/{{domain}}">Manage</a><a class="btn btn-primary" role="button" href="/auction/{{domain}}">Auction</a>
<h6 class="text-muted mb-2 card-subtitle"><br>{{state}}</h6>
<h6 class="text-muted mb-2 card-subtitle">Owner: {{owner}}</h6><a class="btn btn-primary" role="button" style="margin-right: 25px;" href="/manage/{{domain}}">Manage</a><a class="btn btn-primary" role="button" href="/auction/{{domain}}">Auction</a>
</div>
</div>
</div>{{plugins|safe}}
@@ -87,27 +87,6 @@
{{dns | safe}}
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="container-fluid" style="margin-top: 50px;">
<div class="card">
<div class="card-body">
<h4 class="card-title">History</h4><div class="table-responsive">
<table class="table">
<thead>
<tr>
<th>Action</th>
<th>TX</th>
<th>Amount</th>
<th>Time</th>
</tr>
</thead>
<tbody>
{{txs | safe}}
</tbody>
</table>
</div>
</div>
</div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>

View File

@@ -22,12 +22,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -41,14 +41,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -57,7 +57,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" id="wallet-icon" src="/api/v1/wallet/icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -69,7 +69,7 @@
<div class="card">
<div class="card-body">
<h4 class="card-title">Node Settings</h4><small>HSD Version: v{{hsd_version}}</small>
<h6 class="text-muted card-subtitle mb-2">Settings that affect all wallets</h6>
<h6 class="text-muted mb-2 card-subtitle">Settings that affect all wallets</h6>
<ul class="list-group">
<li class="list-group-item">
<div><a class="btn btn-primary stick-right" role="button" href="/settings/rescan">Rescan</a>
@@ -94,7 +94,7 @@
<div class="card">
<div class="card-body">
<h4 class="card-title">Wallet Settings</h4>
<h6 class="text-muted card-subtitle mb-2">Settings that affect only current wallets</h6>
<h6 class="text-muted mb-2 card-subtitle">Settings that affect only current wallets</h6>
<ul class="list-group">
<li class="list-group-item">
<div><a class="btn btn-primary stick-right" role="button" href="/settings/xpub">xPub</a>
@@ -120,7 +120,7 @@
<div class="card">
<div class="card-body">
<h4 class="card-title">About</h4>
<h6 class="text-muted card-subtitle mb-2">FireWallet is a UI to allow easy connection with HSD created by <a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a> and freely available. Please contact him <a href="https://l.woodburn.au/contact" target="_blank">here</a> if you would like to request any features or report any bugs.<br>FireWallet version: <code>{{version}}</code></h6>
<h6 class="text-muted mb-2 card-subtitle">FireWallet is a UI to allow easy connection with HSD created by <a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a> and freely available. Please contact him <a href="https://l.woodburn.au/contact" target="_blank">here</a> if you would like to request any features or report any bugs.<br>FireWallet version: <code>{{version}}</code></h6>
<div class="text-center"><a href="https://github.com/nathanwoodburn/firewalletbrowser" style="margin: 15px;color: var(--bs-emphasis-color);text-decoration:none;" target="_blank"><i class="icon ion-social-github" style="color: var(--bs-emphasis-color);"></i>&nbsp;Github</a><a href="https://firewallet.au" style="margin: 15px;color: var(--bs-emphasis-color);text-decoration:none;" target="_blank"><i class="icon ion-ios-information" style="color: var(--bs-emphasis-color);"></i>&nbsp;Website</a><a href="https://l.woodburn.au/donate" style="margin: 15px;color: var(--bs-emphasis-color);text-decoration:none;" target="_blank"><i class="icon ion-social-usd" style="color: var(--bs-emphasis-color);"></i>&nbsp;Donate to support development</a></div>
</div>
</div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -67,7 +67,7 @@
</div>
<div class="card" style="max-width: 500px;margin: auto;margin-top: 50px;">
<div class="card-body">
<h4 class="card-title">Your transaction has been sent and will be mined soon.</h4><span style="display: block;font-size: 12px;">TX: {{tx}}</span><span style="display: block;">Check your transaction on a block explorer</span><a class="card-link" href="https://niami.io/tx/{{tx}}" target="_blank">Niami</a><a class="card-link" href="https://3xpl.com/handshake/transaction/{{tx}}" target="_blank">3xpl</a><a class="card-link" href="https://hns.cymon.de/tx/{{tx}}" target="_blank">HNS.Cymon.de</a>
<h4 class="card-title">Your transaction has been sent and will be mined soon.</h4><span style="display: block;font-size: 12px;">TX: {{tx}}</span><span style="display: block;">Check your transaction on a block explorer</span><a class="card-link" href="https://shakeshift.com/transaction/{{tx}}" target="_blank">ShakeShift</a><a class="card-link" href="https://3xpl.com/handshake/transaction/{{tx}}" target="_blank">3xpl</a>
</div>
</div>
</div>

View File

@@ -21,12 +21,12 @@
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<nav class="navbar align-items-start p-0 sidebar sidebar-dark accordion bg-gradient-primary navbar-dark toggled" style="background: var(--bs-primary-border-subtle);">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center m-0 sidebar-brand" href="/">
<div class="sidebar-brand-icon"><img src="/assets/img/favicon.png" width="44"></div>
<div class="sidebar-brand-text mx-3"><span>FireWallet</span></div>
<div class="mx-3 sidebar-brand-text"><span>FireWallet</span></div>
</a>
<hr class="sidebar-divider my-0">
<hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link" href="/tx"><i class="fas fa-table"></i><span>Transactions</span></a></li>
@@ -40,14 +40,14 @@
<div class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);">
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get">
<div class="container-fluid"><button class="btn btn-link d-md-none me-3 rounded-circle" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
<form class="d-none d-sm-inline-block mw-100 ms-md-3 me-auto my-2 my-md-0 navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for domain" name="q" value="{{search_term}}" style="color: var(--bs-dark-text-emphasis);background: var(--bs-light);"><button class="btn btn-primary py-0" type="submit"><i class="fas fa-search"></i></button></div>
</form><span style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
</form><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);"><span id="hsd-sync-mobile">{{sync}}</span></span><span class="d-inline d-print-none d-sm-inline d-md-inline d-lg-none d-xl-none d-xxl-none" style="color: var(--bs-dark);margin-left: 10px;"><span id="wallet-sync-mobile">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);">Sync: <span id="hsd-sync">{{sync}}</span>%</span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Wallet:&nbsp;<span id="wallet-sync">{{wallet_status}}</span></span><span class="d-none d-print-inline d-sm-none d-md-none d-lg-inline d-xl-inline d-xxl-inline" style="color: var(--bs-dark);margin-left: 10px;">Height: <span id="hsd-height">{{height}}</span></span>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get">
<div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="w-100 me-auto navbar-search" action="/search" method="get">
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ..." name="q" value="{{search_term}}">
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div>
@@ -56,7 +56,7 @@
</li>
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 small" style="color: var(--bs-dark);">{{account}}</span><img class="border rounded-circle img-profile" src="/api/v1/wallet/icon" id="wallet-icon"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a></div>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="/logout"><i class="fas fa-sign-out-alt me-2 fa-sm fa-fw text-gray-400"></i>&nbsp;Logout</a></div>
</div>
</li>
</ul>
@@ -71,9 +71,10 @@
{% if page != 1 %}
<a class="btn btn-primary" role="button" href="/tx?page={{page-1}}">Prev</a>
{% endif %}
{% if txCount == 100 %}
<!-- {% if txCount == 100 %} -->
<!-- {% endif %} -->
<a class="btn btn-primary" role="button" href="/tx?page={{page+1}}">Next</a>
{% endif %}
</div>
</div>
</div>
@@ -81,27 +82,74 @@
<table id="dataTable" class="table my-0">
<thead>
<tr>
<th>Action</th>
<th>Address</th>
<th>Tx</th>
<th>Confirmations</th>
<th>Amount</th>
<th>Date</th>
<th>Transaction</th>
<!-- <th class="hide-mobile">Address</th> -->
<!-- <th class="amount-column">Amount</th> -->
</tr>
</thead>
<tbody>
{{tx|safe}}
<tbody id="transactions-tbody">
<tr id="loading-row">
<td colspan="5" class="text-center">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="mt-2">Loading transactions...</div>
</td>
</tr>
<!-- <tbody>
{{tx|safe}} -->
</tbody>
<tfoot>
<tr>
<td><strong>Action</strong></td>
<td><strong>Address</strong></td>
<td><strong>Tx</strong></td>
<td><strong>Confirmations</strong></td>
<td><strong>Amount</strong></td>
<td><strong>Date</strong></td>
<td><strong>Transaction</strong></td>
<!-- <td class="hide-mobile"><strong>Address</strong></td> -->
<!-- <td class="amount-column"><strong>Amount</strong></td> -->
</tr>
</tfoot>
</table>
</div></div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const page = {{ page }};
const tbody = document.getElementById('transactions-tbody');
const loadingRow = document.getElementById('loading-row');
// Fetch transactions
fetch(`/api/v1/wallet/transactions?page=${page}`)
.then(response => response.json())
.then(data => {
if (data.error) {
tbody.innerHTML = `<tr><td colspan="5" class="text-center text-danger">Error: ${data.error}</td></tr>`;
return;
}
// Replace loading with actual transactions
tbody.innerHTML = data.html;
// Update pagination buttons if needed
updatePagination(data.txCount, page);
})
.catch(error => {
console.error('Error fetching transactions:', error);
tbody.innerHTML = '<tr><td colspan="5" class="text-center text-danger">Failed to load transactions</td></tr>';
});
});
function updatePagination(txCount, currentPage) {
// Update pagination buttons based on transaction count
const prevBtn = document.querySelector('a[href*="page=' + (currentPage - 1) + '"]');
const nextBtn = document.querySelector('a[href*="page=' + (currentPage + 1) + '"]');
if (currentPage <= 1 && prevBtn) {
prevBtn.style.display = 'none';
}
if (txCount < 100 && nextBtn) {
nextBtn.style.display = 'none';
}
}
</script></div>
</div>
</div>
</div>

View File

@@ -1 +1 @@
[data-bs-theme=dark]{--bs-primary:#000000;--bs-primary-rgb:0,0,0;--bs-primary-text-emphasis:#666666;--bs-primary-bg-subtle:#000000;--bs-primary-border-subtle:#000000;--bs-light:#404040;--bs-light-rgb:64,64,64;--bs-light-text-emphasis:#8C8C8C;--bs-light-bg-subtle:#0D0D0D;--bs-light-border-subtle:#262626;--bs-dark:#ffffff;--bs-dark-rgb:255,255,255;--bs-dark-text-emphasis:#FFFFFF;--bs-dark-bg-subtle:#333333;--bs-dark-border-subtle:#999999}.btn-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#000000;--bs-btn-border-color:#000000;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#000000;--bs-btn-disabled-border-color:#000000}.btn-outline-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-primary{--bs-btn-color:#000000;--bs-btn-border-color:#000000;--bs-btn-focus-shadow-rgb:0,0,0;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#000000}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#fff;--bs-btn-bg:#404040;--bs-btn-border-color:#404040;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#363636;--bs-btn-hover-border-color:#333333;--bs-btn-focus-shadow-rgb:226,226,226;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333333;--bs-btn-active-border-color:#303030;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#404040;--bs-btn-disabled-border-color:#404040}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#404040;--bs-btn-border-color:#404040;--bs-btn-focus-shadow-rgb:64,64,64;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#404040;--bs-btn-hover-border-color:#404040;--bs-btn-active-color:#fff;--bs-btn-active-bg:#404040;--bs-btn-active-border-color:#404040;--bs-btn-disabled-color:#404040;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#404040}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#FFFFFF;--bs-btn-hover-border-color:#FFFFFF;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#FFFFFF;--bs-btn-active-border-color:#FFFFFF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}::-webkit-resizer{display:none}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}
[data-bs-theme=dark]{--bs-primary:#000000;--bs-primary-rgb:0,0,0;--bs-primary-text-emphasis:#666666;--bs-primary-bg-subtle:#000000;--bs-primary-border-subtle:#000000;--bs-light:#404040;--bs-light-rgb:64,64,64;--bs-light-text-emphasis:#8C8C8C;--bs-light-bg-subtle:#0D0D0D;--bs-light-border-subtle:#262626;--bs-dark:#ffffff;--bs-dark-rgb:255,255,255;--bs-dark-text-emphasis:#FFFFFF;--bs-dark-bg-subtle:#333333;--bs-dark-border-subtle:#999999}.btn-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#000000;--bs-btn-border-color:#000000;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#000000;--bs-btn-disabled-border-color:#000000}.btn-outline-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-primary{--bs-btn-color:#000000;--bs-btn-border-color:#000000;--bs-btn-focus-shadow-rgb:0,0,0;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#000000}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#fff;--bs-btn-bg:#404040;--bs-btn-border-color:#404040;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#363636;--bs-btn-hover-border-color:#333333;--bs-btn-focus-shadow-rgb:226,226,226;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333333;--bs-btn-active-border-color:#303030;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#404040;--bs-btn-disabled-border-color:#404040}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#404040;--bs-btn-border-color:#404040;--bs-btn-focus-shadow-rgb:64,64,64;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#404040;--bs-btn-hover-border-color:#404040;--bs-btn-active-color:#fff;--bs-btn-active-bg:#404040;--bs-btn-active-border-color:#404040;--bs-btn-disabled-color:#404040;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#404040}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#FFFFFF;--bs-btn-hover-border-color:#FFFFFF;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#FFFFFF;--bs-btn-active-border-color:#FFFFFF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}::-webkit-resizer{display:none}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}.no-display{text-decoration:none}.amount-column{text-align:right;padding-right:10px;white-space:nowrap}.domain-name{text-decoration:none;color:var(--bs-body-color)}@media (max-width:768px){.hide-mobile{display:none!important}

View File

@@ -1 +1 @@
[data-bs-theme=dark]{--bs-primary:#6e0e9c;--bs-primary-rgb:110,14,156;--bs-primary-text-emphasis:#A86EC4;--bs-primary-bg-subtle:#16031F;--bs-primary-border-subtle:#42085E;--bs-light:#404040;--bs-light-rgb:64,64,64;--bs-light-text-emphasis:#8C8C8C;--bs-light-bg-subtle:#0D0D0D;--bs-light-border-subtle:#262626;--bs-dark:#ffffff;--bs-dark-rgb:255,255,255;--bs-dark-text-emphasis:#FFFFFF;--bs-dark-bg-subtle:#333333;--bs-dark-border-subtle:#999999}.btn-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#6e0e9c;--bs-btn-border-color:#6e0e9c;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5E0C85;--bs-btn-hover-border-color:#580B7D;--bs-btn-focus-shadow-rgb:233,219,240;--bs-btn-active-color:#fff;--bs-btn-active-bg:#580B7D;--bs-btn-active-border-color:#530B75;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6e0e9c;--bs-btn-disabled-border-color:#6e0e9c}.btn-outline-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-primary{--bs-btn-color:#6e0e9c;--bs-btn-border-color:#6e0e9c;--bs-btn-focus-shadow-rgb:110,14,156;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6e0e9c;--bs-btn-hover-border-color:#6e0e9c;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6e0e9c;--bs-btn-active-border-color:#6e0e9c;--bs-btn-disabled-color:#6e0e9c;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6e0e9c}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#fff;--bs-btn-bg:#404040;--bs-btn-border-color:#404040;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#363636;--bs-btn-hover-border-color:#333333;--bs-btn-focus-shadow-rgb:226,226,226;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333333;--bs-btn-active-border-color:#303030;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#404040;--bs-btn-disabled-border-color:#404040}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#404040;--bs-btn-border-color:#404040;--bs-btn-focus-shadow-rgb:64,64,64;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#404040;--bs-btn-hover-border-color:#404040;--bs-btn-active-color:#fff;--bs-btn-active-bg:#404040;--bs-btn-active-border-color:#404040;--bs-btn-disabled-color:#404040;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#404040}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#FFFFFF;--bs-btn-hover-border-color:#FFFFFF;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#FFFFFF;--bs-btn-active-border-color:#FFFFFF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}
[data-bs-theme=dark]{--bs-primary:#6e0e9c;--bs-primary-rgb:110,14,156;--bs-primary-text-emphasis:#A86EC4;--bs-primary-bg-subtle:#16031F;--bs-primary-border-subtle:#42085E;--bs-light:#404040;--bs-light-rgb:64,64,64;--bs-light-text-emphasis:#8C8C8C;--bs-light-bg-subtle:#0D0D0D;--bs-light-border-subtle:#262626;--bs-dark:#ffffff;--bs-dark-rgb:255,255,255;--bs-dark-text-emphasis:#FFFFFF;--bs-dark-bg-subtle:#333333;--bs-dark-border-subtle:#999999}.btn-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#6e0e9c;--bs-btn-border-color:#6e0e9c;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5E0C85;--bs-btn-hover-border-color:#580B7D;--bs-btn-focus-shadow-rgb:233,219,240;--bs-btn-active-color:#fff;--bs-btn-active-bg:#580B7D;--bs-btn-active-border-color:#530B75;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6e0e9c;--bs-btn-disabled-border-color:#6e0e9c}.btn-outline-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-primary{--bs-btn-color:#6e0e9c;--bs-btn-border-color:#6e0e9c;--bs-btn-focus-shadow-rgb:110,14,156;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6e0e9c;--bs-btn-hover-border-color:#6e0e9c;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6e0e9c;--bs-btn-active-border-color:#6e0e9c;--bs-btn-disabled-color:#6e0e9c;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6e0e9c}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#fff;--bs-btn-bg:#404040;--bs-btn-border-color:#404040;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#363636;--bs-btn-hover-border-color:#333333;--bs-btn-focus-shadow-rgb:226,226,226;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333333;--bs-btn-active-border-color:#303030;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#404040;--bs-btn-disabled-border-color:#404040}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#404040;--bs-btn-border-color:#404040;--bs-btn-focus-shadow-rgb:64,64,64;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#404040;--bs-btn-hover-border-color:#404040;--bs-btn-active-color:#fff;--bs-btn-active-bg:#404040;--bs-btn-active-border-color:#404040;--bs-btn-disabled-color:#404040;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#404040}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#FFFFFF;--bs-btn-hover-border-color:#FFFFFF;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#FFFFFF;--bs-btn-active-border-color:#FFFFFF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}.no-display{text-decoration:none}.amount-column{text-align:right;padding-right:10px;white-space:nowrap}.domain-name{text-decoration:none;color:var(--bs-body-color)}@media (max-width:768px){.hide-mobile{display:none!important}

View File

@@ -1 +1 @@
[data-bs-theme=dark]{--bs-primary:#1a0023;--bs-primary-rgb:26,0,35;--bs-primary-text-emphasis:#76667B;--bs-primary-bg-subtle:#050007;--bs-primary-border-subtle:#100015;--bs-light:#404040;--bs-light-rgb:64,64,64;--bs-light-text-emphasis:#8C8C8C;--bs-light-bg-subtle:#0D0D0D;--bs-light-border-subtle:#262626;--bs-dark:#ffffff;--bs-dark-rgb:255,255,255;--bs-dark-text-emphasis:#FFFFFF;--bs-dark-bg-subtle:#333333;--bs-dark-border-subtle:#999999}.btn-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#1a0023;--bs-btn-border-color:#1a0023;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#16001E;--bs-btn-hover-border-color:#15001C;--bs-btn-focus-shadow-rgb:221,217,222;--bs-btn-active-color:#fff;--bs-btn-active-bg:#15001C;--bs-btn-active-border-color:#14001A;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#1a0023;--bs-btn-disabled-border-color:#1a0023}.btn-outline-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-primary{--bs-btn-color:#1a0023;--bs-btn-border-color:#1a0023;--bs-btn-focus-shadow-rgb:26,0,35;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1a0023;--bs-btn-hover-border-color:#1a0023;--bs-btn-active-color:#fff;--bs-btn-active-bg:#1a0023;--bs-btn-active-border-color:#1a0023;--bs-btn-disabled-color:#1a0023;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1a0023}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#fff;--bs-btn-bg:#404040;--bs-btn-border-color:#404040;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#363636;--bs-btn-hover-border-color:#333333;--bs-btn-focus-shadow-rgb:226,226,226;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333333;--bs-btn-active-border-color:#303030;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#404040;--bs-btn-disabled-border-color:#404040}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#404040;--bs-btn-border-color:#404040;--bs-btn-focus-shadow-rgb:64,64,64;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#404040;--bs-btn-hover-border-color:#404040;--bs-btn-active-color:#fff;--bs-btn-active-bg:#404040;--bs-btn-active-border-color:#404040;--bs-btn-disabled-color:#404040;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#404040}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#FFFFFF;--bs-btn-hover-border-color:#FFFFFF;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#FFFFFF;--bs-btn-active-border-color:#FFFFFF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}
[data-bs-theme=dark]{--bs-primary:#1a0023;--bs-primary-rgb:26,0,35;--bs-primary-text-emphasis:#76667B;--bs-primary-bg-subtle:#050007;--bs-primary-border-subtle:#100015;--bs-light:#404040;--bs-light-rgb:64,64,64;--bs-light-text-emphasis:#8C8C8C;--bs-light-bg-subtle:#0D0D0D;--bs-light-border-subtle:#262626;--bs-dark:#ffffff;--bs-dark-rgb:255,255,255;--bs-dark-text-emphasis:#FFFFFF;--bs-dark-bg-subtle:#333333;--bs-dark-border-subtle:#999999}.btn-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#1a0023;--bs-btn-border-color:#1a0023;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#16001E;--bs-btn-hover-border-color:#15001C;--bs-btn-focus-shadow-rgb:221,217,222;--bs-btn-active-color:#fff;--bs-btn-active-bg:#15001C;--bs-btn-active-border-color:#14001A;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#1a0023;--bs-btn-disabled-border-color:#1a0023}.btn-outline-primary[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-primary{--bs-btn-color:#1a0023;--bs-btn-border-color:#1a0023;--bs-btn-focus-shadow-rgb:26,0,35;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1a0023;--bs-btn-hover-border-color:#1a0023;--bs-btn-active-color:#fff;--bs-btn-active-bg:#1a0023;--bs-btn-active-border-color:#1a0023;--bs-btn-disabled-color:#1a0023;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1a0023}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#fff;--bs-btn-bg:#404040;--bs-btn-border-color:#404040;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#363636;--bs-btn-hover-border-color:#333333;--bs-btn-focus-shadow-rgb:226,226,226;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333333;--bs-btn-active-border-color:#303030;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#404040;--bs-btn-disabled-border-color:#404040}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#404040;--bs-btn-border-color:#404040;--bs-btn-focus-shadow-rgb:64,64,64;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#404040;--bs-btn-hover-border-color:#404040;--bs-btn-active-color:#fff;--bs-btn-active-bg:#404040;--bs-btn-active-border-color:#404040;--bs-btn-disabled-color:#404040;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#404040}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#FFFFFF;--bs-btn-hover-border-color:#FFFFFF;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#FFFFFF;--bs-btn-active-border-color:#FFFFFF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}.no-display{text-decoration:none}.amount-column{text-align:right;padding-right:10px;white-space:nowrap}.domain-name{text-decoration:none;color:var(--bs-body-color)}@media (max-width:768px){.hide-mobile{display:none!important}

View File

@@ -1 +1 @@
[data-bs-theme=dark]{--bs-light:#ffffff;--bs-light-rgb:255,255,255;--bs-light-text-emphasis:#FFFFFF;--bs-light-bg-subtle:#333333;--bs-light-border-subtle:#999999;--bs-dark:#000000;--bs-dark-rgb:0,0,0;--bs-dark-text-emphasis:#666666;--bs-dark-bg-subtle:#000000;--bs-dark-border-subtle:#000000}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#D9D9D9;--bs-btn-hover-border-color:#CCCCCC;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#CCCCCC;--bs-btn-active-border-color:#BFBFBF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#000000;--bs-btn-border-color:#000000;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#000000;--bs-btn-disabled-border-color:#000000}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#000000;--bs-btn-border-color:#000000;--bs-btn-focus-shadow-rgb:0,0,0;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#000000}::-webkit-resizer{display:none}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}
[data-bs-theme=dark]{--bs-light:#ffffff;--bs-light-rgb:255,255,255;--bs-light-text-emphasis:#FFFFFF;--bs-light-bg-subtle:#333333;--bs-light-border-subtle:#999999;--bs-dark:#000000;--bs-dark-rgb:0,0,0;--bs-dark-text-emphasis:#666666;--bs-dark-bg-subtle:#000000;--bs-dark-border-subtle:#000000}.btn-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-light{--bs-btn-color:#000000;--bs-btn-bg:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#D9D9D9;--bs-btn-hover-border-color:#CCCCCC;--bs-btn-focus-shadow-rgb:38,38,38;--bs-btn-active-color:#000000;--bs-btn-active-bg:#CCCCCC;--bs-btn-active-border-color:#BFBFBF;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:#ffffff;--bs-btn-disabled-border-color:#ffffff}.btn-outline-light[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-light{--bs-btn-color:#ffffff;--bs-btn-border-color:#ffffff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-hover-color:#000000;--bs-btn-hover-bg:#ffffff;--bs-btn-hover-border-color:#ffffff;--bs-btn-active-color:#000000;--bs-btn-active-bg:#ffffff;--bs-btn-active-border-color:#ffffff;--bs-btn-disabled-color:#ffffff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffffff}.btn-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#000000;--bs-btn-border-color:#000000;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#000000;--bs-btn-disabled-border-color:#000000}.btn-outline-dark[data-bs-theme=dark],[data-bs-theme=dark] .btn-outline-dark{--bs-btn-color:#000000;--bs-btn-border-color:#000000;--bs-btn-focus-shadow-rgb:0,0,0;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#000000;--bs-btn-hover-border-color:#000000;--bs-btn-active-color:#fff;--bs-btn-active-bg:#000000;--bs-btn-active-border-color:#000000;--bs-btn-disabled-color:#000000;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#000000}::-webkit-resizer{display:none}.stick-right{position:absolute;right:25px}.error:after{content:attr(data-text);position:absolute;left:2px;text-shadow:-1px 0 #e74a3b;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:2s linear infinite alternate-reverse noise-anim}.error:before{content:attr(data-text);position:absolute;left:-2px;text-shadow:1px 0 #4e73df;top:0;color:#5a5c69;background:var(--bs-primary);overflow:hidden;clip:rect(0,900px,0,0);animation:3s linear infinite alternate-reverse noise-anim-2}.no-display{text-decoration:none}.amount-column{text-align:right;padding-right:10px;white-space:nowrap}.domain-name{text-decoration:none;color:var(--bs-body-color)}@media (max-width:768px){.hide-mobile{display:none!important}