We ran an end-to-end payment against
https://xrplme.online/wc/v1/thailand/bot-solana
and confirmed the complete cycle:
SetComputeUnitLimit, SetComputeUnitPrice, and
TransferChecked (USDC)X-PAYMENT-SIGNATUREnetwork : solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp asset : EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v # native USDC amount : 1000000 # 1.00 USDC payTo : 5KMiN7b7qBAqE2o5ucoCJ5xH9vZaFfzvq3dHeiGGvcMw feePayer : 32jx1jS6Dkkf7fuGv33h1rVgbAaMHNtnVbGkTWhW8heL qrData : solana:5KMiN7b7qBAqE2o5ucoCJ5xH9vZaFfzvq3dHeiGGvcMw?amount=1.00&spl-token=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
On the XRPL, the buyer signs a payment and sends two headers
(X-PAYMENT-SIGNATURE + X-INV-ID). On Solana, the
transaction must be partially signed by the buyer's wallet, then the
facilitator adds a second signature from its fee payer wallet —
because the buyer may hold USDC but no SOL for network fees.
SetComputeUnitLimit +
SetComputeUnitPrice + TransferChecked. A
bare transfer with only one instruction is rejected.partial_sign, not sign.
The fee payer (32jx1jS6…) is a separate wallet.
The buyer signs only the token transfer; the facilitator signs the fee
payer slot during verification.Message is constructed with the facilitator's fee payer
address as the payer — not the buyer's wallet. Otherwise the
fee payer signature doesn't match.| Role | Holds | Key location |
|---|---|---|
Collector (payTo) | All USDC revenue | Not on the server — Phantom address only |
| Fee payer | SOL for network fees | Server 0600 env file |
| Payer (buyer) | USDC only | Buyer’s wallet |
The revenue wallet never has its key on the server. Separating gas from revenue means the collector address can be a cold wallet.
| Tier | XRPL (XRP) | Solana (USDC) |
|---|---|---|
| Standard | 1 XRP | 1.00 USDC |
| AI-enhanced | 5 XRP | 7.00 USDC |
Prices settle nightly from server_solana.py
(PRICE_STD / PRICE_AI) and are also returned live
in every 402 response. Query
xrplme_get_pricing for the current values.
The API docs page now includes a payment rail
selector (XRP vs USDC), correct pricing labels for both tiers, and
Solana-specific 402 handling — it reads qrData (Solana Pay
URI), feePayer, and displays the right retry instructions.
A complete, runnable example is in the xrplme-mcp-client repository . It walks through:
/wc/v1/{country}/bot-solana[/ai] endpointcurl -X POST https://xrplme.online/wc/v1/thailand/bot-solana \
-H "Content-Type: application/json" \
-d '{"message":"What are the current visa and entry requirements?"}'
Expect a 402 with the terms above. Coverage spans 30 countries. Data is informational only.
Related: