Security
How FomoPay keeps money moving only where it should: no keys or seed phrases ever, funds in your custody, scoped and hashed API keys, honest identity, and mainnet behind an explicit switch.
Not in the app, not in the API, not by email or DM — ever. Signing in is a wallet signature (Sign-In with Ethereum) that moves no funds. Anyone asking for these is not FomoPay.
Custody
- Wallet payments are non-custodial. FomoPay prepares the exact transaction; the sender's own wallet signs and sends it, directly to the recipient's verified wallet. FomoPay never holds sender keys.
- Reward Vaults keep funds in your wallet. Your vault wallet (or Safe) approves FomoPay's payout signer for a capped USDG allowance. The signer can only
transferFromup to what remains of that cap — enforced by the USDG contract, not by a promise — and only to verified handles.approve(signer, 0)revokes it on-chain, any time. See Reward Vaults. - The payout signer is isolated. In production its key is held by a managed KMS (an encrypted keyfile in local development) — never a plaintext environment variable. It holds only ETH for gas, never customer funds; payouts are serialized per signer and every one is audited.
- No smart contracts to trust. FomoPay V1 uses plain ERC-20 transfers and allowances on Robinhood Chain — no proxy, no pooled escrow, nothing to upgrade underneath you.
API keys
- Scoped. Six scopes (
payments:create,payments:read,rewards:create,profiles:resolve,vaults:read,webhooks:write) — give each key only what it needs. - Hashed. Only
HMAC-SHA256(server pepper, key)is stored, plus a display prefix. Keys are shown once. - Bound to a network.
fp_test_keys only work on the development chain,fp_live_keys only on mainnet. - Rate-limited and logged. Per-key limits; every request is logged without bodies or secrets; key creation and revocation are audited.
- Server-side only. Never in a browser or app bundle — the SDK refuses to run in one.
Identity honesty
- Only VERIFIED is payable, and only VERIFIED gets a ✓. “FomoPay Ready ✓” means FomoPay verified the payout wallet: the recipient proved control of the identity and signed with the wallet. It never claims the person is “verified by Fomo”.
- Sandbox vs live. Until an authorized Fomo identity integration is switched on, identities are sandbox identities — labelled “Sandbox” in every UI,
sandbox: trueand aSANDBOX_IDENTITYwarning in the API, and they can't receive on mainnet. FomoPay doesn't scrape Fomo or use private endpoints; everything goes through one identity adapter. - Lookalikes are flagged.
@Iyra(capital i) next to@lyraraisesSIMILAR_HANDLE: people paying in FomoPay must acknowledge it before signing, and API payments carry it inwarningsandrisk_flags. - Destinations are snapshotted. A payment always goes to the wallet verified when it was created. A recipient changing wallets never redirects a pending payment, and a recent change holds vault/API payouts for a cooldown (default 24 h) and warns senders for 72 h.
Privacy and anti-harvesting
/v1/resolvenever returns a wallet address; payments show only a masked destination.- No handle → wallet directory, no bulk export, no lifetime earnings. Search returns only identities that use FomoPay.
- Resolution is rate-limited per key and capped by distinct handles per day.
- Receipts default to unlisted; nothing private is published automatically.
Controls before money moves
Every payment passes the risk engine before anything is signed: recipient resolved and verified, destination still valid, asset supported, amount within per-payment / daily / project / key / recipient limits, vault able to cover it, idempotency key unused, project enabled, no open security flag, recent-wallet-change cooldown, lookalike and first-recipient checks, and approval thresholds (one or two approvers). Screening hits and blocked jurisdictions are blocked (451 COMPLIANCE_BLOCKED) or held for manual review — rules differ by country and FomoPay doesn't pretend otherwise.
Every sensitive action — payments, approvals, vault funding and withdrawal, key and team changes, limit changes, destination changes — is written to the audit log.
Webhooks
Every delivery is HMAC-SHA256 signed with a per-endpoint secret derived from a server key (never stored), timestamped against replay, and rotatable with an overlap window. Endpoint URLs are checked against private, loopback and metadata addresses at save time and at connect time. See signatures.
Mainnet gating
A FomoPay deployment refuses payments on Robinhood Chain mainnet unless it was explicitly switched on (MAINNET_ENABLED) after security, payment, identity and monitoring checks — the API answers 403 MAINNET_DISABLED until then. Live keys are only issued on a mainnet-enabled deployment. Development runs on a local chain with a stand-in USDG at the real USDG address, so the code paths are the ones mainnet uses.
Once confirmed, a transfer can't be reversed by you or by FomoPay. FomoPay's job is to make sure it was the right recipient before it happens — and to never call it confirmed before the chain does.
Robinhood Chain facts
- Network
- Robinhood Chain mainnet — an Ethereum L2 (Arbitrum Orbit). Chain id
4663. Gas is paid in ETH. - USDG
- Global Dollar, 6 decimals,
0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168— the chain's official stablecoin. - ETH
- Native asset, 18 decimals.
- USDC
- There is no official USDC on Robinhood Chain. FomoPay never accepts a token address from a request; assets come from a server-side registry.
- Confirmed
- 2 block confirmations on top of inclusion, then FomoPay's own verification of the transfer.
- Explorer
- robinhoodchain.blockscout.com
Reporting a problem
If you believe a key, endpoint or payout was misused, revoke the key or pause the vault first (both take effect immediately), then contact the FomoPay team with the request_ids involved.