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 (chain 77)
Заголовок раздела «Публичные URL (chain 77)»| Сервис | URL |
|---|---|
| Демонстрационный ресурс | GET https://poa.net/77/x402/demo — без оплаты HTTP 402 с PAYMENT-REQUIRED |
| Facilitator | GET 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. Для формирования платежа:
- Скопируйте
resourceбез изменений, а выбранный объектaccepts[i]поместите вaccepted. - Установите
authorization.to = accepted.payToиauthorization.value = accepted.amount. - Задайте
validAfterиvalidBeforeв Unix-секундах. ЗначениеvalidBeforeне должно превышать текущее время плюсaccepted.maxTimeoutSeconds. - Создайте
nonceиз 32 случайных байт. Сохраните регистр адресов из котировки. - Закодируйте весь объект ниже в 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.
- Пополните кошелёк нативным USDC в сети 77.
- Подпишите EIP-712
TransferWithAuthorizationдляNativeTransferAuth(name=USDC,version=2,verifyingContract=0x2D00…0006,chainId=77). Суммы задаются с точностью 6 десятичных знаков. - Повторите запрос с
PAYMENT-SIGNATURE= Base64 конверта выше. Публичный facilitator/77/x402/facilitator/*— сервис в процессе узла, который обслуживает демонстрационный ресурс; он отправляетtransferWithAuthorizationс ключа отправителя расчётной транзакции. Демонстрационный ресурс отвечает 200 только после включения расчётной транзакции со статусом0x1. Нет квитанции —settlement_pending(402), не успех. Worker502/504после запроса расчёта не значит, что платёж провалился: проверьте хеш транзакции /(from, nonce)до новой подписи. - Пока производство блоков остановлено, расчёт отвечает
errorReason: "producer_halted"до отправки транзакции; повторите тот же подписанный платёж после возобновления, и он будет исполнен. - Один и тот же
(from, nonce)второй раз не исполняется. Адрес пула оператора (genesis-оператор моста, ему запрещёны обычные переводы) не может быть EIP-712from.
Кошелёк агента: вызовите 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-байт-кода. См. Прекомпайлы.