From 557dde2279669b817e8ec44ec03d3a393a3fd9fa Mon Sep 17 00:00:00 2001 From: Krystie Date: Fri, 27 Mar 2026 12:23:25 -0700 Subject: [PATCH 1/3] Update favicon and logo to transparent TRI triangle --- static/favicon.ico | Bin 355 -> 112419 bytes static/logo-192.png | Bin 355 -> 6403 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/static/favicon.ico b/static/favicon.ico index bd0f35441b80bc10e6293a8a88a01a35e7f0181c..5f16b566b2c4e272c011f5eda1a95be9c7c38666 100644 GIT binary patch literal 112419 zcmeD^2V7Ih(`ocxq&Ew8iUMLmiWNjfrKx}f6i`7y5kYAI6tH4fKq-2N4Tz|K(h{(P z!if}>60o6k={4VM0v>wz{ZH>K;N|@sH_J=j+bO%VvpX}3!C*1$7<6GV3YZ&HFc^FI zOd>Js<2kVy>8Tiuu5N#Q4hA!KCKjWr%B){d#9$n~;Fk*hbwLb9O@yp

`zvQ@t5X-yseTFeI@Ye({y+d=7E9V13@ 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 YXdV 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 literal 355 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 literal 355 zcmY+AK~KXl42AFg6{csXH?1cWRf4t%q%x+d6XF;evqb8WlDbs;_aq$>aP;%@=Vyzn z>ZNSob~QY<&kgJj_svrY=?&uRrbMjT>e9%w)f%zhrjTmp;TCb8=WO0&&L6Seqvlhe z Date: Fri, 27 Mar 2026 17:31:58 -0700 Subject: [PATCH 2/3] Complete redesign of block detail page with comprehensive information - Split layout into organized sections (Basic Info, Technical Details, Hashes, PoS Info) - Added stats grid showing Confirmations, Transactions, Block Reward, Size - Show all cryptographic hashes (merkle root, prev/next blocks) - Added PoS-specific section with proof hash, stake modifier, signature - Improved typography and visual hierarchy - Better timestamp display with age and full date - Enhanced navigation with Previous/Next buttons - Color-coded PoS vs PoW badges - Organized into left/right columns for better readability - Added all technical fields (version, nonce, bits, trust values) Now shows everything a proper block explorer should display! --- src/routes/block/[hash]/+page.svelte | 321 ++++++++++++++++++++++----- 1 file changed, 266 insertions(+), 55 deletions(-) diff --git a/src/routes/block/[hash]/+page.svelte b/src/routes/block/[hash]/+page.svelte index 1a43715..f113ba5 100644 --- a/src/routes/block/[hash]/+page.svelte +++ b/src/routes/block/[hash]/+page.svelte @@ -1,88 +1,299 @@ Block {block.height} - Triangles Explorer + - -

-
-

Block {block.height}

-

{block.hash}

+ +
+
+
+
+

Block #{formatNumber(block.height)}

+ + {blockType(block.flags)} + +
+

+ {blockAge} • {blockDate} +

+
+
+ {#if block.previousblockhash} + + + + + {/if} + {#if block.nextblockhash} + + + + + {/if} +
-
- {#if block.previousblockhash} - ← Prev - {/if} - {#if block.nextblockhash} - Next → - {/if} + + +
+
Block Hash
+
{block.hash}
- -
-
-

Block Details

+ +
+
+
Confirmations
+
{formatNumber(block.confirmations)}
-
- {#each fields as [label, value]} -
- {label} -
{value}
+
+
Transactions
+
{txCount}
+
+
+
Block Reward
+
{formatAmount(blockReward)} TRI
+
+
+
Size
+
{formatNumber(block.size || 0)} bytes
+
+
+ + +
+ +
+ +
+
+

Block Information

- {/each} +
+
+
Height
+
{formatNumber(block.height)}
+
+
+
Timestamp
+
{blockDate}
+
{blockAge}
+
+
+
Received Time
+
{block.time}
+
+
+
Block Type
+
+ + {blockType(block.flags)} + + {#if isPoS} + (Stake Proof) + {:else if isPoW} + (Work Proof) + {/if} +
+
+
+
Difficulty
+
{formatDifficulty(block.difficulty)}
+
+
+
Block Reward
+
{formatAmount(blockReward)} TRI
+
+
+
+ + +
+
+

Technical Details

+
+
+
+
Version
+
{block.version}
+
+
+
Size
+
{formatNumber(block.size || 0)} bytes
+
+
+
Nonce
+
{block.nonce}
+
+
+
Bits
+
{block.bits}
+
+ {#if block.blocktrust} +
+
Block Trust
+
{block.blocktrust}
+
+ {/if} + {#if block.chaintrust} +
+
Chain Trust
+
{block.chaintrust}
+
+ {/if} +
+
+
+ + +
+ +
+
+

Cryptographic Hashes

+
+
+
+
Merkle Root
+
{block.merkleroot}
+
+
+
Previous Block
+ {#if block.previousblockhash} + + {block.previousblockhash} + + {:else} + Genesis Block + {/if} +
+
+
Next Block
+ {#if block.nextblockhash} + + {block.nextblockhash} + + {:else} + Latest Block + {/if} +
+
+
+ + + {#if isPoS} +
+
+

+ + Proof-of-Stake Details +

+
+
+ {#if block.proofhash} +
+
Proof Hash
+
{block.proofhash}
+
+ {/if} + {#if block.modifier} +
+
Stake Modifier
+
{block.modifier}
+
+ {/if} + {#if block.modifierchecksum} +
+
Modifier Checksum
+
{block.modifierchecksum}
+
+ {/if} + {#if block.entropybit !== undefined} +
+
Entropy Bit
+
{block.entropybit}
+
+ {/if} + {#if block.signature} +
+
Block Signature
+
{block.signature}
+
+ {/if} +
+
+ {/if} + + +
+
+

Flags

+
+
+
{block.flags}
+
+
{#if addresses.length > 0} -
-
-

Addresses Involved ({addresses.length})

-
-
-
- {#each addresses as addr} - - {addr} - - {/each} +
+
+

Addresses Involved ({addresses.length})

+
+
+
+ {#each addresses as addr} + + {addr} + + {/each} +
-
{/if}
-

Transactions ({block.tx.length})

+

Transactions ({txCount})

- + {#if data.txs && data.txs.length > 0} + + {:else} +
+

Transaction data loading...

+
+ {/if}
From f881ad1f97e007ae17d4a2482bbd9d26cca49a98 Mon Sep 17 00:00:00 2001 From: Krystie Date: Fri, 27 Mar 2026 17:34:37 -0700 Subject: [PATCH 3/3] Add QR codes to address pages with redesigned layout - Installed qrcode npm package for QR generation - Created reusable QRCode.svelte component - Completely redesigned address page layout: - Prominent QR code display (200x200px) - Grid layout with QR + address info + balance stats - Copy address button with feedback - Stats grid showing transactions, UTXOs, sent, net activity - Enhanced UTXO table with clickable block heights - Better visual hierarchy and spacing - QR code shows even if address index disabled - White QR on dark background matching site theme - Added proper meta descriptions for SEO Address pages now have professional layout with scannable QR codes! --- package-lock.json | 308 ++++++++++++++++++++++++- package.json | 3 +- src/lib/components/QRCode.svelte | 24 ++ src/routes/address/[addr]/+page.svelte | 145 ++++++++++-- 4 files changed, 456 insertions(+), 24 deletions(-) create mode 100644 src/lib/components/QRCode.svelte diff --git a/package-lock.json b/package-lock.json index 9382a4f..efbcb71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "1.0.0", "dependencies": { "chart.js": "^4.4.0", - "leaflet": "^1.9.4" + "leaflet": "^1.9.4", + "qrcode": "^1.5.4" }, "devDependencies": { "@sveltejs/adapter-node": "^5.5.4", @@ -1417,6 +1418,30 @@ "node": ">=0.4.0" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/aria-query": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", @@ -1437,6 +1462,15 @@ "node": ">= 0.4" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/chart.js": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", @@ -1465,6 +1499,17 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -1475,6 +1520,24 @@ "node": ">=6" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1510,6 +1573,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -1537,6 +1609,18 @@ "dev": true, "license": "MIT" }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/enhanced-resolve": { "version": "5.20.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", @@ -1636,6 +1720,19 @@ } } }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1661,6 +1758,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -1697,6 +1803,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -2008,6 +2123,18 @@ "dev": true, "license": "MIT" }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -2064,6 +2191,51 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -2091,6 +2263,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/postcss": { "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", @@ -2120,6 +2301,23 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -2134,6 +2332,21 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -2213,6 +2426,12 @@ "node": ">=6" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/set-cookie-parser": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.0.1.tgz", @@ -2245,6 +2464,32 @@ "node": ">=0.10.0" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2484,6 +2729,67 @@ } } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/zimmerframe": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", diff --git a/package.json b/package.json index 9486ad1..0da7228 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "chart.js": "^4.4.0", - "leaflet": "^1.9.4" + "leaflet": "^1.9.4", + "qrcode": "^1.5.4" } } diff --git a/src/lib/components/QRCode.svelte b/src/lib/components/QRCode.svelte new file mode 100644 index 0000000..32691bb --- /dev/null +++ b/src/lib/components/QRCode.svelte @@ -0,0 +1,24 @@ + + + diff --git a/src/routes/address/[addr]/+page.svelte b/src/routes/address/[addr]/+page.svelte index 02ac070..249b2b3 100644 --- a/src/routes/address/[addr]/+page.svelte +++ b/src/routes/address/[addr]/+page.svelte @@ -1,36 +1,135 @@ Address {data.address} - Triangles Explorer + -
-

Address

-

{data.address}

-
- {#if data.indexError} -
- Address index is not enabled on this node. Start the daemon with -addressindex=1 to enable address lookups. +
+

Address Details

+
+ Address index is not enabled on this node. Start the daemon with -addressindex=1 to enable address lookups. +
+
+ + +
+
+
+ +
+
{data.address}
+ +
{:else} - - {#if data.balance} -
-
Balance
-
- {formatAmount(data.balance.balance / 100000000)} TRI -
-
- Total received: {formatAmount(data.balance.received / 100000000)} TRI + +
+

Triangles Address

+

View balance, transactions, and QR code

+
+ + +
+ +
+
+

QR Code

+
+ +
+

Scan to send TRI to this address

- {/if} + + +
+ +
+
Address
+
{data.address}
+ +
+ + + {#if data.balance} +
+
+
Balance
+
+ {formatAmount(data.balance.balance / 100000000)} +
+
TRI
+
+
+
Received
+
+ {formatAmount(data.balance.received / 100000000)} +
+
TRI
+
+
+ {:else} +
+
Balance information unavailable
+
+ {/if} +
+
+ + +
+
+
Transactions
+
{formatNumber(data.totalTxs)}
+
+
+
Unspent Outputs
+
{formatNumber(data.utxos.length)}
+
+ {#if data.balance} +
+
Sent
+
+ {formatAmount((data.balance.received - data.balance.balance) / 100000000)} +
+
TRI
+
+
+
Net Activity
+
+ {formatAmount(data.balance.balance / 100000000)} +
+
TRI
+
+ {/if} +
{#if data.utxos.length > 0} @@ -50,13 +149,15 @@ {#each data.utxos as utxo} - + {truncateHash(utxo.txid, 10)} {utxo.outputIndex} {formatAmount(utxo.satoshis / 100000000)} TRI - {utxo.height} + + {utxo.height} + {/each} @@ -68,13 +169,13 @@
-

Transactions ({data.totalTxs})

+

Transaction History ({formatNumber(data.totalTxs)})

{#if data.txs.length > 0} {#if data.totalTxs > 50}
- Showing 50 of {data.totalTxs} transactions + Showing 50 of {formatNumber(data.totalTxs)} transactions
{/if} {:else}