A complete locally runnable MVP for the official Arena Identity Manager idea: users prove control of an EVM wallet and a Solana wallet by signing the same one-time challenge, then publish an off-chain verified wallet pairing. Includes an optional Solidity on-chain attestation contract.
- Connect MetaMask (EVM) and Phantom (Solana)
- Server-generated 5-minute one-time challenge, bound to app origin, wallet addresses and expiry
- EIP-191 EVM signature verification (
ethers.verifyMessage) - Ed25519 Solana signature verification (
tweetnacl) - Prevent linking the same Solana wallet to two EVM profiles; persist verified records to local JSON
- Public search by EVM address; proof digest; responsive frontend
- Contract source for future Hadrian on-chain anchoring
Important: This version is an off-chain signature-verification MVP. The contract is NOT automatically deployed or called. It would be misleading to claim an on-chain verified identity or a completed Rome-native dual-lane integration. This project is not yet submission-ready for Rome's on-chain requirements. A second integration phase is necessary.
- Node.js 20.19+ or 22+
- npm
- MetaMask extension + Phantom extension in a compatible browser
- Extract ZIP and open the
romeidfolder in VS Code. - In terminal:
npm install - Copy
.env.exampleto.env(Windows PowerShell:Copy-Item .env.example .env) - Terminal A:
npm run server - Terminal B:
npm run dev - Open
http://localhost:5173 - Connect both wallets, approve both message signatures, then verify a profile with its EVM address.
npm testtests cryptographic verification;npm run buildbuilds the frontend.
- Frontend: Vercel (
npm run build, outputdist). - API: must run on a persistent Node host with persistent storage; Vercel static hosting alone will NOT run the Express API. Set
VITE_API_URLto the public API base URL at frontend build time andAPP_ORIGINon the API to the frontend's exact origin. - The JSON file store is for local development only. Use a transactional database (e.g. Postgres) before public launch. Add rate limiting, durable nonce storage, auth for revocations and audit logs.
- Never commit private keys,
.env, mnemonic phrases, or wallet secrets. Neither wallet needs a private key in this application. - On-chain attestation: deploy
contracts/RomeIDRegistry.solon Hadrian using the official ROME CLI/Hardhat, then add an authorized backend attestor that validates signatures and submitsattest. Build an explicit consent-based unlink/revoke flow. Verify chain ID, RPC and gas token against live ROME registry before deployment. - No automated on-chain transactions are performed by this MVP.
App: RomeID One line: One identity, two wallets. Link EVM and Solana wallets through verified ownership. Type: Both (target architecture; MVP wallet signing is supported, but on-chain integration is pending).
- Signature text is plain text and includes the app origin, both addresses, nonce, expiry and exact intent. Do not sign unexpected wallet prompts.
- Server challenges are single-use but stored in memory; restart invalidates them. API is not hardened for public production use.
- Local JSON storage is not concurrency-safe. This is a demonstrator, not a production identity authority.
- Public profiles reveal that two addresses belong to the same person; only link wallets you intend to associate publicly.
- The contract trusts its attestor; it does not verify Solana Ed25519 signatures by itself.
Designed against the user-provided ROME_and_Arena_Knowledge_Base.md (snapshot 2026-11-04). Chain facts must be checked live before deployment.
This V2 retains the working off-chain MetaMask+Phantom signature verification. It can optionally submit an attestation to the Hadrian testnet automatically after successful dual-signature verification. The contract trusts the server attestor; it does not verify Solana Ed25519 signatures on-chain. The API must stay online to verify new users.
- Copy
.env.exampleto.envand create a new dedicated test-only EVM wallet for anchoring. Never use your main wallet or share the private key. SetANCHOR_PRIVATE_KEYin local.env(never commit). - Verify Hadrian RPC, chain ID and faucet instructions against current Rome docs/registry. Fund the dedicated attestor wallet with enough Hadrian test gas token. The test gas token may be USDC, not ETH.
- Run
npm install, thennpm run deploy:hadrian. This compiles and deploysRomeIDRegistrywith the attestor wallet as owner. Record the contract address and deployment transaction. - Set
ANCHOR_CONTRACT_ADDRESSin.env. Runnpm run serverandnpm run devin separate terminals. - Reconnect both wallets and click Verify & Link again. The API verifies both signatures, then uses the server's dedicated attestor wallet to send an on-chain transaction. Check the transaction hash on the Hadrian explorer.
- Test Public Registry search. If the RPC, faucet or contract execution fails, the UI will accurately report the link as off-chain only.
Security: Never place private keys in VITE_ environment variables or GitHub. .env is gitignored. For production use, move from a trusted centralized attestor to a more robust permissioned proof architecture and persistent database. This project is an MVP, not audited.
Deployment: Vercel can host the Vite frontend, but the Express API and server attestor need a separate Node hosting service with secure environment variables. Vercel frontend alone does not make the full app work. Arena registration/Laurels are subject to the current program rules; a working testnet transaction does not guarantee a reward.