Compliance controls.
Every LUSG holder must be on the KYC allowlist and off the sanctions blocklist. It is one B20 policy, checked by the token itself on every send, receive and mint. Seizure, pause and a supply cap are native B20 too.
The holder policy
Policy IDs on Vibenet: allowlist 72057594037928003, blocklist 68, holder policy 216172782113783877, seize-exempt list 72057594037928006.
Seizure, and a default to know about
┌─ FINDING ─┐
SEIZE_EXEMPT_POLICY defaults to always-allow, and "authorized" there means exempt. Out of the box every wallet is exempt, so seizeWithMemo reverts AccountNotSeizable for anyone. We bound the scope to a list holding only the treasury (0xbe42a308…76a6 →), and the setup scripts now bind it at creation.Live tests on Vibenet
Successes are real transactions. Refusals were simulated as calls from the same wallet against live state and decoded to the B20 error, so nothing was spent to prove a refusal.
| Case | Expected | Result |
|---|---|---|
| Transfer between two KYC'd holders | Succeeds | ✓ 0xe71d7d1c…2ca5 → |
| Transfer to a wallet outside the allowlist | PolicyForbids | ✓ refused |
| Mint to a wallet outside the allowlist | PolicyForbids | ✓ refused |
| Compliance blocklists a holder | Succeeds | ✓ 0x841726c8…9985 → |
| The blocklisted holder tries to send | PolicyForbids | ✓ refused |
| Compliance seizes the blocklisted balance (502,000 LUSG) | Succeeds | ✓ 0xcda310e4…38f1 → |
| A wallet without the seize role tries to seize | AccessControlUnauthorizedAccount | ✓ refused |
| Pause transfers | Succeeds | ✓ 0x382f86bc…0f89 → |
| A transfer while paused | ContractPaused | ✓ refused |
| Unpause transfers | Succeeds | ✓ 0x0d9d2125…11a5 → |
| Mint 1 wei past the cap | SupplyCapExceeded | ✓ refused |
| Remove the holder from the blocklist | Succeeds | ✓ 0x358b59ab…7532 → |
Run them again with ./script/compliance_tests.sh. Blocklisted wallets also can't buy or redeem through the desk (unit-tested).
What changes before mainnet
- Test KYC goes away: allowlisting follows a real KYC and accredited-investor check, operated by compliance.
- Admin, minter and compliance roles move to a 2-of-3 Safe; a guardian contract holds pause.
- Offering rules, transfer restrictions and the legal basis for seizure are under review with counsel.