AlphaCOLLAB runs on GenesisL1 mainnet and has had no external audit. Use small amounts.Security notes

COLLAB

Deploy the protocol from /admin

The Deploy tab of the admin page, /admin/deploy, deploys the whole COLLAB protocol from your browser wallet: 20 contract creations, the same ones in the same order as script/Deploy.s.sol, one transaction each. It then reads every contract back, compares it with this release and, once you are signed in, publishes the deployment on this site. This page walks through its six steps, for the operator who deploys.

Part
Running a site
Version
COLLAB 2.2.0
Updated
Reading time
11 min
The Deploy tab of the admin page
The Deploy tab: network and wallet, external contracts and integrations, and the progress beside them

Before you start

What deploying means

  • Permanent. Contracts cannot be changed or removed once deployed, and the fees are not refunded.
  • No owner. The DAO factory and every DAO it creates have no owner, the deploying account included. There is nothing to configure or hand over afterwards.
  • No key on the page. The page never asks for or handles a key. Your wallet signs each transaction after you confirm it.
  • An alpha. COLLAB 2.2 has had AI-assisted reviews and no external audit.

The Deploy tab works without signing in. Only its last step, publishing on this site, needs the admin token.

The wallet

Any EIP-1193 browser wallet works: MetaMask, Rabby, or Keplr in EVM mode. Use an account on GenesisL1, chain 29, holding enough L1 for the fees. The page can switch the wallet to GenesisL1, and add the network to it when the wallet does not know it yet.

How much L1 you need

The plan step estimates every creation with your wallet's node and prices it at the current gas price before you start. For a first idea, from the release rehearsal and the admin page's tests with this release:

FigureGas
All 20 creations, gas used (release rehearsal)42,953,788
The largest creation, the governor implementation4,631,659
The largest gas limit sent (its estimate × 1.2 + 20,000)5,577,990

Every creation is far below the 25 million gas at which GenesisL1 nodes cap an estimate by default. At a 50 gwei gas price, 42,953,788 gas costs about 2.15 L1. Each transaction is sent with a gas limit of its estimate × 1.2 + 20,000, and the plan warns when your balance is below the sum of those limits at the current price. Keep a margin above it: a deployment that runs out of L1 stops, and resumes once you add more.

The six steps

StepWhat it does
1. Network and walletconnects your wallet and confirms the network
2. External contracts and integrationswL1, and the GL1F collections and CIPNFT contracts the DAO factory will list; each is checked on chain
3. Plan and costthe 20 transactions, their gas, and the cost at the current price
4. Deploysends the 20 creations, one after another
5. Verifyreads every contract back and compares it with this release
6. Publish to this sitethe admin service puts the deployment on this site

A Progress card beside the steps counts the contracts (Pending, Sent, Confirmed, Verified, Failed), and the This release card shows the release, the compiler, its settings and the SHA-256 of the protocol bundle the page deploys from.

Step 1: network and wallet

Press Connect wallet. The step then shows the Deploying account, the Wallet, the Network and the Balance.

On GenesisL1 the step is done. On another chain the page warns ("This is chain …, not GenesisL1."), and you either press Switch the wallet to GenesisL1 or, to test on purpose, turn on Deploy to chain … on purpose. Contracts and files made on another chain belong to that chain.

Step 2: external contracts and integrations

These go into the constructors and cannot be changed later. On chain 29 they are prefilled from script/integrations.json, the live GenesisL1 contracts (on a site that already publishes a deployment, from its config.js instead):

FieldPrefilled with
wL1 (wrapped L1, the ERC-20 form of L1 that pools trade)0x59a153c0fD47C6c1F305Abdb8030A90Aa3001fe2
GL1F collection 1, GL1F (id forest)registry 0x33c9844F77a07e36B98f0FFf8201B8A8b02c2a69, site https://gl1f.com/
GL1F collection 2, GL1F Crypto (id crypto)registry 0xF93C5407B07C29cCA9E1313d587fBDF33405038B, site https://crypto.gl1f.com/
CIPNFT contract 1, CIPNFT (id cipnft)0x05e4F1929947bE93a853F2de155fc1d6137f8446, site https://cipnft.com

