OperationsОтправить перевод

Отправить перевод

Полный flow исходящего transfer'а (демо-инвариант: успешный broadcast = confirmed):

  1. Резолв fromAddress, токена (network match), конвертация amount по decimals
  2. Balance check (raw units)
  3. evaluatePolicy (action=transfer) — 403 при deny/block
  4. Запись + ledger-проводка reserve (available → reserved, атомарный batch с guard'ом достаточности) — средства блокируются ДЛЯ ОБЕИХ веток
  5. allow → исполнение сразу: GasStation → 2s → broadcast → confirm | release+failed → ответ 201
  6. requireApproval → status=awaiting_approval, ответ 202; дальше — голоса через POST /transfers/{id}/approvals, финальный approve исполняет перевод

Идемпотентность: передавайте idempotencyKey (уникальный на каждую попытку перевода) — запись резервирует ключ и средства ДО broadcast; повторный запрос с тем же ключом вернёт 200 с существующей транзакцией вместо второго перевода. Резерв атомарен (конкурентные запросы не уведут баланс в минус); после failed/rejected retry — с новым ключом.

curl -X POST "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/transfers" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
  "fromAddressId": "123 Main St",
  "toAddress": "123 Main St",
  "amount": "1.5",
  "asset": "usdt",
  "idempotencyKey": "3f2c1e58-7b0a-4d2c-9a41-8a1f0e6b2d90"
}'
{
  "transaction": {
    "id": "cmr3f41z20001psp7phmyapw3",
    "fromAddress": "123 Main St",
    "toAddress": "123 Main St",
    "amount": "example_string",
    "amountDecimal": "example_string",
    "asset": "example_string",
    "network": "example_string",
    "status": "confirmed",
    "txHash": "example_string",
    "fee": "example_string",
    "counterpartyId": "example_string",
    "approvalThreshold": 42,
    "createdAt": "2026-07-02T11:25:15.134Z"
  }
}
POST
/api/v1/vaults/{code}/transfers
POST
Base URLstring

Target server for requests. Edit to use your own host.

Bearer Token
Bearer Tokenstring
Required

better-auth session token. Мобилка/сервисы. Веб использует cookie.

better-auth session token. Мобилка/сервисы. Веб использует cookie.
API Key (cookie: better-auth.session_token)
path
codestring
Required

Уникальный код Vault'а (slug)

Content-Typestring
Required

The media type of the request body

Options: application/json
amountstring
Required

DECIMAL строка — конвертируется по token.decimals

idempotencyKeystring

Уникальный ключ попытки перевода (рекомендуется: uuid). Повторный запрос с тем же ключом вернёт существующую транзакцию без второго broadcast. Для новой попытки после failed — новый ключ.

Min length: 8 • Max length: 128
Request Preview
Response

Response will appear here after sending the request

Authentication

header
Authorizationstring
Required

Bearer token. better-auth session token. Мобилка/сервисы. Веб использует cookie.

path
parameterstring
Required

API Key for authentication. Provide your API key in the cookie.

Path Parameters

codestring
Required

Уникальный код Vault'а (slug)

Example:
demo_vault

Body

application/json
amountstring
Required

DECIMAL строка — конвертируется по token.decimals

Example:
1.5
idempotencyKeystring

Уникальный ключ попытки перевода (рекомендуется: uuid). Повторный запрос с тем же ключом вернёт существующую транзакцию без второго broadcast. Для новой попытки после failed — новый ключ.

Example:
3f2c1e58-7b0a-4d2c-9a41-8a1f0e6b2d90

Responses

transactionobject
Required