ADR-008 β Liquidity & Merchant Adoption (non-custodial)
- Status: Accepted
- Date: 2026-07-22
- Supersedes: β
- Superseded by: β
- Related: ADR-007 (no protocol revenue), ADR-006 (founder allocation / burn),
ADR-007 (long-term sustainability β fees 100% to miner, governance freeze). A future ADR-009 will cover the relief-grant program, which is intentionally deferred by this decision.
Context
MoonBite (MBITE) is a RandomX PoW Litecoin-family chain. It is pre-mainnet, not listed on any exchange, and has recorded zero trades β so it has no established market value. A coin with no way to be traded and nowhere to be spent has no reason for anyone to hold it, and no honest basis for any grant, airdrop, or "relief" program: giving away a thing of undefined value is not a gift, it's theatre.
Two things must exist *before* value is meaningful:
1. Liquidity β some venue where MBITE can be exchanged for another asset, so price discovery can begin. 2. Utility β somewhere MBITE can actually be *spent*, so holding it connects to real goods/services rather than pure speculation.
The hard constraint on *how* we provide these is regulatory. The moment our software holds customer funds, keys, or balances, or touches the cryptoβfiat boundary (taking money, paying bills, converting to dollars), it becomes money transmission β an MSB activity requiring licensing and KYC/AML in most jurisdictions. That is a line the project deliberately will not cross at the software layer. See the pseudonymity/opsec posture in the project history for why we avoid becoming a regulated intermediary.
Crypto-to-crypto, wallet-to-wallet, non-custodial software that never touches customer funds is, by contrast, ordinary software. That is the only design space we build in.
Decision
Ship a liquidity layer and a merchant-adoption layer, both strictly non-custodial. The server stores *intent and observation only*; it never holds coins, keys, or balances, and never touches fiat.
1. Exchange β non-custodial order book (exchange.py)
- An order-intent store (SQLite) for the pairs MBITE/LTC, MBITE/BTC,
and MBITE/USDT. Each order records the maker's side, price, amount, and the maker's own wallet addresses β *not* any funds.
- Settlement is peer-to-peer via atomic swap (HTLC). MBITE/LTC and MBITE/BTC
are native β both legs live in the shared Bitcoin-script family, so an HTLC swap needs no third party. MBITE/USDT is flagged contract (the USDT leg needs a contract on its host chain) and is documented as harder.
settle_hintperforms the hand-off: when a taker wants an order, it returns
both parties' swap addresses and the mechanism ("HTLC atomic swap, non-custodial") with status manual β the actual swap is executed by the two wallets, not the server. Full swap automation is explicitly Phase 2 and out of scope here.
- The server never matches, escrows, or settles. It is a bulletin board with
a price view. Makers can cancel their own orders (maker-only).
2. Merchants β "Accept MBITE" directory + invoices (merchants.py)
- A merchant directory: businesses that voluntarily list that they accept
MBITE (name, category, URL, blurb, and their own receiving address). Capped at MAX_MERCHANTS_PER_ADDRESS = 3 to limit spam.
- Invoices are non-custodial payment *requests*, not payment *processing*. The
customer pays the merchant directly, wallet-to-wallet. We surface a BIP21-style URI (moonbite:<address>?amount=<mbite>&label=<memo>) the wallet prefills.
- Payment detection is watch-only, exactly how a watch-only wallet confirms a
receipt: at invoice creation we snapshot baseline = received_at_address(addr) (sum of all outputs paying that address across the active chain β monotonic, so it never drops when the merchant later spends). The invoice flips pending β paid only when a *new* inbound amount received_now - baseline >= amount_units lands on-chain, and pending β expired past its TTL (default 1 hour). The server confirms a payment happened; it never receives one.
- Payment verification is dependency-injected (
received_lookup) so the
module is decoupled from any node: the demo wires it to the local educational node; production points it at the MoonBite node.
3. What we explicitly do NOT build
- No custody, escrow, or hot wallet. No server-held keys or balances, ever.
- No fiat rails. No bank/card handling, no "pay your bills in MBITE", no
conversion to dollars β all of that is money transmission and is out.
- No fabricated market data. No prices, volumes, market caps, charts, invented
exchange partnerships, or fake merchants. Until real trades exist there is no price to show, and the UI says so.
- No relief grants yet (deferred to ADR-009). A grant is a *gift of MBITE*,
never bill-payment, and it is premature until the layers above give MBITE an honest, observable value.
Consequences
Positive
- The project provides liquidity *primitives* and *utility* without becoming a
regulated money transmitter. The software stays "just software."
- Users retain self-custody end-to-end; a server compromise cannot move funds
because the server holds none.
- Honest by construction: with nothing to fabricate, the UI can only report what
the chain actually shows (a pending invoice, a real received payment, an empty order book).
Negative / accepted trade-offs
- Atomic-swap settlement is manual (Phase 2 pending).
settle_hinthands off
addresses; the two wallets must complete the HTLC. This is deliberately un-automated for now.
- Thin/empty markets at launch. A non-custodial order book has no market maker
and no seeded liquidity; the exchange listing checklist (EXCHANGE_LISTING.md) still describes the harder, separate path to real venues.
- MBITE/USDT is second-class until the contract leg is built.
- Payment detection assumes an honest, deep chain. On a young low-hash-power
chain, confirmations matter; the demo verifies against the educational node and a production deployment must point received_lookup at a node with adequate confirmation depth.
- Directory/invoice state is not consensus-critical and lives in gitignored
SQLite (exchange.db, merchants.db); it is disposable and must never be treated as a source of truth about funds.
Alternatives considered
- Custodial exchange / payment processor. Rejected: triggers money-transmission
licensing, KYC/AML, and custody risk β incompatible with the project's non-custodial and pseudonymity posture.
- Fiat on/off ramp or bill-pay. Rejected: crosses the cryptoβfiat boundary
(MSB territory) by definition.
- Fabricated "coming soon" prices / partner logos to look bigger. Rejected on
honesty grounds β no fabricated market data, full stop.
- Launch a grant/relief program now to bootstrap holders. Rejected as
premature: with no liquidity or spend utility, MBITE has no honest value to grant. Revisit in ADR-009 once these layers are live.
Notes
Reference implementation lives in this repository: exchange.py, merchants.py, the /api/exchange/* and /api/merchant* routes in web_app.py, and the markets.html / merchants.html UIs. The end-to-end merchant pay-flow (create invoice β pay on-chain β watch-only detection flips it to *paid*) has been verified against the local educational node.