Probar en testnet
Documentación

Construye, cobra,
escala con Local402.

Cobra en tu moneda y recibe USDC en Stellar, de personas o agentes de IA. Guías, paquetes, referencia y una demo en testnet.

Visión general

¿Qué es Local402?

Local402 extiende x402 en Stellar. Pones el precio en tu moneda (24 monedas del oráculo Reflector, y la UF) y recibes USDC exacto. Quien paga, persona o agente, elige USDC, XLM o EURC; si no es USDC, el contrato FxPay hace el swap en Soroswap dentro de la misma transacción. Cada venta deja un recibo con el precio local, la tasa y su fuente.

Ventajas clave
  • Pagos nativos para agentesPrecio por solicitud sobre HTTP 402.
  • Precio en tu moneda24 monedas y la UF; recibes USDC en Stellar.
  • Seguro y verificableEl agente revisa la tasa antes de firmar; si el swap no alcanza, se revierte todo.
Siguiente: prueba en testnet, tu primer pago 402 → 200.
Cómo funciona

Cuatro pasos y ningún tipo de cambio a mano.

Todo ocurre dentro del flujo x402 estándar. Si algo no cuadra, la transacción entera se revierte.

01

Precio local

El vendedor fija "70 NGN" en su ruta.

02

Oráculo Reflector

Lo pasa a USDC con la tasa on-chain, a favor del vendedor.

03

Paga con lo que tengas

USDC directo, o XLM y EURC con swap en Soroswap.

04

Recibo

USDC exacto al vendedor; el sobrante vuelve al cliente.

Comparación

x402 hoy, y con Local402.

Hoy x402 solo cobra en dólares y en un único activo. Pero el comercio real factura en pesos, reales, rupias, nairas, euros o yenes.

x402 en Stellar hoyCon Local402
PrecioEn dólares; "70 NGN" fallaMXN, EUR, INR, NGN, CLP… (24 monedas) y UF, vía oráculo on-chain
El cliente paga conSolo el activo exacto (USDC)USDC, XLM o EURC, con swap atómico
El vendedor recibeUSDCUSDC exacto, sin exposición a XLM
Si el swap no alcanza—Se revierte todo; el sobrante vuelve
Agentes de IAConfían en el precio del vendedorVerifican la tasa, con tope por pago y presupuesto
ContabilidadMontos en USDCRecibo con precio local, tasa y fuente; CSV
Pruébalo

Seis APIs, seis monedas. Un solo USDC al otro lado.

Elige una ruta y mira su 402, gratis y sin wallet. Los botones de pago pagan de verdad en testnet.

agente@local402
Cargando…
Calculadora

Pon tu precio. Nosotros hacemos el cambio.

Cualquier monto en USD, UF o 24 monedas, y lo que cuesta pagarlo con cada activo.

Precio del vendedor
Mainnet

Lo mismo, con dinero real.

Mismo código en Stellar mainnet: USDC y EURC de Circle, Soroswap y Reflector reales. A la derecha, el último pago real tal como lo escribe /receipts.csv.

receipts.csv · 000004 · 2026-10-07
monto_local, moneda
50 CLP
activo_pagado, monto_pagado
USDC 0.0512658
usdc_recibido
0.0512658
transaccion
c5977d…6bb350
Pagado
GET /indicadores · 50 CLP · mainnet

Paga 50 pesos reales desde tu wallet.

Con Freighter en Mainnet; basta con tener XLM. Tú firmas, el facilitador paga la red y el cliente rechaza cobros sobre 200 CLP.

¿Eres un agente? Lo mismo desde la terminal, con tu propia clave y un tope por pago.

tu-wallet@mainnet
# desde tu wallet: elige USDC, XLM o EURC # o como agente, con tu clave: $ STELLAR_SECRET=S… npx -y local402-client pay https://local402-mainnet.vercel.app/indicadores --with XLM --max "100 CLP"
FechaPrecioVendedor recibeCliente pagóPrima vs ReflectorTransacción
Guías

