Server data from the Official MCP Registry
USDT payment links, payments and collection summaries on Whitechain testnet. Can't move money.
About
USDT payment links, payments and collection summaries on Whitechain testnet. Can't move money.
Security Report
Valid MCP server (2 strong, 1 medium validity signals). No known CVEs in dependencies. ⚠️ Package registry links to a different repository than scanned source. Imported from the Official MCP Registry. 1 finding(s) downgraded by scanner intelligence.
10 files analyzed · 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Permissions Required
This plugin requests these system permissions. Most are normal for its category.
What You'll Need
Set these up before or after installing:
Environment variable: WHITEFLOW_MODE
Environment variable: WHITEFLOW_API_KEY
Environment variable: WHITEFLOW_TIMEZONE
How to Install
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-vishal4742-whiteflow": {
"env": {
"WHITEFLOW_MODE": "your-whiteflow-mode-here",
"WHITEFLOW_API_KEY": "your-whiteflow-api-key-here",
"WHITEFLOW_TIMEZONE": "your-whiteflow-timezone-here"
},
"args": [
"-y",
"whiteflow-mcp"
],
"command": "npx"
}
}
}Documentation
View on GitHubFrom the project's GitHub README.
Whiteflow
A stablecoin payment gateway for merchants who sell internationally: payment links, payment pages, invoices, QR codes, discount vouchers, multi-currency prices, sales reports and instant settlement in USDT on Whitechain, with a one-line payment button and an SDK. Customers pay with zero gas. Plus Capital: get paid early from future sales. Testnet only (Whitechain Sepolia).
Status (Nov 7, submission): live on Whitechain testnet at whiteflow.org; every acceptance test below links its on-chain transaction. Requirements:
docs/SRS.md. Design:ARCHITECTURE.md. How we built it:PIPELINE.md,AI_USAGE.md.
What makes it different
- Zero gas for the payer: the customer signs once; our relayer pays the gas.
- Instant settlement (T+0): money lands in the merchant's own wallet in the same transaction (included in about 1 s; Whitechain marks it finalized later); we never hold it.
- Exact amounts: the customer signs an authorization for an exact amount, so under- and overpayment (a common problem at crypto gateways) can't happen.
- Every receipt is an on-chain transaction anyone can check.
- Easiest to integrate: a one-line payment button or a small SDK, with signed webhooks.
Compared with existing gateways
| Whitepay (W Group) | Coinbase Commerce | Whiteflow | |
|---|---|---|---|
| Where the money lands | A WhiteBIT-side account: deposit addresses and off-chain settlement from WhiteBIT balances (docs) | Escrow, then settled in USDC | The merchant's own wallet, in the same transaction |
| Customer pays gas | Not stated; "Pay with WhiteBIT" moves funds off-chain between WhiteBIT accounts | No (EIP-3009 USDC on Base) | No (EIP-3009 USDT on Whitechain) |
| Runs on Whitechain | Not mentioned on whitepay.com | No | Yes |
| Fee | 0.4–1.5% of pay-ins (whitepay.com) | About 1% (Shopify app listing) | A flat 0.10 USDT inside each payment, which covers the gas |
| Merchant financing | None listed | None | Revenue advances and invoice claims, repaid from the payment split |
| Where they're ahead | 200+ coins, POS terminals, fiat payouts | Shopify, scale | — |
We'd sit next to Whitepay, not replace it: Whitepay covers custodial, many-coin, fiat-settled processing; we're the non-custodial rail on Whitechain itself, with financing that only works when the payment is split on chain.
Why this needs on-chain stablecoin settlement
Repayment is enforced where the money arrives. One customer payment is split, in the same transaction, between the merchant, the investors who financed it and the gas fee, under rules neither the merchant nor we can change. A card rail or bank transfer can't route one payment to three parties by code, and an investor would have to trust the merchant to forward the money. With USDT on Whitechain, any verified investor can fund a café at 3 a.m. and gets repaid in one second.
Demo
- Live app: whiteflow.org (Whitechain testnet; test mode) · Demo shop: shop.whiteflow.org · Video (2:45): ⟨url⟩
- Walkthrough = acceptance tests AT-1 to AT-15 (
docs/SRS.md§6)
Sponsor tracks
Whitechain (Operate · Scale · Tokenize; one prize)
| Requirement | Evidence |
|---|---|
| Contracts deployed + verified on 1874 (all full Blockscout matches) | MerchantPay 0xab81…4251 · CapitalMarket 0xecd6…0abe · ClaimToken 0xce9b…c388 · InvestorRegistry 0x2934…3e74 · the app uses only these; an earlier Phase 2 MerchantPay (0x83b5…73b7) is paused and unused |
| USDT payment in the main flow | Sale split in one tx 0xae155c49… (2 USDT → 0.10 fee + 1.90 merchant; payer 0 WBT) · invoice payment AT-7 (100.10 → 60 + 40 to two investors) · advance repayment split AT-4 (a 5 USDT sale sends 1 to the investor in the same tx) · gasless 25 USDT checkout AT-1 · refund AT-2 · 4.40 s sign-to-receipt sale NFR-4, and 4.32 s through the production relayer on Vercel tx (relayer share 2.44 s: checks 0.30, pre-send 0.26, send 0.51, receipt 1.37) |
| Operate: drop-in in ≈20 lines | apps/shop integration: 20 lines (api/checkout.ts 9: sessions.create + redirect; api/webhook.ts 11: constructEvent verifies MC-Signature, forged or unsigned → 400); live shop shop.whiteflow.org: a 2.00 USDT espresso paid by a 0-WBT guest in 4.98 s AT-14, payment.succeeded delivered once and verified; merchant view payments, customer view payment link · payment page; refund 0xbd91e67e…; CSV export (reports screen, GET /api/v1/reports.csv) |
| Operate (gateway): what a merchant gets | Payment links + QR (screen): a 25 USD pays-once link paid by a 0-WBT guest in 3.81 s AT-11 (25 → 0.10 fee + 24.90 merchant) · payment pages (live page, screenshot) · invoices with line items (paid on chain, financed in the Capital tab: AT-7) · discount vouchers stored on Arkiv (entity, used in AT-12) · multi-currency prices (USD = USDT 1:1; EUR/GBP/INR/SGD at the ECB rate, AED via its peg; quote locked 10 min): 20.00 EUR at 0.88873 EUR/USD (Frankfurter, 6 Nov) charged exactly 22.51 USDT, rounded up AT-13 · reports + CSV screen (6 Nov IST: 12 payments, 238.61 USDT gross, 1.20 fees, equal to the sum of MerchantPay's on-chain Paid events for the merchant, AT-15) · instant T+0 settlements (each row links its on-chain tx; the merchant-only "Network fee we covered" column: screen) · signed webhooks (MC-Signature) · test-mode API keys · /docs: quickstart, curl next to the SDK, every endpoint, test scenarios |
| Scale: zero crypto steps for the payer | Customer pays with one "Confirm payment" from a wallet the page creates for them (no WBT, no seed phrase, no chain name) link at 375 px → paid at 375 px |
| Scale: who pays gas / how the relayer gets WBT / what stops draining | The merchant pays a 0.10 USDT fee inside each payment, sent to the relayer in the same tx; at the 6 gwei cap a ≈208k-gas sale costs ≈0.00104 WBT, so the fee covers gas up to ≈6.2 gwei. The relayer is topped up with faucet WBT; turning collected USDT fees back into WBT is a manual YetiTrade swap (the automatic swap was cut for time). Drain guard (apps/relayer/src/relayer.ts, tests in apps/relayer/test/): only MerchantPay paySale/payInvoice, payers with code refused (incl. EIP-7702), simulate first, gas cap 6 gwei, a payer is banned after one mined revert and sending stops after 3 per hour, shared-secret header, Postgres send lock, per-IP and per-payer rate limits, daily WBT budget. Live relayer: relayer.whiteflow.org/health; bad calls rejected with the relayer nonce unchanged (AT-10), /health p95 280 ms, rejects p95 ≤ 363 ms (NFR-14) |
| Tokenize: real transfer rules + lifecycle | ERC-1155 claim token with ERC-7943 rules (investor allowlist (simulated KYC), ≤8 holders, maturity lock, admin freeze) in ClaimToken.sol and InvestorRegistry.sol; a transfer to a non-eligible wallet reverts on chain with ERC7943CannotReceive AT-8; advance funded AT-3 → a 5 USDT sale repays 1 USDT to the investor in the same tx AT-4 → after the cap the investor gets 0 AT-5 · invoice financing: two investors buy a 100 USDT invoice A 58.84 + B 39.23 → the debtor pays 100.10 and both are repaid 60 + 40 in one tx AT-7 · canTransfer returns false for it before anyone signs (AT-8) |
| Rail proof (Phase 1) | A payer with 0 WBT and nonce 0 sends 1 USDT through our relayer: tx (94,034 gas, paid by the relayer) · stub PullStub |
| Feedback | WHITECHAIN_FEEDBACK.md |
Arkiv (Build on Arkiv)
Financing offers are read from Arkiv: the investor offer book queries mcplus.offer.v1 entities live (capital-arkiv.ts), and an offer drops out when its entity expires at the deadline. Discount codes are Arkiv entities (mcplus.voucher.v1) that expire with the code, and the checkout reads the live entity before applying a code: a missing or expired entity refuses the code, and if Arkiv can't be reached the code is refused while the sale can still be paid without it (applyVoucher, FR-ARK-7): code G4AT12 (10% off) is entity 0xf51f…482c, created in tx 0x3e21…1fa2 and expiring 7 Nov 06:30 UTC; the code is stored only as a keyed hash. A customer used it on a 6 + 5 USD page and paid 9.90 USDT on Whitechain AT-12. Financing offers are Arkiv entities (mcplus.offer.v1) that expire at the offer deadline; the investor offer book reads them (Capital tab). Writer address: 0xF216677A6c7635c34e7dD58927B98D141d538Cbe · Live proof (Phase 1 probe): create tx 0x2d651b87…771e (block 258050; create 3.2 s, ownedBy query 285 ms) · Runnable query: https://rabdi.explorer.arkiv.network/entity-explorer with arkiv.schema = str('mcplus.probe.v1'), or node --env-file=../../.env scripts/arkiv-probe.ts from apps/web (needs ARKIV_PRIVATE_KEY + ARKIV_ACCESS_KEY) · arkiv/schema.md, friction.md, reach.md, why-arkiv.md, how-you-use-arkiv.md.
Ethereum Foundation (Anon-RPC · CROPS)
Every chain read the app makes in the browser goes through Anon-RPC by default (Nym, Tor fallback), including Arkiv reads; a meter on the dashboard counts them (a production run showed Private reads 4 of 4, no CSP violations). The customer pay and checkout pages make no browser chain reads at all (the amount and merchant come from our server), so they can't leak the payer's IP. Exclusions (disclosed): relayer writes over HTTPS, the two mainnet bootstrap reads (eth_call to ethereum-rpc.publicnode.com), explorer history lookups, the server-side read behind the pay and checkout pages, the server's balance check behind "Pay with your wallet" (it answers only enough or not enough), the customer's own wallet's RPC traffic when they choose that option (their wallet, not ours), and, only if the customer presses "Use another wallet or email", Privy and the WalletConnect relay (see Privacy below), and the Nym worker's own plain traffic (directory lookups to validator.nymtech.net, one WSS to a Nym entry gateway, bundle fallbacks unpkg.com / raw.githubusercontent.com after jsDelivr). These carry no wallet data. The dashboard's Content-Security-Policy allows exactly these hosts on /merchant pages (not on /merchant/developers, which shows a new API secret); the customer pay, checkout, link and page routes allow no third-party hosts at all.
Private-read proof (Phase 1): the app read Whitechain blocks through Nym (e.g. block 12,298,671) with 0 direct RPC requests in 12 browser test runs; a swapped worker bundle is refused (pinned hash).
CROPS: C: payment functions are permissionless, so anyone can submit a signed authorization if our relayer is down · O: MIT (LICENSE) · P: private reads by default, no personal data on-chain or on Arkiv · S: non-custodial, keys stay on the user's device.
AI assistant (MCP)
packages/mcp is a local MCP server (stdio, also packaged as whiteflow.mcpb for Claude Desktop) that manages payment collection from an AI assistant. It has 14 tools: payment links, invoices, customers, list_payments, get_collection_summary and reminders. It can't move money.
- Sandbox (the default): a simulator on your computer, with no account and no network. Try it with no key.
- Testnet: the live gateway with your
sk_test_key. The key's merchant must belong to a Whiteflow workspace: sign in on whiteflow.org, then link the wallet in Settings.
cd packages/mcp && npm ci && npm run pack
claude mcp add whiteflow --env WHITEFLOW_MODE=testnet --env WHITEFLOW_API_KEY=sk_test_YOUR_KEY -- node "$PWD/dist/bundle/server/index.mjs"
Or connect any AI from one link, whiteflow.org/mcp: Add to Claude Desktop, Add to Cursor or Add to VS Code, or run npx -y whiteflow-mcp (npm) in any MCP client (Codex, Gemini CLI, Windsurf, Cline, Zed). Leave out both --env flags for sandbox mode. Details, the Claude Desktop install and the full tool list: packages/mcp/README.md.
Parts of it are adapted from Pixa (MIT; licence in packages/mcp/THIRD_PARTY_LICENSES; ETHGlobal mentors confirmed this reuse is within Start Fresh).
Architecture
Full-stack: Next.js frontend, two TypeScript servers (relayer, web API incl. the gateway API: links, pages, vouchers, quotes, reports, settlements, keys, webhooks), a zero-dependency SDK + one-line pay button (packages/sdk), Postgres for sessions and rate limits only, and Solidity contracts on Whitechain that hold every money rule.
Shop server ──POST /api/v1/sessions──► Web API (apps/web) ──► checkout link
Customer /pay (no chain reads in the browser) ── signs a USDT authorization, no gas
▼
Relayer (apps/relayer): allowlist · payer has no code · signature, balance, window, replay
· rate limits · daily gas budget · simulate first ── pays the WBT gas
▼
MerchantPay (one tx): pull USDT ─► 0.10 fee to relayer ─► advance holdback to investors ─► rest to merchant
▼
receipt → signed webhook to the shop
Dashboards read the chain privately via Anon-RPC (Nym), one Multicall per screen; offers live on Arkiv.
Contracts: contracts/ (Solidity 0.8.38, Foundry) · Relayer: apps/relayer/ (Node, viem) · Apps: apps/web/, apps/shop/ (Next.js 16) · Details: ARCHITECTURE.md
Setup
Requirements: Node 26, Foundry 1.8.6, git. Everything runs on Whitechain Sepolia (chain 1874); no mainnet funds are needed.
git clone --recursive https://github.com/Vishal4742/whiteflow && cd whiteflow
cp .env.example .env # fill in the values; never commit .env
# Contracts (Foundry; fork tests run against Whitechain Sepolia with the real USDT)
cd contracts && forge build && forge test -vv && cd ..
# Relayer: http://127.0.0.1:8787 locally; production https://relayer.whiteflow.org/health
cd apps/relayer && npm ci && npm test && npm run dev # GET /health, POST /relay
# Web app (merchant, investor, customer pages): http://localhost:3000
cd apps/web && npm ci && npm run typecheck && npm test && npm run dev
# SDK + pay button (zero dependencies)
cd packages/sdk && npm ci && npm test
# Demo shop on the SDK (20 integration lines)
cd apps/shop && npm ci && npm run dev
Test funds: claim WBT at faucet.testnet.whitechain.io, then swap some to the prize USDT (0xcedfb56113143d55b2358b8cfbb0deb5ad2f55a7) on testnet.yetitrade.fi. CI runs the same checks on every push (.github/workflows/ci.yml).
Contract tests: 155 Foundry tests (fork tests against Whitechain Sepolia with the real USDT). Coverage of the four deployed contracts (forge coverage --ir-minimum): lines 346/349 (99.1%), branches 92/92 (100%), functions 61/61 (100%). Per contract: CapitalMarket 100% lines, ClaimToken 99.1%, InvestorRegistry 100%, MerchantPay 97.8% (the two missed lines are _pause/_unpause, an IR line-map artifact; the pause test runs them).
Privacy of the payer options
The default checkout uses a guest key kept in the browser (no email recovery) and loads no third-party scripts. "Pay with your wallet" adds a browser-wallet button (no third party) and an opt-in Privy option (any phone wallet over WalletConnect, or email). Privy loads only when pressed, and the sheet says what it shares. Privy receives the IP address, user agent and a Privy analytics id (Privy 3.51 has no analytics switch); with email it also gets the email, the email wallet's address and the payment approval it signs. The WalletConnect relay sees the IP; its messages are end-to-end encrypted. We clear Privy's local session and analytics id after each checkout, so one browser's checkouts aren't linked.
Operations (testnet)
- Our demo wallets were funded once by a seed script from the team wallet (test USDT swapped from faucet WBT on YetiTrade); the app has no faucet button.
- Admin trust (testnet): one deployer key (
0xb4E7…714D) is the compliance admin and the contract owner. It can force-transfer claims between eligible investors, freeze claim units and revoke investor eligibility (ERC-7943 rules, simulated KYC), and it can pause MerchantPay. Ownership usesOwnable2Step; production would put these roles behind a multisig. - The relayer keeps its send lock, daily gas budget and per-payer limits in Postgres (a lease row with a fencing write, FR-REL-10), so they hold across server instances and redeploys. A mined revert bans that payer until the owner lifts it, and 3 reverts in an hour pause all relaying. Its WBT is refilled by hand (the automatic fee-to-WBT swap, FR-REL-8, wasn't built).
Limitations (honest)
- Testnet only (official USD₮ isn't on Whitechain mainnet yet). Maturity lock 60 s and grace 120 s on testnet so the demo can show them; 1 day / 7 days in production.
- KYC is simulated: our compliance key keeps an investor allowlist (standing in for WhiteBIT KYC). Cut for time: EAS attestations, debtor acknowledgement, pay-on-due-date, and default and recourse (a claim that is never repaid stays outstanding).
- A merchant could take sales outside our checkout; default rules, recourse and public sales stats would mitigate this, not prevent it.
- Investor caps (1 per advance, 2 per invoice) and the rule that an invoice buy leaves a fundable remainder are enforced by our server before relaying, not by the contract (which allows 8 holders), so two first fundings sent in the same few seconds can both pass. Each extra holder adds about 34k gas to a repayment, and the relayer refuses anything above its gas limit rather than pay for a failure.
- Invoice repayments are limited per payer (10 an hour), not per merchant: a merchant who also controls an invoice's investors could spend the relayer's 0.1 WBT daily gas budget in about 40 heavy repayments, paying about 4 USDT in fees. No funds are at risk; relaying pauses until the next day.
What's next (after Mumbai)
- Pay from another chain: one tested corridor (Ethereum Sepolia USDC into Whitechain USDT) with an exact destination amount and a refund path, before any "any chain" claim.
- Business accounts with roles, and settlement-address changes that need a second approval.
Team and AI usage
⟨team⟩ · AI usage per file and the full build trail: AI_USAGE.md, .batches/
Reviews
No reviews yet
Be the first to review this server!
More Developer Tools MCP Servers
Rea
Freeby Morluto · Developer Tools
Reverse engineer anything from your terminal or agent with one CLI and MCP server.
Paperclip
Freeby Paperclipai · Developer Tools
Trending hip-hop artist momentum scores across four cultural dimensions.
Fetch
Freeby Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
Git
Freeby Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
Toleno
Freeby Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
MCP Marketplace
Freeby mcp-marketplace · Developer Tools
Search and install MCP servers from inside your AI client.
