Institutional-grade compliance layer for a regulated zk-validium blockchain built on Polygon CDK / zkSync-style stack.
Lunos implements token-scoped compliance enforcement entirely at the smart contract layer. No modifications to the EVM execution engine, zk circuits, sequencer, or prover are required.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Governance Multisig β
β (GovernanceExecutor) β
ββββββββ¬βββββββββββββββ¬βββββββββββββββββββ¬ββββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββ
β Jurisdiction β β Approved β β Compliance β
β Registry β β Attestors β β Registry β
β β β β β β
β jurisdiction β β attestor β β walletβjurisβcred β
β IDs (1=EUβ¦) β β whitelist β β + pending updates β
ββββββββββββββββ ββββββββββββββββ ββββββββββ¬βββββββββββ
β
βΌ
βββββββββββββββββββ
β Compliance β
β Manager β
β β
β validateTransferβ
β (view only) β
ββββββββββ¬βββββββββ
β
ββββββββββββββββββββββββββ€
β β
βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β RestrictedToken β β TokenTransfer β
β βββββ Matrix β
β ERC20 + complianceβ β β
β _update() hook β β fromβtoβallowed β
ββββββββββββββββββββ ββββββββββββββββββββ
β²
β
ββββββββββββββββββββ
β RestrictedToken β
β Factory β
β β
β deploys proxies β
ββββββββββββββββββββ
| Contract | Path | Responsibility |
|---|---|---|
| JurisdictionRegistry | contracts/core/ |
Canonical jurisdiction IDs (immutable once created) |
| ApprovedAttestors | contracts/core/ |
Whitelisted KYC provider addresses |
| ComplianceRegistry | contracts/core/ |
Wallet credentials with timelocked updates |
| ComplianceManager | contracts/core/ |
View-only transfer validation engine |
| Contract | Path | Responsibility |
|---|---|---|
| RestrictedToken | contracts/token/ |
ERC20 with compliance in _update() |
| TokenTransferMatrix | contracts/token/ |
Jurisdiction-to-jurisdiction compatibility |
| RestrictedTokenFactory | contracts/token/ |
Deploys new token + matrix proxy pairs |
| Contract | Path | Responsibility |
|---|---|---|
| GovernanceExecutor | contracts/governance/ |
Multisig execution wrapper for system calls |
| Contract | Path | Responsibility |
|---|---|---|
| DIDRegistry | contracts/did/ |
Optional decentralized identity anchor |
| FeeManager | contracts/fees/ |
Future fee routing (issuer, attestation, protocol) |
- Governance adds jurisdiction IDs via
JurisdictionRegistry.addJurisdiction() - Governance approves attestors via
ApprovedAttestors.addAttestor() - Attestor submits credential via
ComplianceRegistry.submitCredential() - Credential enters pending state:
effectiveBlock = block.number + globalCredentialDelay - After delay,
resolveCredential()activates the credential
When RestrictedToken.transfer() is called:
_update()is invoked (OpenZeppelin ERC20 hook)_enforceCompliance(from, to)executes before balance mutation- Pending credentials are resolved lazily via
ComplianceRegistry.resolveCredential() - Wallet jurisdictions are looked up from
walletJurisdictionmapping - Token checks both jurisdictions are in
acceptedJurisdictions ComplianceManager.validateTransfer()checks:- Credentials active
- Credentials not expired (
block.timestamp < expiry) - Credential levels β₯
requiredLevel - Jurisdictions registered
TokenTransferMatrix.matrixAllows()checks jurisdiction compatibility- If any check fails β
ComplianceCheckFailedevent + revert - If all pass β
super._update()executes the balance mutation
Hierarchical levels stored as uint8:
- 1 = Retail
- 2 = Accredited
- 3 = Institutional
Higher levels satisfy lower requirements (e.g., Institutional satisfies Accredited).
| Domain | Controller | Applies To |
|---|---|---|
| Global Delay | Governance | Credential issuance, updates, revocations |
| Token Delay | Issuer | Matrix updates, token-specific rules |
Resolution: effectiveBlock = block.number + delay
Pending updates activate lazily during reads.
User Transfer β RestrictedToken._update()
β
βββ ComplianceRegistry.resolveCredential(sender)
βββ ComplianceRegistry.resolveCredential(receiver)
βββ Check acceptedJurisdictions
βββ ComplianceManager.validateTransfer()
β βββ ComplianceRegistry.getCredential(sender)
β βββ ComplianceRegistry.getCredential(receiver)
β βββ Check active, expiry, level
β βββ JurisdictionRegistry.jurisdictionExists()
βββ TokenTransferMatrix.matrixAllows()
βββ super._update() [balance mutation]
- Compliance before mutation β All checks execute before
super._update() - Irreversible compliance β
complianceEnabledcannot be set to false - Timelock enforcement β All credential/matrix changes respect delays
- Attestor exclusivity β Only approved attestors issue credentials
- Expiry enforcement β Expired credentials always fail validation
- O(1) lookups β No loops, all checks via mapping lookups
- zk-compatible β No oracles, no async, deterministic execution only
contracts/
βββ core/
β βββ ComplianceManager.sol
β βββ ComplianceRegistry.sol
β βββ JurisdictionRegistry.sol
β βββ ApprovedAttestors.sol
βββ token/
β βββ RestrictedToken.sol
β βββ TokenTransferMatrix.sol
β βββ RestrictedTokenFactory.sol
βββ governance/
β βββ GovernanceExecutor.sol
βββ did/
β βββ DIDRegistry.sol
βββ fees/
β βββ FeeManager.sol
βββ interfaces/
βββ IComplianceManager.sol
βββ IComplianceRegistry.sol
βββ IJurisdictionRegistry.sol
βββ IRestrictedToken.sol
βββ IAttestor.sol
test/
βββ compliance/
β βββ ComplianceRegistry.t.sol
β βββ ComplianceManager.t.sol
βββ tokens/
βββ RestrictedToken.t.sol
βββ TokenTransferMatrix.t.sol
script/
βββ DeployCore.s.sol
βββ DeployToken.s.sol
audit/
βββ checklist.md
βββ invariants.md
βββ known-risks.md
forge install OpenZeppelin/openzeppelin-contracts-upgradeable
forge install foundry-rs/forge-stdforge buildforge test# Deploy core infrastructure
forge script script/DeployCore.s.sol --rpc-url <RPC_URL> --broadcast
# Deploy token infrastructure
forge script script/DeployToken.s.sol --rpc-url <RPC_URL> --broadcastEnterprise nodes should index these events for compliance monitoring:
| Event | Contract | Purpose |
|---|---|---|
CredentialScheduled |
ComplianceRegistry | New/updated credential pending |
CredentialActivated |
ComplianceRegistry | Credential became active |
CredentialRevoked |
ComplianceRegistry | Credential revocation scheduled |
MatrixUpdateScheduled |
TokenTransferMatrix | Matrix change pending |
MatrixUpdateActivated |
TokenTransferMatrix | Matrix change activated |
RestrictedTokenTransfer |
RestrictedToken | Compliant transfer completed |
ComplianceCheckFailed |
RestrictedToken | Transfer rejected |