Despliega en producción.

En local, npm run demo no necesita nada: crea y fondea cuentas desechables de testnet y levanta todo en localhost:3001.

terminal
git clone https://github.com/DiegoPoveda01/local402 && cd local402
npm install
npm run demo # cuentas de testnet desechables, todo en marcha
# o por partes, copiando antes cada .env.example:
npm run facilitator # :4022 liquida exact y exact-fx, paga las comisiones
npm run api # :3001 vendedor de demo y panel
npm run agent # un cliente que paga
npm run mcp # servidor MCP

Un despliegue que sirven varios procesos, o que mueve dinero real, necesita además estas variables. Cada .env.example lista el resto.

VariableDóndePara qué
LOCAL402_QUOTE_SECRETvendedorFirma las cotizaciones. Mismo valor en cada instancia, de al menos 32 caracteres (openssl rand -hex 32). Desde la 1.0 el vendedor no arranca sin ella; quoteSecret: false la desactiva en un vendedor de una sola instancia.
KV_REST_API_URL, KV_REST_API_TOKENvendedorRecibos, topes de la demo y el último valor de la UF. Sin ellas, cada instancia serverless guarda los suyos y se pierden con ella.
SELF_URLvendedorDónde compra el agente de la demo.
CORS_ORIGINvendedorOrígenes del panel que pueden pagar desde la wallet del visitante, separados por comas.
PAY_TO_ALLOWLIST, MIN_AMOUNTfacilitadorCada liquidación gasta comisiones del facilitador. En stellar:pubnet valen por defecto PAY_TO y 100000 (0,01 USDC).
FACILITATOR_PRIVATE_KEYSfacilitadorUna clave por liquidación simultánea; cada instancia, las suyas.
FX_CONTRACTambosObligatoria en mainnet: el FxPay al que queda atada la autorización del pagador.
Paquetes

Cobra con local402-server.

Una línea por ruta sobre el middleware de x402. localRoute pone el precio en tu moneda y ofrece exact (USDC) y exact-fx (XLM o EURC) con la misma cotización, así que todos pagan el mismo USDC.

server.ts
// npm install local402-server @x402/express express
import express from "express";
import { paymentMiddleware } from "@x402/express";
import { localRoute, local402Server } from "local402-server";
const payTo = "G…"; // tu cuenta de Stellar (G…) o un contrato (C…)
const app = express();
app.use(paymentMiddleware({
"GET /africa": localRoute("70 NGN", { payTo }),
"GET /uf": localRoute("0.01 UF", { payTo }),
}, local402Server("https://local402.vercel.app/facilitator")));
OpciónPor defectoQué hace
price—Precio local, como "50 CLP" o "0.01 UF". Se redondea hacia arriba: el vendedor nunca recibe menos.
payTo—Dirección de Stellar que recibe el USDC, G… o C…. Si le pasas una clave secreta, la rechaza sin mostrarla.
networkstellar:testnetO stellar:pubnet.
oracleReflector + UFFuente de tasas para cotizar.
quoteSecretLOCAL402_QUOTE_SECRETFirma las cotizaciones; false lo desactiva en una sola instancia.

local402Server(facilitatorUrl, network) crea el servidor de recursos que liquida exact y exact-fx con un facilitador de Local402 y publica la ruta en el catálogo Bazaar. Para cobrar herramientas MCP, local402-server/mcp exporta localToolPayment.

Paquetes

Paga con local402-client.

Lee el 402, vuelve a cotizar con su propio oráculo y solo firma si el precio y el swap están dentro de tus límites.

