Перейти к содержимому

x402: HTTP 402 в нативном USDC

x402 позволяет оплачивать HTTP-ресурсы. Сервер отвечает на неоплаченный запрос кодом 402 Payment Required и условиями платежа. Клиент подписывает авторизацию, а сервис расчётов (facilitator) отправляет платёж в сеть.

В POA USDC — нативная валюта. Для платежа используется NativeTransferAuth по адресу 0x2D00…0006: интерфейс подобен EIP-3009, но работает с state.accounts. Клиент должен использовать параметры из ответа POA; контракт USDC в Ethereum и Permit2 для этого платежа не подходят. Facilitator не выпускает средства. Публичного GET /faucet нет.

СервисURL
Демонстрационный ресурсGET https://poa.net/77/x402/demo — без оплаты HTTP 402 с PAYMENT-REQUIRED
FacilitatorGET https://poa.net/77/x402/facilitator/supported
POST https://poa.net/77/x402/facilitator/verify
POST https://poa.net/77/x402/facilitator/settle

Инструкция в обозревателе: https://poa.net/77/docs/x402. Это не Agent Gateway (/77/agent/v1) и не выдача средств по приглашению (POST /77/agent/v1/faucet).

Окно терминала
curl -sS -D - https://poa.net/77/x402/demo -o /tmp/x402-demo.json

Условия платежа содержат scheme=exact, network=eip155:77, asset=0x2D00…0006 и параметры extra: assetTransferMethod=eip3009, paymentFlow=authorization, kind=native, имя EIP-712 USDC, версию 2 и 6 десятичных знаков.

Тело ответа 402 содержит котировку; заголовок PAYMENT-REQUIRED содержит тот же JSON в Base64. Для формирования платежа:

  1. Скопируйте resource без изменений, а выбранный объект accepts[i] поместите в accepted.
  2. Установите authorization.to = accepted.payTo и authorization.value = accepted.amount.
  3. Задайте validAfter и validBefore в Unix-секундах. Значение validBefore не должно превышать текущее время плюс accepted.maxTimeoutSeconds.
  4. Создайте nonce из 32 случайных байт. Сохраните регистр адресов из котировки.
  5. Закодируйте весь объект ниже в Base64 и передайте в PAYMENT-SIGNATURE. Одного дайджеста EIP-712 или payload.authorization недостаточно.

При отсутствии resource.url или accepted сервер возвращает invalid_payload в ошибке ответа 402; после неудачного расчёта ошибка также передаётся в PAYMENT-RESPONSE.

{
"x402Version": 2,
"resource": { "url": "https://poa.net/77/x402/demo", "mimeType": "application/json", "description": "…" },
"accepted": {
"scheme": "exact",
"network": "eip155:77",
"asset": "0x2d00000000000000000000000000000000000006",
"amount": "10000",
"payTo": "0x…",
"maxTimeoutSeconds": 60,
"extra": {
"assetTransferMethod": "eip3009",
"paymentFlow": "authorization",
"kind": "native",
"name": "USDC",
"version": "2",
"decimals": 6,
"symbol": "USDC"
}
},
"payload": {
"signature": "0x…",
"authorization": {
"from": "0x…",
"to": "0x…",
"value": "10000",
"validAfter": "0",
"validBefore": "…",
"nonce": "0x…"
}
}
}

POST /77/x402/facilitator/verify и settle принимают { "x402Version": 2, "paymentPayload": <конверт>, "paymentRequirements": <accepted> }.

Поддерживается обычный кошелёк (EOA) с балансом нативного USDC и подписью EIP-712.

  1. Пополните кошелёк нативным USDC в сети 77.
  2. Подпишите EIP-712 TransferWithAuthorization для NativeTransferAuth (name=USDC, version=2, verifyingContract=0x2D00…0006, chainId=77). Суммы задаются с точностью 6 десятичных знаков.
  3. Повторите запрос с PAYMENT-SIGNATURE = Base64 конверта выше. Публичный facilitator /77/x402/facilitator/* — сервис в процессе узла, который обслуживает демонстрационный ресурс; он отправляет transferWithAuthorization с ключа отправителя расчётной транзакции. Демонстрационный ресурс отвечает 200 только после включения расчётной транзакции со статусом 0x1. Нет квитанции — settlement_pending (402), не успех. Worker 502/504 после запроса расчёта не значит, что платёж провалился: проверьте хеш транзакции / (from, nonce) до новой подписи.
  4. Пока производство блоков остановлено, расчёт отвечает errorReason: "producer_halted" до отправки транзакции; повторите тот же подписанный платёж после возобновления, и он будет исполнен.
  5. Один и тот же (from, nonce) второй раз не исполняется. Адрес пула оператора (genesis-оператор моста, ему запрещёны обычные переводы) не может быть EIP-712 from.

Кошелёк агента: вызовите POST /77/agent/v1/x402/authorize с bearer-токеном API, имеющим право transfer. Передайте котировку как payment_required и новый 32-байтовый hex nonce; подписант вернёт авторизацию платежа. Требуются включённый x402 и разрешённые оператором сумма и получатель. MCP-адаптер пока не предоставляет этот метод. См. Agent Gateway.

У POA нет ERC-20-контракта для нативного USDC. NativeTransferAuth входит в набор встроенных программ 0x2D00…; оператор устанавливает его вместе с кодом узла. Он исполняется на Elixir без EVM-байт-кода. См. Прекомпайлы.