A voting module for deliberative decision-making using argument trees.
Deliberate lets participants build a tree of pro/con arguments below a debate thesis, stake vote tokens on
argument markets to rate them, and finally tally the tree to determine the outcome. The Deliberate contract
is deployed once, has no owner, and is not upgradeable (ADR-0006); moderation happens through the rating
markets themselves (ADR-0005).
-
Get an up-to-date version of Foundry with
curl -L https://foundry.paradigm.xyz | sh foundryup -
Optionally, to lint the contracts, install solhint using a JS package manager such as Bun with
curl -fsSL https://bun.sh/install | sh bun install -
Optionally, for static analysis, install Slither with
python3 -m pip install slither-analyzer
Install the dependencies (managed with Soldeer) with
forge soldeer installTo compile the contracts, run
forge buildTo run the tests, run
forge testTo show the coverage report, run
forge coverageTo run the linter and static analyzer, run
bunx solhint --config .solhint.json 'src/**/*.sol' && \
bunx solhint --config .solhint.other.json 'script/**/*.sol' 'test/**/*.sol' && \
slither .Who may join is chosen per debate, so Deliberate takes no constructor arguments. A debate names an
IIdentityRegistry at creation: the zero address admits everyone; an AllowlistIdentityRegistry admits the
accounts on a list its owner keeps, and any number of debates can share it; CirclesIdentityRegistry reads the
Circles v2 Hub on Gnosis Chain, admitting every registered Circles human, or the accounts a chosen avatar
trusts. Anything else implementing the interface works too.
None of them is part of the protocol, so they are deployed apart from Deliberate, by
IdentityRegistryFactory. The factory deploys one implementation per kind and hands out EIP-1167 minimal
proxies, so a creator who wants a registry of their own pays a clone rather than a deployment. With a funded
keystore account (cast wallet import) and the
gnosis endpoint from foundry.toml (or any RPC URL in its place):
just simulate gnosis # dry run
just deploy <KEYSTORE_ACCOUNT> gnosis # broadcast
just verify <DELIBERATE_ADDRESS> gnosis # Sourcify and Etherscan; `verify-sourcify`, `verify-etherscan`, `verify-custom` singly
just simulate-registry-factory gnosis # the factory, separately
just deploy-registry-factory <KEYSTORE_ACCOUNT> gnosis # it also clones the any-Circles-human registry
just verify-registry-factory <FACTORY_ADDRESS> gnosis
just verify-registry-implementations <ALLOWLIST_IMPL> <CIRCLES_IMPL> gnosisEach script prints its addresses. The deliberate address and its deployment block feed the indexer's
config.yaml and the frontend's VITE_DELIBERATE_ADDRESS; the registry address feeds the frontend's
VITE_CIRCLES_REGISTRY (deployment pipeline: contracts -> indexer -> frontend).
The live deployment, recorded in broadcast/DeployDeliberate.s.sol/100/run-latest.json and verified on
Sourcify and Gnosisscan:
| Gnosis Chain (100) | address | block |
|---|---|---|
Deliberate |
0x28b939ed3F67c8eaB198e46E9d41CcB4d19c6DE3 |
48049642 |
IdentityRegistryFactory |
0x215b49E5Ca4b4f7A7C67777d2F840Ec1a9636ad2 |
48084197 |
CirclesIdentityRegistry (any Circles human, cloned by the factory) |
0xfeA940eE192AB29cdD97B3187d0885Ab193077D2 |
48084197 |
AllowlistIdentityRegistry implementation |
0x07eFcb5DE727dF70c916A8c8cA548eDA93dA76Db |
48084197 |
CirclesIdentityRegistry implementation |
0xc4b8b7FC1640d44a9B57F12D45d9b0be0a0f8B10 |
48084197 |
CirclesIdentityRegistry (any Circles human, standalone, superseded by the clone) |
0x74bEF28610f70831429dc8d9014Bdeb5C60C4c31 |
48049642 |
src/ The Deliberate contracts, interfaces, types, and utilities.
test/ Foundry tests and mocks.
script/ Deployment scripts.