110 Commits

Author SHA1 Message Date
59000afa87 feat: Cleanup function layouts for alerts
All checks were successful
Tests and Linting / Tests-Linting (3.11) (push) Successful in 35s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 40s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 37s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 51s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 50s
2025-09-09 17:34:36 +10:00
699a74f093 feat: Add api route to dismiss alert
All checks were successful
Tests and Linting / Tests-Linting (3.11) (push) Successful in 29s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 36s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 37s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 42s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 47s
2025-09-09 17:29:11 +10:00
6096f82c4d feat: Add an alert framework
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 3m6s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 3m9s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 3m18s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 3m17s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 3m25s
2025-09-09 17:24:39 +10:00
4353eb8fa4 feat: Use new proxied script url
All checks were successful
Tests and Linting / Tests-Linting (3.10) (push) Successful in 32s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 33s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 38s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 48s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 54s
2025-09-04 22:05:16 +10:00
344cde07d0 feat: Add more info about the installation script to readme
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 1m4s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 1m12s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 1m48s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 1m52s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 3m51s
2025-09-04 21:36:30 +10:00
2fb841aeaf fix: Update link for installation script to use raw
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Has been cancelled
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Has been cancelled
Tests and Linting / Tests-Linting (3.10) (push) Has been cancelled
Tests and Linting / Tests-Linting (3.13) (push) Has been cancelled
Tests and Linting / Tests-Linting (3.11) (push) Has been cancelled
2025-09-04 21:34:19 +10:00
60df317f78 feat: Add install script to readme
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Has started running
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Has been cancelled
Tests and Linting / Tests-Linting (3.11) (push) Has been cancelled
Tests and Linting / Tests-Linting (3.10) (push) Has been cancelled
Tests and Linting / Tests-Linting (3.13) (push) Has been cancelled
2025-09-04 21:33:28 +10:00
4c1ea9fb12 feat: Add installation and start scripts 2025-09-04 21:29:47 +10:00
58ed636ce3 fix: Use git --version instead of short -v to allow for backwards compatability
The default git installed in ubuntu doesn't allow -v
2025-09-04 21:29:05 +10:00
e537c323c2 fix: Update paths to be consistent
All checks were successful
Tests and Linting / Tests-Linting (3.11) (push) Successful in 32s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 43s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 45s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 51s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 59s
2025-09-02 18:15:56 +10:00
812fc84d3e feat: Allow zapping txs of a different age
All checks were successful
Tests and Linting / Tests-Linting (3.11) (push) Successful in 31s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 34s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 35s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 42s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 45s
2025-09-02 17:58:40 +10:00
6d318a597b feat: Add API info to settings page
This is most useful when using an internal node with a random api key
2025-09-02 17:54:56 +10:00
83bd6b9643 feat: Reword workflow
All checks were successful
Tests and Linting / Tests-Linting (3.11) (push) Successful in 36s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 50s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 1m10s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 3m15s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 3m17s
2025-09-02 17:23:13 +10:00
c93b2652f5 Merge pull request 'Add CI workflow to test code with older versions of python' (#6) from feat/ci-testing into main
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 3m7s
Test Python Compatibility / Python-Compatibility (3.10) (push) Successful in 4m59s
Test Python Compatibility / Python-Compatibility (3.11) (push) Successful in 4m57s
Test Python Compatibility / Python-Compatibility (3.13) (push) Successful in 1m58s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 7m3s
Reviewed-on: #6
2025-09-02 16:08:35 +10:00
86e174c337 fix: Lint default plugins
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 50s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 52s
Test Python Compatibility / Python-Compatibility (3.11) (push) Successful in 1m55s
Test Python Compatibility / Python-Compatibility (3.10) (push) Successful in 1m57s
Test Python Compatibility / Python-Compatibility (3.13) (push) Successful in 1m45s
2025-09-02 15:58:55 +10:00
e7b787c30b fix: Lint to follow ruff standards
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 45s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 44s
Test Python Compatibility / Python-Compatibility (3.11) (push) Failing after 22s
Test Python Compatibility / Python-Compatibility (3.13) (push) Failing after 22s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 1m37s
2025-09-02 15:55:45 +10:00
997828795a feat: Add ruff linting
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 43s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 46s
Test Python Compatibility / Python-Compatibility (3.11) (push) Failing after 1m40s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 1m44s
Test Python Compatibility / Python-Compatibility (3.13) (push) Failing after 1m40s
2025-09-02 15:48:21 +10:00
30de2d585e fix: Use single quote in sign message and reduce test versions
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 49s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 53s
Test Python Compatibility / Python-Compatibility (3.10) (push) Successful in 1m45s
Test Python Compatibility / Python-Compatibility (3.13) (push) Successful in 1m44s
Test Python Compatibility / Python-Compatibility (3.8) (push) Failing after 1m24s
2025-09-02 15:28:39 +10:00
56eabfc1fc feat: Add some inital tests
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 46s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 49s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 1m38s
Test Python Compatibility / Python-Compatibility (3.13) (push) Successful in 1m51s
Test Python Compatibility / Python-Compatibility (3.6) (push) Failing after 22s
Test Python Compatibility / Python-Compatibility (3.7) (push) Failing after 1m16s
Test Python Compatibility / Python-Compatibility (3.8) (push) Failing after 1m29s
Test Python Compatibility / Python-Compatibility (3.9) (push) Failing after 1m28s
2025-09-02 15:20:31 +10:00
e0f24267f5 test: Try a new container to run
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 57s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 1m0s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 3m23s
Test Python Compatibility / Python-Compatibility (3.13) (push) Failing after 3m27s
Test Python Compatibility / Python-Compatibility (3.6) (push) Failing after 23s
Test Python Compatibility / Python-Compatibility (3.7) (push) Failing after 1m19s
Test Python Compatibility / Python-Compatibility (3.8) (push) Failing after 1m42s
Test Python Compatibility / Python-Compatibility (3.9) (push) Failing after 1m35s
2025-09-02 15:10:23 +10:00
2d51882d20 fix: Specify python minor version number
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 49s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 48s
Test Python Compatibility / Python-Compatibility (3.10.18) (push) Failing after 19s
Test Python Compatibility / Python-Compatibility (3.13.7) (push) Failing after 19s
Test Python Compatibility / Python-Compatibility (3.6.15) (push) Failing after 21s
Test Python Compatibility / Python-Compatibility (3.7.17) (push) Failing after 20s
Test Python Compatibility / Python-Compatibility (3.8.18) (push) Failing after 20s
Test Python Compatibility / Python-Compatibility (3.9.23) (push) Failing after 19s
2025-09-02 15:00:40 +10:00
06b1eea9ef fix: Disable arm on testing workflow
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 52s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 52s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 1m2s
Test Python Compatibility / Python-Compatibility (3.6) (push) Failing after 1m1s
Test Python Compatibility / Python-Compatibility (3.7) (push) Failing after 22s
Test Python Compatibility / Python-Compatibility (3.8) (push) Failing after 21s
Test Python Compatibility / Python-Compatibility (3.9) (push) Failing after 18s
2025-09-02 14:55:40 +10:00
d483cfdcfd feat: Add testing CI workflow
Some checks failed
Test Python Compatibility / Python-Compatibility (3.6) (push) Failing after 45s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 47s
Test Python Compatibility / Python-Compatibility (3.7) (push) Failing after 11s
Test Python Compatibility / Python-Compatibility (3.8) (push) Failing after 9s
Test Python Compatibility / Python-Compatibility (3.9) (push) Failing after 7s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 2m10s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 2m13s
2025-09-02 14:49:14 +10:00
46ed0173d3 fix: Remove broken label
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 40s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 43s
2025-08-29 23:18:49 +10:00
9dd50d1292 fix: Use full image name in compose 2025-08-29 23:17:10 +10:00
53148f573e revert: Use old manual install method
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 51s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 4m18s
2025-08-29 23:11:47 +10:00
e8f052e0d1 feat: Try using matrix
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Failing after 32s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Failing after 11m41s
2025-08-29 23:03:50 +10:00
7f450d620a revert: Use older checkout
Some checks failed
Build Docker / Build Image (push) Has been cancelled
Build Docker / Build Image with HSD (push) Has been cancelled
2025-08-29 22:55:32 +10:00
41a1bc743f feat: Try new syntax for gitea action
Some checks failed
Build Docker / Build Image (push) Failing after 17s
Build Docker / Build Image with HSD (push) Failing after 23s
2025-08-29 22:53:44 +10:00
30108e3bc5 fix: Extra backslash in CI/CD pipeline
All checks were successful
Build Docker / Build Image (push) Successful in 38s
Build Docker / Build Image with HSD (push) Successful in 50s
2025-08-29 22:42:59 +10:00
a2dc9f43e3 feat: Add docker support for inbuilt HSD
Some checks failed
Build Docker / Build Image with HSD (push) Failing after 36s
Build Docker / Build Image (push) Failing after 38s
2025-08-29 22:40:30 +10:00
1203719eac fix: Docker python version and fix reporting missing requirements
All checks were successful
Build Docker / Build Image (push) Successful in 2m58s
2025-08-29 13:28:12 +10:00
373a71f04d Merge pull request 'SPV support & add internal HSD node' (#4) from feat/internal_hsd into main
All checks were successful
Build Docker / Build Image (push) Successful in 2m13s
Reviewed-on: #4
2025-08-29 13:04:30 +10:00
b76b873036 feat: Update readme
All checks were successful
Build Docker / Build Image (push) Successful in 54s
2025-08-28 17:50:47 +10:00
23e714fad8 feat: Add additional node info to settings
All checks were successful
Build Docker / Build Image (push) Successful in 45s
2025-08-28 17:27:45 +10:00
a36c69ecfc fix: Add SPV support for getDNS()
All checks were successful
Build Docker / Build Image (push) Successful in 55s
2025-08-28 17:18:52 +10:00
1fd9987bf1 feat: Upgrade tx page caches to a sqlite db 2025-08-28 17:13:23 +10:00
f2cda461ba feat: Add SPV features to fix accoutn balances
All checks were successful
Build Docker / Build Image (push) Successful in 2m9s
2025-08-28 16:42:12 +10:00
26c5b4a4fa feat: Update configuration storage and overrides
All checks were successful
Build Docker / Build Image (push) Successful in 53s
2025-08-26 18:04:07 +10:00
7fdc4a3122 fix: SPV causes some domains to not be recognized as owned by the wallet
All checks were successful
Build Docker / Build Image (push) Successful in 50s
2025-08-26 17:31:25 +10:00
5ff8960b7b feat: Add initial internal node option
All checks were successful
Build Docker / Build Image (push) Successful in 10m29s
2025-08-26 16:44:10 +10:00
4c84bc2bbe fix: Use hsd.hns.au to get name from namehash in order to only import account once 2025-08-26 15:26:19 +10:00
49e378803d fix: Use existing hsd from accounts module to get name from hash
All checks were successful
Build Docker / Build Image (push) Successful in 2m7s
2025-08-26 12:52:14 +10:00
1c53547047 feat: Add env flag to disable WALLET DNS record lookup
All checks were successful
Build Docker / Build Image (push) Successful in 47s
2025-08-25 18:10:03 +10:00
080c4402d8 Merge pull request 'Add WALLET DNS record for sending using domain alias' (#3) from feat/WALLETDNS into main
All checks were successful
Build Docker / Build Image (push) Successful in 53s
Reviewed-on: #3
2025-08-25 13:59:15 +10:00
792688064e fix: More code cleanup
All checks were successful
Build Docker / Build Image (push) Successful in 2m9s
2025-08-25 12:43:12 +10:00
599c0df00c feat: Add more code cleanup
All checks were successful
Build Docker / Build Image (push) Successful in 51s
2025-08-25 12:36:11 +10:00
a619d78efd fix: Update types to make code more reliable 2025-08-25 12:28:26 +10:00
f090b7b71a feat: Add initial WALLET DNS record support
All checks were successful
Build Docker / Build Image (push) Successful in 2m46s
2025-08-25 11:55:15 +10:00
545a0b9475 fix: Add display for OPEN transactions in tx history
All checks were successful
Build Docker / Build Image (push) Successful in 2m44s
2025-08-18 11:33:47 +10:00
501091eeae Merge pull request 'feat/mempool-bids' (#2) from feat/mempool-bids into main
All checks were successful
Build Docker / Build Image (push) Successful in 2m19s
Reviewed-on: #2
2025-07-17 16:54:38 +10:00
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
56 changed files with 2887 additions and 1041 deletions

32
.dockerignore Normal file
View File

@@ -0,0 +1,32 @@
.env
.env*
__pycache__/
templates/assets/css/styles.min.css
ignore/
plugins/signatures.json
.venv/
user_data/
customPlugins/
cache/
build/
dist/
hsd/
hsd-data/
hsd.lock
hsdconfig.json
Dockerfile
Dockerfile.hsd
FireWalletBrowser.bsdesign
LICENSE.md
README.md
docker-compose.yml
example.env
plugins.md

View File

@@ -4,11 +4,22 @@ on:
push: push:
jobs: jobs:
Build Image: Build Images:
runs-on: [ubuntu-latest, amd] runs-on: [ubuntu-latest, amd]
strategy:
matrix:
variant:
- target: default
tag_suffix: ""
dockerfile: "Dockerfile"
- target: hsd
tag_suffix: "-hsd"
dockerfile: "Dockerfile.hsd"
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: Install Docker - name: Install Docker
run : | run : |
apt-get install ca-certificates curl gnupg apt-get install ca-certificates curl gnupg
@@ -17,7 +28,7 @@ jobs:
chmod a+r /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update apt-get update
apt-get install docker-ce-cli -y apt-get install docker-ce-cli -y
- name: Build Docker image - name: Build Docker image
run : | run : |
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
@@ -34,8 +45,8 @@ jobs:
fi fi
docker build -t firewallet:$tag_num . docker build --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') --build-arg VCS_REF=$GITEA_SHA --build-arg VERSION=$GITEA_TAG --file ${{matrix.variant.dockerfile}} -t firewallet${{matrix.variant.tag_suffix}}:$tag_num .
docker tag firewallet:$tag_num git.woodburn.au/nathanwoodburn/firewallet:$tag_num docker tag firewallet${{matrix.variant.tag_suffix}}:$tag_num git.woodburn.au/nathanwoodburn/firewallet${{matrix.variant.tag_suffix}}:$tag_num
docker push git.woodburn.au/nathanwoodburn/firewallet:$tag_num docker push git.woodburn.au/nathanwoodburn/firewallet${{matrix.variant.tag_suffix}}:$tag_num
docker tag firewallet:$tag_num git.woodburn.au/nathanwoodburn/firewallet:$tag docker tag firewallet${{matrix.variant.tag_suffix}}:$tag_num git.woodburn.au/nathanwoodburn/firewallet${{matrix.variant.tag_suffix}}:$tag
docker push git.woodburn.au/nathanwoodburn/firewallet:$tag docker push git.woodburn.au/nathanwoodburn/firewallet${{matrix.variant.tag_suffix}}:$tag

40
.gitea/workflows/test.yml Normal file
View File

@@ -0,0 +1,40 @@
name: Tests and Linting
run-name: Python Compatibility and Linting tests
on:
push:
jobs:
Tests-Linting:
runs-on: [ubuntu-latest, amd]
container: catthehacker/ubuntu:act-latest
strategy:
matrix:
python-version: ['3.10', '3.11', '3.13']
fail-fast: false
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then
pip install -r requirements.txt
fi
pip install pytest ruff
- name: Test with pytest
run: |
echo "Testing with Python ${{ matrix.python-version }}"
python -m pytest main.py
- name: Lint with ruff
run: |
echo "Linting with Python ${{ matrix.python-version }}"
ruff check

8
.gitignore vendored
View File

@@ -13,4 +13,10 @@ plugins/signatures.json
user_data/ user_data/
customPlugins/ customPlugins/
cache/ cache/
build/
dist/
hsd/
hsd_data/
hsd.lock
hsdconfig.json

View File

@@ -1,7 +1,7 @@
FROM --platform=$BUILDPLATFORM python:3.10-alpine AS builder FROM --platform=$BUILDPLATFORM python:3.13-alpine AS builder
WORKDIR /app WORKDIR /app
RUN apk add git openssl curl
COPY requirements.txt /app COPY requirements.txt /app
RUN --mount=type=cache,target=/root/.cache/pip \ RUN --mount=type=cache,target=/root/.cache/pip \
pip3 install -r requirements.txt pip3 install -r requirements.txt
@@ -9,10 +9,21 @@ RUN --mount=type=cache,target=/root/.cache/pip \
COPY . /app COPY . /app
# Add mount point for data volume # Add mount point for data volume
# VOLUME /data VOLUME /app/user_data
RUN apk add git openssl
ARG BUILD_DATE
ARG VCS_REF
LABEL org.opencontainers.image.title="FireWallet" \
org.opencontainers.image.description="The Handshake Wallet That is Fire" \
org.opencontainers.image.url="https://firewallet.au" \
org.opencontainers.image.source="https://git.woodburn.au/nathanwoodburn/firewalletbrowser" \
org.opencontainers.image.version="2.0.0" \
org.opencontainers.image.created=$BUILD_DATE \
org.opencontainers.image.licenses="AGPL-3.0-only"
ENTRYPOINT ["python3"] ENTRYPOINT ["python3"]
CMD ["server.py"] CMD ["server.py"]
FROM builder as dev-envs FROM builder AS dev-envs

57
Dockerfile.hsd Normal file
View File

@@ -0,0 +1,57 @@
# ---- HSD build stage ----
FROM node:22-alpine AS hsd-build
WORKDIR /opt/hsd
RUN apk add --no-cache git bash unbound-dev gmp-dev g++ gcc make python3
RUN git clone --depth=1 --branch v8.0.0 https://github.com/handshake-org/hsd.git .
RUN npm install --omit=dev
# ---- Final stage ----
FROM python:3.13-alpine
WORKDIR /app
# Install runtime deps only
RUN apk add --no-cache unbound-dev gmp
# Copy node and npm from hsd-build stage
COPY --from=hsd-build /usr/local/bin/node /usr/local/bin/node
COPY --from=hsd-build /usr/local/lib/node_modules/npm /usr/local/lib/node
COPY --from=hsd-build /usr/local/bin/npm /usr/local/bin/npm
# Copy FireWallet dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy HSD from build stage
COPY --from=hsd-build /opt/hsd /app/hsd
# Copy FireWallet source
COPY . .
# Expose ports
EXPOSE 5000
# Optional HSD ports
# EXPOSE 12037
# EXPOSE 12039
ENV INTERNAL_HSD=true
ENV HSD_DOCKER_CONTAINER=true
ARG BUILD_DATE
ARG VCS_REF
LABEL org.opencontainers.image.title="FireWallet (HSD)" \
org.opencontainers.image.description="The Handshake Wallet That is Fire" \
org.opencontainers.image.url="https://firewallet.au" \
org.opencontainers.image.source="https://git.woodburn.au/nathanwoodburn/firewalletbrowser" \
org.opencontainers.image.version="2.0.0" \
org.opencontainers.image.created=$BUILD_DATE \
org.opencontainers.image.licenses="AGPL-3.0-only"
VOLUME ["/app/hsd_data", "/app/user_data"]
ENTRYPOINT ["python3"]
CMD ["server.py"]

Binary file not shown.

View File

@@ -13,6 +13,17 @@ cp example.env .env
Edit .env to have your HSD api key. Edit .env to have your HSD api key.
If you have HSD runnning on a separate computer also add the IP here If you have HSD runnning on a separate computer also add the IP here
For a quick and easy installation on ubuntu/debian you can run the install.sh script
```bash
curl https://firewallet.au/install.sh | bash
```
This will install all dependencies (including Node/NPM for an internal HSD node), create a python virtual environment and install the required python packages.
After the script has run you can start the wallet with
```bash
./start.sh
```
## Usage ## Usage
Make sure HSD is running then run the following commands: Make sure HSD is running then run the following commands:
@@ -122,11 +133,46 @@ HSD_IP: HSD IP address
THEME: Theme to use (dark-purple, black) THEME: Theme to use (dark-purple, black)
SHOW_EXPIRED: Show expired domains (true/false) SHOW_EXPIRED: Show expired domains (true/false)
EXCLUDE: Comma separated list of wallets to exclude from the wallet list (default primary) 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) HSD_NETWORK: Network to connect to (main, regtest, simnet)
DISABLE_WALLETDNS: Disable Wallet DNS records when sending HNS to domains (true/false)
INTERNAL_HSD: Use internal HSD node (true/false)
``` ```
# Internal HSD
If you set INTERNAL_HSD=true in the .env file the wallet will start and manage its own HSD node. If you want to override the default HSD config create a file called hsdconfig.json in the same directory as main.py and change the values you want to override. For example to disable SPV and use an existing bob wallet sync (on linux) and set the agent to "SuperCoolDev" you could use the following:
```json
{
"spv": false,
"prefix":"~/.config/Bob/hsd_data",
"flags":[
"--agent=SuperCoolDev"
]
}
```
Supported config options are:
```yaml
spv: true/false
prefix: path to hsd data directory
flags: list of additional flags to pass to hsd
version: version of hsd to use (used when installing HSD from source)
chainMigrate: <int> (for users migrating from older versions of HSD)
walletMigrate: <int> (for users migrating from older versions of HSD)
```
## Support the Project
If you find FireWallet useful and would like to support its continued development, please consider making a donation. Your contributions help maintain the project and develop new features.
HNS donations can be sent to: `hs1qh7uzytf2ftwkd9dmjjs7az9qfver5m7dd7x4ej`
Other donation options can be found at [my website](https://nathan.woodburn.au/donate)
Thank you for your support!
## Warnings ## Warnings
- This is a work in progress and is not guaranteed to work - This is a work in progress and is not guaranteed to work

1391
account.py

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
services:
firewallet:
image: git.woodburn.au/nathanwoodburn/firewallet-hsd:latest
ports:
- "5000:5000"
volumes:
- hsd_data:/app/hsd_data
- user_data:/app/user_data
volumes:
hsd_data:
user_data:

26
docker-compose.yml Normal file
View File

@@ -0,0 +1,26 @@
services:
hsd:
image: ghcr.io/handshake-org/hsd:8
volumes:
- hsd_data:/root/.hsd
environment:
- HSD_HTTP_HOST=0.0.0.0
- HSD_WALLET_HTTP_HOST=0.0.0.0
- HSD_LOG_LEVEL=error
- HSD_API_KEY=changeme
firewallet:
image: git.woodburn.au/nathanwoodburn/firewallet:latest
ports:
- "5000:5000"
environment:
- HSD_IP=hsd
- HSD_API=changeme
volumes:
- user_data:/app/user_data
volumes:
hsd_data:
user_data:

View File

@@ -6,10 +6,13 @@ import subprocess
import binascii import binascii
import datetime import datetime
import dns.asyncresolver import dns.asyncresolver
import dns.message
import dns.query
import dns.rdatatype
import httpx import httpx
from requests_doh import DNSOverHTTPSSession, add_dns_provider from requests_doh import DNSOverHTTPSSession, add_dns_provider
import requests
import urllib3 import urllib3
from cryptography.x509.oid import ExtensionOID
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Disable insecure request warnings (since we are manually verifying the certificate) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Disable insecure request warnings (since we are manually verifying the certificate)
@@ -56,7 +59,7 @@ def hip2(domain: str):
domains = [] domains = []
for ext in cert_obj.extensions: for ext in cert_obj.extensions:
if ext.oid == x509.ExtensionOID.SUBJECT_ALTERNATIVE_NAME: if ext.oid == ExtensionOID.SUBJECT_ALTERNATIVE_NAME:
san_list = ext.value.get_values_for_type(x509.DNSName) san_list = ext.value.get_values_for_type(x509.DNSName)
domains.extend(san_list) domains.extend(san_list)
@@ -120,13 +123,39 @@ def hip2(domain: str):
print(f"Hip2: Lookup failed with error: {e}",flush=True) print(f"Hip2: Lookup failed with error: {e}",flush=True)
return "Hip2: Lookup failed." return "Hip2: Lookup failed."
def wallet_txt(domain: str, doh_url="https://hnsdoh.com/dns-query"):
with httpx.Client() as client:
q = dns.message.make_query(domain, dns.rdatatype.from_text("TYPE262"))
r = dns.query.https(q, doh_url, session=client)
if not r.answer:
return "No wallet address found for this domain"
wallet_record = "No WALLET record found"
for ans in r.answer:
raw = ans[0].to_wire() # type: ignore
try:
data = raw[1:].decode("utf-8", errors="ignore")
except UnicodeDecodeError:
return f"Unknown WALLET record format: {raw.hex()}"
if data.startswith("HNS:"):
wallet_record = data[4:]
break
elif data.startswith("HNS "):
wallet_record = data[4:]
break
elif data.startswith('"HNS" '):
wallet_record = data[6:].strip('"')
break
return wallet_record
def resolve_with_doh(query_name, doh_url="https://hnsdoh.com/dns-query"): def resolve_with_doh(query_name, doh_url="https://hnsdoh.com/dns-query"):
with httpx.Client() as client: with httpx.Client() as client:
q = dns.message.make_query(query_name, dns.rdatatype.A) q = dns.message.make_query(query_name, dns.rdatatype.A)
r = dns.query.https(q, doh_url, session=client) r = dns.query.https(q, doh_url, session=client)
ip = r.answer[0][0].address ip = r.answer[0][0].address # type: ignore
return ip return ip
def resolve_TLSA_with_doh(query_name, doh_url="https://hnsdoh.com/dns-query"): def resolve_TLSA_with_doh(query_name, doh_url="https://hnsdoh.com/dns-query"):
@@ -138,44 +167,15 @@ def resolve_TLSA_with_doh(query_name, doh_url="https://hnsdoh.com/dns-query"):
tlsa = r.answer[0][0] tlsa = r.answer[0][0]
return tlsa 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): def emoji_to_punycode(emoji):
try: try:
return emoji.encode("idna").decode("ascii") return emoji.encode("idna").decode("ascii")
except Exception as e: except Exception:
return emoji return emoji
def punycode_to_emoji(punycode): def punycode_to_emoji(punycode):
try: try:
return punycode.encode("ascii").decode("idna") return punycode.encode("ascii").decode("idna")
except Exception as e: except Exception:
return punycode return punycode

View File

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

View File

@@ -1,45 +0,0 @@
What have you built previously?
- [HNSHosting](https://hnshosting.au)
- [ShakeCities](https://shakecities.com)
- [FireWallet](https://firewallet.au)
- [Git Profile](https://github.com/nathanwoodburn)
Project summary
A Handshake wallet web ui. This will be a HSD wallet web ui that will allow users to manage their Handshake domains via a web interface. This will allow users to easily manage their domains without having to use the command line or bob. One benefit of this is that it will allow users to easily manage their domains from their mobile devices that don't have access to any HNS wallet. This could be done in a secure way by only allowing connections on local network devices (in addition to requiring the wallet credentials).
Features:
- Login with HSD wallet name + password (by default don't show a list of wallets to login to as this could be a security risk)
- View account information in a dashboard
- Available balance
- Total balance
- Pending Transactions
- List of domains
- List of transactions
- Manage domains
- Transfer domains
- Finalize domains
- Edit domains
- Revoke domains (with a warning and requiring the account password)
- Manage wallet
- Send HNS
- Receive HNS
- Auctions
- View bids on domain
- Open auction
- Bid on auction
- Reveal bid
- Redeem bid
- Register domain
Completion requirements:
- Basic functionality including
- View info
- Send/Receive HNS
- Manage domains
After the initial version is completed I will be looking to add more features including the above mentioned features.
The initial version will be completed in 2-3 weeks with a fully fledged version released later as the features are developed and tested.
You can contact me at handshake @ nathan.woodburn.au

81
install.sh Executable file
View File

@@ -0,0 +1,81 @@
#!/usr/bin/env bash
install_command=""
# Check if currently in the FireWalletBrowser directory
if [ -f "server.py" ]; then
echo "Please run this script from outside the FireWalletBrowser directory."
exit 1
fi
echo "Starting installation of FireWalletBrowser..."
# Check if OS is using apt package manager (Debian/Ubuntu)
if command -v apt-get &> /dev/null; then
install_command="sudo apt-get install -y"
dependencies=(git curl wget python3 python3-pip python3-venv)
echo "Detected apt package manager."
# Check if OS is using pacman package manager (Arch Linux)
elif command -v pacman &> /dev/null; then
install_command="sudo pacman -S"
dependencies=(git curl wget python3 python-pip)
echo "Detected pacman package manager."
else
echo "Unsupported package manager. Please install dependencies manually."
exit 1
fi
# List of dependencies to install
# Install dependencies
for package in "${dependencies[@]}"; do
# Check if the package is already installed
if command -v $package &> /dev/null || dpkg -s $package &> /dev/null || pacman -Qi $package &> /dev/null; then
echo "$package is already installed."
continue
fi
echo "Installing $package..."
$install_command $package
# Check if the installation was successful
if [ $? -ne 0 ]; then
echo "Failed to install $package. Please check your package manager settings."
exit 1
fi
done
if ! command -v node &> /dev/null || ! command -v npm &> /dev/null; then
echo "Installing Node.js and npm..."
# Download and install nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# in lieu of restarting the shell
\. "$HOME/.nvm/nvm.sh"
nvm install 20
if [ $? -ne 0 ]; then
echo "Failed to install Node.js and npm. Please install them manually."
exit 1
fi
else
echo "Node.js and npm are already installed."
fi
# Clone repo
git clone https://git.woodburn.au/nathanwoodburn/firewalletbrowser.git
# Setup venv
cd firewalletbrowser || exit 1
python3 -m venv .venv
source .venv/bin/activate
# Install python dependencies
python3 -m pip install -r requirements.txt
# Write .env file
if [ ! -f ".env" ]; then
echo "Creating .env file..."
echo "INTERNAL_HSD=true" > .env
echo "Created .env file with INTERNAL Node enabled."
fi
echo "Installation complete. You can start the application by running ./start.sh"

786
main.py

File diff suppressed because it is too large Load Diff

View File

@@ -62,7 +62,8 @@ def listPlugins(update=False):
try: try:
with open("user_data/plugin_signatures.json", "r") as f: with open("user_data/plugin_signatures.json", "r") as f:
signatures = json.load(f) signatures = json.load(f)
except: except Exception as e:
print(f"Error loading plugin signatures: {e}")
# Write a new signatures file # Write a new signatures file
with open("user_data/plugin_signatures.json", "w") as f: with open("user_data/plugin_signatures.json", "w") as f:
json.dump(signatures, f) json.dump(signatures, f)
@@ -87,7 +88,8 @@ def verifyPlugin(plugin: str):
try: try:
with open("user_data/plugin_signatures.json", "r") as f: with open("user_data/plugin_signatures.json", "r") as f:
signatures = json.load(f) signatures = json.load(f)
except: except Exception as e:
print(f"Error loading plugin signatures: {e}")
# Write a new signatures file # Write a new signatures file
with open("user_data/plugin_signatures.json", "w") as f: with open("user_data/plugin_signatures.json", "w") as f:
json.dump(signatures, f) json.dump(signatures, f)
@@ -120,7 +122,8 @@ def getPluginData(pluginStr: str):
try: try:
with open("user_data/plugin_signatures.json", "r") as f: with open("user_data/plugin_signatures.json", "r") as f:
signatures = json.load(f) signatures = json.load(f)
except: except Exception as e:
print(f"Error loading plugin signatures: {e}")
# Write a new signatures file # Write a new signatures file
with open("user_data/plugin_signatures.json", "w") as f: with open("user_data/plugin_signatures.json", "w") as f:
json.dump(signatures, f) json.dump(signatures, f)
@@ -148,11 +151,14 @@ def getPluginData(pluginStr: str):
def getPluginFunctions(plugin: str): def getPluginFunctions(plugin: str):
plugin = import_module(plugin.replace("/",".")) imported_plugin = import_module(plugin.replace("/","."))
return plugin.functions return imported_plugin.functions
def runPluginFunction(plugin: str, function: str, params: dict, authentication: str): def runPluginFunction(plugin: str, function: str, params: dict, authentication: (str|None)):
if not authentication:
return {"error": "Authentication required"}
plugin_module = import_module(plugin.replace("/",".")) plugin_module = import_module(plugin.replace("/","."))
if function not in plugin_module.functions: if function not in plugin_module.functions:
return {"error": "Function not found"} return {"error": "Function not found"}
@@ -168,7 +174,8 @@ def runPluginFunction(plugin: str, function: str, params: dict, authentication:
try: try:
with open("user_data/plugin_signatures.json", "r") as f: with open("user_data/plugin_signatures.json", "r") as f:
signatures = json.load(f) signatures = json.load(f)
except: except Exception as e:
print(f"Error loading plugin signatures: {e}")
# Write a new signatures file # Write a new signatures file
with open("user_data/plugin_signatures.json", "w") as f: with open("user_data/plugin_signatures.json", "w") as f:
json.dump(signatures, f) json.dump(signatures, f)
@@ -189,13 +196,13 @@ def runPluginFunction(plugin: str, function: str, params: dict, authentication:
def getPluginFunctionInputs(plugin: str, function: str): def getPluginFunctionInputs(plugin: str, function: str):
plugin = import_module(plugin.replace("/",".")) imported_plugin = import_module(plugin.replace("/","."))
return plugin.functions[function]["params"] return imported_plugin.functions[function]["params"]
def getPluginFunctionReturns(plugin: str, function: str): def getPluginFunctionReturns(plugin: str, function: str):
plugin = import_module(plugin.replace("/",".")) imported_plugin = import_module(plugin.replace("/","."))
return plugin.functions[function]["returns"] return imported_plugin.functions[function]["returns"]
def getDomainFunctions(): def getDomainFunctions():

View File

@@ -1,4 +1,3 @@
import json
import account import account
import requests import requests
import threading import threading
@@ -127,7 +126,7 @@ def automations_background(authentication):
account_name = account.check_account(authentication) account_name = account.check_account(authentication)
password = ":".join(authentication.split(":")[1:]) password = ":".join(authentication.split(":")[1:])
if account_name == False: if not account_name:
return { return {
"error": { "error": {
"message": "Invalid account" "message": "Invalid account"

View File

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

View File

@@ -1,6 +1,4 @@
import json import json
import account
import requests
import os import os
# Plugin Data # Plugin Data

View File

@@ -1,7 +1,5 @@
import json
import account import account
import requests import requests
import os
# Plugin Data # Plugin Data
info = { info = {
@@ -90,7 +88,7 @@ def main(params, authentication):
return {"status": f"Failed: {batch['error']['message']}", "transaction": "None"} return {"status": f"Failed: {batch['error']['message']}", "transaction": "None"}
if 'result' in batch: if 'result' in batch:
if batch['result'] != None: if batch['result'] is not None:
tx = batch['result']['hash'] tx = batch['result']['hash']
return {"status": "Success", "transaction": tx} return {"status": "Success", "transaction": tx}
# Note only one batch can be sent at a time # Note only one batch can be sent at a time

View File

@@ -93,7 +93,7 @@ def status(params, authentication):
response = requests.post(f"https://{instance}/api", json=data, headers=headers) response = requests.post(f"https://{instance}/api", json=data, headers=headers)
if response.status_code != 200: if response.status_code != 200:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
if response.json()["success"] != True: if not response.json()["success"]:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
return {"status": f"Connected to {instance}"} return {"status": f"Connected to {instance}"}
@@ -110,7 +110,7 @@ def login(params, authentication):
if response.status_code != 200: if response.status_code != 200:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
if response.json()["success"] != True: if not response.json()["success"]:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
auth = { auth = {
@@ -146,7 +146,7 @@ def addDomain(params, authentication):
zones = requests.post(f"https://{instance}/api", json=data, headers=headers) zones = requests.post(f"https://{instance}/api", json=data, headers=headers)
if zones.status_code != 200: if zones.status_code != 200:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
if zones.json()["success"] != True: if not zones.json()["success"]:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
zones = zones.json()["data"] zones = zones.json()["data"]
@@ -169,7 +169,7 @@ def addDomain(params, authentication):
response = requests.post(f"https://{instance}/api", json=data, headers=headers) response = requests.post(f"https://{instance}/api", json=data, headers=headers)
if response.status_code != 200: if response.status_code != 200:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
if response.json()["success"] != True: if not response.json()["success"]:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
zoneID = response.json()["data"]["zone"] zoneID = response.json()["data"]["zone"]
data = { data = {
@@ -179,7 +179,7 @@ def addDomain(params, authentication):
response = requests.post(f"https://{instance}/api", json=data, headers=headers) response = requests.post(f"https://{instance}/api", json=data, headers=headers)
if response.status_code != 200: if response.status_code != 200:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
if response.json()["success"] != True: if not response.json()["success"]:
return {"status": "Error connecting to Varo"} return {"status": "Error connecting to Varo"}
zone = response.json()["data"] zone = response.json()["data"]

370
render.py
View File

@@ -2,15 +2,39 @@ import datetime
import json import json
import urllib.parse import urllib.parse
from flask import render_template from flask import render_template
from domainLookup import punycode_to_emoji
import os import os
import threading
import requests
# Get Explorer URL # Get Explorer URL
TX_EXPLORER_URL = os.getenv("EXPLORER_TX") TX_EXPLORER_URL = os.getenv("EXPLORER_TX")
if TX_EXPLORER_URL is None: 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): def domains(domains, mobile=False):
html = '' html = ''
@@ -24,15 +48,12 @@ def domains(domains, mobile=False):
paid = paid / 1000000 paid = paid / 1000000
# Handle punycodes # Handle punycodes
name = domain['name'] name = renderDomain(domain['name'])
emoji = punycode_to_emoji(name)
if emoji != name:
name = f'{emoji} ({name})'
link = f'/manage/{domain["name"]}' link = f'/manage/{domain["name"]}'
link_action = "Manage" link_action = "Manage"
if domain['registered'] == False: if not domain['registered']:
link_action = "Register" link_action = "Register"
link = f'/auction/{domain["name"]}/register' link = f'/auction/{domain["name"]}/register'
@@ -43,6 +64,31 @@ def domains(domains, mobile=False):
return html return html
actionMap = {
"UPDATE": "Updated ",
"REGISTER": "Registered ",
"RENEW": "Renewed ",
"OPEN": "Opened ",
"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",
"OPEN": "Opened 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): def transactions(txs):
if len(txs) == 0: if len(txs) == 0:
@@ -50,38 +96,106 @@ def transactions(txs):
html = '' html = ''
for tx in txs: for tx in txs:
action = "HNS Transfer" action = "HNS Transfer"
address = tx["outputs"][0]["address"] txhash = tx["hash"]
hash = tx["hash"]
confirmations=tx["confirmations"] 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 amount = 0
incomming = False bid_value = 0
if not tx["inputs"][0]["path"]: isMulti = 0
incomming = True nameHashes = []
for txInput in tx["inputs"]:
if txInput["path"]:
incomming = False
amount -= txInput["value"]
for output in tx["outputs"]: for output in tx["outputs"]:
if output["covenant"]["action"] != "NONE": if output["covenant"]["action"] != "NONE":
if action == "HNS Transfer": if action == "HNS Transfer":
action = output["covenant"]["action"] action = output["covenant"]["action"]
elif action == output["covenant"]["action"]: elif action == output["covenant"]["action"]:
continue isMulti += 1
else: else:
action = "Multiple Actions" action = "Multiple Actions"
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"]
if not output["path"] and not incomming:
amount += output["value"]
elif output["path"] and incomming:
amount += output["value"]
amount = amount / 1000000 amount = amount / 1000000
bid_value = bid_value / 1000000
humanAction = action
hash = f"<a target='_blank' href='{TX_EXPLORER_URL}{hash}'>{hash[:8]}...</a>" if action == "HNS Transfer":
if confirmations < 5: if amount >= 0:
confirmations = f"<td style='background-color: red;'>{confirmations}</td>" 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: 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 = "<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 return html
@@ -95,28 +209,28 @@ def dns(data, edit=False):
for key, value in entry.items(): for key, value in entry.items():
if key != 'type': if key != 'type':
if isinstance(value, list): if isinstance(value, list):
html_output += "<td>\n" if len(value) > 1:
for val in value: html_output += '<td style="white-space: pre-wrap; font-family: monospace;">\n'
html_output += f"{val}<br>\n" for val in value:
html_output += f"{val}<br>\n"
html_output += "</td>\n" html_output += "</td>\n"
else:
html_output += f'<td style="white-space: pre-wrap; font-family: monospace;">{value[0]}</td>\n'
else: 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': elif entry['type'] == 'DS':
ds = f"{entry['keyTag']} {entry['algorithm']} {entry['digestType']} {entry['digest']}" 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: else:
value = "" value = ""
for key, val in entry.items(): for key, val in entry.items():
if key != 'type': if key != 'type':
value += f'{val} ' 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: if edit:
# Remove the current entry from the list
keptRecords = str(data[:index] + data[index+1:]).replace("'", '"') keptRecords = str(data[:index] + data[index+1:]).replace("'", '"')
keptRecords = urllib.parse.quote(keptRecords) keptRecords = urllib.parse.quote(keptRecords)
html_output += f"<td><a href='edit?dns={keptRecords}'>Remove</a></td>\n" html_output += f"<td><a href='edit?dns={keptRecords}'>Remove</a></td>\n"
@@ -125,6 +239,7 @@ def dns(data, edit=False):
index += 1 index += 1
return html_output return html_output
def txs(data): def txs(data):
data = data[::-1] data = data[::-1]
@@ -136,7 +251,7 @@ def txs(data):
amount = entry['amount'] amount = entry['amount']
amount = amount / 1000000 amount = amount / 1000000
if entry['blind'] == None: if entry['blind'] is None:
html_output += f"<td>{amount:,.2f} HNS</td>\n" html_output += f"<td>{amount:,.2f} HNS</td>\n"
else: else:
blind = entry['blind'] blind = entry['blind']
@@ -144,7 +259,7 @@ def txs(data):
html_output += f"<td>{amount:,.2f} + {blind:,.2f} HNS</td>\n" html_output += f"<td>{amount:,.2f} + {blind:,.2f} HNS</td>\n"
html_output += f"<td>{timestamp_to_readable_time(entry['time'])}</td>\n" html_output += f"<td>{timestamp_to_readable_time(entry['time'])}</td>\n"
html_output += f"</tr>\n" html_output += "</tr>\n"
return html_output return html_output
@@ -156,30 +271,60 @@ def timestamp_to_readable_time(timestamp):
return readable_time return readable_time
def bids(bids,reveals): def bids(bids,reveals):
html = '' # Create a list to hold bid data for sorting
bid_data = []
# Prepare data for sorting
for bid in bids: for bid in bids:
lockup = bid['lockup'] lockup = bid['lockup'] / 1000000
lockup = lockup / 1000000
html += "<tr>"
html += f"<td>{lockup:,.2f} HNS</td>"
revealed = False revealed = False
value = 0
# Check if this bid has been revealed
for reveal in reveals: for reveal in reveals:
if reveal['bid'] == bid['prevout']['hash']: if reveal['bid'] == bid['prevout']['hash']:
revealed = True revealed = True
value = reveal['value'] value = reveal['value'] / 1000000
value = value / 1000000
html += f"<td>{value:,.2f} HNS</td>"
bidValue = lockup - value
html += f"<td>{bidValue:,.2f} HNS</td>"
break break
if not revealed:
html += f"<td>Hidden until reveal</td>" # Store all relevant information for sorting and display
html += f"<td>Hidden until reveal</td>" 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 += "<td>Hidden until reveal</td>"
html += "<td>Hidden until reveal</td>"
if bid['own']: if bid['own']:
html += "<td>You</td>" html += "<td>You</td>"
else: else:
html += "<td>Unknown</td>" html += "<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>" html += "</tr>"
return html return html
@@ -195,14 +340,17 @@ def bidDomains(bids,domains, sortbyDomains=False):
bidValue = bid['value'] / 1000000 bidValue = bid['value'] / 1000000
blind = lockup - bidValue 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 += "<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>{domain['state']}</td>"
html += f"<td>{bidDisplay}</td>" html += f"<td style='white-space: nowrap;'>{bidDisplay}</td>"
html += f"<td>{domain['height']:,}</td>" html += f"<td class='hide-mobile'>{domain['height']:,}</td>"
html += "</tr>" html += "</tr>"
else: else:
for domain in domains: for domain in domains:
@@ -215,10 +363,10 @@ def bidDomains(bids,domains, sortbyDomains=False):
bidDisplay = f'<b>{bidValue:,.2f} HNS</b> + {blind:,.2f} HNS blind' bidDisplay = f'<b>{bidValue:,.2f} HNS</b> + {blind:,.2f} HNS blind'
html += "<tr>" 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>{domain['state']}</td>"
html += f"<td>{bidDisplay}</td>" html += f"<td>{bidDisplay}</td>"
html += f"<td>{domain['height']:,}</td>" html += f"<td class='hide-mobile'>{domain['height']:,}</td>"
html += "</tr>" html += "</tr>"
return html return html
@@ -260,22 +408,22 @@ def plugin_functions(functions, pluginName):
functionType = functions[function]["type"] functionType = functions[function]["type"]
html += f'<div class="card" style="margin-top: 50px;">' html += '<div class="card" style="margin-top: 50px;">'
html += f'<div class="card-body">' html += '<div class="card-body">'
html += f'<h4 class="card-title">{name}</h4>' html += f'<h4 class="card-title">{name}</h4>'
html += f'<h6 class="text-muted card-subtitle mb-2">{description}</h6>' html += f'<h6 class="text-muted card-subtitle mb-2">{description}</h6>'
html += f'<h6 class="text-muted card-subtitle mb-2">Function type: {functionType.capitalize()}</h6>' html += f'<h6 class="text-muted card-subtitle mb-2">Function type: {functionType.capitalize()}</h6>'
if functionType != "default": if functionType != "default":
html += f'<p class="card-text">Returns: {returns}</p>' html += f'<p class="card-text">Returns: {returns}</p>'
html += f'</div>' html += '</div>'
html += f'</div>' html += '</div>'
continue continue
# Form # Form
html += f'<form method="post" style="padding: 20px;" action="/plugin/{pluginName}/{function}">' html += f'<form method="post" style="padding: 20px;" action="/plugin/{pluginName}/{function}">'
for param in params: for param in params:
html += f'<div style="margin-bottom: 20px;">' html += '<div style="margin-bottom: 20px;">'
paramName = params[param]["name"] paramName = params[param]["name"]
paramType = params[param]["type"] paramType = params[param]["type"]
if paramType == "text": if paramType == "text":
@@ -299,14 +447,14 @@ def plugin_functions(functions, pluginName):
html += f'</div>' html += '</div>'
html += f'<button type="submit" class="btn btn-primary">Submit</button>' html += '<button type="submit" class="btn btn-primary">Submit</button>'
html += f'</form>' html += '</form>'
# For debugging # For debugging
html += f'<p class="card-text">Returns: {returns}</p>' html += f'<p class="card-text">Returns: {returns}</p>'
html += f'</div>' html += '</div>'
html += f'</div>' html += '</div>'
return html return html
@@ -318,16 +466,16 @@ def plugin_output(outputs, returns):
for returnOutput in returns: for returnOutput in returns:
if returnOutput not in outputs: if returnOutput not in outputs:
continue continue
html += f'<div class="card" style="margin-top: 50px; margin-bottom: 50px;">' html += '<div class="card" style="margin-top: 50px; margin-bottom: 50px;">'
html += f'<div class="card-body">' html += '<div class="card-body">'
html += f'<h4 class="card-title">{returns[returnOutput]["name"]}</h4>' html += f'<h4 class="card-title">{returns[returnOutput]["name"]}</h4>'
output = outputs[returnOutput] output = outputs[returnOutput]
if returns[returnOutput]["type"] == "list": if returns[returnOutput]["type"] == "list":
html += f'<ul>' html += '<ul>'
for item in output: for item in output:
html += f'<li>{item}</li>' html += f'<li>{item}</li>'
html += f'</ul>' html += '</ul>'
elif returns[returnOutput]["type"] == "text": elif returns[returnOutput]["type"] == "text":
html += f'<p>{output}</p>' html += f'<p>{output}</p>'
elif returns[returnOutput]["type"] == "tx": elif returns[returnOutput]["type"] == "tx":
@@ -337,8 +485,8 @@ def plugin_output(outputs, returns):
html += render_template('components/dns-output.html', dns=dns(output)) html += render_template('components/dns-output.html', dns=dns(output))
html += f'</div>' html += '</div>'
html += f'</div>' html += '</div>'
return html return html
def plugin_output_dash(outputs, returns): def plugin_output_dash(outputs, returns):
@@ -348,7 +496,87 @@ def plugin_output_dash(outputs, returns):
for returnOutput in returns: for returnOutput in returns:
if returnOutput not in outputs: if returnOutput not in outputs:
continue continue
if outputs[returnOutput] == None: if outputs[returnOutput] is None:
continue continue
html += render_template('components/dashboard-plugin.html', name=returns[returnOutput]["name"], output=outputs[returnOutput]) html += render_template('components/dashboard-plugin.html', name=returns[returnOutput]["name"], output=outputs[returnOutput])
return html 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:
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) using hsd.hns.au
# name = account.hsd.rpc_getNameByHash(namehash)
name = requests.get(f"https://hsd.hns.au/api/v1/namehash/{namehash}").json()
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
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

@@ -8,4 +8,5 @@ cryptography
requests-doh requests-doh
Flask-QRcode Flask-QRcode
PySocks PySocks
python-git-info python-git-info
waitress

View File

@@ -1,38 +1,43 @@
from flask import Flask import sys
import platform
from main import app from main import app
import main from waitress import serve
from gunicorn.app.base import BaseApplication
import os
class GunicornApp(BaseApplication): threads = 4
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load_config(self): def gunicornServer():
for key, value in self.options.items(): from gunicorn.app.base import BaseApplication
if key in self.cfg.settings and value is not None: class GunicornApp(BaseApplication):
self.cfg.set(key.lower(), value) def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load(self): def load_config(self):
return self.application for key, value in self.options.items():
if key in self.cfg.settings and value is not None: # type: ignore
self.cfg.set(key.lower(), value) # type: ignore
if __name__ == '__main__': def load(self):
workers = 1 return self.application
threads = 2
if workers is None:
workers = 1
if threads is None:
threads = 2
workers = int(workers)
threads = int(threads)
options = { options = {
'bind': '0.0.0.0:5000', 'bind': '0.0.0.0:5000',
'workers': workers, 'workers': 2,
'threads': threads, 'threads': threads,
} }
gunicorn_app = GunicornApp(app, options) 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() 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('Press Ctrl+C to stop the server', flush=True)
print('Serving on http://0.0.0.0:5000/', flush=True)
serve(app, host="0.0.0.0", port=5000, threads=threads)

9
start.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Find if .venv exists
if [ -d ".venv" ]; then
echo "Virtual environment found. Activating..."
source .venv/bin/activate
fi
python3 server.py

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -64,7 +64,7 @@
</nav> </nav>
<div class="container-fluid"> <div class="container-fluid">
<div class="text-center mt-5"> <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> <p class="m-0">404</p>
</div> </div>
<p class="text-dark mb-5 lead">Page Not Found</p> <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"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -66,9 +66,9 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div class="stick-right">{{next_action|safe}}</div> <div id="next-action" class="stick-right">{{next_action|safe}}</div>
<h4 class="card-title">{{domain}}/</h4> <h4 class="card-title">{{rendered}}</h4>
<h6 class="text-muted card-subtitle mb-2">{{next}}</h6> <h6 class="text-muted mb-2 card-subtitle" id="next">{{next | safe}}</h6>
</div> </div>
</div> </div>
</div> </div>
@@ -93,13 +93,92 @@
<th>Bid</th> <th>Bid</th>
<th>Blind</th> <th>Blind</th>
<th>Owner</th> <th>Owner</th>
<th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody id="bids-tbody">
{{bids | safe}} <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> </tbody>
</table> </table>
</div> </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> </div>
</div> </div>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -69,12 +69,12 @@
<h1 class="text-center">{{message}}</h1> <h1 class="text-center">{{message}}</h1>
<div class="row"> <div class="row">
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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-uppercase text-primary mb-1 fw-bold text-xs"><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-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>
<div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div> <div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div>
</div> </div>
@@ -82,26 +82,26 @@
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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-uppercase text-success mb-1 fw-bold text-xs"><span>Total Bids</span></div>
<div class="text-dark fw-bold h5 mb-0"><span id="wallet-bidCount">0</span></div> <div class="text-dark mb-0 fw-bold h5"><span id="wallet-bidCount">0</span></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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="row g-0 align-items-center">
<div class="col-auto"> <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>
<div class="col"><a class="btn btn-primary" role="button" href="/all/reveal">Reveal All</a></div> <div class="col"><a class="btn btn-primary" role="button" href="/all/reveal">Reveal All</a></div>
</div> </div>
@@ -111,14 +111,14 @@
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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="row g-0 align-items-center">
<div class="col-auto"> <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>
<div class="col"><a class="btn btn-primary" role="button" href="/all/redeem">Redeem All</a></div> <div class="col"><a class="btn btn-primary" role="button" href="/all/redeem">Redeem All</a></div>
</div> </div>
@@ -128,14 +128,14 @@
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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="row g-0 align-items-center">
<div class="col-auto"> <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>
<div class="col"><a class="btn btn-primary" role="button" href="/all/register">Register All</a></div> <div class="col"><a class="btn btn-primary" role="button" href="/all/register">Register All</a></div>
</div> </div>
@@ -145,11 +145,11 @@
</div> </div>
</div>{{plugins|safe}} </div>{{plugins|safe}}
</div> </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="col">
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<div class="card-header d-flex justify-content-between align-items-center"> <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>
<div class="card-body"><div class="table-responsive"> <div class="card-body"><div class="table-responsive">
<table class="table"> <table class="table">
@@ -170,11 +170,11 @@
</div> </div>
</div> </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="col">
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<div class="card-header d-flex justify-content-between align-items-center"> <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>
<div class="card-body"><div class="table-responsive"> <div class="card-body"><div class="table-responsive">
<table class="table"> <table class="table">

View File

@@ -1,5 +1,4 @@
<span style="display: block;font-size: 12px;">TX: {{tx}}</span> <span style="display: block;font-size: 12px;">TX: {{tx}}</span>
<span style="display: block;">Check your transaction on a block explorer</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://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"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -67,7 +67,7 @@
<div class="card" style="margin-top: 50px;"> <div class="card" style="margin-top: 50px;">
<div class="card-body"> <div class="card-body">
<h4 class="card-title">{{action}}</h4> <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> <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> <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> </div>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -67,7 +67,7 @@
<div class="card" style="margin-top: 50px;"> <div class="card" style="margin-top: 50px;">
<div class="card-body"> <div class="card-body">
<h4 class="card-title">{{action}}</h4> <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> <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>
</div> </div>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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> </form><span>Sync: {{sync}}%</span>
<ul class="navbar-nav flex-nowrap ms-auto"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -66,7 +66,7 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<h4 class="card-title">{{domain}}/</h4> <h4 class="card-title">{{rendered}}</h4>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -17,7 +17,7 @@
<body class="bg-gradient-primary"> <body class="bg-gradient-primary">
<div class="container"> <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="card-body p-0">
<div class="row"> <div class="row">
<div class="col-lg-5 d-none d-lg-flex"> <div class="col-lg-5 d-none d-lg-flex">
@@ -30,12 +30,12 @@
<h4 class="text-dark mb-4">Import a wallet!</h4> <h4 class="text-dark mb-4">Import a wallet!</h4>
</div> </div>
<form class="user" method="post"> <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="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="row mb-3"> <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 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 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>
<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> <hr>
</form> </form>
<div class="text-center"><a class="small" href="/login">Didn't mean to create a new wallet? Login!</a></div> <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"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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 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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -68,12 +68,12 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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-uppercase text-primary mb-1 fw-bold text-xs"><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-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>
<div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div> <div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div>
</div> </div>
@@ -81,12 +81,12 @@
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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-uppercase text-success mb-1 fw-bold text-xs"><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-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>
<div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div> <div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div>
</div> </div>
@@ -94,14 +94,14 @@
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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="row g-0 align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@@ -110,12 +110,12 @@
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4"> <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="card-body">
<div class="row align-items-center no-gutters"> <div class="row align-items-center no-gutters">
<div class="col me-2"> <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-uppercase text-warning mb-1 fw-bold text-xs"><span>Pending Transactions</span></div>
<div class="text-dark fw-bold h5 mb-0"><span id="wallet-pending">0</span></div> <div class="text-dark mb-0 fw-bold h5"><span id="wallet-pending">0</span></div>
</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"> <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> <g>
@@ -135,20 +135,19 @@
<div class="col"> <div class="col">
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<div class="card-header d-flex justify-content-between align-items-center"> <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>
<div class="card-body"><div class="table-responsive"> <div class="card-body"><div class="table-responsive">
<table class="table" id="data-table"> <table class="table" id="data-table">
<thead> <thead>
<tr> <tr>
<th onclick="sortTable(0)">Domain <span class="sort-indicator"></span></th> <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(1)" class="hide-mobile">Expires <span class="sort-indicator"></span></th>
<th onclick="sortTable(2)">Price Paid <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> <!-- <th><span class="sort-indicator"></span></th> -->
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<!-- {{domains | safe}} -->
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@@ -20,7 +20,7 @@
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-9 col-lg-12 col-xl-10"> <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> <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="card-body p-0">
<div class="row"> <div class="row">
<div class="col-lg-6 d-none d-lg-flex"> <div class="col-lg-6 d-none d-lg-flex">
@@ -47,7 +47,7 @@ document.addEventListener("DOMContentLoaded", function () {
}); });
</script> </script>
</div> </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> <hr>
</form> </form>
<div class="text-center"><a class="small" href="register">Create a wallet</a></div> <div class="text-center"><a class="small" href="register">Create a wallet</a></div>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content" style="padding-bottom: 25px;"> <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);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -66,15 +66,16 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="card"> <div class="card">
<div class="card-body"> <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> <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 card-subtitle mb-2">Expires in {{expiry}} days</h6> <h6 class="text-muted mb-2 card-subtitle">Expires in {{expiry}} days</h6>
</div> </div>
</div> </div>
</div>{{plugins|safe}} </div>{{plugins|safe}}
<div class="container-fluid" style="margin-top: 50px;"> <div class="container-fluid" style="margin-top: 50px;">
<div class="card"> <div class="card">
<div class="card-body"> <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"> <table class="table">
<thead> <thead>
<tr> <tr>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -64,7 +64,7 @@
</nav> </nav>
<div class="container-fluid" style="margin-bottom: 20px;"> <div class="container-fluid" style="margin-bottom: 20px;">
<h3 class="text-dark mb-1">{{name}}</h3> <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>
</div> </div>
<footer class="sticky-footer" style="background: var(--bs-primary-text-emphasis);"> <footer class="sticky-footer" style="background: var(--bs-primary-text-emphasis);">

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>

View File

@@ -17,7 +17,7 @@
<body class="bg-gradient-primary"> <body class="bg-gradient-primary">
<div class="container"> <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="card-body p-0">
<div class="row"> <div class="row">
<div class="col-lg-5 d-none d-lg-flex"> <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> <h4 class="text-dark mb-4">Create a new wallet!</h4>
</div> </div>
<form class="user" method="post"> <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="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="row mb-3"> <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 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 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> <hr>
</form> </form>
<div class="text-center"><a class="small" href="/login">Didn't mean to create a new wallet? Login!</a></div> <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"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -65,10 +65,10 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="card"> <div class="card">
<div class="card-body"> <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> <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 mb-2 card-subtitle"><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">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> </div>
</div>{{plugins|safe}} </div>{{plugins|safe}}
@@ -87,27 +87,6 @@
{{dns | safe}} {{dns | safe}}
</tbody> </tbody>
</table> </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> </div>
</div> </div>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>

View File

@@ -22,12 +22,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -57,7 +57,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -68,25 +68,37 @@
<h3 class="mb-1" style="text-align: center;color: rgb(0,255,0);">{{success}}</h3> <h3 class="mb-1" style="text-align: center;color: rgb(0,255,0);">{{success}}</h3>
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<h4 class="card-title">Node Settings</h4><small>HSD Version: v{{hsd_version}}</small> <h4 class="card-title">Node Settings</h4><small>HSD Version: v{{hsd_version}}&nbsp; Type: {% if internal %} Internal {% else %} Remote {% endif %} ({% if spv %}SPV{% else %}Full Node{% endif %})</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">
<ul class="list-group"> <li class="list-group-item">
<li class="list-group-item"> <div><a class="btn btn-primary stick-right" role="button" href="/settings/rescan">Rescan</a>
<div><a class="btn btn-primary stick-right" role="button" href="/settings/rescan">Rescan</a> <h3>Rescan</h3><span>Rescan the blockchain for transactions</span>
<h3>Rescan</h3><span>Rescan the blockchain for transactions</span> </div>
</div> </li>
</li> <li class="list-group-item">
<li class="list-group-item"> <div><a class="btn btn-primary stick-right" role="button" href="/settings/resend">Resend</a>
<div><a class="btn btn-primary stick-right" role="button" href="/settings/resend">Resend</a> <h3>Resend unconfirmed transactions</h3><span>Resend any transactions that haven&#39;t been mined yet.</span>
<h3>Resend&nbsp;unconfirmed transactions</h3><span>Resend any transactions that haven't been mined yet.</span> </div>
</div> </li>
</li> <li class="list-group-item">
<li class="list-group-item"> <div><a class="btn btn-primary stick-right" role="button" href="/settings/zap">Zap</a>
<div><a class="btn btn-primary stick-right" role="button" href="/settings/zap">Zap</a> <h3>Delete unconfirmed transactions</h3><span>This will only remove pending tx from the wallet older than 20 minutes (~ 2 blocks)</span>
<h3>Delete unconfirmed transactions</h3><span>This will only remove pending tx from the wallet older than 20 minutes (~ 2 blocks)</span> </div>
</div> </li>
</li> <li class="list-group-item">
</ul> <div><a class="btn btn-primary stick-right" role="button" href="/settings/api-info">API Info</a>
<h3>View API Information</h3><span>View information about the connected HSD node&#39;s API</span>
</div>
</li>
{% if internal %}
<li class="list-group-item">
<div><a class="btn btn-primary stick-right" role="button" href="/settings/restart">Restart Node</a>
<h3>Restart Internal Node</h3><span>This will attempt to restart the HSD node</span>
</div>
</li>
{% endif %}
</ul>
</div> </div>
</div> </div>
</div> </div>
@@ -94,7 +106,7 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<h4 class="card-title">Wallet Settings</h4> <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"> <ul class="list-group">
<li class="list-group-item"> <li class="list-group-item">
<div><a class="btn btn-primary stick-right" role="button" href="/settings/xpub">xPub</a> <div><a class="btn btn-primary stick-right" role="button" href="/settings/xpub">xPub</a>
@@ -120,7 +132,7 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<h4 class="card-title">About</h4> <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 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>
</div> </div>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -67,7 +67,7 @@
</div> </div>
<div class="card" style="max-width: 500px;margin: auto;margin-top: 50px;"> <div class="card" style="max-width: 500px;margin: auto;margin-top: 50px;">
<div class="card-body"> <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> </div>
</div> </div>

View File

@@ -21,12 +21,12 @@
<body id="page-top"> <body id="page-top">
<div id="wrapper"> <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);"> <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 sidebar-brand m-0" href="/"> <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-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> </a>
<hr class="sidebar-divider my-0"> <hr class="my-0 sidebar-divider">
<ul class="navbar-nav text-light" id="accordionSidebar"> <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="/"><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> <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 class="d-flex flex-column" id="content-wrapper" style="background: var(--bs-primary);">
<div id="content"> <div id="content">
<nav class="navbar navbar-expand shadow mb-4 topbar static-top navbar-light" style="background: var(--bs-primary-text-emphasis);"> <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> <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 me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search" action="/search" method="get"> <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> <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"> <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> <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"> <div class="dropdown-menu p-3 dropdown-menu-end animated--grow-in" aria-labelledby="searchDropdown">
<form class="me-auto navbar-search w-100" action="/search" method="get"> <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"><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 class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
</div> </div>
@@ -56,7 +56,7 @@
</li> </li>
<li class="nav-item dropdown no-arrow"> <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="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> </div>
</li> </li>
</ul> </ul>
@@ -71,9 +71,10 @@
{% if page != 1 %} {% if page != 1 %}
<a class="btn btn-primary" role="button" href="/tx?page={{page-1}}">Prev</a> <a class="btn btn-primary" role="button" href="/tx?page={{page-1}}">Prev</a>
{% endif %} {% endif %}
{% if txCount == 100 %} <!-- {% if txCount == 100 %} -->
<!-- {% endif %} -->
<a class="btn btn-primary" role="button" href="/tx?page={{page+1}}">Next</a> <a class="btn btn-primary" role="button" href="/tx?page={{page+1}}">Next</a>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
@@ -81,27 +82,74 @@
<table id="dataTable" class="table my-0"> <table id="dataTable" class="table my-0">
<thead> <thead>
<tr> <tr>
<th>Action</th> <th>Date</th>
<th>Address</th> <th>Transaction</th>
<th>Tx</th> <!-- <th class="hide-mobile">Address</th> -->
<th>Confirmations</th> <!-- <th class="amount-column">Amount</th> -->
<th>Amount</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody id="transactions-tbody">
{{tx|safe}} <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> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<td><strong>Action</strong></td> <td><strong>Date</strong></td>
<td><strong>Address</strong></td> <td><strong>Transaction</strong></td>
<td><strong>Tx</strong></td> <!-- <td class="hide-mobile"><strong>Address</strong></td> -->
<td><strong>Confirmations</strong></td> <!-- <td class="amount-column"><strong>Amount</strong></td> -->
<td><strong>Amount</strong></td>
</tr> </tr>
</tfoot> </tfoot>
</table> </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> </div>
</div> </div>

47
templates/welcome.html Normal file
View File

@@ -0,0 +1,47 @@
<!DOCTYPE html>
<html data-bs-theme="dark" lang="en-au" style="height: 100%;">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Welcome to FireWallet</title>
<link rel="icon" type="image/png" sizes="900x768" href="/assets/img/favicon.png">
<link rel="icon" type="image/png" sizes="900x768" href="/assets/img/favicon.png">
<link rel="icon" type="image/png" sizes="900x768" href="/assets/img/favicon.png">
<link rel="icon" type="image/png" sizes="900x768" href="/assets/img/favicon.png">
<link rel="icon" type="image/png" sizes="900x768" href="/assets/img/favicon.png">
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i&amp;display=swap">
<link rel="stylesheet" href="/assets/css/styles.min.css">
</head>
<body class="d-flex align-items-center bg-gradient-primary" style="height: 100%;">
<div class="container">
<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 my-5 o-hidden border-0" style="padding-top: 50px;padding-bottom: 50px;">
<div class="card-body p-0">
<div class="row">
<div class="col-lg-6 d-none d-lg-flex">
<div class="flex-grow-1 bg-login-image" style="background: url(&quot;/assets/img/favicon.png&quot;) center / contain no-repeat;"></div>
</div>
<div class="col-lg-6">
<div class="text-center p-5">
<div class="text-center">
<h4 class="mb-4">Welcome to FireWallet!</h4>
</div>
<div class="btn-group-vertical btn-group-lg gap-1" role="group"><a class="btn btn-primary" role="button" href="/register">Create a new wallet</a><a class="btn btn-primary" role="button" href="/import-wallet">Import an existing wallet</a></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="/assets/bootstrap/js/bootstrap.min.js"></script>
<script src="/assets/js/script.min.js"></script>
</body>
</html>

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}