Libertum aplica las restricciones de cumplimiento en el código, no solo en la documentación. Este capítulo recorre esa cadena de extremo a extremo.
El inversor hace clic en "Completar KYC"
↓
Frontend → backend → se emite un token de acceso de SumSub (limitado al proyecto, de un solo uso)
↓
El iframe de SumSub se carga en el navegador
↓
El inversor envía documento + selfie + (documentos de la jurisdicción)
↓
SumSub procesa la solicitud (revisión automática + manual)
↓
Webhook → backend → kycStatus = IN_PROGRESS
↓
Webhook → backend → kycStatus = APPROVED o REJECTED
↓
Con APPROVED, la plataforma registra al inversor en el contrato IdentityRegistry
(a través del relayer, contra la infraestructura de identidad de la oferta)
Un KYC aprobado habilita la posibilidad de colocar órdenes en el mercado primario, pero no autoriza por sí solo operaciones en ninguna oferta específica: el siguiente paso es la inclusión de la wallet en la whitelist.
Incluso con el KYC en estado APPROVED:
Cuando un inversor (o un agente en su nombre) llama a transfer(to, amount) sobre un Token ERC-3643:
¿El emisor de la transferencia está congelado? → revierte si es así.
¿Tiene saldo no congelado suficiente? → se verifica con freezePartialTokens.
¿El receptor está en el IdentityRegistry? → revierte si no lo está.
Para cada módulo de cumplimiento habilitado en Modular Compliance:
Country Allow: ¿el claim de país del receptor está en la lista permitida?
Country Restrict: ¿el claim de país del receptor NO está en la lista bloqueada?
Supply Limit: ¿suministro total + (monto acuñado, si es una emisión) ≤ tope?
Max Balance: ¿el saldo resultante del receptor ≤ tope?
Hold Time: ¿los tokens que se mueven superan el período de retención?
Si todo pasa → se ejecuta la transferencia y se emite el evento Transfer.
Si algo falla → revierte.
Todo esto ocurre antes de que se mueva token alguno. No existe una verificación de cumplimiento posterior al hecho: la propia blockchain rechaza las transferencias no conformes.
forcedTransfer(from, to, amount) omite el paso 1 (emisor congelado) y el paso 2 (saldo no congelado suficiente), de modo que un agente puede mover tokens desde una wallet congelada o parcialmente congelada en escenarios legítimos de cumplimiento. Los pasos 3 y 4 se siguen aplicando: el receptor debe estar verificado y todos los módulos de cumplimiento deben seguir aprobando la operación. Esa es la salvaguarda crítica: una transferencia forzada nunca puede depositar tokens en una wallet no conforme.
recoveryAddress(lostWallet, newWallet, identity) es similar, pero ejecuta la actualización del IdentityRegistry de forma atómica junto con la transferencia, revinculando la nueva wallet a la misma identidad en una sola operación.
Cada acción de cumplimiento genera múltiples registros de auditoría:
Los auditores externos obtienen el panorama completo combinando las exportaciones off-chain con la indexación de eventos on-chain: ambas vistas coinciden porque el indexador de eventos escribe en la base de datos únicamente cuando el evento on-chain ha sido observado y confirmado.