Deploying Vaults

This walkthrough shows how a strategist can launch a MORE Vault on any EVM network on which the MORE Vaults protocol is deployed using the Solidity scripts that ship with the core repo. To deploy on your target network, you can switch RPC endpoints and explorer links.

Permissioned & Permissionless Deployments

There is a single registry on each chain's MORE Vault Factory. The registry is permissionless insofar as anyone can create a vault. Its goal is to distinguish between permissioned and permissionless vaults and the facets, selectors and protocols they rely on. Permissioned vaults may only activate facets from the permissioned Vault Registry.

Permissionless vaults can use any facet, selector, protocol or oracle. There is no check on the Vault Registry to verify facets. Permissionless oracles can be added to the Permissionless Oracle Registry so they can be used by permissionless vaults. Anyone may add an oracle to this registry.

Cross-Chain Hub & Spoke Model

To facilitate cross-chain vaults, MORE relies on a hub and spoke model, supported by the core Bridge facet. The facet itself is agnostic to underlying bridges and provides a unified interface with any cross-chain messaging infrastructure.

The flagship version of this facet ships with support for LayerZero. Later, it will be extended to include additional bridges with the goal of offering additional breadth and fallback resilience.

In Q3 2025, you'll be able to begin testing MORE Vaults as a multi-chain mesh. The hub chain Vault Owner will be able to deploy a vault on another chain by specifying a SALT, a unique value, that is used to associate vaults on different chains to the same mesh.

Step-by-step deployment guide

Scripts location: /scripts

CreateVault.s.sol – signs a transaction to the permissionless Vault Factory.

These scripts run under Foundry using standard EVM byte‑code. A Python library is currently under development and will be made available soon.

What you’ll deploy

  • Diamond proxy – the vault contract which uses existing core and optional facets.

  • Register on the factory – written automatically so frontends can find your vault.

Environment setup

# Install Foundry
curl -L https://foundry.paradigm.xyz | bash && foundryup

# Clone the repo
git clone https://github.com/deathwing00000/More-Vaults.git
cd More-Vaults

# Compile once
forge build

If forge build fails or the RPC later errors, hop onto Discord and open a #support-ticket for live help.

Create .env

Copy .env.example to .env and fill in:

# GENERAL PARAMS
PRIVATE_KEY="Your Private Key"

# VAULT CREATION PARAMS
OWNER="The owner's EVM address"
CURATOR="The curator's EVM address"
GUARDIAN="The guardian's EVM address"
FEE_RECIPIENT="The fee recipient's EVM address"
UNDERLYING_ASSET="The EVM token address of the underlying asset"
FEE=1000 # In BPS, 0 means no performance fees will be taken
DEPOSIT_CAPACITY=10000000 # Underlying asset's value with decimals
TIME_LOCK_PERIOD=86400 # In seconds
MAX_SLIPPAGE_PERCENT=1000 # BPS
VAULT_NAME="Your vault name"
VAULT_SYMBOL="Your vault's ticker"

# COMING SOON
IS_PERMISSIONLESS=TRUE 
# If this is set to true, the vault will be registered as a permissionless vault in the Vault Factory.
IS_HUB=TRUE 
# If this is set to true, the vault will be enabled for deposits and withdrawals. If this is set ot false, the vault will serve as a spoke and only the hub vault will be able to deposit and withdraw.
SALT="Any unique value" 
# The transaction will revert if the value was already used on the same chain.

# DEPLOYED REQUIRED PROTOCOL ADDRESSES
DIAMOND_CUT_FACET=
DIAMOND_LOUPE_FACET=
ACCESS_CONTROL_FACET=
CONFIGURATION_FACET=
VAULT_FACET=
MULTICALL_FACET=
ERC4626_FACET=
ERC7540_FACET=
BRIDGE_FACET=
VAULT_REGISTRY=
VAULTS_FACTORY=

# You can find these addresses on the Contracts page.

# DEPLOYED OPTIONAL PROTOCOL ADDRESSES
UNISWAP_V2_FACET=
ORIGAMI_FACET=
MORE_MARKETS_FACET=
AGGRO_KITTY_SWAP_FACET=
CURVE_FACET=
UNISWAP_V3_FACET=
MULTI_REWARDS_FACET=

# You can find these addresses on the Contracts page.

Need facet addresses? The Contracts page list every DAO‑approved facet.

Dry-run

forge script scripts/CreateVault.s.sol:CreateVaultScript \
  --rpc-url $RPC_URL --chain-id $CHAIN_ID \

Foundry prints the CreateVaultParams and the array of FacetCut entries it will submit. Check every field: roles, fee, capacity, facet list. Edit .env and repeat until correct.

What happens:

  1. DeployConfig.s.sol reads your env vars.

  2. getCuts() builds one FacetCut per facet (address, selector array).

  3. CreateVault signs with PRIVATE_KEY and calls deployVault() on the factory.

Broadcast

Add --broadcast to send the transaction:

forge script scripts/CreateVault.s.sol:CreateVaultScript \
  --rpc-url $RPC_URL --chain-id $CHAIN_ID \
  --broadcast

Save the transaction hash, and once mined, the vault address is printed by Foundry.

Verify

  1. Execute the following command

forge verify-contract \
  --rpc-url $RPC_URL
  --verifier etherscan \
  --etherscan-api-key $API_KEY \
  <address> \
  src/MoreVaultsDiamond.sol:MoreVaultsDiamond \
  1. Wait for verification.

  2. Check the returned URL and ensure your contract was verified.

Last updated