Contracts & Addresses

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

Strategy: PmUsdCrvUsdStrategy

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

0x617A6877f0a55D1eF2B64b5861A2bB5Fe6FEB739
Etherscan

AaveLoanManager

Loan manager for borrowing USDT via Aave V3

0x25a1b8262f9644F00Fc80F11eF8cc2Ea1b74BDE3
Etherscan

PmUsdCrvUsdStrategy

Yield strategy that provides pmUSD/crvUSD liquidity and compounds CRV rewards

0x73B753F63175F003881Dc39710d40c8E2F027FD8
Etherscan

ZenjiViewHelper

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

0x0aDC622F11D8fA2F3E4709D037e95010a651471A
Etherscan

VaultTracker

Tracks vault performance and calculates APR

0x0000000000000000000000000000000000000000
Etherscan

RebalanceKeeper

Automation keeper for monitoring and triggering vault rebalances

0x4251213039444bd27E3f90AB67e3666BB857BCE6
Etherscan

CrvToCrvUsdSwapper

Swapper contract for CRV → crvUSD reward conversions

0xa44B08F6cdbCA7cB0db0366d32a5F130D0C24C6C
Etherscan

UniversalRouterV3Swapper

Swapper contract for USDT/WBTC/ETH conversions via Uniswap Universal Router V3

0xa870FCca88EC0B4Ee76A0bc28DF7B7BdAFe4cd77
Etherscan

Asset Contracts

AssetSymbolTypeDecimalsAddress
Wrapped Bitcoin (WBTC)WBTCCollateral Asset80x2260...C599
Tether USD (USDT)USDTDebt Asset60xdAC1...1ec7
crvUSD (Curve USD)crvUSDYield Asset180xf939...1b4E
pmUSDpmUSDStrategy Token180xC0c1...4DdF

Oracle Contracts

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

External Protocol Integrations

Aave V3 Pool

Lending pool for WBTC collateral and USDT borrowing

0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2

Curve USDT/crvUSD Pool

Two-pool for USDT ↔ crvUSD swaps in yield strategy

0x390f3595bCa2Df7d23783dFd126427CCeb997BF4

Curve pmUSD/crvUSD Pool

StableSwapNG pool for pmUSD/crvUSD liquidity

0xEcb0F0d68C19BdAaDAEbE24f6752A4Db34e2c2cb

pmUSD Token

pmUSD token contract used in the pmUSD/crvUSD pool

0xC0c17dD08263C16f6b64E772fB9B723Bf1344DdF

Stake DAO Reward Vault

Reward vault distributing CRV incentives

0x7d3CDe9cCf0109423E672c17bD36481CF8CE437D

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-pmusd'];

// 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-pmusd']; // 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-pmusd'];

// 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