Skip to content
DocsDevelopersContracts & addresses

Contract Reference

This page lists the canonical deployed addresses for the DAO Ships protocol, the network they live on, and what each contract does. The addresses below come from deployment-addresses.json in the contracts repository and match the addresses the live app uses in src/config/contracts.ts.

Trust deployment-addresses.json

Some older docs in the repositories contain stale address sets from earlier redeployments. The addresses on this page are the canonical deployment. If a value disagrees with another file, prefer the ones here.

Network

PropertyValue
NetworkQuai Orchard Testnet (Cyprus-1)
Chain ID15000
RPC URLhttps://rpc.orchard.quai.network
Block explorerhttps://orchard.quaiscan.io
Native currencyQUAI (18 decimals)
Solidity0.8.22
OpenZeppelinv5

Cyprus-1 uses a sharded address scheme — all addresses on this shard begin with the 0x00 prefix, which is why deployment relies on CREATE2 salt mining (see Launch from TypeScript).

Deployed addresses

ContractAddressRole
Poster0x005C3957b8f612BBcdCFCbeDb8C53C3d3b3FEEdcEIP-3722 metadata bus
DAOShipSingleton0x0034B574bDC240d37b6F08248Ae069727164002CLogic for DAOShip clones
SharesERC20Singleton0x00366CedcB0B99A9E5Dfb9B7dE1484A895118235Logic for voting-token clones
LootERC20Singleton0x00521258bBD3B23Bc10c3Fc77d360Df4379dE054Logic for loot-token clones
DAOShipLauncher0x00487182EA7a7881d84C63099001B0195a41BFB3Clone factory (DAO + tokens)
DAOShipAndVaultLauncher0x0036B11eEC6aa17407b0e157fA9caa32b7EFC9D1Atomic factory (DAO + vault)

The app also references this Quai Vault infrastructure, pre-deployed by the Quai Vault project:

ContractAddressRole
QuaiVaultFactory0x002d1305D597c157bB975967FA2e5337674b0E5FCreates vault (avatar) proxies
VaultSingleton0x004E539Cf477A5Cb456A56023f083cD91Bc4934eQuai Vault implementation
MultiSendCallOnly0x002ae8A47C2da497fe569AfCF0486410aA1093E0Batched-call DelegateCall target

Contract roles and key functions

DAOShip

The governance engine. Deployed as an EIP-1167 clone of DAOShipSingleton. Holds no funds — all treasury actions execute against the vault via execTransactionFromModule.

Key functions:

function submitProposal(bytes calldata proposalData, uint32 expiration, string calldata details) external payable returns (uint32);
function sponsorProposal(uint32 id) external;
function submitVote(uint32 id, bool approved) external;
function processProposal(uint32 id, bytes calldata proposalData) external;
function ragequit(address to, uint256 sharesToBurn, uint256 lootToBurn, address[] calldata tokens) external;
function setNavigators(address[] calldata navigators, uint256[] calldata permissions) external; // governanceOnly
function setGuildTokens(address[] calldata tokens, bool[] calldata enabled) external;           // governanceOnly
function setGovernanceConfig(bytes calldata governanceConfig) external;                          // onlyGovernor

Permission constants: ADMIN = 1, MANAGER = 2, GOVERNOR = 4, MAX_PERMISSION = 7. The governanceOnly modifier requires msg.sender == address(this) — i.e. the call must arrive through a passed proposal.

DAOShipLauncher

EIP-1167 clone factory for DAOShip, SharesERC20, and LootERC20. Exposes launchDAOShip(...) and calculateAddresses(sender, sharesSalt, lootSalt, daoShipSalt) for deterministic address prediction.

DAOShipAndVaultLauncher

The atomic factory most callers use. One transaction predicts the DAOShip address, creates the Quai Vault with DAOShip pre-enabled as a module, then launches DAOShip with the vault as its avatar. Key functions:

function launchDAOShipAndVault(
    bytes calldata initializationParamsTemplate,
    string calldata shareTokenName, string calldata shareTokenSymbol,
    string calldata lootTokenName, string calldata lootTokenSymbol,
    address[] calldata vaultOwners, uint256 vaultThreshold,
    uint256 vaultSalt, uint256 sharesSalt, uint256 lootSalt, uint256 daoShipSalt
) external returns (address payable daoShip, address vault);
 
function calculateAllAddresses(
    address sender,
    uint256 sharesSalt, uint256 lootSalt, uint256 daoShipSalt, uint256 vaultSalt,
    address[] calldata vaultOwners, uint256 vaultThreshold, uint32 minExecutionDelay
) external view returns (address daoShip, address shares, address loot, address vault);

It emits LaunchDAOShipAndVault(daoShip, vault, shares, loot, newVault, launcher).

SharesERC20 and LootERC20

SharesERC20 is the voting token with timestamp checkpoints and auto-delegation; LootERC20 is the non-voting economic token. Both are minted and burned only by DAOShip (or a MANAGER navigator) via mintShares / mintLoot and the corresponding burns. The protocol caps a DAO at MAX_GUILD_TOKENS = 20 ragequit tokens.

Poster

An EIP-3722 content bus that emits NewPost and stores no state, so a post costs around 25K gas regardless of content length:

function post(string content, string tag) external;
event NewPost(address indexed user, string content, string indexed tag);

Indexers filter on tag (for example daoships.launcher.daoProfile) to attach metadata to DAOs, proposals, and members. See the Indexer page for how these are stored.