Verifying Locks
Learn how to verify locked liquidity on-chain and display proof to your community.
Overview
This guide covers:
Checking if liquidity is locked
Verifying lock details on-chain
Using block explorers
Displaying locks on your website
Why Verify Locks?
For Projects
Build Trust: Show community you're committed
Marketing: Display locked liquidity prominently
Transparency: Prove anti-rug measures
Competitive Advantage: Stand out from scams
For Users/Investors
Due Diligence: Check before investing
Safety Score: Higher locked liquidity = safer
Verify Claims: Don't trust, verify
Exit Scam Protection: Confirm liquidity can't be rugged
Method 1: Using Clavis Web App
Step 1: Get Lock Info
If you know the lock owner address:
Go to https://app.realsafe.io
Click "Search" or "Verify" in navigation
Enter wallet address or Lock ID
Click "Search"
Search for locks by address or Lock ID
Step 2: View Lock Details
You'll see:
Lock ID: Unique identifier
Owner: Who owns the lock
Token Pair: Which tokens are locked (V3) or LP token (V2)
Amount: How much liquidity is locked
Unlock Date: When it can be unlocked
Status: Active/Unlocked
Condition: Any custom unlock conditions
Search results showing multiple locks
Detailed view of a specific lock
Step 3: Verify On-Chain
Click "View on Explorer" to see:
Transaction that created lock
Smart contract interactions
All details verified on-chain
Method 2: Using Block Explorers
Monad Testnet
Locker Contracts:
V3 Locker:
0x2D0dFc5a6731315D8f911E8534746D89B7472175V2 Locker:
0xe373C89A77dE728D50c7372C8Fe139B292a7DFE2
Steps:
Go to https://testnet-explorer.monad.xyz
Search for locker contract address
Click "Read Contract" tab
Use view functions:
getOwnerLockIds(address)- Get all locks for addressgetLock(uint256)- Get specific lock detailscanUnlock(uint256)- Check if unlockable
Locker contract on Monad Explorer
Read Contract functions
Results from calling getLock function
Method 3: Using Smart Contract Calls
Reading Lock Data
Get all locks for an address:
uint256[] memory lockIds = locker.getOwnerLockIds(ownerAddress);Get specific lock details:
Lock memory lock = locker.getLock(lockId);Check if can unlock:
bool unlockable = locker.canUnlock(lockId);Using cast (Command Line)
Get owner's locks:
cast call 0x0b4619Ed28429a392C79aed87E6572F34ab6199e \
"getOwnerLockIds(address)" \
0xYourAddress \
--rpc-url https://testnet-rpc.monad.xyzGet lock details:
cast call 0x0b4619Ed28429a392C79aed87E6572F34ab6199e \
"getLock(uint256)" \
1 \
--rpc-url https://testnet-rpc.monad.xyzInterpreting Lock Data
Lock Structure (V3)
struct Lock {
uint256 lockId; // Unique ID
uint256 nftId; // NFT token ID
address owner; // Current owner
address pendingOwner; // Pending transfer
address pool; // Pool address
address token0; // First token
address token1; // Second token
uint128 liquidity; // Liquidity amount
uint256 unlockDate; // Unlock timestamp
address collectAddress; // Fee recipient
bool isActive; // Is active
address condition; // Condition contract
}Key Fields to Check
isActive:
true: Lock is active, liquidity still lockedfalse: Lock has been unlocked
unlockDate:
Unix timestamp
Convert to date: https://www.unixtimestamp.com/
Must be >= current time to be locked
liquidity:
Amount of liquidity locked
V3: liquidity units
V2: number of LP tokens
condition:
0x0000...: No condition, time-based onlyOther address: Custom condition set
Visual guide to understanding lock struct data
Displaying Locks on Your Website
Option 1: Embed Widget (Coming Soon)
<iframe
src="https://app.realsafe.io/embed/ADDRESS"
width="400"
height="600"
frameborder="0">
</iframe>Example embedded widget on a website
Option 2: Query Via API
GraphQL endpoint:
https://api.thegraph.com/subgraphs/name/clavis/lockerExample query:
query {
locks(where: { owner: "0xYourAddress" }) {
id
tokenId
owner
unlockDate
isActive
pool {
token0 {
symbol
}
token1 {
symbol
}
}
}
}GraphQL query in action
Option 3: Custom Integration
Using ethers.js:
const provider = new ethers.providers.JsonRpcProvider(RPC_URL);
const locker = new ethers.Contract(LOCKER_ADDRESS, ABI, provider);
// Get locks
const lockIds = await locker.getOwnerLockIds(ADDRESS);
// Get details
for (const lockId of lockIds) {
const lock = await locker.getLock(lockId);
console.log(`Lock ${lockId}:`, lock);
}Verification Checklist
When verifying a project's locked liquidity:
Visual verification checklist
Basic Checks
Advanced Checks
Red Flags
Sharing Proof of Lock
Create Shareable Link
Go to lock details page
Click "Share" button
Copy link:
https://app.realsafe.io/lock/LOCK_IDShare on social media
Share your lock proof easily
Generate Proof Image
Lock details page
Click "Generate Proof"
Download image with lock details
Share image on X
Example proof badge for social sharing
Create Badge for Website
<a href="https://app.realsafe.io/lock/123">
<img src="https://app.realsafe.io/badge/123"
alt="Liquidity Locked" />
</a>Badge displayed on project website
Common Verification Questions
"How do I know it's real?"
Check on block explorer (Monad Explorer)
Verify contract is official Clavis contract
Check transaction history
All data is on-chain, cannot be faked
"Can the team unlock early?"
No, if unlock date hasn't passed
Smart contract enforces unlock time
No admin backdoor exists
Even contract owner cannot unlock early
"What if lock shows 'inactive'?"
Lock was already unlocked
Liquidity no longer locked
Check unlock date and current date
May have been unlocked legitimately
"Multiple locks vs single lock?"
Both are fine:
Single large lock: Simple, clear
Multiple staggered locks: Vesting schedule, progressive unlocks
Check total locked amount across all locks
Next Steps
Locking Guide - Lock your own liquidity
FAQ - More questions answered
Developer Docs - Build verification tools
Questions? Reach out on X
Last updated
