N9T2 Commercial Bridge — Agent Integration Skill
1. Purpose
The N9T2 Commercial Bridge is a quote-bound, two-way transfer service between XRP on the XRP Ledger (XRPL) and ETH or USDC on Base Mainnet. Liquidity is provided by THORChain.
An agent integrating this service must be able to:
- Request a live transfer quote.
- Validate the route, destination, exact customer input, payment instructions, service fee and quote expiry.
- Present the quote to the customer and obtain explicit authorization before payment.
- Make, or have the customer make, exactly the payment the quote specifies.
- Submit the actual source-chain transaction hash for verification against the quote.
- Track execution and settlement.
- Retrieve the customer-safe receipt, and report completion only when the receipt establishes it.
This is a commercial cross-chain transfer workflow. It is separate from N9T2's pay-per-call XRPL data endpoint /bridge/execute.
A quote is not a transfer. A verified payment is not a completed transfer. Neither a quote nor the customer's principal is commercial revenue.
2. Production endpoints
Production base URL: https://x402.n9t2.com
| Operation | Method | Endpoint | Purpose |
|---|---|---|---|
| Create quote | POST | /bridge/quote |
Live quote bound to the route, destination and payment instructions |
| Verify payment | POST | /bridge/payment |
Verify and record the actual customer payment against a quote |
| Retrieve receipt | GET | /bridge/receipt/{quote_id} |
Durable customer-safe receipt for a quote |
Machine-readable references:
- OpenAPI:
https://x402.n9t2.com/openapi.json - Agent discovery:
https://x402.n9t2.com/.well-known/agent.json(seeinterfaces.commercialBridge) - LLM summary:
https://x402.n9t2.com/llms.txt
The live API is authoritative for availability, quote values and transaction status. If a live response conflicts with an example in this document, follow the live response; stop if the discrepancy affects the safety or meaning of the transaction.
3. Supported routes
| Direction | source_chain | source_asset | destination_chain | destination_asset | Customer pays with |
|---|---|---|---|---|---|
| XRP → ETH | xrpl |
XRP |
base |
ETH |
Native XRP Payment on XRPL |
| ETH → XRP | base |
ETH |
xrpl |
XRP |
Native ETH transfer on Base |
| XRP → USDC | xrpl |
XRP |
base |
USDC |
Native XRP Payment on XRPL |
| USDC → XRP | base |
USDC |
xrpl |
XRP |
ERC-20 USDC transfer on Base |
Base USDC is the canonical USDC contract on Base Mainnet: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals). No other ERC-20 token is accepted.
Do not attempt BNB Chain, Solana, other ERC-20 tokens, or any route not listed above. The quote endpoint rejects unsupported routes with unsupported_route.
The destination address must match the destination chain: a 0x… EVM address for Base, or an XRPL classic address (r…) for XRPL. Confirm the address and network with the customer before requesting a quote.
4. Request a quote
POST https://x402.n9t2.com/bridge/quote with Content-Type: application/json.
Exactly these five fields are required:
| Field | Type | Meaning |
|---|---|---|
source_chain |
string | xrpl or base |
source_asset |
string | XRP, ETH or USDC |
destination_chain |
string | xrpl or base |
destination_asset |
string | XRP, ETH or USDC |
destination_address |
string | Customer-controlled destination wallet |
The quote request does not accept a source amount. The service determines the live route minimum and calculates the exact customer input. Do not invent fields such as source_amount, slippage or transaction_hash.
Examples
Replace the placeholders with the customer's real destination address.
XRP on XRPL to ETH on Base:
{"source_chain": "xrpl", "source_asset": "XRP", "destination_chain": "base", "destination_asset": "ETH", "destination_address": "CUSTOMER_BASE_ADDRESS"}
ETH on Base to XRP on XRPL:
{"source_chain": "base", "source_asset": "ETH", "destination_chain": "xrpl", "destination_asset": "XRP", "destination_address": "CUSTOMER_XRPL_ADDRESS"}
XRP on XRPL to USDC on Base:
{"source_chain": "xrpl", "source_asset": "XRP", "destination_chain": "base", "destination_asset": "USDC", "destination_address": "CUSTOMER_BASE_ADDRESS"}
USDC on Base to XRP on XRPL:
{"source_chain": "base", "source_asset": "USDC", "destination_chain": "xrpl", "destination_asset": "XRP", "destination_address": "CUSTOMER_XRPL_ADDRESS"}
curl:
curl -sS -X POST https://x402.n9t2.com/bridge/quote \
-H 'Content-Type: application/json' \
--data '{"source_chain":"xrpl","source_asset":"XRP","destination_chain":"base","destination_asset":"USDC","destination_address":"CUSTOMER_BASE_ADDRESS"}'
5. Validate the quote
A successful response:
{"quoted": true, "executable": true, "quote": { "...": "..." }}
Require HTTP 200, quoted: true and executable: true. Otherwise stop and report the actual error.
The quote object includes quote_id, status, source, destination, customer_input, payment, minimum_transaction_requirement, service_cost, destination_amount, customer_usd_reference, quote_expiry, created_at and execution_binding.
The payment object contains:
| Field | Meaning |
|---|---|
type |
native for XRP and ETH; erc20 for Base USDC |
network |
xrpl:0 (XRPL Mainnet) or eip155:8453 (Base Mainnet) |
asset |
XRP, ETH or USDC |
pay_to |
N9T2 treasury address that must receive the payment |
amount |
Exact amount to pay, in whole units of the asset |
expires_at |
Unix time after which the quote must not be paid |
token, decimals |
Base USDC only: the USDC contract and 6 |
Treat quote_id, amount, asset, network, recipient, destination and expiry as one bound contract. Never reconstruct payment instructions from memory or an older quote, and never modify them.
Before payment, show the customer the route, destination address, exact amount, asset, network, recipient, N9T2 fee, quote expiry and estimated destination amount, and obtain explicit authorization for those exact details.
6. Make the payment
Pay exactly payment.amount of payment.asset to payment.pay_to on payment.network, before payment.expires_at. Quotes are short-lived (typically about 15 minutes); if the quote expires, request a new one instead of paying.
- XRP (XRPL): one native XRP
Paymenttopay_tofor exactly the quoted amount. - ETH (Base): one native ETH transfer to
pay_tofor exactly the quoted amount. - USDC (Base): one standard USDC
transferof exactly the quoted amount (amount × 10^6base units) topay_to. Payments from smart-contract wallets are accepted; the payment is verified from the USDCTransferlog. The transaction must contain exactly one USDC transfer topay_to.
Overpayment, underpayment, split payments, or payment in another asset will not verify.
Wallet signing happens only in the customer's own wallet or signing environment. Never send private keys, seed phrases, recovery phrases or wallet secrets to N9T2 or any HTTP endpoint.
7. Verify the payment
POST https://x402.n9t2.com/bridge/payment with Content-Type: application/json.
The only allowed fields:
| Field | Required | Meaning |
|---|---|---|
quote_id |
Yes | Exact ID from the active quote |
transaction_hash |
Yes | Hash of the actual source-chain payment |
{"quote_id": "ACTUAL_QUOTE_ID", "transaction_hash": "ACTUAL_PAYMENT_TRANSACTION_HASH"}
Never submit a planned, fabricated or unrelated transaction hash.
The server verifies the transaction against the stored quote. A transaction already bound to a different quote is rejected with transaction_already_bound (HTTP 409). Resubmitting the same quote and transaction pair returns the existing record.
Base payments require a minimum number of block confirmations. If verification returns base_payment_insufficient_confirmations (HTTP 409), wait and submit the same quote_id and transaction_hash again; do not pay again.
Possible errors include invalid_json, invalid_request, unexpected_fields, quote_id_missing, transaction_hash_missing, quote_expired, transaction_already_bound, unsupported_payment_source, payment_destination_mismatch, payment_amount_mismatch, base_payment_insufficient_confirmations and verified_transaction_hash_mismatch. Read the actual HTTP status and response body.
8. Execution is not completion
After verification, execution runs through a durable, exactly-once workflow; it does not happen inside the payment HTTP request. The execution object can report provider_execution_authorized, provider_execution_dispatched and next_stage. Stages include durable_dispatch_pending, provider_reconciliation, settlement_monitoring, receipt_available and manual_review.
payment_verified: true does not mean the destination transfer completed. If verification succeeded but execution was not dispatched or the request errored, inspect the quote and receipt state. Never send principal again.
9. Retrieve the receipt
curl -sS 'https://x402.n9t2.com/bridge/receipt/URL_ENCODED_QUOTE_ID'
A found receipt returns HTTP 200 with the customer-safe receipt. A missing receipt returns HTTP 404:
{"found": false, "error": "receipt_not_found"}
Report completion only when the receipt shows execution status COMPLETED with settlement. While execution is pending, query the same quote_id again after a reasonable delay. Do not create a new quote or resubmit payment because the receipt is not ready yet.
10. Pricing
The N9T2 service fee is 1.45 XRP equivalent per transfer, charged in the source asset and already included in customer_input:
customer_input = live route minimum + N9T2 service fee
- XRP source: the fee is 1.45 XRP.
- ETH source: the fee is the ETH equivalent of 1.45 XRP at the live market price, rounded up.
- USDC source: the fee is the USD value of 1.45 XRP at the live market price (USDC valued at 1 USD), rounded up to 6 decimals.
The route minimum is transaction value set by live THORChain liquidity, not an N9T2 fee. Prices, minimums and destination estimates are dynamic; never hard-code them. The destination amount is an estimate, not a guarantee of the final settled amount.
A quote, customer principal, route minimum, destination estimate or payment verification is not revenue. Revenue exists only when a transfer completes and the fee is retained.
11. Errors and retries
Quote errors:
| Code | HTTP | Action |
|---|---|---|
missing_required_field |
400 | Correct the request fields |
unsupported_route |
400 | Use a route from section 3 |
invalid_destination |
400 | Use an address valid for the destination chain |
quote_unavailable |
503 | Live route quote unavailable; retry later |
market_unavailable |
503 | Live market pricing unavailable; retry later |
minimum_unstable |
503 | Route minimum changed while quoting; request a new quote |
Receipt errors: HTTP 404 receipt_not_found means the receipt is not available yet; check the same quote again if payment was verified.
For ambiguous payment outcomes, reconcile the original quote, transaction hash and receipt before any retry. Never blindly resend customer principal.
12. Agent safety checklist
- Use only the four routes in section 3.
- Never invent request fields, quote IDs, transaction hashes or payment details.
- Verify the destination address and exact payment instructions against the active quote.
- Obtain explicit customer approval before payment.
- Never request or transmit wallet secrets.
- Never pay an expired quote.
- For Base USDC, send exactly one transfer of the exact amount to
pay_to. - Distinguish payment verified, execution dispatched, settlement and completed receipt.
- Do not claim completion without receipt and settlement evidence.
- When the live API returns something unfamiliar, preserve the details and report uncertainty instead of guessing.
13. Capability catalogue
- Parent capability:
n9t2-bridge - Commercial capability:
n9t2-commercial-bridge - Category:
commercial-cross-chain - Routes:
xrpl:XRP→base:ETH,base:ETH→xrpl:XRP,xrpl:XRP→base:USDC,base:USDC→xrpl:XRP
This skill documents the commercial transfer lifecycle. It does not add MCP tools or change the 19-tool MCP catalogue.