Skip to content

Commit afc34a0

Browse files
UltraDAGcomClaude Opus 4.7 (1M context)
andcommitted
ops: pause mainnet, switch surfaces to testnet-only
Mainnet Fly apps (ultradag-mainnet-1..5) destroyed; referral bot scaled to 0; refbot pg machine stopped. Dashboard, website, and bounty docs flipped to mainnet-paused framing. Dashboard: - MAINNET_NODES emptied; TESTNET_NODES trimmed to the two live nodes - Default network is now testnet; stored 'mainnet' preference is overridden at load time - TopBar mainnet button disabled and labelled "Mainnet (paused)" Website: - Homepage "Mainnet — Open to the Public" section replaced with paused notice + testnet connect snippet - network.js, explorer.js, client.js MAINNET_NODES emptied; testnet arrays trimmed to the two live nodes - testnet page node grid trimmed - FAQ "Is mainnet live?" answer updated Bug bounty: - PROGRAM.md status, mainnet-access section, and conversion-rules block updated; mainnet-attack-surfaces remain in scope for review - LEDGER.md gains a top-of-file pause notice; existing entries remain binding per the testnet-reset-safety policy - LAUNCH.md status line and PROMOTION.md announcement copy updated Dashboard rebuilt and rsynced into site/public/dashboard/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent efbd386 commit afc34a0

14 files changed

Lines changed: 113 additions & 115 deletions

File tree

