# ZenSats — Full Documentation > Complete machine-readable documentation for AI agents and crawlers. > Generated: 2026-06-18 > Canonical site: https://zensats.app > Fetch individual pages: https://zensats.app/docs/{page}.md (e.g. /docs/vault.md) > Curated index: https://zensats.app/llms.txt --- # ZenSats > ERC-4626 carry trade vaults on Ethereum mainnet. Deposit collateral (WBTC, wstETH), borrow stablecoins via LlamaLend, deploy to StakeDAO yield strategies, earn the spread. Fully permissionless rebalance and harvest. ## Start here (one fetch gets everything) - [llms-full.txt](https://zensats.app/llms-full.txt): Complete concatenated documentation — agent API reference, vault addresses, deposit/withdraw flows, and all doc pages in one file. **Fetch this first.** ## Documentation (plain markdown, no JavaScript required) - [Overview](https://zensats.app/docs.md): Protocol summary, active vs legacy vaults, how carry trades work - [Zenji Vault](https://zensats.app/docs/vault.md): ERC-4626 accounting, rebalancing, strategy/debt ratio, risk controls - [Loan Manager](https://zensats.app/docs/loan-manager.md): LlamaLend (active) and Aave V3 (legacy) borrowing - [Yield Strategy](https://zensats.app/docs/strategy.md): LlamaLend + StakeDAO crvUSD/USDT flow and legacy pmUSD strategy - [Governance](https://zensats.app/docs/governance.md): Roles, timelock scope, emergency authority, hard caps - [Risks](https://zensats.app/docs/risks.md): Risk disclosure — smart contract, liquidation, protocol, market risks - [Contracts](https://zensats.app/docs/contracts.md): All vault addresses, oracles, external protocol integrations ## Agent API - [Agent API reference](https://zensats.app/docs/agent-api.md): Deposit/withdraw/harvest/rebalance flows, on-chain view functions, all API endpoints - [GET /api/agent/vaults](https://zensats.app/api/agent/vaults): Live TVL, APR, share prices, contract addresses, deposit/withdraw instructions ## Strategy economics (active LlamaLend vaults) - [GET /api/llamalend?controller=0x...](https://zensats.app/api/llamalend): LlamaLend crvUSD borrow APY history - [GET /api/stakedao-apr?gauge=0x...](https://zensats.app/api/stakedao-apr): Live StakeDAO yield APR Implied carry ≈ `LTV × (yield APR − borrow APY)`. Default vault slug: `wbtc-llamalend`. ## Active vaults (open for deposits) - [WBTC LlamaLend vault](https://zensats.app/vault/wbtc-llamalend): `0x18E2F4F2E6565187fce73ECC707579E5F7933f74` — WBTC collateral, crvUSD debt, StakeDAO crvUSD/USDT LP - [wstETH LlamaLend vault](https://zensats.app/vault/wsteth-llamalend): `0x23F189dE34EED95f6303CfF1C77f7676F211Dd2c` — wstETH collateral, same strategy ## Legacy vaults (withdraw-only) - [WBTC pmUSD legacy](https://zensats.app/vault/wbtc-pmusd): `0x617A6877f0a55D1eF2B64b5861A2bB5Fe6FEB739` - [wstETH pmUSD legacy](https://zensats.app/vault/wsteth-pmusd): `0xbaEc8343B610A5ee7Ca2c5b93507AC7def98E2B1` - [XAUT pmUSD legacy](https://zensats.app/vault/xaut-pmusd): `0x7d5281D590Fb0647aDc7d8494a2c8Fb8C2B23cBD` ## Optional - [Human docs (HTML, SSR)](https://zensats.app/docs): Same content with navigation chrome — also curl-fetchable, but markdown URLs above are lower-noise for LLMs - [GitHub contracts](https://github.com/NateBrune/ZenSats-contracts): Source code and ABIs - [DeFi app](https://zensats.app/menu): Vault picker (requires JavaScript) --- # Documentation Pages --- # Agent API & On-Chain Reference > Operational reference for AI agents integrating with ZenSats vaults. Network: Ethereum Mainnet (chainId 1). ## Quick Start 1. `GET https://zensats.app/api/agent/vaults` — vaults with live state and deposit instructions 2. For LlamaLend vaults, also fetch `/api/llamalend` and `/api/stakedao-apr` for implied carry 3. Read on-chain state via contract view functions below Default vault slug: `wbtc-llamalend` ## Deposit Prerequisites: hold the vault deposit asset (WBTC 8 decimals, wstETH 18 decimals) on mainnet. 1. `maxDeposit(address)` on vault — 0 means paused 2. `approve(vaultAddress, amount)` on deposit asset ERC-20 3. `deposit(uint256 assets, address receiver)` on vault → returns shares minted Preview: `previewDeposit(uint256 assets) → uint256 shares` Alternative: `mint(uint256 shares, address receiver) → uint256 assetsUsed` ## Withdraw **Redeem (recommended):** `redeem(uint256 shares, address receiver, address owner) → uint256 assets` **Withdraw by amount:** `withdraw(uint256 assets, address receiver, address owner) → uint256 sharesBurned` Check limits: `maxWithdraw(owner)`, `maxRedeem(owner)` ## Harvest `harvestYield()` on vault — permissionless, no args. Claims strategy rewards, compounds into vault PPS. ## Rebalance `rebalance()` on vault when LTV outside deadband. Check `isRebalanceNeeded(vault)` on ViewHelper first. Bounty: `rebalanceBountyRate()` (1e18 precision). Paid in debt asset when `feeRate() > 0`. ## Strategy / Debt Ratio - `strategyToDebtRatio()` — 1e18 precision (÷ 1e16 for %; target 100%) - `DEADBAND_SPREAD()` — allowed drift band - History: `GET /api/vault/:address/history?interval=raw` ## Vault View Functions - `totalAssets()`, `totalSupply()`, `balanceOf(address)` - `convertToAssets(shares)`, `convertToShares(assets)` - `maxDeposit`, `maxWithdraw`, `maxRedeem` - `previewDeposit`, `previewRedeem` - `idle()`, `emergencyMode()`, `depositCap()`, `targetLtv()`, `feeRate()`, `MIN_DEPOSIT()` ## ViewHelper (pass vault address) - `getHealth(vault)`, `isRebalanceNeeded(vault)` - `getTotalCollateralValue(vault)`, `getUserValue(vault, user)` ## LoanManager - `getCurrentLTV()` (÷ 1e16 for %) - `getCurrentDebt()`, `getCurrentCollateral()` ## API Endpoints | Endpoint | Description | |----------|-------------| | `GET /api/agent/vaults` | All vaults + deposit instructions | | `GET /api/vault/:address/latest` | Latest snapshot | | `GET /api/vault/:address/history?interval=raw` | Historical snapshots | | `GET /api/vault/:address/profits?bucket=1h` | Profit time series | | `GET /api/vault/:address/holders` | Share holders | | `GET /api/llamalend?controller=0x...` | LlamaLend borrow APY | | `GET /api/stakedao-apr?gauge=0x...` | StakeDAO yield APR | | `GET /api/merkle/:strategyAddress` | StakeDAO merkle claims (legacy) | Use vault **contract address** in API paths, not slug. APR values in agent API are basis points (500 = 5%). ## Legacy Merkle Claims `GET /api/merkle/:strategyAddress` then `execute(bytes[] claimsData)` on `0x0f542fA75c871EB1b93Ef881b73e46acF733392f` ## ERC-4626 Fully compliant. Standard deposit/withdraw/mint/redeem — no custom integration needed for basic flows. --- # ZenSats Documentation > ZenSats is an ERC-4626 vault system that automates collateralized carry trades on Ethereum mainnet. Deposit collateral, borrow stablecoins, deploy to yield strategies, earn the spread. ## Two Forms of Collateral Accounting The vault tracks value in collateral units using two buckets: - **Direct collateral** — collateral token held in the vault and loan manager path. - **Debt-side value** — strategy and idle debt assets converted back to collateral-equivalent value via loan manager pricing. ## How It Works 1. **Deposit collateral** — receive ERC-4626 shares. 2. **Borrow debt asset** — vault posts collateral and borrows at target LTV. 3. **Deploy strategy** — active vaults: borrow crvUSD on LlamaLend → LP in Curve crvUSD/USDT → stake in StakeDAO. 4. **Permissionless upkeep** — anyone can call `rebalance()`, `harvestYield()`, `accrueYieldFees()`. 5. **Redeem shares** — withdraw/redeem returns collateral, unwinding positions when needed. ## Admin Model (Restricted Powers) - **Owner** — bounded params, idle mode, protocol fees, emergency unwind. Cannot swap loan manager or strategy. - **Gov** — swapper changes only, via 1-week timelock. Vault validates swapper output against oracle pricing. - **Emergency mode** — one-way latch; cannot be reversed. ## Current Live Vaults | Slug | Collateral | Loan manager | Status | |------|------------|--------------|--------| | `wbtc-llamalend` | WBTC | LlamaLend (crvUSD) | Active (testing) | | `wsteth-llamalend` | wstETH | LlamaLend (crvUSD) | Active (testing) | Implied carry ≈ `LTV × (StakeDAO yield APR − LlamaLend borrow APY)`. ## Legacy Vaults (withdraw-only) | Slug | Collateral | Loan manager | Status | |------|------------|--------------|--------| | `wbtc-pmusd` | WBTC | Aave V3 (USDT) | Legacy | | `wsteth-pmusd` | wstETH | Aave V3 (USDT) | Legacy | | `xaut-pmusd` | XAUT | Aave V3 (USDT) | Legacy | Legacy vaults return `maxDeposit() = 0`. Existing shareholders can withdraw. ## Related docs - [Zenji Vault](/docs/vault.md) — ERC-4626 accounting and controls - [Loan Manager](/docs/loan-manager.md) — Aave V3 and LlamaLend borrowing - [Yield Strategy](/docs/strategy.md) — LlamaLend + StakeDAO and legacy pmUSD flows - [Governance](/docs/governance.md) — roles, timelock, emergency authority - [Risks](/docs/risks.md) — risk disclosure - [Contracts](/docs/contracts.md) — addresses and integrations - [llms-full.txt](/llms-full.txt) — complete docs in one file --- # Zenji Vault > The core ERC-4626 vault contract. Handles share accounting, collateralized leverage, strategy deployment, and unwind logic for withdrawals. ## Core Components - **Zenji (ERC-4626)** — deposits, share mint/burn, fee accounting, rebalancing, emergency controls. - **Loan Manager** — collateral/debt position, health checks, collateral/debt conversion pricing. - **Yield Strategy** — deploys borrowed debt asset, reports strategy value, harvests rewards. ## Two Forms of Collateral Value `getTotalCollateral()` exposes value in collateral units from: 1. **Direct collateral inventory** — balances in vault + loan manager. 2. **Debt-side value** — strategy and idle debt assets converted to collateral-equivalent via loan manager pricing. Shares represent one unified collateral-denominated claim while the strategy side stays in debt-asset form. ## User-Facing Functions - `deposit(assets, receiver)` — deposit collateral, mint shares. - `mint(shares, receiver)` — mint exact shares. - `withdraw(assets, receiver, owner)` — withdraw exact collateral. - `redeem(shares, receiver, owner)` — burn shares for collateral. Withdrawals can partially or fully unwind debt/strategy positions depending on size and liquidity. ## Permissionless Maintenance - `rebalance()` — adjust LTV when outside deadband. - `harvestYield()` — claim and compound strategy rewards. - `accrueYieldFees()` — realize protocol fees from strategy profit deltas. ## Strategy Balance vs Debt Balance - `strategyToDebtRatio()` — ratio in 1e18 precision (÷ 1e16 for %; target ≈ 100%). - `DEADBAND_SPREAD()` — allowed drift band around 100% (same precision). - Historical ratio: `GET /api/vault/:address/history`. Pre-borrow snapshots (zero debt and strategy balance) produce extraneous values and are filtered in the UI. ## Bounded Parameters (Owner) | Parameter | Range | |-----------|-------| | Target LTV | 15% – 65% | | Fee rate | max 20% | | Rebalance bounty | max 50% | | Vault max slippage | max 10% | ## Risk Controls - Deadband rebalancing around target LTV - Oracle freshness checks on loan-manager pricing - Reentrancy protection on state-changing entry points - One-block action delay (anti same-block transfer/redeem bypass) - Emergency mode one-way latch with staged unwind Emergency mode is for controlled unwind and pro-rata exits — not a reversible pause switch. --- # Loan Manager > Pluggable component handling the borrowing side of the carry trade. Abstracts protocol-specific logic for loans, collateral, and health monitoring. ## Deployed Implementations - **Active vaults** (`wbtc-llamalend`, `wsteth-llamalend`) — **LlamaLend**, borrow **crvUSD**. - **Legacy vaults** (`wbtc-pmusd`, `wsteth-pmusd`, `xaut-pmusd`) — **Aave V3**, borrow **USDT**. ## ILoanManager Interface Key functions exposed to the vault: - `getCurrentLTV()` — current loan-to-value (1e18 precision, ÷ 1e16 for %) - `getCurrentDebt()` — outstanding debt in debt asset decimals - `getCurrentCollateral()` — collateral supplied - `getHealth()` — health factor (protocol-specific) - Borrow/repay/adjust collateral operations (vault-only) ## Aave V3 Loan Manager - Collateral supplied to Aave pool; USDT borrowed against it. - Standard over-collateralized loans with liquidation threshold. - Battle-tested; high liquidity. ## LlamaLend Loan Manager - Curve Finance lending with **soft liquidations** via LLAMMA. - Native crvUSD borrowing; capital-efficient bands-based liquidation. - Newer than Aave; LLAMMA mechanism is complex. **Soft liquidation** (LlamaLend): gradual collateral→debt conversion across price bands vs Aave's instant liquidation. ## Health and Rebalancing ViewHelper exposes `isRebalanceNeeded(vault)` when LTV drifts outside target ± `DEADBAND_SPREAD`. Anyone can call `rebalance()` on the vault to restore target LTV. --- # Yield Strategy > The strategy receives borrowed stablecoins and deploys them to earn yield. Profit is the spread between yield earned and borrow cost. ## Active Strategy (LlamaLend + StakeDAO) Active vaults (`wbtc-llamalend`, `wsteth-llamalend`): 1. Borrow **crvUSD** from LlamaLend loan manager. 2. Provide liquidity in Curve **crvUSD/USDT** pool. 3. Stake LP in StakeDAO OnlyBoost gauge. 4. Harvest CRV → swap to crvUSD → compound. ### Strategy Economics ``` implied yield ≈ LTV × (StakeDAO yield APR − LlamaLend borrow APY) ``` - **Yield APR** — `GET /api/stakedao-apr?gauge={stakedaoGauge}` - **Borrow APY** — `GET /api/llamalend?controller={llamaLendController}` - **LTV** — `getCurrentLTV()` on loan manager (÷ 1e16 for %) While TVL is small, measured historical APR can be noisy. Stats page shows implied carry from live on-chain inputs for testing vaults. ## Legacy Strategy (Aave + RAAC pmUSD) Legacy vaults (`wbtc-pmusd`, `wsteth-pmusd`, `xaut-pmusd`) use `PmUsdCrvUsdStrategy` (withdraw-only): 1. Borrow USDT from Aave V3. 2. Swap USDT → crvUSD (Curve). 3. Add liquidity to RAAC pmUSD/crvUSD pool. 4. Stake LP in StakeDAO. 5. Harvest CRV → crvUSD → compound. ## Strategy Interface (Vault-Controlled) - `deposit(uint256)`, `withdraw(uint256)`, `withdrawAll()` - `harvest()`, `balanceOf()`, `pendingRewards()` - `emergencyWithdraw()` Only the vault can call strategy admin methods. ## Operational Notes - **Harvest** is permissionless at vault level via `harvestYield()`. - **Strategy value** is reported in debt-asset terms, converted to collateral-equivalent for vault accounting. - **Operator monitor** at `/monitor` — liquidity, health flags, idle/emergency controls. --- # Governance and Admin Scope > Role-based control with explicit limits. Admin keys can operate and protect the system but are intentionally constrained. ## Roles | Role | Can Do | Cannot Do | |------|--------|-----------| | **Owner** | Set bounded params, toggle idle, withdraw protocol fees, emergency steps, strategy slippage, 2-step owner transfer | Exceed hard caps; disable emergency once enabled; swap loan manager/strategy; rescue collateral/debt via generic rescue | | **Gov** | Propose/execute/cancel swapper change via timelock; 2-step gov transfer | Move user funds; bypass timelock | | **Public** | `rebalance()`, `harvestYield()`, `accrueYieldFees()` | Change config/roles; privileged emergency actions | ## Timelock - **Scope today**: swapper changes only. - **Delay**: 1 week (`TIMELOCK_DELAY`). - **Flow**: `proposeSwapper()` → wait → `executeSwapper()` or `cancelSwapper()`. ## Hard Limits in Code ``` MIN_TARGET_LTV = 15% MAX_TARGET_LTV = 65% MAX_FEE_RATE = 20% MAX_REBALANCE_BOUNTY = 50% MAX_VAULT_SLIPPAGE = 10% TIMELOCK_DELAY = 1 week ``` ## Emergency Authority - `enterEmergencyMode()` — one-way latch. - `emergencyStep(step)` — staged unwind. - `emergencySkipStep(step)` — mark blocked steps resolved if external dependency fails. - `rescueAssets(token, recipient)` — cannot rescue collateral or debt asset. ## Role Transfers `transferRole(role, to)` → pending holder calls `acceptRole(role)`. Two-step to reduce accidental handoff risk. --- # Risks > **All DeFi protocols involve significant risk of loss.** ZenSats is experimental software interacting with multiple external protocols. You could lose all deposited funds. ## Smart Contract Risk Bugs or exploits in Zenji vault, loan managers (Aave, LlamaLend), yield strategies, swappers, view helpers, or trackers could cause partial or total loss. Contracts are open source and use OpenZeppelin libraries but have **not** undergone a formal third-party audit. ## Liquidation Risk Collateral price drops increase LTV. If LTV exceeds the lending protocol's liquidation threshold, positions can be liquidated at a penalty. LlamaLend uses soft liquidation (gradual); Aave uses instant liquidation. ## Third-Party Protocol Risk ### LlamaLend (active vaults) - LLAMMA failure in extreme volatility - Oracle failures affecting liquidation bands - crvUSD minting exploit / insolvency - Newer, less battle-tested than Aave ### Aave V3 (legacy vaults) - Pool exploit, oracle manipulation, bad debt, governance attack - Billions in TVL; years of operation, but past safety ≠ future safety ### StakeDAO / crvUSD-USDT LP (active vaults) - Gauge or locker exploit - CRV emission cuts reducing yield below borrow cost - Pool imbalance increasing withdrawal cost - crvUSD or USDT de-peg → impermanent loss ### RAAC / pmUSD (legacy vaults) - pmUSD peg loss or illiquidity - Newer asset with less history than established stablecoins ### Curve Finance - Pool imbalance, smart contract exploit (e.g. 2023 vyper compiler incident) - Active vaults: crvUSD/USDT LP. Legacy: USDT ↔ crvUSD swaps. ## Market Risk (Negative Spread) Carry trade profit = strategy yield − borrow cost. If borrow rates spike or strategy yields drop, spread goes negative. Examples: - LlamaLend crvUSD borrow APY jumps on high utilization - crvUSD/USDT pool returns decline from lower CRV emissions - Frequent rebalancing slippage during volatility If borrow cost is 10% and strategy earns 8%, leveraged position loses ~2% APR (before fees). ## Collateral / Peg Risk - **WBTC** — BitGo custody risk - **wstETH** — Lido smart contract risk - **XAUT** — Tether Gold custody - **crvUSD, USDT** — stablecoin de-peg risk ## Operational Risk - Chainlink keeper downtime delays rebalance/harvest - Gas spikes make upkeep uneconomic - Frontend/API errors do not affect on-chain funds but may mislead users ## Mitigation (Not Elimination) - Bounded on-chain parameters - Timelocked swapper governance - Emergency mode staged unwind - Immutable loan manager/strategy per vault deployment - Permissionless `rebalance()` and `harvestYield()` **Use at your own risk. Read contract addresses on Etherscan before depositing.** --- # Contracts & Addresses > All contracts on **Ethereum Mainnet (chainId 1)**. Verify on Etherscan before interacting. ## Active Vaults ### wbtc-llamalend (WBTC crvUSD/USDT StakeDAO) | Contract | Address | |----------|---------| | Zenji Vault | `0x18E2F4F2E6565187fce73ECC707579E5F7933f74` | | LlamaLend Loan Manager | `0x45dE3acb04C571136790f07eA114E922346d13d5` | | Strategy (CrvUsdUsdtStakedao) | `0x596fE8c8a61446AE2c5703fdC31b8F63390626E4` | | ViewHelper | `0x0b5DF73C0C56Df124694d63F21935E06EFD12255` | | Rebalance Keeper | `0x1D25FDABdB77f04D992D4972290dbE4760BC3634` | | WBTC Oracle | `0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c` | | LlamaLend Controller | `0x4e59541306910aD6dC1daC0AC9dFB29bD9F15c67` | | StakeDAO Gauge | `0x4e6bB6B7447B7B2Aa268C16AB87F4Bb48BF57939` | Collateral: WBTC `0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599` (8 decimals) Debt: crvUSD `0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E` (18 decimals) ### wsteth-llamalend (wstETH crvUSD/USDT StakeDAO) | Contract | Address | |----------|---------| | Zenji Vault | `0x23F189dE34EED95f6303CfF1C77f7676F211Dd2c` | | LlamaLend Loan Manager | `0xCf9f54218666a32BE9da1d60BC81412BA86730C7` | | Strategy (CrvUsdUsdtStakedao) | `0x8bD4d875E2Cf1174e282B532Fa534b6633F59B5f` | | ViewHelper | `0x80216B4DA05B5B29011C29fbB8C15A47E52A23E3` | | Rebalance Keeper | `0xb76CD1a7d8d3033aC519b0add5309B3403c7C031` | | wstETH Oracle | `0xDC88A9052F1352094C749b04627Fe04551e689eC` | | LlamaLend Controller | `0x100dAa78fC509Db39Ef7D04DE0c1ABD299f4C6CE` | | StakeDAO Gauge | `0x4e6bB6B7447B7B2Aa268C16AB87F4Bb48BF57939` | Collateral: wstETH `0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0` (18 decimals) Debt: crvUSD `0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E` (18 decimals) ## Legacy Vaults (withdraw-only) ### wbtc-pmusd | Contract | Address | |----------|---------| | Zenji Vault | `0x617A6877f0a55D1eF2B64b5861A2bB5Fe6FEB739` | | Aave Loan Manager | `0x25a1b8262f9644F00Fc80F11eF8cc2Ea1b74BDE3` | | Strategy (PmUsdCrvUsd) | `0x73B753F63175F003881Dc39710d40c8E2F027FD8` | | ViewHelper | `0x0aDC622F11D8fA2F3E4709D037e95010a651471A` | ### wsteth-pmusd | Contract | Address | |----------|---------| | Zenji Vault | `0xbaEc8343B610A5ee7Ca2c5b93507AC7def98E2B1` | | Aave Loan Manager | `0x10a0Cec186B5B5365E9D8b671cE423b4eCbDeeCc` | | Strategy (PmUsdCrvUsd) | `0x48c166Ad4E0fa3B344fb7efb93Fdee4bf7d9e861` | | ViewHelper | `0xc99e21f05722230E7B5A26f9De1Db415080c872E` | ### xaut-pmusd | Contract | Address | |----------|---------| | Zenji Vault | `0x7d5281D590Fb0647aDc7d8494a2c8Fb8C2B23cBD` | | Aave Loan Manager | `0x55aE1060c67eB78E6f655dfcDE4386bbB063bEB5` | | Strategy (PmUsdCrvUsd) | `0xE2B44aE759446eF4C0151A2669122b4794Aee7C0` | | ViewHelper | `0x40c2D606Ce9E060Bef7374951BaE4Ca6906517BD` | ## Shared External Protocols | Protocol | Address | Used by | |----------|---------|---------| | Aave V3 Pool | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | Legacy vaults | | Curve crvUSD/USDT Pool | `0x390f3595bCa2Df7d23783dFd126427CCeb997BF4` | Active vaults | | Curve pmUSD/crvUSD Pool | `0xEcb0F0d68C19BdAaDAEbE24f6752A4Db34e2c2cb` | Legacy vaults | | pmUSD Token | `0xC0c17dD08263C16f6b64E772fB9B723Bf1344DdF` | Legacy vaults | | StakeDAO Reward Vault | `0x7d3CDe9cCf0109423E672c17bD36481CF8CE437D` | Legacy vaults | | Merkle Executor | `0x0f542fA75c871EB1b93Ef881b73e46acF733392f` | Legacy merkle claims | ## ABIs Available in frontend source: `src/lib/contracts/config.ts` and [GitHub](https://github.com/NateBrune/ZenSats-contracts). ## Security - ✓ Verified on Etherscan - ✓ Open source - ✓ OpenZeppelin libraries - ⚠️ No formal third-party audit