Skip to content

Commit 152e06b

Browse files
UltraDAGcomClaude Opus 4.6 (1M context)
andcommitted
mainnet: open to public validators (2026-04-16)
After four weeks of closed hardening and 4 bounty-validated fixes, mainnet opens to permissionless validator participation. The 5 Fly nodes are peers, not gatekeepers — ranking is stake-weighted. Infrastructure: - fly-mainnet-[1-5].toml: added [[services]] block exposing port 9333 to the public internet, removed NO_BOOTSTRAP=true. External nodes can now reach ultradag-mainnet-*.fly.dev:9333 for P2P. Docs: - PROGRAM.md: status "Testnet (mainnet closed)" → "Mainnet & Testnet". Added April 16 public-open date. Replaced Mainnet Access Policy section with open-access rules. - README.md: "mainnet is currently closed" → "mainnet is open". - site/index.astro: "Mainnet — Closed During Hardening Phase" section replaced with open-access instructions + run-a-node snippet. Not changed: NETWORK_ID differs between testnet/mainnet builds as cryptographic replay protection — this stays. `--validators N` still passed at startup to set the quorum floor (GHSA-rprp-wjrh-hx7g). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3e79f46 commit 152e06b

8 files changed

Lines changed: 103 additions & 85 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
| 🟡 **Medium** | 1,000 – 5,000 UDAG |
2323
| 🟢 **Low** | 100 – 1,000 UDAG |
2424

