Libertum enforces compliance constraints in code, not just in documentation. This chapter walks through the chain end-to-end.
Investor clicks "Complete KYC"
↓
Frontend → backend → SumSub access token issued (project-scoped, single-use)
↓
SumSub iframe loads in browser
↓
Investor submits ID + selfie + (jurisdiction docs)
↓
SumSub processes (machine + manual review)
↓
Webhook → backend → kycStatus = IN_PROGRESS
↓
Webhook → backend → kycStatus = APPROVED or REJECTED
↓
On APPROVED, the platform registers the investor on the IdentityRegistry contract
(via the relayer, against the offering's identity infrastructure)
Approved KYC unlocks the ability to place primary orders, but does not by itself authorise transactions in any specific offering — wallet whitelisting comes next.
Even after KYC is APPROVED:
When an investor (or an agent on their behalf) calls transfer(to, amount) on an ERC-3643 Token:
Is sender frozen? → revert if yes.
Does sender have enough non-frozen balance? → check freezePartialTokens.
Is receiver in IdentityRegistry? → revert if no.
For each compliance module enabled on Modular Compliance:
Country Allow: receiver’s country claim in allow-list?
Country Restrict: receiver’s country claim NOT in block-list?
Supply Limit: total supply + (mint amount, if mint) ≤ cap?
Max Balance: receiver’s resulting balance ≤ cap?
Hold Time: tokens being moved older than hold-time?
All pass → execute transfer; emit Transfer event.
Any fail → revert.
This happens before any tokens move. There is no after-the-fact compliance check — the chain itself rejects non-compliant transfers.
forcedTransfer(from, to, amount) skips step 1 (sender frozen) and step 2 (sufficient non-frozen balance) — so an agent can move tokens out of a frozen or partially-frozen wallet in legitimate compliance scenarios. Steps 3 and 4 still apply: receiver must be verified, all compliance modules must still pass. This is the critical safety: a force transfer can never put tokens in a non-compliant wallet.
recoveryAddress(lostWallet, newWallet, identity) is similar but performs the IdentityRegistry update atomically with the transfer — re-linking the new wallet to the same identity in one operation.
Every compliance action produces multiple audit records:
External auditors get a full picture by combining off-chain exports with on-chain event indexing — both views agree because the event indexer writes to the database only when the on-chain event is observed and confirmed.