LUSG docsLIUM FINANCE Vibenet live · Base Sepolia next Open the app →
Contents
Design

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

KYC allowlistadmin: LusgDesk Sanctions blocklistadmin: compliance Holder policyINTERSECT (both must pass) TRANSFER_SENDER_POLICY TRANSFER_RECEIVER_POLICY MINT_RECEIVER_POLICY
A blocklist policy authorizes everyone not on it, so INTERSECT(allowlist, blocklist) means "allowlisted and not blocklisted". Composite policies arrived with the Cobalt upgrade.

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.

CaseExpectedResult
Transfer between two KYC'd holdersSucceeds✓ 0xe71d7d1c…2ca5 →
Transfer to a wallet outside the allowlistPolicyForbids✓ refused
Mint to a wallet outside the allowlistPolicyForbids✓ refused
Compliance blocklists a holderSucceeds✓ 0x841726c8…9985 →
The blocklisted holder tries to sendPolicyForbids✓ refused
Compliance seizes the blocklisted balance (502,000 LUSG)Succeeds✓ 0xcda310e4…38f1 →
A wallet without the seize role tries to seizeAccessControlUnauthorizedAccount✓ refused
Pause transfersSucceeds✓ 0x382f86bc…0f89 →
A transfer while pausedContractPaused✓ refused
Unpause transfersSucceeds✓ 0x0d9d2125…11a5 →
Mint 1 wei past the capSupplyCapExceeded✓ refused
Remove the holder from the blocklistSucceeds✓ 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