agent.ts
import { Local402Client } from "local402-client";
const client = new Local402Client({
secret: process.env.STELLAR_SECRET,
payWith: "XLM", // USDC, XLM o EURC
maxPrice: "500 CLP", // rechaza cualquier pago por encima
});
const price = await client.quote(url); // sin pagar
const paid = await client.pay(url); // transaction, explorerUrl, body…
OpciónPor defectoQué hace
secret / signer—Clave del pagador, o un firmante que no la expone (una wallet del navegador).
payWithUSDCUSDC usa exact; XLM y EURC usan exact-fx a través de FxPay.
maxPrice—Tope por pago, en cualquier moneda soportada.
budget—Un SpendingBudget, como "5000 CLP", compartible entre clientes.
maxOverchargeBps200 (2%)Rechaza cotizaciones por encima de su propio oráculo.
maxFxPremiumBps500 (5%)Rechaza swaps que puedan gastar más que esto sobre el valor del oráculo.
fxSlippageBps200 (2%)Margen que autoriza el swap; lo que no se usa se devuelve.
networkstellar:testnetEn stellar:pubnet, XLM y EURC necesitan además fxContract (FXPAY_MAINNET).
oracle / assetOracleReflector + UFTasas con que revisa la cotización del vendedor y la del swap.

También como CLI, sin escribir código:

terminal
npx -y local402-client quote https://local402-mainnet.vercel.app/africa
STELLAR_SECRET=S… npx -y local402-client pay <url> --with XLM --max "100 NGN"
Paquetes

Conecta un agente.

local402-mcp le da a tu agente cuatro herramientas para descubrir, cotizar y pagar, con un tope por pago y un presupuesto por sesión.

terminal
claude mcp add local402 \
-e STELLAR_PRIVATE_KEY=S… \
-e "MAX_PRICE=500 CLP" -- npx -y local402-mcp
HerramientaQué hace
local402_discoverBusca servicios en el catálogo x402 Bazaar del facilitador.
local402_quotePrecio local y tasa, sin pagar.
local402_payPaga con USDC, XLM o EURC.
local402_walletSaldo y presupuesto restante.
VariablePor defectoQué hace
STELLAR_IDENTITY / STELLAR_PRIVATE_KEY—Cuenta que paga: una identidad de stellar-cli (preferida) o una clave secreta.
PAY_WITHUSDCActivo con que paga: USDC, XLM o EURC.
MAX_PRICE500 CLPRechaza cualquier pago por encima de este precio local.
BUDGET5000 CLPDeja de pagar cuando la sesión gastó este total.
NETWORKstellar:testnetO stellar:pubnet.
FACILITATOR_URLel de Local402Facilitador cuyo catálogo lista local402_discover.
FX_CONTRACTFxPay de Local402 en mainnetContrato FxPay en que confía para XLM y EURC.
HORIZON_URLHorizon públicoPara leer saldos.
Referencia

La cotización del 402.

El 402 ofrece dos opciones con la misma cotización, en extra.local402: exact (USDC, el esquema estándar de x402) y exact-fx (XLM o EURC, que FxPay cambia a USDC). Míralo sin instalar nada:

terminal
# el precio está en nairas; el requisito, en USDC
curl -si https://local402-mainnet.vercel.app/africa \
| grep -i '^payment-required' | cut -d' ' -f2 | tr -d '\r' | base64 -d
CampoQué es
currency, localAmountEl precio tal como lo puso el vendedor.
usdPerUnitValor en USD de una unidad de la moneda.
tokenAmount, tokenDecimalsLo que hay que pagar, en la unidad mínima del token. Redondeado hacia arriba.
oracleSource, oracleTimestampDe dónde salió la tasa y cuándo.
oracleValueDateDía al que corresponde el valor, cuando difiere del timestamp (la UF).
expiresAtSegundos unix tras los cuales el vendedor ya no la respeta.
signatureHMAC del vendedor, cuando las cotizaciones van firmadas.
Referencia

El esquema exact-fx.

Un borrador de esquema x402: el pagador entrega otro activo y el vendedor recibe el monto exacto en USDC. Un cliente x402 estándar paga la opción exact del mismo 402. Especificación completa.

