Перед началом
- Используйте API-ключ приложения в песочнице. Продакшн-приложения никогда не обращаются к тестовому VASP.
- Включите Travel Rule с юридическим названием:
- По желанию подключите адрес назначения webhook к событию
travel_rule.status.updated. Песочница доставляет его с пометкой"environment": "sandbox".
Didit Test VASP
GET /v1/sandbox/scenarios/ возвращает профиль тестового VASP и все сценарии из его объекта travel_rule, поэтому ваши тесты могут считывать значения триггеров, а не задавать их вручную:
Все значения являются тестовыми данными. Тестовый VASP не входит ни в одну сеть Travel Rule, и никакой результат в песочнице не показывает, что реальный контрагент или сеть доступны.
Сценарии исходящих переводов
Каждая исходящая транзакцияtravelRule приложения песочницы, которой требуется обмен, направляется в тестовый VASP. Исход выбирается по адресу кошелька получателя (регистр не важен) или по имени получателя в формате Didit Test VASP <suffix>. Если заданы оба, приоритет у кошелька. Если не задано ни то, ни другое, или суффикс не указан в таблице, перевод завершается (accept).
Перевод, которому не требуется обмен, никогда не направляется в тестовый VASP: перевод ниже вашего threshold_amount, перевод на верифицированный кошелёк вашего пользователя и перевод на кошелёк контрагента, который вы указали как некастодиальный. VASP-контрагент, выбранный вами или вашим конечным пользователем вручную из каталога, оценивается по тем же маршрутам, что и в продакшн-приложении: если у его записи есть маршрут (верифицированная конечная точка TRP, сеть, через которую отправляет ваше приложение, или контакт комплаенса), перевод направляется в тестовый VASP; если маршрута нет, перевод завершается со статусом COUNTERPARTY_VASP_NOT_FOUND, как и в продакшн-приложении.
rail) имеет значение TEST_VASP, а в списке переводов получателем VASP указан Didit Test VASP. Отслеживайте перевод в webhook travel_rule.status.updated или получите его через GET /v3/transactions/{transaction_id}/.
name_mismatchсравнивает имя получателя, которое вы отправили, с именем держателя, которое возвращает тестовый VASP, по вашему правилу проверки имён для типа субъекта получателя (matching_rules.individual.nameилиmatching_rules.company.name; до тех пор, пока вы их не задали, они следуют заname_matching_strictness). Перевод и запись временной шкалы, которая определила его исход, содержатname_match(сcompared_with: "counterparty_vasp") иdata_matchсmismatched_fields: ["name"].not_reachableоставляет перевод в статусеAWAITING_COUNTERPARTYна время повторных попыток, сdelivery.statusRETRYINGиlast_errortest VASP is not answering, а затем переводит его вCOUNTERPARTY_VASP_NOT_REACHABLE. После этого отправьте{"action": "resend"}, чтобы выполнить перевод заново.self_hostedзаставляет тестовый VASP ответить, что кошелёк является некастодиальным. Зафиксируйте подтверждение с помощью виджета проверки владения кошельком (создаётся для вас, пока включёнauto_wallet_verification) илиPOST .../travel-rule/ownership/с{"confirmed": true}: кошелёк добавляется в вашу адресную книгу под именем получателя, и решение о переводе принимается по совпадению имён. Совпадение завершает перевод и помечает кошелёк как верифицированный;{"confirmed": false}отклоняет его.
Входящие переводы от тестового VASP
Чтобы проверить принимающую сторону, попросите тестовый VASP отправить вам перевод черезPOST /v3/travel-rule/test-vasp/inbound/. Укажите один из кошельков вашего приложения из собственной адресной книги. Перевод принимается тем же входящим путём, что и реальный: проверка идёт по вашей адресной книге, режиму владения и правилам проверки имён.
Ответ
201 содержит transaction_id, txn_id, scenario, travel_rule_status, detail, test_vasp: true и перевод travel_rule. Для продакшн-приложения возвращается 400 ("The Didit Test VASP is only available on sandbox applications."), для другого scenario также возвращается 400, а для приложения с выключенным Travel Rule возвращается 409.
Примите решение по ожидающему переводу через
POST .../travel-rule/ownership/, как и для реального: {"confirmed": true} завершает его, а {"confirmed": false} отклоняет.
Депозит, который вы сами регистрируете через POST /v3/transactions/, тестовый VASP не отправлял. Он остаётся в статусе AWAITING_COUNTERPARTY и ждёт своего VASP-отправителя, а в его хронологии указан endpoint выше. Webhook по нему не отправляется, пока не истечёт срок confirmation_timeout_hours. POST /v3/travel-rule/inbound/ по-прежнему закрывает регистрацию после депозита по вашей адресной книге, как и в продакшн-приложении.
Webhook в песочнице
travel_rule.status.updated отправляется для приложений в песочнице при каждом изменении статуса, с "environment": "sandbox". Перевод, на который ответил тестовый VASP, также содержит rail: "TEST_VASP", test_vasp: true и test_vasp_scenario. Остальная часть песочницы работает так, как описано в Мониторинг транзакций в песочнице: правила не проверяются, transaction.created и transaction.status.updated не отправляются, и списания не производятся.
Что песочница не подтверждает
- Что реальный контрагент, членство в сети или публичный TRP-хост Didit работают. Ни один из них не вызывается.
- Что ваши учётные данные сети действительны. Подключённое членство подтверждается его первым боевым обменом.
- Маршруты каталога реальных VASP: в приложении песочницы каждый маршрут показывает
unavailableсreason: sandbox_application, а у каждой строкиreachable: false.