Skip to main content

Deploy a vault

This guide walks through deploying a new CreatorOVault for a Zora Creator Coin.

Prerequisites:

  • Creator coin address on Base
  • Deployer wallet with ETH for gas
  • Familiarity with the token model

Overview

Deploying a vault creates the core infrastructure:

Deploy sequence:
1. CreatorOVault (ERC-4626)
2. CreatorOVaultWrapper
3. CreatorShareOFT (■TOKEN)
4. Configure relationships
5. Add strategies

Option 1: Factory deployment

Use CreatorVaultDeployer for a complete deployment:

CreatorVaultDeployer deployer = CreatorVaultDeployer(DEPLOYER_ADDRESS);

// Deploy all components
(address vault, address wrapper, address shareOFT) = deployer.deployVault(
creatorCoin, // TOKEN address
"Creator OVault - AKITA", // Vault name
"▢AKITA", // Vault symbol
"AKITA Shares", // OFT name
"■AKITA", // OFT symbol
owner // Owner address
);

This deploys:

  • CreatorOVault
  • CreatorOVaultWrapper
  • CreatorShareOFT (if registry available)

Option 2: Manual deployment

Step 1: Deploy vault

CreatorOVault vault = new CreatorOVault(
creatorCoin, // Underlying asset
owner, // Owner address
"Creator OVault - AKITA", // Name
"▢AKITA" // Symbol
);

Step 2: Deploy wrapper

CreatorOVaultWrapper wrapper = new CreatorOVaultWrapper(
creatorCoin, // TOKEN
address(vault), // Vault address
owner // Owner
);

Step 3: Deploy ShareOFT

CreatorShareOFT shareOFT = new CreatorShareOFT(
"AKITA Shares", // Name
"■AKITA", // Symbol
registry, // CreatorRegistry address
owner // Owner
);

Step 4: Configure relationships

// Set vault on wrapper
wrapper.setShareOFT(address(shareOFT));

// Set vault on ShareOFT
shareOFT.setVault(address(vault));

// Set minter permission
shareOFT.setMinter(address(wrapper), true);

// Set gauge controller
shareOFT.setGaugeController(gaugeController);

Configuration

Access control

// Set management (can manage strategies)
vault.setManagement(managementAddress);

// Set keeper (can deploy/report)
vault.setKeeper(keeperAddress);

// Set emergency admin
vault.setEmergencyAdmin(emergencyAddress);

Strategy setup

// Add yield strategies
vault.addStrategy(charmStrategy, 6900); // 69%
vault.addStrategy(ajnaStrategy, 2139); // 21.39%

// Set idle buffer
vault.setMinimumTotalIdle(4_805_000e18); // 9.61%

Fee configuration

// Set performance fee (default 10%)
vault.setPerformanceFee(1000);

// Set fee recipient
vault.setPerformanceFeeRecipient(feeRecipient);

DEX registration

// Register trading venues for fee detection
shareOFT.setAddressType(uniswapPool, OperationType.SwapOnly);
shareOFT.setAddressTypes(dexPools, OperationType.SwapOnly);

Verification

Check deployment

// Vault
require(vault.asset() == creatorCoin);
require(vault.owner() == owner);

// Wrapper
require(wrapper.shareOFT() == shareOFT);

// ShareOFT
require(shareOFT.vault() == address(vault));
require(shareOFT.gaugeController() == gaugeController);

Test deposit

// Approve
creatorCoin.approve(address(vault), testAmount);

// Deposit
uint256 shares = vault.deposit(testAmount, depositor);

// Verify
require(vault.balanceOf(depositor) == shares);
require(vault.totalAssets() == testAmount);

Post-deployment

Register with CreatorRegistry

registry.registerVault(
creatorCoin,
address(vault),
address(wrapper),
address(shareOFT)
);

Whitelist (if enabled)

// Whitelist initial depositors
vault.setWhitelistEnabled(true);
vault.setWhitelistBatch(addresses, true);

Cross-chain setup (if needed)

// Configure LayerZero peers on each chain
shareOFT.setPeer(dstEid, bytes32(peerAddress));

Next steps


Troubleshooting

Common issues

IssueSolution
First deposit failsEnsure amount >= MINIMUM_FIRST_DEPOSIT (5M)
ShareOFT not mintingCheck minter permission on wrapper
No fees collectedRegister DEX pools as SwapOnly
Cross-chain failsConfigure peers on both chains