extraTipoQué es
areFeesSponsoredtrueEl facilitador paga las comisiones de red, como en exact.
fxContractstringDirección de FxPay. El cliente solo firma para un contrato en que ya confía; no la toma del servidor.
sendAssetsstring[]Contratos de token que el facilitador acepta como activo del pagador.

El pagador firma una sola autorización:

FxPay
FxPay.pay(from, send_asset, max_send, dest_asset, dest_amount, pay_to, deadline)
// max_send: FxPay.quote(...) más 2% de margen; lo que no se usa vuelve en la misma llamada
// si la ruta necesita más que max_send: ExcessiveInput, y no se mueve nada
Referencia

Cuando algo sale mal.

Cada caso falla antes de que se mueva dinero, o revierte la transacción entera.

SituaciónQué pasa
La tasa del oráculo tiene más de 15 minutos, viene del futuro o es ceroEl servidor no cotiza. No hay requisito, así que nadie paga con un precio malo.
El vendedor cotiza más de 2% sobre el oráculo del pagadorLocal402Client se niega antes de firmar.
El swap podría gastar más de 5% sobre el valor del oráculoEl cliente se niega antes de firmar (maxFxPremiumBps).
Los pools se movieron y la ruta necesita más que max_sendFxPay revierte con ExcessiveInput. No se mueve nada.
Ningún pool entrega el activo del vendedorFxPay falla con NoRoute.
Monto, destinatario o activo distintos de los del 402El facilitador lo rechaza: wrong_amount, wrong_recipient, wrong_asset.
El plazo vence mientras el pagador aprueba en la walletdeadline_expired. El cliente ya deja 180 s para firmar.
Las tres fuentes de la UF están caídasSe usa la última UF conocida hasta por tres días; después solo deja de cotizar la ruta en UF.
Recibos en vivo

Cada venta, lista para contabilidad.

Exportar CSV
HoraRecursoPrecioTasa (USD)Vendedor recibeCliente pagóTransacción
Aún no hay pagos. Prueba uno arriba.
Referencia

Lo que no hace.

  • No corrige el oráculo. Vendedor y pagador leen el mismo feed de Reflector, así que Local402 atrapa a un vendedor que cotiza mal, no a un feed equivocado. Pasa tu propio oracle al cliente para una lectura independiente.
  • No cubre el tipo de cambio. El vendedor recibe USDC; pasarlo a su moneda sigue siendo cosa suya.
  • No busca en todos los mercados. FxPay enruta solo por Soroswap, por el pool directo o pasando por XLM.
  • No custodia fondos. FxPay no guarda saldo entre pagos y no tiene funciones de admin ni de actualización.
  • No está auditado. Tiene tests y pagos reales liquidados, pero ninguna auditoría externa. Por eso el facilitador de mainnet solo liquida para el vendedor de la demo y desde 0,01 USDC.
  • exact-fx aún no es parte de x402. Es un borrador.
Referencia

Todo se puede verificar.

El contrato FxPay de mainnet, CA6Z4E…UGHD, es byte a byte el artefacto de un release de GitHub compilado en CI. stellar.expert lo muestra verificado contra el commit 268f32c (tag v0.1.1) y Stellar Lab, como Verified Build. Compruébalo sin confiar en esta página:

terminal
curl -fsSL -O https://github.com/DiegoPoveda01/local402/releases/download/v0.1.1_contracts_fx-pay_cli27.0.0/fx-pay_v0.1.1.wasm
sha256sum fx-pay_v0.1.1.wasm
curl -s https://api.stellar.expert/explorer/public/contract/CA6Z4E55YN6LZEXBQPFCWUIMUJGAV42RLHYWWZ6SNIP4E73R2I2PUGHD | jq -r .wasm
# ambos imprimen 69a12d89059be04ac195f5acf40982d7e9ee93fd08f4df33626789d00ffccbd2