is_ownership_verified: true, o que permite que uma transferência Travel Rule associada avance a partir de UNCONFIRMED_OWNERSHIP.
Quando a Didit o cria para si
Raramente precisa de criar uma sessão manualmente. Quandoauto_wallet_verification está ativado nas suas definições da Travel Rule (o valor predefinido), a Didit cria automaticamente uma sessão do widget na criação da transação sempre que uma transferência precisa de prova de controlo da carteira pelo utilizador final:
- A transferência está em
UNCONFIRMED_OWNERSHIP, porque a carteira da contraparte foi declarada autocustodiada na submissão. - A transferência é de saída e está em
COUNTERPARTY_VASP_NOT_FOUND, porque não foi possível identificar nenhuma VASP da contraparte, pelo que a prova de propriedade é o único caminho restante para a conclusão.
action_required da transação (type: "wallet_ownership", com o url a abrir), e os SDK iniciam-na automaticamente na submissão do lado do cliente.
As transferências de entrada que a Didit cria para si (um registo sunrise, uma consulta TRP de entrada ou a perna de entrada do canal INTERNAL) nunca recebem uma sessão criada automaticamente, mesmo quando ficam em UNCONFIRMED_OWNERSHIP.
Crie a sessão manualmente com POST /v3/travel-rule/widget-session/ quando quiser pré-verificar uma carteira antes de existir qualquer transferência, quando tiver auto_wallet_verification desativado ou para uma dessas transferências de entrada.
O que comprova
O widget oferece até quatro métodos de prova. Os que aparecem dependem da forma como a sessão foi criada e das suas definições da Travel Rule:Contrato de verificação de assinatura de mensagens
Submeter a assinatura devolve200 com status: "VERIFIED" assim que prova o controlo da carteira.
Devolve 400 e deixa a prova aberta, para que o cliente possa assinar novamente, com um destes valores de code:
Contrato de verificação do teste Satoshi
A verificação de um depósito de teste Satoshi é assíncrona, porque a transação tem de ser vista on-chain e depois confirmada. Submeter otxid do depósito devolve 200 com status: "PENDING" enquanto o depósito ainda não estiver confirmado on-chain - o txid é retido, não descartado.
Devolve 200 com status: "VERIFIED" assim que o depósito é confirmado.
Devolve 400 com status: "REJECTED" para um depósito efetivamente errado: enviado de outra carteira, com um montante diferente do esperado para o endereço de depósito, anterior ao desafio, ou uma transação que já provou outra carteira. A prova fica fechada e o cliente pode iniciar uma nova enquanto a sessão tiver tentativas disponíveis.
Um depósito que ainda não está indexado também devolve 200 com status: "PENDING", e uma consulta que falha do lado da Didit devolve 400 com o código DEPOSIT_LOOKUP_FAILED. Em ambos os casos a prova fica aberta e a Didit continua a verificar.
Devolve 410 se a janela de teste expirar antes de ser visto um depósito válido.
Depois de um txid ter sido submetido, uma tarefa em segundo plano volta a verificar o depósito pendente a cada cinco minutos e completa a prova depois de a transação ser confirmada. Assim, o cliente não precisa de submeter novamente o txid.
Quando fornece um satoshi_deposit_address, o expires_at da própria sessão do widget é prolongado para pelo menos a janela de teste Satoshi de 24 horas, dando tempo ao depósito para ser confirmado antes de a sessão expirar.
Fluxo
1
Criar uma sessão do widget
Chame
POST /v3/travel-rule/widget-session/ com a carteira que precisa de ser verificada. Opcionalmente, associe-a a uma transferência para que esta avance automaticamente assim que a propriedade for comprovada.2
Abrir o URL devolvido
Envie ao seu cliente o
url da resposta. Ele conclui ali uma prova, sem necessidade de conta Didit nem de chave de API; o token no URL é a autenticação.3
Detetar a conclusão
Quando uma prova é verificada, o widget marca a entrada do livro de endereços como verificada e, se a sessão estiver associada a uma transferência, avança-a. Fique atento a
travel_rule.status.updated (transferências associadas) ou faça polling ao contexto do widget.Criar uma sessão do widget
Este exemplo associa a sessão à transferência declarada com carteira autocustodiada do guia da Travel Rule, pelo quewallet_address é a carteira de destino dessa transferência.
Uma sessão associada a uma transferência só aceita provas para a carteira da contraparte da transferência.
url devolvido na resposta tal como vem - não o construa você mesmo.
Abrir o URL devolvido
Detetar a conclusão
O widget expõe um endpoint público de leitura identificado pelo token - faça polling para ver o progresso, ou confie nos webhooks quando a sessão estiver associada a uma transferência:completed_atpassa a não ser nulo assim que uma prova é verificada.- Cada entrada em
proofstraz os campos de que o seu método necessita: uma provaSATOSHI_TESTacrescentadeposit_address,expected_amounte o seu próprioexpires_at; uma provaMESSAGE_SIGNINGacrescentachallenge, a cadeia de caracteres que o cliente assina. - Uma prova
SATOSHI_TESTpode ficar comstatus: "PENDING"enquanto o depósito é visto na blockchain mas ainda não está confirmado, sem qualquer ação necessária da sua parte nem da do cliente - veja o contrato de verificação do teste Satoshi acima. - Quando a sessão foi criada com um
transaction_id, a verificação da prova avança a transferência associada e, numa aplicação em produção, dispara-se um webhooktravel_rule.status.updated. Prefira o webhook ao polling. Um pedidoTRPrecebido é aprovado de volta ao remetente e passa aCOMPLETEDassim que essa aprovação for entregue. Qualquer outra transferência emUNCONFIRMED_OWNERSHIP(ou uma recebida emON_HOLD) passa aCOMPLETED, ou aCOUNTERPARTY_MISMATCHED_DATAquando o nome do beneficiário não corresponde ao titular da carteira, e um depósito sunrise liquidado que seja concluído avança paraFINISHED. Uma transferência enviada emCOUNTERPARTY_VASP_NOT_FOUNDpassa aCOMPLETED. - Uma prova
SCREENSHOTmantémstatus: "PENDING"neste contexto, mesmo depois de confirmar a propriedade. Aprova-a comPOST .../travel-rule/ownership/, que só aceita uma transferência a aguardar a confirmação de propriedade. Por isso, uma captura de ecrã não tem caminho de aprovação numa sessão sem transferência associada, nem numa sessão associada a uma transferência enviada emCOUNTERPARTY_VASP_NOT_FOUND: desativeallow_screenshot_proofse essas sessões não devem oferecê-la. - Após uma prova rejeitada, a sessão aceita uma nova tentativa enquanto restarem tentativas.
max_attempts,attempts_usedeattempts_remainingindicam a contagem, uma prova rejeitada incluirejection_reason, e quandoattempts_remainingfor0, iniciar outra prova responde com409e tem de criar uma nova sessão. - O endpoint de contexto devolve
404para um token desconhecido e410quando a sessão expirou sem ter sido concluída.
Não há dependências de uso único aqui: o widget e o seu backend convergem para o mesmo estado durável (a entrada verificada do livro de endereços e o estado da transferência), pelo que um webhook perdido ou um separador fechado é sempre recuperável ao reler a transferência ou o contexto do widget.
Localização e marca
O widget é apresentado em 54 idiomas, seguindo o caminho de idioma da ligação (ou o idioma predefinido do navegador). Quando a marca branca está ativada para a sua aplicação, o widget herda automaticamente a personalização do seu fluxo de verificação: logótipo, cores da marca, estilo dos botões e do painel, tipo de letra personalizado, favicon e o nome público da sua aplicação no título. Não é necessária nenhuma configuração adicional: aplica-se a mesma personalização que configurou para as sessões de KYC. Um utilizador que volta a uma ligação já concluída volta a ver o ecrã de conclusão; se tiver passado umcallback_url, o widget reencaminha-o para esse endereço.
As ligações expiradas mostram um ecrã de expiração com a marca, que convida a pedir uma nova ligação.
Crie uma nova sessão para essa pessoa com POST /v3/travel-rule/widget-session/: reenviar uma transferência com action: "resend" não cria uma sessão.
Próximos passos
Travel Rule
O ciclo de vida completo do intercâmbio, os canais, as definições e os fluxos de receção.
Livro de endereços de carteiras
Registe as carteiras que controla para que as transferências recebidas sejam associadas a elas.
Webhooks
Subscreva travel_rule.status.updated para reagir quando uma prova faz avançar uma transferência.
SDKs nativos
Abra o URL do widget com o navegador do sistema, e não com a webview do SDK.