Contracts & Addresses
All ZenSats contracts are deployed on Ethereum Mainnet. Below you'll find addresses, descriptions, and links to verify contracts on Etherscan.
Verify Everything
Always verify contract addresses before interacting. All contracts are verified on Etherscan with publicly viewable source code. Never send funds to addresses you haven't personally verified.
ZenSats Core Contracts
Zenji Vault (ERC4626)
Main vault contract that accepts WBTC deposits and coordinates carry trade strategy
LlamaLendLoanManager
Loan manager for borrowing crvUSD via LlamaLend against WBTC
CrvUsdUsdtStakedaoStrategy
Borrow crvUSD via LlamaLend, LP in crvUSD/USDT pool, stake in StakeDAO
ZenjiViewHelper
Helper contract for complex view functions (health, LTV bounds, etc.)
VaultTracker
Tracks vault performance and calculates APR
RebalanceKeeper
Automation keeper for monitoring and triggering vault rebalances
CrvToCrvUsdSwapper
Swapper contract for CRV → crvUSD reward conversions
UniswapMixedCurveSwapper
Swapper contract for WBTC/crvUSD conversions via Uniswap + Curve
Asset Contracts
| Asset | Symbol | Type | Decimals | Address |
|---|---|---|---|---|
| Wrapped Bitcoin (WBTC) | WBTC | Collateral Asset | 8 | 0x2260...C599 |
| Curve USD (crvUSD) | crvUSD | Debt Asset | 18 | 0xf939...1b4E |
| crvUSD (Curve USD) | crvUSD | Yield Asset | 18 | 0xf939...1b4E |
Oracle Contracts
External Protocol Integrations
LlamaLend crvUSD Market
LlamaLend market controller for WBTC collateral / crvUSD borrowing
Curve crvUSD/USDT Pool
StableSwap-NG pool for crvUSD/USDT liquidity
StakeDAO Gauge
OnlyBoost gauge for crvUSD/USDT LP rewards
ABIs
All contract ABIs are available in the frontend codebase:Integration Examples
Reading Vault Data
import { readContract } from '@wagmi/core';
import { VAULT_ABI, VIEW_HELPER_ABI } from '$lib/contracts/config';
import { VAULTS } from '$lib/config/vaults';
const vault = VAULTS['wbtc-llamalend'];
// Get total assets
const totalAssets = await readContract(wagmiConfig, {
address: vault.vaultAddress,
abi: VAULT_ABI,
functionName: 'totalAssets'
});
// Get current LTV
const ltvBounds = await readContract(wagmiConfig, {
address: vault.viewHelperAddress,
abi: VIEW_HELPER_ABI,
functionName: 'getLtvBounds',
args: [vault.vaultAddress]
});Depositing Collateral
import { writeContract, waitForTransactionReceipt } from '@wagmi/core';
import { VAULTS } from '$lib/config/vaults';
const vault = VAULTS['wbtc-llamalend']; // or any vault slug
// 1. Approve vault to spend collateral
const approveHash = await writeContract(wagmiConfig, {
address: vault.asset.address,
abi: ERC20_ABI,
functionName: 'approve',
args: [vault.vaultAddress, amountToDeposit]
});
await waitForTransactionReceipt(wagmiConfig, { hash: approveHash });
// 2. Deposit collateral
const depositHash = await writeContract(wagmiConfig, {
address: vault.vaultAddress,
abi: VAULT_ABI,
functionName: 'deposit',
args: [amountToDeposit, userAddress]
});
await waitForTransactionReceipt(wagmiConfig, { hash: depositHash });Monitoring Events
import { VAULTS } from '$lib/config/vaults';
const vault = VAULTS['wbtc-llamalend'];
// Listen for deposits
publicClient.watchContractEvent({
address: vault.vaultAddress,
abi: VAULT_ABI,
eventName: 'Deposit',
onLogs: (logs) => {
logs.forEach((log) => {
console.log('Deposit:', {
sender: log.args.sender,
owner: log.args.owner,
assets: log.args.assets,
shares: log.args.shares
});
});
}
});
// Listen for governance changes
publicClient.watchContractEvent({
address: vault.vaultAddress,
abi: VAULT_ABI,
eventName: 'StrategyChangeProposed',
onLogs: (logs) => {
console.warn('Strategy change proposed!', logs);
}
});Useful Links
View vault's DeFi positions and holdings
View transactions and contract code
Review source code and contracts
Choose a vault and get started
Security
Security Status
- ✓ All contracts are verified on Etherscan with public source code
- ✓ Open source and available for community review
- ✓ Uses OpenZeppelin battle-tested libraries
- ⚠️ Not yet formally audited by a third-party security firm
A formal security audit has not yet been completed. Use at your own risk.