25-
**All testing happens on [testnet](https://ultradag-node-1.fly.dev/status)** — mainnet is currently closed to external participation while the bounty program hardens the code. See [`PROGRAM.md`](./docs/security/bug-bounty/PROGRAM.md#mainnet-access-policy-current-phase) for the mainnet access policy.
25+
**Mainnet is open** — anyone can run a validator at `ultradag-mainnet-[1-5].fly.dev:9333`. Please prefer [testnet](https://ultradag-node-1.fly.dev/status) for destructive exploration and reproduction PoCs. See [`PROGRAM.md`](./docs/security/bug-bounty/PROGRAM.md#mainnet-access-policy) for scope and rules.
2626

2727
Reports are private via GitHub Security Advisories. Testnet resets **do not** affect any reward commitment — the append-only [`LEDGER.md`](./docs/security/bug-bounty/LEDGER.md) is the binding record, not on-chain balances. See [`LEDGER.md → Testnet Reset Safety`](./docs/security/bug-bounty/LEDGER.md#testnet-reset-safety) for why.
2828

docs/security/bug-bounty/PROGRAM.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
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 — Testnet (mainnet is closed while the bounty program hardens the code)
4+
**Status:** Active — Mainnet & Testnet
55
**Launch Date:** March 8, 2026
6-
**Mainnet Genesis:** April 10, 2026 (validators running, closed to external peers)
7-
**Mainnet Public Open:** TBD (gated on bounty program results)
6+
**Mainnet Genesis:** April 10, 2026
7+
**Mainnet Public Open:** April 16, 2026 (anyone can run a validator)
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. **All testing happens against the public testnet.** Mainnet is currently running but is **closed to external participation** — only the founder-operated Fly.io validators can join the P2P mesh. External users cannot connect as validators, peers, or relays. The public RPC on mainnet is still readable for transparency (you can query `/status`, `/balance`, etc.), but no new state can be introduced by outsiders until the bounty program has had time to harden the code.
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).
1313

14-
Valid reports are rewarded in testnet UDAG, recorded in the append-only [`LEDGER.md`](./LEDGER.md), and convertible 1:1 to mainnet UDAG per the vesting schedule in that file — regardless of how many times testnet is reset in the interim. 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, 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.
1515

16-
## Mainnet Access Policy (current phase)
16+
## Mainnet Access Policy
1717

18-
Mainnet is in a deliberate **hardening phase**. Key points:
18+
Mainnet is **fully open**:
1919

20-
- **P2P port 9333 is not exposed to the public internet** on any mainnet node. External hosts cannot open TCP connections to the Noise handshake endpoint. The 5 mainnet nodes reach each other over Fly's internal WireGuard mesh (`ultradag-mainnet-[1-5].internal`) only.
21-
- **RPC port 10333 remains public** at `https://ultradag-mainnet-[1-5].fly.dev` for transparency. Anyone can read chain state; no one can submit transactions that affect it unless they go through the existing RPC (and most state-changing RPC endpoints are testnet-only on mainnet builds).
22-
- **Pre-launch token distribution happens on Arbitrum** via an ERC-20 representation of UDAG. Buying UDAG in this phase gets you Arbitrum-side tokens, not native mainnet UDAG. This lets the maintainer restart mainnet freely during hardening without invalidating any token holder. See `bridge/README.md`.
23-
- **Mainnet will open to public participation** only after the bounty program has validated the code against real adversaries over a meaningful window. There is no fixed date; the decision is gated on the findings in this program.
24-
- **Until mainnet opens, attacking mainnet nodes is out of scope and explicitly illegal.** Test against testnet only. If you can somehow reach a mainnet node (through a misconfiguration or a Fly bug) — report it privately as a finding, do not exploit it.
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.
2524

2625
## Scope
2726

site/src/pages/index.astro

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -585,39 +585,39 @@ const GECKOTERMINAL_URL =
585585
<span class="kw">curl</span> <span class="str">http://localhost:10333/status</span></pre>
586586
</div>
587587

588-
<!-- Mainnet Access Policy (currently closed during hardening phase) -->
588+
<!-- Mainnet Access — fully open as of 2026-04-16 -->
589589
<div class="code-section reveal">
590590
<div class="code-header">
591591
<div class="code-dots"><div class="code-dot"></div><div class="code-dot"></div><div class="code-dot"></div></div>
592-
<span class="code-label">Mainnet — Closed During Hardening Phase</span>
593-
</div>
594-
<pre><span class="cm"># Mainnet is RUNNING but closed to external participation.</span>
595-
<span class="cm"># The 5 founder-operated validators are producing rounds, finalizing,</span>
596-
<span class="cm"># and crediting the 7-bucket emission, but external hosts cannot join</span>
597-
<span class="cm"># the P2P mesh (the Noise handshake port is not exposed to the public</span>
598-
<span class="cm"># internet on any mainnet node).</span>
599-
600-
<span class="cm"># Why?</span>
601-
<span class="cm"># We want the bug bounty program to harden every consensus, state,</span>
602-
<span class="cm"># network, and cryptographic path against real adversaries BEFORE</span>
603-
<span class="cm"># letting third-party validators stake real value. Mainnet is our</span>
604-
<span class="cm"># production-shaped but non-user-facing environment until then.</span>
605-
606-
<span class="cm"># What you can still do with mainnet:</span>
607-
<span class="cm"># 1. Query read-only RPC for transparency:</span>
592+
<span class="code-label">Mainnet — Open to the Public</span>
593+
</div>
594+
<pre><span class="cm"># Mainnet opened to public participation on 2026-04-16.</span>
595+
<span class="cm"># Anyone can run a validator, stake UDAG, and join the active set.</span>
596+
<span class="cm"># The 5 founder-operated Fly nodes are peers, not gatekeepers —</span>
597+
<span class="cm"># ranking is purely stake-weighted.</span>
598+
599+
<span class="cm"># Run a mainnet node from source:</span>
600+
<span class="kw">git clone</span> https://github.com/UltraDAGcom/core &amp;&amp; <span class="kw">cd</span> core
601+
<span class="kw">cargo build --release --features mainnet</span>
602+
./target/release/ultradag-node \
603+
--data-dir ./mainnet-data --port 9333 --rpc-port 10333 \
604+
--seed ultradag-mainnet-1.fly.dev:9333 \
605+
--validators 5
606+
607+
<span class="cm"># Query mainnet state:</span>
608608
<span class="kw">curl</span> <span class="str">https://ultradag-mainnet-1.fly.dev/status</span>
609-
<span class="cm"># 2. Inspect any address balance or name:</span>
610609
<span class="kw">curl</span> <span class="str">https://ultradag-mainnet-1.fly.dev/balance/udag1...</span>
611-
<span class="cm"># 3. Watch the chain progress via /round/:N and /vertex/:hash</span>
612610

613-
<span class="cm"># Where to test, find bugs, and earn UDAG:</span>
614-
<span class="cm"># → Testnet (instructions above) — 5 public validators, open mesh,</span>
615-
<span class="cm"># full faucet, every RPC path enabled, full bug bounty scope.</span>
616-
<span class="cm"># See docs/security/bug-bounty/PROGRAM.md for rewards + rules.</span>
611+
<span class="cm"># Stake to enter the validator active set:</span>
612+
<span class="cm"># 1. Fund your address with UDAG (bridge from Arbitrum, or earn via</span>
613+
<span class="cm"># faucet/bounty on testnet first).</span>
614+
<span class="cm"># 2. Submit a Stake tx via /tx/submit — see docs/stake.md.</span>
615+
<span class="cm"># 3. If your effective stake lands in the top-N, you produce rounds</span>
616+
<span class="cm"># and earn the 44% validator emission share.</span>
617617

618-
<span class="cm"># When will mainnet open?</span>
619-
<span class="cm"># Gated on bounty program results. No fixed date — we'll announce</span>
620-
<span class="cm"># when we're confident enough adversarial testing has happened.</span></pre>
618+
<span class="cm"># Bug bounty: still runs on mainnet AND testnet.</span>
619+
<span class="cm"># Use testnet for destructive PoCs. Report via GitHub Security.</span>
620+
<span class="cm"># See docs/security/bug-bounty/PROGRAM.md for rewards + rules.</span></pre>
621621
</div>
622622

623623
<!-- Additional Info -->
@@ -626,18 +626,18 @@ const GECKOTERMINAL_URL =
626626
<div class="node-info-grid">
627627
<div>
628628
<p>
629-
✓ <strong>Read-only RPC</strong> public on port 10333<br />
630-
✓ <strong>Full transparency</strong> — all state queryable<br />
631-
<strong>P2P mesh</strong> closed to external nodes<br />
632-
<strong>Public staking</strong> disabled until bounty review
629+
✓ <strong>P2P port 9333</strong> public on all mainnet nodes<br />
630+
✓ <strong>RPC port 10333</strong> public — reads and writes<br />
631+
<strong>Permissionless validators</strong> — stake to join<br />
632+
<strong>Stake-weighted active set</strong> — no allowlist
633633
</p>
634634
</div>
635635
<div>
636636
<p>
637-
✓ <strong>Bug bounty</strong> runs on testnet (open mesh)<br />
638-
✓ <strong>Pre-launch tokens</strong> on Arbitrum (ERC-20)<br />
639-
✓ <strong>Restartable</strong> — Arbitrum holders insulated<br />
640-
✓ <strong>Open date</strong> gated on bounty results
637+
✓ <strong>Bug bounty</strong> open on mainnet &amp; testnet<br />
638+
✓ <strong>Token on Arbitrum</strong> (ERC-20) + native UDAG<br />
639+
✓ <strong>Open validator set</strong> — top-N by effective stake<br />
640+
✓ <strong>Opened 2026-04-16</strong> to public participation
641641
</p>
642642
</div>
643643
</div>

tools/operations/deployment/fly/fly-mainnet-1.toml

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ primary_region = "ams"
1212
DATA_DIR = "/data"
1313
VALIDATORS = "5"
1414
SEED = "ultradag-mainnet-2.internal:9333 ultradag-mainnet-3.internal:9333 ultradag-mainnet-4.internal:9333 ultradag-mainnet-5.internal:9333"
15-
NO_BOOTSTRAP = "true"
1615
# CLEAN_STATE = "true"
1716

1817
[mounts]
@@ -33,23 +32,19 @@ primary_region = "ams"
3332
path = "/health"
3433
timeout = "10s"
3534

36-
# Mainnet P2P port 9333 is INTENTIONALLY not exposed as a public [[services]]
37-
# block. The 5 mainnet nodes reach each other over Fly's internal WireGuard
38-
# mesh via `.internal` DNS (see SEED above), which doesn't require a public
39-
# port. Closing port 9333 to the public internet keeps the mainnet P2P
40-
# protocol as a private allowlist — only the 5 nodes in this org can even
41-
# attempt a Noise handshake. External observers can still query the public
42-
# RPC endpoint on port 10333 via [http_service] above.
43-
#
44-
# To re-open mainnet to public peers, restore this block (the default Fly
45-
# P2P pattern — identical to the testnet fly-node-*.toml files):
46-
#
47-
# [[services]]
48-
# protocol = "tcp"
49-
# internal_port = 9333
50-
# [[services.ports]]
51-
# port = 9333
52-
# handlers = []
35+
# Mainnet P2P is OPEN to public peers — anyone can run a validator or
36+
# observer node. Stake-weighted active-set selection (top-N by effective
37+
# stake) is the only gate; the former founder-only WireGuard mesh was
38+
# lifted for mainnet launch on 2026-04-16.
39+
[[services]]
40+
internal_port = 9333
41+
protocol = "tcp"
42+
auto_stop_machines = false
43+
auto_start_machines = true
44+
min_machines_running = 1
45+
46+
[[services.ports]]
47+
port = 9333
5348

5449
[deploy]
5550
strategy = "immediate"

tools/operations/deployment/fly/fly-mainnet-2.toml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ primary_region = "ams"
1212
DATA_DIR = "/data"
1313
VALIDATORS = "5"
1414
SEED = "ultradag-mainnet-1.internal:9333 ultradag-mainnet-3.internal:9333 ultradag-mainnet-4.internal:9333 ultradag-mainnet-5.internal:9333"
15-
NO_BOOTSTRAP = "true"
1615
# CLEAN_STATE = "true"
1716

1817
[mounts]
@@ -33,10 +32,17 @@ primary_region = "ams"
3332
path = "/health"
3433
timeout = "10s"
3534

36-
# Mainnet P2P port 9333 is INTENTIONALLY not exposed as a public [[services]]
37-
# block. See fly-mainnet-1.toml for the full rationale. Nodes reach each
38-
# other over Fly's internal WireGuard mesh via `.internal` DNS. To re-open
39-
# mainnet to public peers, restore the standard P2P [[services]] block.
35+
# Mainnet P2P is OPEN to public peers — anyone can run a validator or
36+
# observer node. Stake-weighted active-set selection is the only gate.
37+
[[services]]
38+
internal_port = 9333
39+
protocol = "tcp"
40+
auto_stop_machines = false
41+
auto_start_machines = true
42+
min_machines_running = 1
43+
44+
[[services.ports]]
45+
port = 9333
4046

4147
[deploy]
4248
strategy = "immediate"

tools/operations/deployment/fly/fly-mainnet-3.toml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ primary_region = "ams"
1212
DATA_DIR = "/data"
1313
VALIDATORS = "5"
1414
SEED = "ultradag-mainnet-1.internal:9333 ultradag-mainnet-2.internal:9333 ultradag-mainnet-4.internal:9333 ultradag-mainnet-5.internal:9333"
15-
NO_BOOTSTRAP = "true"
1615
# CLEAN_STATE = "true"
1716

1817
[mounts]
@@ -33,10 +32,17 @@ primary_region = "ams"
3332
path = "/health"
3433
timeout = "10s"
3534

36-
# Mainnet P2P port 9333 is INTENTIONALLY not exposed as a public [[services]]
37-
# block. See fly-mainnet-1.toml for the full rationale. Nodes reach each
38-
# other over Fly's internal WireGuard mesh via `.internal` DNS. To re-open
39-
# mainnet to public peers, restore the standard P2P [[services]] block.
35+
# Mainnet P2P is OPEN to public peers — anyone can run a validator or
36+
# observer node. Stake-weighted active-set selection is the only gate.
37+
[[services]]
38+
internal_port = 9333
39+
protocol = "tcp"
40+
auto_stop_machines = false
41+
auto_start_machines = true
42+
min_machines_running = 1
43+
44+
[[services.ports]]
45+
port = 9333
4046

4147
[deploy]
4248
strategy = "immediate"

tools/operations/deployment/fly/fly-mainnet-4.toml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ primary_region = "ams"
1212
DATA_DIR = "/data"
1313
VALIDATORS = "5"
1414
SEED = "ultradag-mainnet-1.internal:9333 ultradag-mainnet-2.internal:9333 ultradag-mainnet-3.internal:9333 ultradag-mainnet-5.internal:9333"
15-
NO_BOOTSTRAP = "true"
1615
# CLEAN_STATE = "true"
1716

1817
[mounts]
@@ -33,10 +32,17 @@ primary_region = "ams"
3332
path = "/health"
3433
timeout = "10s"
3534

36-
# Mainnet P2P port 9333 is INTENTIONALLY not exposed as a public [[services]]
37-
# block. See fly-mainnet-1.toml for the full rationale. Nodes reach each
38-
# other over Fly's internal WireGuard mesh via `.internal` DNS. To re-open
39-
# mainnet to public peers, restore the standard P2P [[services]] block.
35+
# Mainnet P2P is OPEN to public peers — anyone can run a validator or
36+
# observer node. Stake-weighted active-set selection is the only gate.
37+
[[services]]
38+
internal_port = 9333
39+
protocol = "tcp"
40+
auto_stop_machines = false
41+
auto_start_machines = true
42+
min_machines_running = 1
43+
44+
[[services.ports]]
45+
port = 9333
4046

4147
[deploy]
4248
strategy = "immediate"

tools/operations/deployment/fly/fly-mainnet-5.toml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ primary_region = "ams"
1212
DATA_DIR = "/data"
1313
VALIDATORS = "5"
1414
SEED = "ultradag-mainnet-1.internal:9333 ultradag-mainnet-2.internal:9333 ultradag-mainnet-3.internal:9333 ultradag-mainnet-4.internal:9333"
15-
NO_BOOTSTRAP = "true"
1615
# CLEAN_STATE = "true"
1716

1817
[mounts]
@@ -33,10 +32,17 @@ primary_region = "ams"
3332
path = "/health"
3433
timeout = "10s"
3534

36-
# Mainnet P2P port 9333 is INTENTIONALLY not exposed as a public [[services]]
37-
# block. See fly-mainnet-1.toml for the full rationale. Nodes reach each
38-
# other over Fly's internal WireGuard mesh via `.internal` DNS. To re-open
39-
# mainnet to public peers, restore the standard P2P [[services]] block.
35+
# Mainnet P2P is OPEN to public peers — anyone can run a validator or
36+
# observer node. Stake-weighted active-set selection is the only gate.
37+
[[services]]
38+
internal_port = 9333
39+
protocol = "tcp"
40+
auto_stop_machines = false
41+
auto_start_machines = true
42+
min_machines_running = 1
43+
44+
[[services.ports]]
45+
port = 9333
4046

4147
[deploy]
4248
strategy = "immediate"

0 commit comments

Comments
 (0)