Інтеграція з Notabene (Travel Rule compliance)
Notabene — провідний Travel Rule messaging провайдер з охватом 500+ VASP в 30+ країнах. SDK доступний для JavaScript/TypeScript, Python та Go. Інтеграція займає 1-2 тижні.
SDK setup та аутентифікація
import { NotabeneSDK } from "@notabene/javascript-sdk";
const sdk = new NotabeneSDK({
audience: "https://api.notabene.id",
clientId: process.env.NOTABENE_CLIENT_ID,
clientSecret: process.env.NOTABENE_CLIENT_SECRET,
vaspDID: process.env.MY_VASP_DID,
});
Вихідний переклад: повний flow
async function processOutgoingTransferTravelRule(withdrawal: Withdrawal) {
// 1. Ідентифікація VASP одержувача
const { vasp: beneficiaryVASP } = await sdk.addresses.lookup({
address: withdrawal.destinationAddress,
asset: withdrawal.asset,
});
if (!beneficiaryVASP) {
// Unhosted wallet — окремена процедура
await handleUnhostedWallet(withdrawal);
return;
}
// 2. Створення transfer record
const transfer = await sdk.transfers.create({
transactionAsset: withdrawal.asset,
transactionAmount: withdrawal.amount.toString(),
originatorVASPdid: process.env.MY_VASP_DID,
beneficiaryVASPdid: beneficiaryVASP.did,
originator: buildOriginatorInfo(withdrawal.user),
beneficiary: { beneficiaryPersons: [], accountNumber: [withdrawal.destinationAddress] },
transactionBlockchainInfo: {
origin: withdrawal.fromAddress,
destination: withdrawal.destinationAddress,
},
});
// 3. Чекаємо підтвердження (ACK або NACK від beneficiary VASP)
const confirmed = await waitForTransferConfirmation(transfer.id);
if (!confirmed) {
// Best-efforts: логуємо та продовжуємо (більшість регуляторів це приймає)
await logTravelRuleAttempt(withdrawal.id, transfer.id, "NO_RESPONSE");
}
// 4. Виконуємо виведення
await executeBlockchainWithdrawal(withdrawal);
}
Вхідний переклад: отримання Travel Rule даних
// Webhook від Notabene коли отримані Travel Rule дані
app.post("/webhooks/notabene", async (req, res) => {
const { type, transfer } = req.body;
if (type === "transfer.created") {
await handleIncomingTravelRuleData(transfer);
}
res.status(200).send();
});
async function handleIncomingTravelRuleData(transfer: NotabeneTransfer) {
// Зберігаємо отримані дані
await db.saveTravelRuleRecord({
externalId: transfer.id,
senderVASP: transfer.originatorVASPdid,
originator: transfer.originator,
destinationAddress: transfer.transactionBlockchainInfo.destination,
asset: transfer.transactionAsset,
amount: transfer.transactionAmount,
});
// Підтверджуємо отримання
await sdk.transfers.update(transfer.id, { status: "ACK" });
}
Статуси transfer та обробка
| Статус | Значення | Дія |
|---|---|---|
| CREATED | Створений, чекає | Нічого |
| SENT | Відправлений beneficiary VASP | Чекаємо відповідь |
| ACK | Одержувач підтвердив | Виконати переклад |
| NACK | Одержувач відмовив | Відмінити або escalate |
| EXPIRED | Нема відповіді за timeout | Best-efforts → виконати з логом |
Інтеграція Notabene в процес ввода та виводу коштів, включаючи webhook handling та unhosted wallet flow — 1-2 тижні.







