import { IS_MAINNET, IS_PILOT, NETWORK, PROFILE } from '../shared/network.ts'; import { CHAIN_ID, GENESIS_HASH, GENESIS_TIME } from './testnet/consensus.ts'; export function launchManifest() { return { profile: PROFILE, network: NETWORK, chainId: CHAIN_ID, genesis: GENESIS_HASH, genesisTime: GENESIS_TIME, launchStatus: IS_MAINNET ? 'candidate-gated' : IS_PILOT ? 'private-pilot-mock-only' : 'testnet', paymentMode: 'mock', audited: false }; } /** Operator attestation is an accident-prevention gate, NOT proof of a security audit. */ export function assertLaunchAllowed(env: NodeJS.ProcessEnv = process.env, now = Date.now()) { if (IS_PILOT) { if (env.WIKIDECK_PILOT_MODE !== 'private-mock-only') { throw new Error('Private pilot requires WIKIDECK_PILOT_MODE=private-mock-only'); } if ((env.WIKIDECK_PAYMENT_MODE ?? 'mock') !== 'mock') { throw new Error('Private pilot supports mock payments only; live XMR remains disabled'); } return; } if (!IS_MAINNET) return; if (env.WIKIDECK_MAINNET_LAUNCH !== CHAIN_ID || env.WIKIDECK_MAINNET_REVIEW_ACK !== 'independent-review-complete') { throw new Error(`Mainnet candidate is launch-gated. Review the launch checklist; explicit chain approval required: ${CHAIN_ID}`); } if (now < GENESIS_TIME * 1000) throw new Error('Mainnet candidate genesis time has not arrived; this is not an announced launch date'); const origin = new URL(env.PUBLIC_ORIGIN ?? 'http://invalid'); if (origin.protocol !== 'https:' || origin.username || origin.password || origin.pathname !== '/' || origin.search || origin.hash) throw new Error('Mainnet requires an HTTPS PUBLIC_ORIGIN'); const peers = (env.WIKIDECK_PEERS ?? '').split(',').map(s => s.trim()).filter(Boolean); if (new Set(peers).size < 2) throw new Error('Mainnet launch requires at least two explicitly configured independent HTTPS peers'); for (const text of peers) { const peer = new URL(text); if (peer.protocol !== 'https:' || peer.origin === origin.origin || peer.username || peer.password || peer.pathname !== '/' || peer.search || peer.hash) throw new Error('Invalid mainnet peer origin'); } if (new Set(peers.map(p => new URL(p).origin)).size < 2 || env.WIKIDECK_ALLOW_PRIVATE_PEERS === '1') throw new Error('Mainnet requires distinct public peer origins; private peer bypass is disabled'); if ((env.WIKIDECK_PAYMENT_MODE ?? 'mock') !== 'mock') throw new Error('Live XMR payments remain disabled pending a separate settlement review'); }