Each GL1F collection has five addresses (Registry, Model NFT, Market, Runtime and Model store); Deploying COLLAB: reference lists them all.

Under Integrations DAOs start with, the DAO factory's lists are what the creation wizard preselects for a new DAO. Each DAO can add or remove its own later by a critical vote, so these lists bind no DAO. You may edit, add (Add a GL1F collection, Add a CIPNFT contract) or Remove entries, at most 8 of each.

Each entry needs:

  • a Name of at most 40 plain characters, in Latin letters or in Chinese, Japanese or Korean ones, unlike any other entry's name, ignoring case and look-alike characters;
  • an Id of at most 32 lowercase letters, digits and hyphens, starting and ending with a letter or digit, not starting with x- (kept for DAOs' own integrations), and unique;
  • a Site with an https address, or none;
  • addresses that are non-zero, distinct from each other and from wL1, with a right checksum.

Every address is then checked on chain:

  • wL1 must answer symbol() with wL1 and decimals() with 18;
  • a GL1F collection's registry, Model NFT, market and runtime must point at each other, and its model store must have code;
  • a CIPNFT contract must answer as CIPNFT does.

Check the contracts runs the checks again; Use Deploy.s.sol's chain 29 addresses puts the defaults back. Once the deployment has started, the step is locked: "These contracts and lists are part of the deployment under way and can no longer change. Start over to use others."

Step 3: plan and cost

The plan appears once the network is confirmed and every contract of step 2 is verified. It shows the Transactions, the total Gas, the Gas price ("now, from your wallet's node"), the Estimated cost (with the most the gas limits could cost: "at most … with the 20% gas margin") and your Wallet balance.

Two creations, the DeSciFi router and the token launcher, call the DeSciFi factory in their constructors before it exists, so their gas is first estimated from their code size and marked "about"; each is estimated exactly right before it is sent. When your balance may not cover every gas limit, the plan says so: "Your balance may not cover every transaction." Estimate again refreshes the plan.

The 20 contracts

#On the pageContractWhat it is
1Text storeTextStoreStores constitutions, announcements and proposal texts as content-addressed blobs.
2Member keyringCollabKeyringHolds members' public encryption keys for sealed data, shared by every DAO.
3Pool implementationDeSciFiPairThe code every DeSciFi pool runs as a clone.
4DeSciFi factoryDeSciFiFactoryCreates and lists DeSciFi pools.
5DeSciFi routerDeSciFiRouterSwaps and liquidity with slippage and deadline limits.
6Lock box implementationLockBoxThe code every liquidity lock runs as a clone.
7Lock factoryLockFactoryCreates locks for DeSciFi LP tokens.
8Member distributorMemberDistributorRuns snapshot airdrops to DAO members.
9DAO token implementationDAOTokenThe code every DAO-launched token runs as a clone.
10Token launcherTokenLauncherIssues DAO tokens with their allocations and first pools.
11Policy builderPolicyBuilderWrites the default call policy of each new DAO.
12Share token implementationShareTokenVoting shares with delegation and snapshots.
13Governor implementationDAOGovernorDeposits, votes, timelocks and execution.
14Treasury implementationDAOTreasuryHolds a DAO's assets and acts on passed proposals.
15Policy implementationDAOPolicyWhat each kind of proposal may call.
16Profile implementationDAOProfileTitle, logo, description, links and representatives.
17Key vault implementationCipherVaultA DAO's seat in CIPNFT for sealed data.
18DAO factoryDAOFactoryCreates every DAO from the six implementations. It has no owner.
19DAO lensDAOLensRead-only views the site uses for DAO pages.
20Market lensMarketLensRead-only views for tokens, pools, locks and airdrops.

The Contracts guide explains how they work together.

Step 4: deploy

The step reminds you: "Deploying sends 20 transactions from your wallet. Contracts are permanent once deployed." Press Deploy 20 contracts and confirm in the dialog.

Confirming each transaction

For each contract, in order, the page:

  1. builds the creation with the addresses of the contracts before it;
  2. estimates it with your wallet's node ("Checking the transaction before your wallet opens…"). A creation whose estimate fails is not sent: "The creation would fail, so it was not sent.";
  3. opens your wallet ("Confirm in your wallet…"). Check the network and confirm;
  4. waits for a block ("Submitted 0x…, waiting for a block…");
  5. compares the new contract's code with this release before it moves on ("Created 0x… in block …").

The ledger of step 3 follows along: Pending, In your wallet, Sent, Confirmed, then Verified after step 5. While it runs, Pause after this transaction stops after the current one, and Deploy the remaining … carries on.

When a transaction fails or you reject it, the deployment stops with the reason, and the button becomes Retry: deploy the … for that contract. The contracts already deployed stay on chain and in the plan.

What a failure costs

GenesisL1 charges every transaction at least half its gas limit, even when it fails. A creation here is sent only after its own estimate succeeds, with a limit of that estimate × 1.2 + 20,000, so a failure is rare. It still costs at least half that limit and at most all of it: for the largest creation, from about 2.8 million gas (0.14 L1 at 50 gwei) to 5,577,990 gas (about 0.28 L1). Gas reference explains the rule.

Resuming after an interruption

The page saves its progress in this browser, per chain and deploying account: the external contracts and lists you chose, and for each contract its transaction, nonce and address. It holds only public facts.

  • A reload or a closed tab resumes where it stopped. Contracts saved as confirmed are checked again against this release; a transaction that left the wallet is waited for, by its hash or by the address its nonce creates. Let the transaction in flight confirm before you reload: a reload during sending once led, in testing, to one extra transaction.
  • The wallet switched account or network: the deployment pauses ("Switch back to continue").
  • Another browser, or cleared site data: Download the deployments JSON keeps the record so far (the file is 29.partial.json until the deployment is complete). On the other browser, connect the same account and use Resume from a deployments JSON; every contract it names is checked for this release's code first.
  • Another release: a deployment started with another release of the protocol cannot be continued ("This deployment was started with another release of the protocol."). Start over to deploy this release.

Start over forgets the saved progress for this account and chain. The contracts deployed so far stay on chain; download the record first if you want to keep it.

Step 5: verify

When the 20 contracts are confirmed, the page reads them back from the chain and compares them with this release. The results come in four groups:

  • Contract code: each address holds this release's code, compared with its immutables masked;
  • Wiring: each constructor argument reads back as the address Deploy.s.sol passes;
  • External contracts: wL1 has code and answers like wL1; on GenesisL1 it must be the one Deploy.s.sol names;
  • Integrations: each listed GL1F collection and CIPNFT contract is what it claims to be, and the factory lists exactly these; on GenesisL1, an entry named like one of Deploy.s.sol's defaults must be that default.
The Deploy tab with the deploy and verify steps done: all checks passed
Deploy and Verify done in the release rehearsal: all 60 checks passed

In the release rehearsal the result read "All 60 checks passed. Every contract runs the code of release 2.2.0 and is wired as Deploy.s.sol wires it." Run the checks again repeats them. When a check fails, the page says "Do not publish this deployment." and does not offer to publish it.

Step 6: publish to this site

Signed out, the step shows a small sign-in form: "Publishing needs the admin token. The deployment itself is safe on chain and stays saved in this browser."

Signed in, it shows Publish to collab.genesisl1.com (your host): "The admin service checks the record again, keeps it as deployments/29.json, rewrites config.js so that every page reads these contracts, and starts the prerender." Press Publish to this site and confirm. The page then shows what the server wrote and the prerender's progress. When the site already shows another deployment, the page warns that publishing replaces it; the replaced record stays in the server's history.

Publish, unpublish and check describes what happens next, and the Publish tab, which publishes an existing deployment.

Publish by hand

Publish by hand ("For a static host, or another site: the record and config.js") downloads the deployment record (Download 29.json) and, once every check has passed, a config.js written exactly as tools/write_web_config.py writes it, with options for the RPC endpoints, block explorers, network name, site address, price API, Google Analytics ID and custom endpoints. It opens by itself on a host without the admin service. See Hosting without the server kit.

Deploying with Foundry instead

forge script script/Deploy.s.sol deploys the same 20 contracts from a Foundry keystore account and writes deployments/29.json. Publish that record from the Publish tab. See Deploying COLLAB: reference.