{"ok":true,"data":{"build":{"cluster":"mainnet-beta","commit":"local","mintingEnabled":false,"audited":false},"capabilities":{"walletConnect":true,"tradeSubmission":false,"tokenCreation":false,"solToZecRouting":false,"moneroRead":false,"privatePayout":false,"privateOrders":false,"settlementProofs":false},"adapters":[{"id":"solana-entry","name":"Solana entry adapter","status":"live","summary":"Wallet connection, network verification, and mainnet swap execution.","claim":"Connect any Wallet Standard wallet and trade on mainnet in two clicks.","specs":[{"label":"Standard","value":"Wallet Standard"},{"label":"Cluster check","value":"getGenesisHash"},{"label":"Token programs","value":"SPL + Token-2022"},{"label":"Router","value":"Jupiter aggregator"},{"label":"Signing","value":"Client-side only"}],"signature":"interface SolanaEntry {\n  verifyNetwork(): Promise<NetworkCheck>\n  getSolBalance(addr: string): Promise<number>\n  getTokenBalance(owner, mint): Promise<number>\n}","provides":["Wallet Standard connection (Phantom, Solflare, Backpack and any compliant wallet)","Cluster identity check via getGenesisHash before any signature is requested","Live SOL and SPL balance reads, across both the legacy and Token-2022 programs","Wallet-signed mainnet swaps with on-chain confirmation","Explorer links for every address and signature shown"],"shipping":["Hardware-wallet clear signing, so the device renders the swap rather than a blob","Self-hosted RPC by default, removing the last third party from the read path","Priority-fee tuning driven by live network congestion"],"configuredBy":["NEXT_PUBLIC_SOLANA_CLUSTER","NEXT_PUBLIC_SOLANA_RPC_URL"]},{"id":"conversion-routing","name":"Conversion and routing adapter","status":"building","summary":"Quotes and routes a SOL balance into XMR so participation can settle in the Monero.","claim":"One hop from a Solana balance to the Monero, with every venue disclosed.","specs":[{"label":"Quote TTL","value":"45s, enforced"},{"label":"Route disclosure","value":"Per hop"},{"label":"Fee breakdown","value":"Itemised"},{"label":"Custody","value":"Provider, time-boxed"},{"label":"Contract","value":"ConversionQuote"}],"signature":"interface ConversionAdapter {\n  quote(i: { fromAmountSol: number }): Promise<ConversionQuote>\n  execute(quoteId: string): Promise<SettlementRef>\n}","provides":["A typed quote shape the real provider must satisfy","Indicative pricing so the quote surface can be reviewed end to end","Quote expiry and staleness handling, enforced at confirm time"],"shipping":["Provider selection, gated on a published custody and timing-correlation review","Amount bucketing and randomised release, so size and timing stop correlating across chains","Multi-provider routing so no single venue sees the whole flow"],"configuredBy":["CONVERSION_PROVIDER_URL","CONVERSION_PROVIDER_KEY"]},{"id":"monero-settlement","name":"Monero settlement adapter","status":"beta","summary":"Validates Monero destinations and is the interface a reward payout service would implement.","claim":"Reward destinations decoded and checksummed to the spec, byte for byte, before anything is sent.","specs":[{"label":"Encoding","value":"Monero Base58, block-wise"},{"label":"Checksum","value":"Keccak-256, first 4 bytes"},{"label":"Address types","value":"standard, integrated, subaddress"},{"label":"Networks","value":"mainnet only; stagenet/testnet refused"},{"label":"Key custody","value":"Out of process"}],"signature":"interface MoneroSettlement {\n  checkAddress(raw: string): PrivateAddressCheck\n  listEpochs(): Promise<DistributionEpoch[]>\n  claim(i: { epoch, toAddress }): Promise<PayoutRef>\n}","provides":["Real Monero Base58 decoding and Keccak-256 checksum verification","Prefix-aware typing: standard (4…), integrated (4…, 106 chars) and subaddress (8…)","Stagenet and testnet addresses parsed, identified and refused rather than silently accepted"],"shipping":["Signer service holding payout authority, isolated from this web process entirely","A per-payee subaddress issued from a wallet RPC, so payouts are not linkable to one another","View-key-backed accrual reads, and transaction proofs a recipient can verify"],"configuredBy":["MONERO_WALLET_RPC_URL","ORANGECURVE_SETTLEMENT_SIGNER_URL"]},{"id":"private-markets","name":"Private asset and market layer","status":"building","summary":"Confidential balances, private order flow and settlement proofs — the layer that makes the headline literal.","claim":"The hard part, specified in full: commitments, nullifiers, batch proofs.","specs":[{"label":"Balance model","value":"Commitment notes"},{"label":"Spend protection","value":"Nullifier set"},{"label":"Order privacy","value":"Threshold-encrypted"},{"label":"Settlement","value":"Batch auction + proof"},{"label":"Components","value":"5 specified"}],"signature":"interface PrivateMarkets {\n  submitPrivateOrder(o: EncryptedOrder): Promise<Receipt>\n  getConfidentialBalance(vk: ViewingKey): Promise<Note[]>\n  verifySettlement(p: SettlementProof): boolean\n}","provides":["A complete written specification for all five components","A commitment-based note model in the shape Monero already proves at scale","Standard nullifier construction for exactly-once spends"],"shipping":["Note tree and nullifier set — the two components with settled designs","Batch-auction settlement circuit, with proving cost as the binding constraint","Fixed-cadence order batching with a decoy policy, to break timing analysis"],"configuredBy":[]},{"id":"rewards-engine","name":"Rewards engine","status":"beta","summary":"Applies a token’s published fee split, weights holders by time-held balance, and pays the pot out in private XMR.","claim":"Snapshot-proof accounting that sums to the last zatoshi.","specs":[{"label":"Weighting","value":"Time-weighted balance"},{"label":"Min hold","value":"30 min to qualify"},{"label":"Split precision","value":"Integer zatoshi"},{"label":"Rounding","value":"Carried, never dropped"},{"label":"Fee split","value":"Immutable at launch"}],"signature":"interface RewardsEngine {\n  timeWeightedBalance(i: EligibilityInput): number\n  splitEpoch(i: { potZec, weights }): Payout[]\n  accrualsFor(wallet: string): Promise<RewardAccrual[]>\n}","provides":["Published, immutable-at-launch fee split shown before the creator signs","Time-weighted eligibility with a minimum hold window (implemented and deterministic)","Exact-sum epoch splitting in zatoshi, with the rounding remainder accounted for"],"shipping":["Verifiable proof of total distribution, upgrading epochs from commitment to proof","Private payout execution once the signer service lands","Claim batching tuned to shrink the timing signal a claim leaks"],"configuredBy":["INDEXER_URL","ORANGECURVE_SETTLEMENT_SIGNER_URL"]},{"id":"indexer","name":"Indexer and API","status":"beta","claim":"Live market data on every listing, with public and private state never mixed.","specs":[{"label":"Quote sources","value":"DexScreener → Jupiter"},{"label":"Candles and fills","value":"GeckoTerminal, real pool data"},{"label":"Cache","value":"60s, shared in-flight"},{"label":"Timeout","value":"4s, then fallback"},{"label":"Validation","value":"zod, server-side"},{"label":"Cache-Control","value":"no-store"}],"signature":"interface IndexerAdapter {\n  listTokens(q: TokenQuery): Promise<TokenPage>\n  getToken(id: string): Promise<TokenDetail | null>\n  getCandles(id: string, tf: Timeframe): Promise<Candle[]>\n}","summary":"Serves token listings, charts, trades and holder data, keeping public chain facts separate from private user state.","provides":["Typed, zod-validated query contract for listings, charts, trades and holders","Filtering, sorting, search and pagination implemented server-side","Public chain facts and private user state kept as separate methods with separate trust assumptions","Charts and the trade tape read real pool data, and render empty rather than generated when an upstream has none"],"shipping":["Self-hosted index, removing the last third-party read dependency","Websocket price streaming in place of interval polling","Per-pool depth and slippage curves surfaced on every listing"],"configuredBy":["INDEXER_URL","INDEXER_KEY","NEXT_PUBLIC_USE_INDEXER"]}],"protocolResearch":[{"key":"confidential-balances","title":"Confidential balances","requirement":"A holder position must be readable by its owner and by nobody else, while remaining provably within total supply.","state":"specified","notes":"Commitment-based note model with an append-only note tree, in the shape Monero already uses for value. The open question is not the primitive but where the tree lives: Monero mainnet has no native custom private asset, so this needs either a ZSA-style protocol change or a separate proving system anchored to Monero."},{"key":"private-orders","title":"Private order submission","requirement":"Order size and direction must not be inferable before, during, or after execution.","state":"open-problem","notes":"Encrypting an order is easy. Preventing the sequencer, the relayer, or an observer of timing and gas patterns from reconstructing it is not. Any honest design here includes batching with a fixed cadence and a decoy policy, both of which cost latency."},{"key":"settlement-proofs","title":"Settlement proofs","requirement":"Anyone must be able to verify that a batch settled according to published market rules, without learning any participant position.","state":"researching","notes":"Circuit design for a batch-auction settlement proof, including the fee split. Cost and proving time are the binding constraints, not feasibility."},{"key":"nullifier-set","title":"Nullifier set","requirement":"A note must be spendable exactly once, without revealing which note was spent.","state":"specified","notes":"Standard construction. The engineering risk is operational: nullifier-set growth, and the availability requirements on whoever serves it."},{"key":"metadata-resistance","title":"Metadata resistance","requirement":"Network-level observation of OrangeCurve clients must not deanonymise participants.","state":"open-problem","notes":"The front end is the weakest link. IP addresses, request timing, and RPC provider logs can defeat on-chain privacy entirely. Mitigations exist (self-hosted RPC, Tor, client-side filtering) but none are default-on today."}]}}