Пред-проверить перевод
Проверить перевод через POST /evaluate до создания операции — узнать allow/queue/block, причину и сработавшие политики, ничего не меняя.
Перед тем как создавать перевод, можно спросить Policy Engine: «пройдёт ли это?» — не создавая ничего и не резервируя средства. evaluate возвращает тот же вердикт allow / queue / block с причиной и списком сработавших политик. Удобно для пред-флайт проверок в UI и автоматизации. Про сам движок — на странице Policy Engine.
Шаг 1. Отправьте запрос на оценку
POST /api/v1/evaluate — это топ-левел эндпоинт (не внутри /vaults/{code}). Он ничего не создаёт — только считает вердикт.
curl -X POST "[BASE_URL]/api/v1/evaluate" \
-H "Authorization: Bearer $V3_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"action": "transfer",
"vaultId": "VAULT_ID",
"userId": "USER_ID",
"asset": "usdt",
"amount": "1350.00",
"toAddress": "TQ2m...p4rX"
}'
const res = await fetch("[BASE_URL]/api/v1/evaluate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.V3_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
action: "transfer",
vaultId: "VAULT_ID",
userId: "USER_ID",
asset: "usdt",
amount: "1350.00",
toAddress: "TQ2m...p4rX",
}),
});
console.log(await res.json());
res = requests.post(
"[BASE_URL]/api/v1/evaluate",
headers={"Authorization": f"Bearer {os.environ['V3_TOKEN']}"},
json={
"action": "transfer",
"vaultId": "VAULT_ID",
"userId": "USER_ID",
"asset": "usdt",
"amount": "1350.00",
"toAddress": "TQ2m...p4rX",
},
)
print(res.json())
Обязателен asset; tokenCode опционален. Остальные поля тела приведены для примера — точную схему сверьте со Справочником API на странице evaluate. vaultId — это id Vault'а, а не его code.
Шаг 2. Прочитайте решение
В ответе — вердикт и объяснение:
{
"decision": "block",
"reason": "AMOUNT_EXCEEDED",
"policyId": "...",
"policyCode": "otc-daily-limit",
"trace": [
{ "policyCode": "otc-daily-limit", "policyName": "OTC daily limit", "effect": "block" }
]
}
decision—allow,queueилиblock.reason— машиночитаемая причина (например,AMOUNT_EXCEEDED).trace— список сработавших политик с ихeffect.
Как использовать вердикт: allow — можно сразу создавать перевод; queue — перевод потребует подтверждения, можно предупредить об этом заранее; block — показать причину и не дать отправить.
Шаг 3. Как движок принимает решение
evaluate работает по принципу deny-overrides:
- Собираются все политики пользователя в Vault'е (через членства в группах).
- Остаются включённые политики с типом действия, равным запрошенному.
- Проверяется применимость (дерево условий; пустое — «применима всегда»).
- Если хотя бы одна политика блокирует — итог
block.
Тот же расчёт выполняется и при создании перевода — но там он сопровождается побочными эффектами (резерв, заявка). evaluate же безопасен для повторных вызовов. Подробнее — на странице Policy Engine.