Files
2026-10-22 14:40:00 -04:00

41 lines
4.1 KiB
TypeScript
Executable File

import { IS_MAINNET, IS_PILOT } from '../shared/network.ts';
import { ADDITIONAL_MARKET_FEE } from '../shared/market.ts';
import { assertLaunchAllowed, launchManifest } from './launch.ts';
import { marketConfig } from './market/store.ts';
export type LaunchCheck = { id: string; status: 'pass' | 'blocked' | 'unverified'; detail: string };
/** Read-only local assessment. Never opens a ledger, starts PoW, contacts peers, or sets approvals.
* Configured approvals cannot resolve findings that require new code or independent evidence. */
export function launchPreflight(env: NodeJS.ProcessEnv = process.env, now = Date.now()) {
const checks: LaunchCheck[] = [{ id: 'network-selection', status: IS_MAINNET || IS_PILOT ? 'pass' : 'blocked',
detail: IS_MAINNET ? 'Separate mainnet candidate selected.' : IS_PILOT
? 'Private pilot chain selected; this is not a public or production profile.'
: 'Testnet selected; this is not a production profile.' }];
try {
marketConfig(env);
checks.push({ id: 'mock-payment-boundary', status: 'pass', detail: 'Only mock payments are supported; market configuration is valid.' });
} catch {
checks.push({ id: 'mock-payment-boundary', status: 'blocked', detail: 'Invalid market configuration or unsupported live payment mode. No secret values are included in this report.' });
}
if (IS_MAINNET || IS_PILOT) {
try {
assertLaunchAllowed(env, now);
checks.push({ id: 'operator-startup-gates', status: 'pass', detail: 'Local startup gates satisfied; this does not establish production readiness or peer independence.' });
} catch (error) {
checks.push({ id: 'operator-startup-gates', status: 'blocked', detail: error instanceof Error ? error.message : 'Startup gate failed.' });
}
}
checks.push(
{ id: 'public-node-resource-controls', status: 'blocked', detail: 'Stage-1 global RPC budgets, bounded pages/client history and read caching exist. In-memory DAG growth, full-history UI/reconciliation and production-scale load/capacity evidence remain unresolved.' },
{ id: 'consensus-launch-calibration', status: 'blocked', detail: 'Stage-3 bounded offline native benchmarks and deterministic retarget/timestamp analysis exist. Representative network hashrate, stochastic/multi-host adversarial evidence, reviewed launch rules/genesis and independent economic-security review remain missing.' },
{ id: 'wallet-key-protection', status: 'blocked', detail: 'Stage-2 encrypted vault storage, explicit migration/unlock and lock-aware signing exist. Legacy plaintext copies, unlocked-page compromise, migration/lifecycle coverage and independent production wallet/recovery review remain unresolved.' },
{ id: 'live-market-settlement', status: 'blocked', detail: 'No end-to-end live Monero custody path is connected. Production deposit allocation/crediting, treasury withdrawal signing, market ledger settlement, recovery integration and reviewed custody/refund policy remain unavailable. Mock payment is not real payment.' },
{ id: 'release-security-review', status: 'unverified', detail: 'Independent consensus/application review and release-specific dependency/native/container scans require external evidence; an operator environment flag is not evidence.' },
{ id: 'deployment-rehearsal', status: 'unverified', detail: 'Stage-4 explicit proxy trust, private diagnostics/checker and stopped-node paired backup/restore with local native replay tests exist. Actual HTTPS/proxy topology, independent hosts/miners, alert delivery, off-host recovery and on-call procedures remain unverified.' },
{ id: 'fee-recipient-control', status: 'unverified', detail: 'Confirm the fixed public XMR fee address, checksum and recipient control out of band before any future live payout. No keys or proof are requested here.' },
);
return { ...launchManifest(), assessedAt: new Date(now).toISOString(), productionReady: false,
decision: 'NO-GO', scope: 'Local code/configuration preflight; not an independent audit or launch approval.',
additionalFee: { ...ADDITIONAL_MARKET_FEE }, checks };
}