The verified-flow liquidity layer for institutional DeFi.
PROVE ELIGIBILITY · TRADE PRIVATELY · GET A BETTER DEAL ON UNISWAP V4
Live Base Sepolia evidence
These v0.3.3 transactions show Safe-controlled ownership, credential issuance, bounded liquidity and swap execution, plus an expected rejection for an uncredentialed wallet. This is an unaudited MockEAS testnet demo, not a production deployment.
Customers
ILAL is not another whitelist UI. It is an execution layer for regulated flow: private eligibility, lower cost per trade, and an on-chain route that market makers can integrate into existing systems.
Prove eligibility once, hold a CNF, then sign short-lived sessions locally. Compliance status is binary; identity and KYC documents never touch the pool.
Integrate the ILALRouter into internal trading infrastructure. Valid sessions unlock a lower LP fee path while rejected wallets never reach execution.
Deploy your own CNFIssuer, bind a pool policy, and manage eligible wallets through EAS or ZK roots. Your credential controls your pool.
Product suite
Uniswap v4 hook that enforces CNF validity, pool policy, router binding, action binding, deadline, signature, and nonce replay protection.
Soulbound ERC-721 compliance credential with EAS or ZK issuance, timelocked root/verifier updates, revocation, expiry, and on-chain issuer metadata.
User-facing Uniswap v4 IUnlockCallback router. Current source supports bounded swap output, LP maximum spends, LP minimum receipts, and fees on actual consumed input.
Local v0.3.3 candidate for proof, CNF, sessions, liquidity, swaps, encrypted keystores, RPC-managed accounts, and Safe proposals. npm 0.3.2 is deprecated.
git clone github.com/rpnny/ilal
188 Solidity tests plus an expanded CLI suite above the 19-test baseline, 256 fuzz runs, archived chain evidence, and regression coverage for signer, Safe, ERC-1271, policy, expiry, fees, and amount bounds.
The problem
Centralized exchange → defeats the purpose of on-chain settlement. You don't own the liquidity.
No restrictions → non-compliant wallets can interact. Regulators say no.
Fragmented liquidity, high dev cost, every RWA issuer reinvents the same wheel.
Institutions and market makers leak identity. Competitive positions exposed publicly.
ILAL's answer
Users prove eligibility through an issuer attestation or a privacy-preserving ZK proof. A soulbound credential mints once. A Uniswap v4 hook verifies on every swap. Verified flow becomes a liquidity signal and gets 0.05% LP fee. The hook enforces everything — no hosted API, no custody, no KYC leak. Old KYC hooks decide who can pass; ILAL decides who can pass and gives that flow a better deal.
How it works
The public demo uses a MockEAS attestation. ZK-enabled issuers can instead run the Groth16 circuit locally and prove Merkle membership without revealing the full eligibility record.
The issuer's configured EAS or ZK trust path is checked on-chain. If valid, a soulbound ERC-721 credential mints to the wallet. One credential, valid for 90 days. No re-KYC needed for every trade.
Before each trade, sign a 10-minute EIP-712 SessionToken locally. It binds caller identity, the specific pool, the router address, and a one-time nonce — all without touching the chain.
The ComplianceHook runs six checks before every swap: session signature, deadline, caller binding, pool policy match, CNF validity, and one-time nonce. Pass all six → LP fee drops to 0.05%. Fail any → revert.
For RWA issuers
Each RWA issuer deploys their own CNFIssuer with their own schemaUID.
The pool policy binds to that specific issuer and credential type.
Other issuers' credentials cannot enter your pool. Full isolation, composable with any Uniswap v4 pool.
# Deploy CNFIssuer + ComplianceHook + ILALRouter + pool
forge script script/DeployDemo.s.sol \
--rpc-url https://sepolia.base.org \
--broadcast
# Operator queues the updated Merkle root, then activates after timelock
node dist/index.js oracle propose-root --root <newMerkleRoot>
node dist/index.js oracle activate-root
# Bind proofs to this issuer and schema (72h timelock)
node dist/index.js credential zk-root --wallet <wallet> --expires-at <unix> --issuer <cnfIssuer>
node dist/index.js oracle propose-domain --issuer-hash <issuerHash> --schema-hash <schemaHash>
node dist/index.js oracle activate-domain
# Set pool policy to require your credential type
node dist/index.js pool policy set \
--pool-id 0xYourPoolId \
--issuer 0xYourCNFIssuer
Integration
git clone https://github.com/rpnny/ilal
cd ilal/cli && npm ci && npm run build
node dist/index.js init
node dist/index.js --version # 0.3.3
# Public testnet prototype.
# Production use requires audited contracts
# and a real KYC/KYB attester.
ilal credential status \
--wallet 0xYourInstitutionWallet
# Output:
# credential: none
# Path A: generate ZK proof
# Path B: mint from EAS attestation
ilal credential zk-root \
--wallet 0xYourInstitutionWallet \
--expires-at 1800000000
ilal --keystore ./wallet.json credential prove \
--wallet 0xYourInstitutionWallet \
--expires-at 1800000000
# Output:
# ✓ Proof generated & verified locally
# mintWithProof()
# active root and proof expiry match
ilal --keystore ./wallet.json session sign \
--pool 0xYourPoolId \
--action swap \
--hook 0x9B894a...59CA80 \
--caller 0x2ccd39...ef99A77
# Output:
# ✓ Session signed locally
# hookData ready
# gas spent: 0
ilal --keystore ./wallet.json swap \
--amount-in 1 \
--token-in 0xToken \
--min-amount-out <quotedMinRaw>
# Output:
# ✓ Allowance ok
# ✓ Session signed (expires in 600s)
# ✓ Gate checks ready
# LP fee: 0.05%
# ILAL fee: 0.005%
Full CLI reference
ilal status | Dashboard: credential · issuer config · pool policy |
ilal credential status | Check whether a wallet holds a valid CNF credential |
ilal credential zk-root | Compute the ZK Merkle root for a wallet and expiry |
ilal credential prove | Trader flow: local ZK proof → mint or renew CNF |
ilal swap | Compliant swap via ILALRouter with a required slippage floor |
ilal oracle | Timelocked root, verifier, and proof-domain updates |
ilal pool add-liquidity | Add liquidity with maximum token spend bounds |
ilal pool remove-liquidity | Remove liquidity with minimum token receive bounds |
ilal pool policy set | Register compliance policy for a pool |
ilal session sign | Sign a standalone SessionToken |
ilal policy proof generate | Generate and locally verify a private V2 eligibility proof |
ilal policy grant activate | Cache a short-lived pool grant after on-chain proof verification |
ilal deploy --admin 0xSafe | Deploy an issuer-owned stack with custom EAS trust domain |
Active · Base Sepolia v0.3.3
0x57d6fa…1aA9aEF ↗
PolicyRegistry
Per-pool compliance policy registry
0xB93fcF…ce47f52 ↗
ComplianceHook
Uniswap v4 beforeSwap hook — 6 checks per swap
0x9B894a…59CA80 ↗
ILALRouter
IUnlockCallback execution channel
0x2ccd39…ef99A77 ↗
v0.3.3 deployment verification
Safe admin and treasury Safe 1.4.1 · threshold 1 ↗ MockEAS demo attester testnet trust source ↗ Pool policy registered enabled=true ↗ Demo tokens funded 1,000,000 TOKA/TOKB ↗ Real EAS credential mint mintWithEAS tx ↗ Real add liquidity router + hook tx ↗ Real verified swap 0.05% fee path ↗ Router bypass patched authorizedRouter bound ↗ Uncredentialed wallet rejected CredentialInvalid() revert ↗Pool
0x1a05b4…82d1ad
0x05E733…3408
Public candidate · V2 ZK policy grants
Base Sepolia PoC only. The proving key uses a development ceremony and the testnet admin remains an EOA.
0xD7E328…5864A80 ↗
PolicyGrantManagerV2
Groth16 verification and short-lived grant cache
0xb19121…47e43C11 ↗
PolicyRegistryV2
Issuer, KYC tier, jurisdiction and revision commitment
0x48eB31…7565325 ↗
ILALRouter V2
Bound execution with slippage and LP amount limits
0xcADfb9…00A3fD47 ↗
V2 public execution evidence
Groth16 policy grant activated revision 1 · verified on-chain ↗ V2 hook-gated liquidity added 362,275 gas ↗ V2 verified-flow swap 0.05% LP fee · 211,147 gas ↗V2 candidate pool
0x524f78…a104a4
public testnet PoC · unaudited