Token and LP liquidity lock platform built on Stellar Soroban. Lock tokens or LP pool shares in an immutable on-chain contract, then share a public verifiable link so your community knows the liquidity can't be rugged.
- Token locks — lock any SEP-41 token until a chosen date, with optional linear vesting
- LP locks — lock Aquarius or Soroswap pool share tokens
- Public explorer — anyone can verify locks by token contract address
- Extend locks — creators can extend the unlock date, never shorten it
- Beneficiary model — creator and beneficiary can be different addresses (vesting, team grants)
- Freighter wallet integration
| Contract | Address |
|---|---|
| Token Locker | CBFCKEOQRQIXKLGU4QBUQVOINOKFBOXJ37LXEKLKNUO6TW4FNGDU26AW |
| LP Locker | CA3WYETNIF5IAF3VUNQ3SYKZFV45TOFBF7CEZ46I7QEBPWTRM73WLEI4 |
| Layer | Tech |
|---|---|
| Smart contracts | Rust / Soroban SDK 22 |
| Frontend | React 19, TypeScript, Vite, Tailwind CSS v4 |
| Wallet | Freighter via @stellar/freighter-api |
| RPC | Soroban Testnet RPC |
├── contracts/
│ ├── token-locker/ # SEP-41 token lock contract
│ ├── lp-locker/ # LP pool share lock contract
│ └── deploy.sh # Deploy both contracts to testnet
├── src/
│ ├── components/ # UI components
│ ├── hooks/ # useWallet, useLocks, useAsync
│ ├── lib/ # Contract bindings, RPC client
│ ├── pages/ # CreateLock, MyLocks, LockDetail, Explorer
│ └── types/ # Shared TypeScript types
pnpm install
pnpm devOpen http://localhost:5173.
pnpm buildRequires Rust and the Stellar CLI.
cd contracts
stellar contract buildCompiled WASMs land in contracts/target/wasm32v1-none/release/.
# Create and fund a testnet account
stellar keys generate myaccount --network testnet
stellar keys fund myaccount --network testnet
# Deploy both contracts
cd contracts
./deploy.sh myaccountPaste the printed contract IDs into src/lib/stellar.ts under CONTRACTS.
| Function | Description |
|---|---|
create_lock(creator, token, amount, beneficiary, unlock_at, vesting?) |
Lock tokens, returns lock id |
withdraw(id) |
Beneficiary withdraws after unlock |
extend(id, new_unlock_at) |
Creator extends unlock date |
get_lock(id) |
Fetch a single lock |
get_locks_by_creator(address) |
All locks created by address |
get_locks_by_beneficiary(address) |
All locks where address is beneficiary |
get_locks_by_token(token) |
All locks for a token (powers the explorer) |
Same shape as Token Locker, minus vesting, plus dex, token_a, token_b fields.
![]() |
![]() |
![]() |
![]() |
MIT




