Contracts & Addresses

All ZenSats contracts are deployed on Ethereum Mainnet. Below you'll find addresses, descriptions, and links to verify contracts on Etherscan.

Status: Active (testing) · Strategy: CrvUsdUsdtStakedaoStrategy

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

0x18E2F4F2E6565187fce73ECC707579E5F7933f74
Etherscan

LlamaLendLoanManager

Loan manager for borrowing crvUSD via LlamaLend against WBTC

0x45dE3acb04C571136790f07eA114E922346d13d5
Etherscan

CrvUsdUsdtStakedaoStrategy

Borrow crvUSD via LlamaLend, LP in crvUSD/USDT pool, stake in StakeDAO

0x596fE8c8a61446AE2c5703fdC31b8F63390626E4
Etherscan

ZenjiViewHelper

Helper contract for complex view functions (health, LTV bounds, etc.)

0x0b5DF73C0C56Df124694d63F21935E06EFD12255
Etherscan

VaultTracker

Tracks vault performance and calculates APR

0x0000000000000000000000000000000000000000
Etherscan

RebalanceKeeper

Automation keeper for monitoring and triggering vault rebalances

0x1D25FDABdB77f04D992D4972290dbE4760BC3634
Etherscan

CrvToCrvUsdSwapper

Swapper contract for CRV → crvUSD reward conversions

0x7F29a7a645b62EFb81F838Bcb118beE0c2d0F3b1
Etherscan

UniswapMixedCurveSwapper

Swapper contract for WBTC/crvUSD conversions via Uniswap + Curve

0x4F095C3Ed5edF2Cf061B73CCBa3C5F8889FAd3B6
Etherscan

Asset Contracts

AssetSymbolTypeDecimalsAddress
Wrapped Bitcoin (WBTC)WBTCCollateral Asset80x2260...C599
Curve USD (crvUSD)crvUSDDebt Asset180xf939...1b4E
crvUSD (Curve USD)crvUSDYield Asset180xf939...1b4E

Oracle Contracts

WBTC/USD Oracle
WBTC price oracle (8 decimals)
0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c
View

External Protocol Integrations

LlamaLend crvUSD Market

LlamaLend market controller for WBTC collateral / crvUSD borrowing

0x4e59541306910aD6dC1daC0AC9dFB29bD9F15c67

Curve crvUSD/USDT Pool

StableSwap-NG pool for crvUSD/USDT liquidity

0x390f3595bCa2Df7d23783dFd126427CCeb997BF4

StakeDAO Gauge

OnlyBoost gauge for crvUSD/USDT LP rewards

0x4e6bB6B7447B7B2Aa268C16AB87F4Bb48BF57939

ABIs

All contract ABIs are available in the frontend codebase:
VAULT_ABI - Zenji ERC4626 vault
LOAN_MANAGER_ABI - ILoanManager interface
YIELD_STRATEGY_ABI - IYieldStrategy interface
VIEW_HELPER_ABI - ZenjiViewHelper
VAULT_TRACKER_ABI - VaultTracker
CHAINLINK_ABI - Chainlink price feed

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

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.

Next Steps

- Launch the app to get started - Review Risks before depositing - Read Zenji Vault for technical details - Understand Governance controls