dashboard/src/components/layout/TopBar.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,12 @@ export function TopBar({
108108
return udag < 0.01 && udag > 0 ? '<0.01' : udag.toLocaleString(undefined, { maximumFractionDigits: 2 });
109109
};
110110

111+
// Mainnet is paused — the button is disabled and shown in a muted style.
111112
const mainnetBtnStyle: React.CSSProperties = {
112113
...switchBtnBase,
113-
...(isMainnet
114-
? { background: 'rgba(0,224,196,0.15)', color: '#00E0C4', border: '1px solid rgba(0,224,196,0.25)' }
115-
: { color: 'var(--dag-text-muted)' }),
114+
color: 'var(--dag-text-muted)',
115+
opacity: 0.4,
116+
cursor: 'not-allowed',
116117
};
117118

118119
const testnetBtnStyle: React.CSSProperties = {
@@ -148,10 +149,14 @@ export function TopBar({
148149
</div>
149150
</div>
150151

151-
{/* Center: network switcher */}
152+
{/* Center: network switcher (mainnet currently paused) */}
152153
<div style={switcherWrapStyle}>
153-
<button onClick={() => onSwitchNetwork('mainnet')} style={mainnetBtnStyle}>
154-
Mainnet
154+
<button
155+
style={mainnetBtnStyle}
156+
disabled
157+
title="Mainnet is paused"
158+
>
159+
Mainnet (paused)
155160
</button>
156161
<button onClick={() => onSwitchNetwork('testnet')} style={testnetBtnStyle}>
157162
Testnet

dashboard/src/lib/api.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,28 @@
33
const TESTNET_NODES = [
44
'https://ultradag-node-1.fly.dev',
55
'https://ultradag-node-2.fly.dev',
6-
'https://ultradag-node-3.fly.dev',
7-
'https://ultradag-node-4.fly.dev',
8-
'https://ultradag-node-5.fly.dev',
96
];
107

11-
const MAINNET_NODES = [
12-
'https://ultradag-mainnet-1.fly.dev',
13-
'https://ultradag-mainnet-2.fly.dev',
14-
'https://ultradag-mainnet-3.fly.dev',
15-
'https://ultradag-mainnet-4.fly.dev',
16-
'https://ultradag-mainnet-5.fly.dev',
17-
];
8+
// Mainnet is paused — no reachable nodes. The network toggle is kept in the
9+
// UI so the codepath is preserved for future re-enablement, but selecting it
10+
// surfaces an empty node list and the dashboard stays in the paused state.
11+
const MAINNET_NODES: string[] = [];
1812

1913
export type NetworkType = 'mainnet' | 'testnet';
2014

2115
// Persist network choice in localStorage
2216
function loadNetwork(): NetworkType {
2317
try {
2418
const stored = localStorage.getItem('ultradag_network');
25-
if (stored === 'mainnet' || stored === 'testnet') return stored;
19+
// Mainnet is paused — any stored 'mainnet' preference is overridden to
20+
// testnet at load time so the dashboard is usable out of the box.
21+
if (stored === 'testnet') return stored;
2622
} catch {}
27-
return 'mainnet'; // default — matches explorer/network pages
23+
return 'testnet';
2824
}
2925

3026
let currentNetwork: NetworkType = loadNetwork();
31-
let currentNode = (currentNetwork === 'mainnet' ? MAINNET_NODES : TESTNET_NODES)[0];
27+
let currentNode = (currentNetwork === 'mainnet' ? MAINNET_NODES : TESTNET_NODES)[0] ?? '';
3228
let connected = false;
3329
/** Incremented on every network switch — stale responses check this to self-discard */
3430
let switchGeneration = 0;
@@ -43,7 +39,7 @@ export function switchNetwork(network: NetworkType) {
4339
currentNetwork = network;
4440
localStorage.setItem('ultradag_network', network);
4541
const nodes = network === 'mainnet' ? MAINNET_NODES : TESTNET_NODES;
46-
currentNode = nodes[0];
42+
currentNode = nodes[0] ?? '';
4743
connected = false;
4844
switchGeneration++;
4945
// Notify all pages to refetch immediately
@@ -71,6 +67,12 @@ async function fetchJson<T>(path: string, options?: RequestInit): Promise<T> {
7167
export async function connectToNode(): Promise<boolean> {
7268
const nodes = currentNetwork === 'mainnet' ? MAINNET_NODES : TESTNET_NODES;
7369

70+
// Mainnet is paused — no nodes to race against.
71+
if (nodes.length === 0) {
72+
connected = false;
73+
return false;
74+
}
75+
7476
// Race all nodes in parallel — first healthy response wins
7577
try {
7678
const winner = await Promise.any(

docs/security/bug-bounty/LAUNCH.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ Best,
280280

281281
---
282282

283-
**Program Status:** ✅ Active (mainnet live since 2026-04-10)
283+
**Program Status:** ✅ Active — Testnet (Mainnet paused 2026-04-22)
284284
**Private reporting:** Enabled on the repo; advisory URL live
285285
**Next Action:** Announce publicly via `PROMOTION.md` channels
286-
**Last Updated:** April 11, 2026
286+
**Last Updated:** April 22, 2026

docs/security/bug-bounty/LEDGER.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77
**UDAG Mainnet Token:** [`0x9cFD2011DF13d9E394B5Bb59f0f7e7A5C512155b`](https://arbiscan.io/token/0x9cFD2011DF13d9E394B5Bb59f0f7e7A5C512155b) (Arbitrum One, deployed 2026-04-12)
88
**Bounty Payment Source:** Genesis allocation holder `0x9aEcb515361af7980eaa16fE40c064f69738EbF9` (to be reimbursed from treasury post-emission)
99

10+
> **Mainnet paused as of 2026-04-22.** Mainnet payouts are deferred until
11+
> mainnet is re-enabled. Every entry below remains binding — the commitment
12+
> is the git-tracked entry plus the hunter's key, not the chain state. See
13+
> [Testnet Reset Safety](#testnet-reset-safety) below; the same policy
14+
> applies to a mainnet pause. Vesting anchors and the 1:1 UDAG conversion
15+
> are unchanged.
16+
1017
This ledger tracks all bug bounty rewards. Each entry is cryptographically signed and represents a binding commitment to distribute mainnet UDAG tokens.
1118

1219
---

docs/security/bug-bounty/PROGRAM.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
# UltraDAG Bug Bounty Program
22

33
**Operator:** JMS Media Group LLC (Wyoming, USA; Filing ID 2026-001951812) — the legal entity behind the UltraDAG project and the payer of record for all bounty rewards.
4-
**Status:** Active — Mainnet & Testnet
4+
**Status:** Active — Testnet (Mainnet paused as of 2026-04-22)
55
**Launch Date:** March 8, 2026
66
**Mainnet Genesis:** April 10, 2026
7-
**Mainnet Public Open:** April 16, 2026 (anyone can run a validator)
7+
**Mainnet Paused:** April 22, 2026
88
**Total Pool:** 500,000 UDAG
99

1010
## Overview
1111

12-
UltraDAG is offering rewards for security researchers who discover and responsibly disclose vulnerabilities in the UltraDAG codebase. **Mainnet is now open** — anyone can run a validator, stake UDAG, and participate in consensus. Testing is welcome on both mainnet and testnet; please prefer testnet for destructive exploration. Mainnet nodes are reachable at `ultradag-mainnet-[1-5].fly.dev:9333` (P2P) and `https://ultradag-mainnet-[1-5].fly.dev` (RPC).
12+
UltraDAG is offering rewards for security researchers who discover and responsibly disclose vulnerabilities in the UltraDAG codebase. **Mainnet is currently paused**; testing runs on testnet only. Testnet nodes are reachable at `ultradag-node-[1-2].fly.dev:9333` (P2P) and `https://ultradag-node-[1-2].fly.dev` (RPC).
1313

14-
Valid reports are rewarded in UDAG, recorded in the append-only [`LEDGER.md`](./LEDGER.md), and convertible 1:1 to mainnet UDAG per the vesting schedule in that file. See [`LEDGER.md` → Testnet Reset Safety](./LEDGER.md#testnet-reset-safety) for why a testnet wipe does not affect your claim.
14+
Valid reports are rewarded in UDAG and recorded in the append-only [`LEDGER.md`](./LEDGER.md). Payout in mainnet UDAG is deferred while mainnet is paused but every ledger entry remains binding per the program's testnet-reset-safety policy — the commitment is the git-tracked entry plus the hunter's key, not the chain state. See [`LEDGER.md` → Testnet Reset Safety](./LEDGER.md#testnet-reset-safety).
1515

16-
## Mainnet Access Policy
16+
## Testnet Access
1717

18-
Mainnet is **fully open**:
19-
20-
- **P2P port 9333 is public** on all mainnet nodes at `ultradag-mainnet-[1-5].fly.dev:9333`. External validators and observers can connect directly.
21-
- **RPC port 10333 is public** at `https://ultradag-mainnet-[1-5].fly.dev` for both reads and transaction submission.
22-
- **Validator set is permissionless** — any address with enough UDAG can stake and enter the active set. The 5 founder-operated Fly nodes have no protocol-level privilege; ranking is by effective stake.
23-
- **Please do not DoS mainnet.** In-scope attacks are those demonstrating a protocol or implementation bug via a minimal PoC — not brute traffic floods. If you can crash or halt a live mainnet node with a single crafted message, that's a valid Critical; sustained DoS traffic is out of scope and may be reported to the hosting provider.
18+
- **P2P port 9333 is public** on both testnet nodes at `ultradag-node-[1-2].fly.dev:9333`.
19+
- **RPC port 10333 is public** at `https://ultradag-node-[1-2].fly.dev` for reads and transaction submission.
20+
- **Please do not DoS the testnet.** In-scope attacks are those demonstrating a protocol or implementation bug via a minimal PoC — not brute traffic floods. If you can crash or halt a testnet node with a single crafted message, that's a valid Critical; sustained DoS traffic is out of scope and may be reported to the hosting provider.
21+
- **Mainnet attack surfaces remain in scope for review** — any bug you find against the current codebase is eligible regardless of whether it's exercisable on a live mainnet today. The vulnerability class is what matters for the reward tier.
2422

2523
## Scope
2624

@@ -155,8 +153,9 @@ Create a GitHub Security Advisory with:
155153
the severity assessment, reward range, and planned timeline.
156154

157155
### Mainnet conversion (applies to all ledger entries)
158-
Mainnet launched **2026-04-10**. Every entry in the ledger converts 1:1 to
159-
mainnet UDAG under the following rules:
156+
Mainnet genesis was **2026-04-10**; mainnet is currently paused as of
157+
**2026-04-22**. Every entry in the ledger converts 1:1 to mainnet UDAG
158+
under the following rules:
160159

161160
1. **Vesting schedule:** 25% unlocked at the vesting anchor (immediate), 75%
162161
vested linearly over the 12 months following.
@@ -167,6 +166,10 @@ mainnet UDAG under the following rules:
167166
the Ed25519 secret key (or passkey) behind their testnet address. This
168167
proves ownership without needing the testnet address to hold any balance
169168
or for the testnet to even still be running.
169+
4. **Pause handling:** while mainnet is paused, claim windows open as soon
170+
as mainnet is re-enabled. The vesting anchor rule above still applies —
171+
a paused period does not reset or delay the anchor. Entries already
172+
accrued continue to accrue the 12-month linear vest.
170173

171174
**Testnet reset safety:** testnet `--clean` restarts do not affect any ledger
172175
entry. The commitments live in git, not on the testnet chain. See the

docs/security/bug-bounty/PROMOTION.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,11 @@ affect the commitment.
112112
113113
UltraDAG is offering up to 50k UDAG for critical vulnerabilities.
114114
DAG-BFT blockchain with 2-3 round finality — interesting consensus
115-
model to test. Mainnet is live (5 validators) but all testing must
116-
happen against the public testnet (attacking mainnet is out of scope).
115+
model to test. Mainnet is currently paused; all testing runs against
116+
the public testnet.
117117
118-
Live testnet + immediate testnet payouts + mainnet conversion schedule.
118+
Live testnet + mainnet conversion schedule. Ledger commitments remain
119+
binding through the pause.
119120
Details: https://github.com/UltraDAGcom/core/blob/main/SECURITY.md
120121
```
121122

0 commit comments

Comments
 (0)