x402 on Gonka
проверка…

Git: Git-хостинг gonkalabs временно недоступен. Скачайте исходный код с этого сайта — Исходный код.

Продавцы

Назначьте цену HTTP-маршруту в GNK или USDC. Вы отдаёте 402, клиент платит, вы проводите платёж через этот фасилитатор, затем отдаёте работу. Ноду Gonka запускать не нужно.

Цикл сервера

  1. Если PAYMENT-SIGNATURE нет или это не валидный base64 JSON, ответьте 402 с PAYMENT-REQUIRED (заголовок и тело).
  2. POST на /settle с paymentPayload (то, что прислал клиент) и paymentRequirements (то, что вы объявили).
  3. Если success ложно, снова ответьте 402 и положите причину в error.
  4. Если success истинно, сделайте работу и верните 200 с PAYMENT-RESPONSE — base64 результата settle.

В Gonka поток оплаты авансовый. Не отдавайте ресурс после одной только проверки verify. /verify необязателен и только читает. Средства двигает /settle.

Тело 402 — объект x402 v2 PaymentRequired. Минимально полезная запись accepts:

{
  "scheme": "exact",
  "network": "cosmos:gonka-mainnet",
  "amount": "1000000",
  "asset": "ngonka",
  "payTo": "gonka1yourmerchantaddress…",
  "maxTimeoutSeconds": 60,
  "extra": {
    "name": "GNK",
    "decimals": 9,
    "assetTransferMethod": "signed-tx",
    "paymentFlow": "upfront"
  }
}

Добавьте второй объект для USDC: asset — адрес CW-20, decimals — 6, nameUSDC. Весь объект PaymentRequired закодируйте стандартным base64 для заголовка. Список полей — в Протоколе.

Settle до выдачи

curl -sS -X POST {{BASE}}/settle \
  -H 'Content-Type: application/json' \
  -d '{
    "x402Version": 2,
    "paymentPayload": { "...from PAYMENT-SIGNATURE..." },
    "paymentRequirements": { "...your accepts entry..." }
  }'

При успехе вы получите transaction (hex-хеш), payer, network и amount. При необходимости запишите это в свой леджер; перевод в сети уже ушёл на payTo.

Фасилитатор отклоняет повторный TxRaw (replayed_payment). В приложении всё равно проверяйте это, если реплик несколько и клиент ретраит.

Набросок middleware

async function requirePayment(req, res, next) {
  const header = req.get("PAYMENT-SIGNATURE");
  const required = paymentRequiredFor(req);
  if (!header) return send402(res, required);
  const paymentPayload = JSON.parse(Buffer.from(header, "base64").toString());
  const settled = await fetch(FACILITATOR + "/settle", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      x402Version: 2,
      paymentPayload,
      paymentRequirements: paymentPayload.accepted,
    }),
  }).then((r) => r.json());
  res.set("PAYMENT-RESPONSE", Buffer.from(JSON.stringify(settled)).toString("base64"));
  if (!settled.success) return send402(res, { ...required, error: settled.errorReason });
  next();
}

Цены

GNK1 GNK = 1000000000 ngonka. Пример: 0.001 GNK → amount: "1000000".
USDC1 USDC = 1000000. Пример: $0.01 → amount: "10000".
Кто получаетВаш адрес payTo. Фасилитатор не сводит и не держит платёж.

Демо-маршрут на этом хосте использует крошечные суммы для тестов. Продакшен-суммы — ваши.

Discovery

Необязательно: публикуйте платные URL, чтобы агенты их находили. Этот фасилитатор отдаёт GET /discovery/resources для своего /demo. Живой каталог ниже и на странице Список ресурсов. Можно вести похожий список на своём API или позже зарегистрироваться в x402 Bazaar. Форма — в HTTP API.