diff --git a/index.html b/index.html index c54a633..70ed6c3 100644 --- a/index.html +++ b/index.html @@ -117,7 +117,8 @@ tbody tr:hover{background:color-mix(in srgb,var(--accent-soft) 50%,transparent)} .num{font-family:var(--mono);font-variant-numeric:tabular-nums} .score{font-family:var(--display);font-weight:600;font-size:15px} -.add-grid{display:grid;grid-template-columns:1.3fr 1fr;gap:24px;margin:40px 0;align-items:start} +.add-grid{display:grid;grid-template-columns:1.3fr 1fr;gap:24px;margin:40px 0;align-items:stretch} +.add-grid>.panel{display:flex;flex-direction:column} .panel{ background:var(--panel);border:1px solid var(--line); border-radius:var(--radius);padding:24px;box-shadow:var(--shadow); @@ -139,12 +140,6 @@ tbody tr:hover{background:color-mix(in srgb,var(--accent-soft) 50%,transparent)} .btn:disabled{opacity:.45;cursor:not-allowed;filter:none} .note{font-size:13px;color:var(--muted);margin-top:16px;line-height:1.55} .note strong{color:var(--ink)} -.freshness-note{ - font-size:12px;line-height:1.4;color:var(--muted); - background:var(--accent-soft);border:1px solid var(--line);border-radius:8px; - padding:7px 12px;margin:0 0 12px; -} -.freshness-note strong{color:var(--ink)} .btn-share{ display:block;margin:0 auto 8px;font:inherit;font-size:13px;cursor:pointer; padding:8px 16px;border-radius:8px;border:1px solid var(--line-strong); @@ -264,13 +259,6 @@ footer a{color:var(--accent);text-decoration:none} ↓ JSON - -

- Fee/description/version refresh about once a day (timing varies). Deposits are credited instantly after 3 confirmations (~30 min). -

-
@@ -299,7 +287,7 @@ footer a{color:var(--accent);text-decoration:none}

Add your Will Executor

-

Enter your server URL. It will be checked online before it appears in the list.

+

Enter your server URL. It will appear in the list once your deposit is confirmed (typically about 30 minutes).

@@ -313,7 +301,7 @@ footer a{color:var(--accent);text-decoration:none}

You are about to add this server:

-

Make sure the link above works correctly before paying. No refunds or URL changes after payment.

+

Make sure the link above works correctly before paying. No refunds after payment. URL changes require proof of ownership — see the Terms.

Contact
Server
Will Executor
- +

@@ -344,10 +332,11 @@ footer a{color:var(--accent);text-decoration:none}

How ranking works

-

Bid-based ranking: higher contributions rank higher.

-
Deposit threshold50,000 sats
-
Plugin integrationautomatic
-
Early-adopter guarantee12 months
+

Ordered by excess donated, then total paid, then base fee (lower first), then WeTime points.

+
Yearly fee50,000 sats
+
Listing period365 days
+
Renewal windowfrom 6 months before expiry
+
Plugin integrationautomatic
@@ -362,13 +351,13 @@ footer a{color:var(--accent);text-decoration:none}
02

Ranking System

-

This leaderboard operates on a bid-based ranking system where higher contributions result in better positioning.

+

This leaderboard is ordered by excess donated (over the yearly fee), then total amount paid, then lower base fee, then WeTime points.

03 -

Early Adopter Incentives

-

To support the project's initial launch phase, we plan to maintain the first Will Executor servers for a minimum of 12 months, rewarding early participants. Subsequently, premium positions will be available through an auction system based on protocol revenue generation.

+

Listing & Renewal

+

A flat yearly fee buys 365 days of presence in the list, starting when your payment reaches 3 confirmations. You can renew for one additional year at any time from 6 months before expiry; listings that are not renewed are removed at expiry. See the Terms for details.

@@ -385,6 +374,7 @@ footer a{color:var(--accent);text-decoration:none}
Bitcoin After Life — Will Executor List welist@bitcoin-after.life + Terms COMMIT_HASH_PLACEHOLDER
@@ -397,18 +387,6 @@ let minAmount = 50000; const fmt = n => (n != null ? Number(n).toLocaleString('en-US') : '—'); const trunc = (s, m=40) => s && s.length > m ? s.slice(0, m) + '…' : s; -const statusMap = { - 'OK': 'Health check passed', - 'TIMEOUT': 'Connection timeout', - 'CONNECTION': 'Connection error', - 'STATUS': 'HTTP error', - 'WRONG REPLY': 'Invalid JSON response', - 'REQUEST': 'Request error', - 'BODY': 'Body read error', - 'DECODE': 'Decode error', - 'KO': 'Generic error' -}; - function getChain() { const btn = document.querySelector('#chainSeg [aria-pressed="true"]'); return btn ? btn.dataset.c : 'bitcoin'; @@ -416,9 +394,7 @@ function getChain() { function getFiltered() { return allServers - .filter(d => withTor ? true : !d.onion) - .filter(d => (d.url + " " + (d.info||"")).toLowerCase().includes(q.toLowerCase())) - .sort((a, b) => (b.last_block||0) - (a.last_block||0) || (b.points||0) - (a.points||0) || (b.count_win||0) - (a.count_win||0) || (a.base_fee||0) - (b.base_fee||0) || (b.version||'').localeCompare(a.version||'')); + .filter(d => (d.url + " " + (d.info||"")).toLowerCase().includes(q.toLowerCase())); } function render() { @@ -462,11 +438,12 @@ function render() {
`); }); - const online = allServers.filter(d => d.status === "online" || d.status === "OK").length; + const online = allServers.filter(d => d.status === "OK").length; document.getElementById('s-online').textContent = online; document.getElementById('s-total').textContent = allServers.length; - const top = getFiltered()[0]; - document.getElementById('s-block').textContent = top ? fmt(top.last_block) : '—'; + // Highest known block across all servers (the list is ranked by fee/points, not by height) + const maxBlock = allServers.reduce((m, d) => Math.max(m, d.last_block || 0), 0); + document.getElementById('s-block').textContent = maxBlock ? fmt(maxBlock) : '—'; } async function fetchData() { @@ -592,7 +569,7 @@ document.getElementById('terms-accept').addEventListener('click', async function const balStr = result.balance != null ? fmt(result.balance) : null; const uncStr = result.unconfirmed_balance != null ? fmt(result.unconfirmed_balance) : null; document.getElementById('iv-balance').textContent = balStr ? (uncStr ? balStr + ' (' + uncStr + ')' : balStr) : '—'; - document.getElementById('iv-donations').textContent = result.donations != null ? fmt(result.donations) : '—'; + document.getElementById('iv-donations').textContent = result.donation != null ? fmt(result.donation) : '—'; document.getElementById('iv-contact').textContent = document.getElementById('contact').value.trim() || '—'; const weLink = result.id ? `/weinfo/${result.chain || chain}/${result.id}` : null; const weinfoEl = document.getElementById('iv-weinfo'); @@ -613,13 +590,13 @@ document.getElementById('terms-accept').addEventListener('click', async function document.getElementById('iv-nextdep').textContent = result.next_deposit_date || '—'; document.getElementById('iv-nextdep-row').style.display = 'flex'; document.getElementById('iv-status').className = 'ok-line'; - document.getElementById('iv-status').textContent = 'Server is already listed. Next deposit: ' + (result.next_deposit_date || '—'); + document.getElementById('iv-status').textContent = 'Server is already listed. Next renewal: ' + (result.next_deposit_date || '—'); const inv = document.getElementById('invoice'); inv.classList.add('show'); inv.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); return; } - const amountSats = result.amount != null ? result.amount : minAmount; + const amountSats = result.min_amount != null ? result.min_amount : minAmount; const amountBtc = (amountSats / 1e8).toFixed(8).replace(/\.?0+$/, ''); const invoiceuri = `bitcoin:${result.address}?amount=${amountBtc}&label=BAL&message=Order+For+url+%26+${encodeURIComponent(url)}`; const qrEl = document.getElementById('qrcode'); @@ -649,7 +626,7 @@ document.getElementById('terms-accept').addEventListener('click', async function } }; document.getElementById('iv-status').className = 'ok-line'; - document.getElementById('iv-status').textContent = '✓ Server added: ' + serverUrl + '. Pay the invoice to complete.'; + document.getElementById('iv-status').textContent = '✓ Server verified: ' + serverUrl + '. Pay the invoice — it will be listed after 3 confirmations.'; const inv = document.getElementById('invoice'); inv.classList.add('show'); inv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });