Saltar al contingut principal
El widget de verificació de titularitat de cartera és una pàgina allotjada que demostra que un dels teus clients controla una adreça de cartera de criptomonedes concreta. Segons el TFR de la UE, un VASP ha de verificar la titularitat d’una cartera autoallotjada (no allotjada) abans d’alliberar fons cap a aquesta cartera o des d’aquesta cartera per sobre del llindar sunrise. El widget és la manera com Didit recull aquesta prova sense que hagis de construir tu mateix els fluxos de signatura. Una prova verificada marca l’entrada de la llibreta d’adreces de carteres corresponent com a is_ownership_verified: true, cosa que permet que una transferència de Travel Rule vinculada avanci i surti de UNCONFIRMED_OWNERSHIP.

Quan Didit la crea per a tu

Gairebé mai no cal crear tu mateix una sessió. Quan auto_wallet_verification està activat a la teva configuració de Travel Rule (per defecte), Didit crea automàticament una sessió de widget en el moment de crear la transacció sempre que una transferència necessiti la prova, per part de l’usuari final, del control de la cartera:
  • La transferència es troba en UNCONFIRMED_OWNERSHIP: la cartera de la contrapart s’ha declarat autoallotjada en el moment d’enviar la transferència.
  • La transferència és de sortida i es troba en COUNTERPARTY_VASP_NOT_FOUND: no s’ha pogut identificar cap VASP de la contrapart, de manera que la prova de titularitat és el camí que queda per completar-la.
La sessió creada automàticament es retorna al bloc action_required de la transacció (type: "wallet_ownership", amb la url que cal obrir), i els SDK la inicien automàticament en l’enviament des del costat del client. Les transferències entrants que Didit crea per a tu (un registre sunrise, una consulta TRP entrant o el tram entrant de la via INTERNAL) mai no reben una sessió creada automàticament, encara que acabin a UNCONFIRMED_OWNERSHIP. Crea-la manualment amb POST /v3/travel-rule/widget-session/ quan vulguis verificar una cartera abans que existeixi cap transferència, quan tinguis auto_wallet_verification desactivat, o per a una d’aquestes transferències entrants.

Què demostra

El widget ofereix fins a quatre mètodes de prova. Els que apareixen depenen de com has creat la sessió i de la teva configuració de Travel Rule:

Contracte de verificació de la signatura de missatges

Enviar la signatura retorna 200 amb status: "VERIFIED" quan demostra el control de la cartera. Retorna 400 i deixa la prova oberta, perquè el client pugui tornar a signar, amb un d’aquests valors de code:

Contracte de verificació de la prova Satoshi

La verificació d’un dipòsit de prova Satoshi és asíncrona, perquè la transacció s’ha de veure on-chain i després confirmar-se. Enviar el txid del dipòsit retorna 200 amb status: "PENDING" mentre el dipòsit no estigui confirmat on-chain: el txid es conserva, no es descarta. Retorna 200 amb status: "VERIFIED" quan el dipòsit es confirma. Retorna 400 amb status: "REJECTED" per a un dipòsit realment incorrecte: enviat des d’una altra cartera, amb una quantitat diferent de l’esperada a l’adreça de dipòsit, anterior al repte, o una transacció que ja ha servit per demostrar una altra cartera. La prova es tanca i el client pot iniciar-ne una de nova mentre la sessió tingui intents disponibles. Un dipòsit que encara no està indexat també retorna 200 amb status: "PENDING", i una consulta que falla per part de Didit retorna 400 amb el codi DEPOSIT_LOOKUP_FAILED: en tots dos casos la prova queda oberta i Didit continua comprovant. Retorna 410 si la finestra de prova expira abans de veure un dipòsit vàlid. Un cop s’ha enviat un txid, un procés en segon pla torna a comprovar el dipòsit pendent cada cinc minuts i completa la prova després que la transacció es confirmi, de manera que el client no necessita tornar a enviar el txid. Quan passes un satoshi_deposit_address, el expires_at de la pròpia sessió del widget s’amplia fins a almenys la finestra de prova Satoshi de 24 hores, perquè el dipòsit tingui temps de confirmar-se abans que expiri la sessió.

Flux

1

Crear una sessió del widget

Crida POST /v3/travel-rule/widget-session/ amb la cartera que necessites verificar. Opcionalment, vincula-la a una transferència perquè la transferència avanci automàticament quan es demostri la titularitat.
2

Obrir la URL retornada

Envia el teu client a la url de la resposta. Allà completa una prova: no cal cap compte de Didit ni clau d’API; el token de la URL és l’autenticació.
3

Detectar la finalització

Quan una prova es verifica, el widget marca l’entrada de la llibreta d’adreces com a verificada i, si la sessió està vinculada a una transferència, la fa avançar. Vigila travel_rule.status.updated (transferències vinculades) o consulta periòdicament el context del widget.

Crear una sessió del widget

Aquest exemple vincula la sessió a la transferència autoallotjada declarada de la guia de Travel Rule, de manera que wallet_address és la cartera de destinació d’aquesta transferència. Una sessió vinculada a una transferència només accepta proves per a la cartera de la contrapart de la transferència.
Obre sempre la url retornada a la resposta tal com és; no la construeixis tu mateix.

Obrir la URL retornada

El widget només és web en aquesta versió. Obre la url al navegador del sistema o en una pestanya personalitzada; mai dins d’un webview del SDK mòbil de Didit.La signatura de missatges funciona amb carteres instal·lades al navegador del client, que el widget descobreix mitjançant els protocols EIP-6963 i Wallet Standard. Actualment no està disponible la vinculació amb una aplicació de cartera mòbil separada, per exemple mitjançant un codi QR, de manera que el widget no passa el control a cap altra aplicació. Un webview integrat a l’aplicació, com el webview del SDK de Didit per a Web/Flutter/React Native/iOS/Android, no pot accedir a les carteres del navegador del client, de manera que un widget obert allà deixa el client sense manera de signar.En mòbil, inicia la url amb el navegador del sistema operatiu (SFSafariViewController / Chrome Custom Tabs, o el navegador per defecte) en lloc de mostrar-la en un webview. En web, una pestanya normal o una finestra emergent són correctes.

Detectar la finalització

El widget exposa un endpoint de lectura públic identificat pel token: consulta’l periòdicament per veure el progrés, o confia en els webhooks quan la sessió està vinculada a una transferència:
  • completed_at passa a tenir valor no nul quan una prova es verifica.
  • Cada entrada de proofs porta els camps que necessita el seu mètode: una prova SATOSHI_TEST afegeix deposit_address, expected_amount i el seu propi expires_at; una prova MESSAGE_SIGNING afegeix challenge, la cadena que signa el client.
  • Una prova SATOSHI_TEST pot quedar amb status: "PENDING" mentre el seu dipòsit es veu a la cadena de blocs però encara no està confirmat, sense cap acció necessària per part teva ni del client; consulta contracte de verificació de la prova Satoshi més amunt.
  • Quan la sessió s’ha creat amb un transaction_id, verificar la prova fa avançar la transferència vinculada i, en una aplicació en producció, s’activa un webhook travel_rule.status.updated. Prefereix el webhook a les consultes periòdiques. Una consulta TRP entrant s’aprova i es retorna al remitent, i passa a COMPLETED quan es lliura aquesta aprovació. Qualsevol altra transferència en UNCONFIRMED_OWNERSHIP (o una entrant en ON_HOLD) passa a COMPLETED, o a COUNTERPARTY_MISMATCHED_DATA quan el nom del beneficiari no coincideix amb el del titular de la cartera, i un dipòsit sunrise liquidat que es completa continua fins a FINISHED. Una transferència sortint en COUNTERPARTY_VASP_NOT_FOUND passa a COMPLETED.
  • Una prova SCREENSHOT manté status: "PENDING" en aquest context, fins i tot després que confirmis la titularitat. L’aprovaràs amb POST .../travel-rule/ownership/, que només accepta una transferència que espera la confirmació de la titularitat. Per tant, una captura de pantalla no té cap via d’aprovació en una sessió sense transferència vinculada, ni en una sessió vinculada a una transferència sortint en COUNTERPARTY_VASP_NOT_FOUND: desactiva allow_screenshot_proof si aquestes sessions no han d’oferir-la.
  • Després d’una prova rebutjada, la sessió admet un nou intent mentre en queden. max_attempts, attempts_used i attempts_remaining indiquen el recompte, una prova rebutjada porta rejection_reason, i quan attempts_remaining és 0, iniciar una altra prova respon amb 409 i has de crear una sessió nova.
  • L’endpoint de context retorna 404 per a un token desconegut i 410 quan la sessió ha caducat sense completar-se.
Aquí no hi ha dependències d’un sol ús: el widget i el teu backend convergeixen en el mateix estat persistent (l’entrada verificada de la llibreta d’adreces i l’estat de la transferència), de manera que un webhook perdut o una pestanya tancada sempre es poden recuperar tornant a llegir la transferència o el context del widget.

Localització i marca

El widget es mostra en 54 idiomes, segons el camí d’idioma de l’enllaç (o l’idioma predeterminat del navegador). Quan la marca blanca està activada per a la vostra aplicació, el widget hereta automàticament la marca del vostre flux de verificació: logotip, colors de marca, estil de botons i panells, tipus de lletra personalitzat, favicon i el nom públic de la vostra aplicació al títol. No cal cap configuració addicional: s’aplica la mateixa personalització que heu configurat per a les sessions de KYC. Un usuari que torna a un enllaç ja completat veu de nou la pantalla de finalització; si heu passat un callback_url, el widget hi redirigeix l’usuari. Els enllaços caducats mostren una pantalla de caducitat amb la marca pròpia, que convida l’usuari a sol·licitar un enllaç nou. Creeu una sessió nova amb POST /v3/travel-rule/widget-session/ per a aquest usuari: reenviar una transferència amb action: "resend" no en crea cap.

Propers passos

Travel Rule

El cicle de vida complet de l’intercanvi, els canals, la configuració i els fluxos de recepció.

Llibreta d'adreces de carteres

Registreu les carteres que controleu perquè les transferències entrants es puguin associar a aquestes carteres.

Webhooks

Subscriviu-vos a travel_rule.status.updated per reaccionar quan una prova faci avançar una transferència.

SDK natius

Obriu l’URL del widget amb el navegador del sistema, no amb el webview de l’SDK.
Darrera modificació el 7 de novembre del 2026