Deploy your transfer-agent factory
A CapTableFactory is the onchain house for a transfer-agent business: it deploys many issuer cap tables (beacon proxies) and its owner controls upgrades for those tables.
| Role | Meaning |
|---|---|
| Factory owner | Wallet that deployed the factory (beacon upgrades). For the shared Plume demo this is TAP Admin — not every issuer wallet. |
| Issuer ADMIN | Wallet that called createCapTable on a factory. |
| Mongo register | Local DB row so this API knows which factory address to use — not ownership. |
Factory owner is not the same as the server PRIVATE_KEY used for API-signed txs. See Three wallets / keys on Setup. Do not leave the factory-owner key in the always-on API env.
Product direction: wallet-first “deploy your factory” in the app. Today the supported path is pnpm deploy-factory (CLI) with auto Mongo registration.
Default: deploy your own factory
Configure env
Root .env (or a dedicated deploy env file) needs a funded deployer key for this command — that wallet becomes factory owner — plus RPC_URL and CHAIN_ID (Plume: 98866 / https://rpc.plume.org). Do not leave the owner key in the always-on Docker/API env after deploy.
Run the deployment script
pnpm deploy-factoryThe script deploys libraries + CapTable implementation + CapTableFactory, then auto-registers factory + live implementation in Mongo (unless --no-register).
Point the frontend at your factory
Set NEXT_PUBLIC_FACTORY_ADDRESS in app/.env.local (and root .env if using Docker app) to the printed CapTableFactory address.
Factory addresses are unique to the deployer wallet and nonce. Do not hardcode someone else’s factory as “yours,” and do not paste a stale implementation address — read it from the factory onchain.
Register an existing factory you control
pnpm factory:register --factory 0xYourFactory
# implementation is read onchain when omittedMongoDB Compass is optional for inspection (mongodb://tap:tap@localhost:27017, database mongo, collection factories). Prefer the CLI so the implementation stays live.
Demo / issuer-dev: shared Plume factory
For local product work without deploying a factory:
REUSE_TAP_FACTORY=1 pnpm bootstrap
# or: pnpm factory:register --factory 0xcd6Df14406b0569ceEABa884A18717774EdeaCA1| Actor / deployment | Address | Capability |
|---|---|---|
Shared demo CapTableFactory | 0xcd6Df14406b0569ceEABa884A18717774EdeaCA1 | Permissionless issuer cap-table creation |
| Factory owner (TAP Admin) | 0x366aA809015061C101983900d0c2ebf7d71B96AF | Beacon upgrades for this factory |
You can mint issuer cap tables through this factory (createCapTable is permissionless). You do not own upgrades. Production transfer agents should deploy their own factory.
Next: Create an issuer.