LogoLogo
These products have been deprecated and are no longer being maintained. For a better experience and support, please check out our new stack Aragon OSx.
Aragon Legacy Documentation
Aragon Legacy Documentation
  • 🔷Aragon
    • Aragon Legacy Documentation
    • Aragon Values, Finances, and Legal
      • Legal and technical infrastructure
      • Financial infrastructure
      • Meet your DAO support network
    • Learn about DAOs
      • What is a DAO?
      • Why do we need DAOs?
      • What is decentralized autonomous governance?
      • What is the AN DAO?
      • TAO Voting
      • Why use Aragon to build a DAO?
  • 🌐Products
    • Prerequisites
    • Quickstart
    • Setting up a Metamask Wallet
      • Getting started with Ethereum
      • Getting started with Goerli Testnet
      • Getting started with Polygon
      • Getting started with Mumbai Testnet
      • Getting started with Harmony
      • Getting started with Harmony testnet
      • Getting started with Metis Andromeda
      • Getting started with Stardust Testnet
      • Getting started with BSC Testnet
      • How to sign a transaction?
      • Import your seed wallet to Metamask
      • Gas Tracker
    • Setting up a Frame Wallet
    • Setting up a Gnosis Safe MultiSig Wallet
    • Aragon Client
      • What is Aragon Client
      • How to create a DAO
        • Templates
        • Using the Company Template
        • Using the Membership Template
        • Use the Reputation template
      • How to create a DAO on Polygon
      • How to create a DAO on Harmony
      • How to navigate your DAO
        • Home
        • The Apps
          • Tokens App
          • Voting App
          • Finance App
          • Agent App
            • How to install the Agent App in your DAO
            • Using Agent with Frame
        • System Setting
          • Permissions Setting
          • App Center
          • Organization Setting
      • After you've started a DAO
        • How to change the Quorum of your DAO
          • Change Quorum using Aragon Console
          • Change Quorum using EVMcrispr
        • How to create a Legal Wrapper for your DAO with Otoco
        • How to Operate your DAO from your Mobile Phone
      • How to Brick your DAO 🧱
    • Aragon Govern
      • What is Aragon Govern?
      • How to create a Govern DAO
      • Navigate into your Govern DAO
        • How to mint and assign DAO tokens to others
        • How to deposit funds
        • Challenging a transaction
      • Reasons for the delay period in the transaction
      • Collateral for scheduling or challenging a transaction. Why?
      • Acting as a guardian for an Aragon Govern dispute
      • Using the Client DAO with the Govern DAO
    • Aragon Voice
      • What is Aragon Voice?
      • Creating a voting proposal
      • Creating a voting proposal using your token
      • Voting on a proposal
    • Aragon Vocdoni
      • What is Aragon Vocdoni
      • Creating a Vodconi organization
      • Accessing your Vocdoni organization
      • Navigating your Vocdoni organization
        • Creating a voting proposal
        • Voting on a proposal (anonymous voting disabled)
        • Voting on a proposal (anonymous voting enabled)
    • Aragon Court
      • What is Aragon Court
      • Court Dashboard
      • Dispute lifecycle
      • Acting as guardian for a dispute
      • Glossary
  • 🛠️Developers
    • Legacy Developer Documentation
    • General Tools
      • The Basics
        • Before starting
        • Quick start
        • Tech Stack
        • App permissions
        • Forwarding
        • Upgradeability
        • Package management
        • Templates
        • Aragon client
        • Human readable transactions
      • Guides
        • How to create your first custom DAO using Aragon CLI!
        • How to use the Agent App
          • Installing Aragon Agent from aragonCLI
          • Setting and Checking permissions
          • Interacting with Aragon Agent
        • How to build your first Aragon App!
        • How to publish an Aragon App to aragonPM
        • How to migrate existing Aragon App to Buidler plugin
        • How to change the Quorum of your DAO
          • Change Quorum using Aragon Console
          • Change Quorum using EVMcrispr
        • Deploying Aragon Client in new Chains
          • Deployments information
            • Harmony testnet
            • BSC Tesnet
            • Harmony
            • Metis stardust
            • Metis Andromeda
        • How to Brick your DAO 🧱
        • How to sign with Web3 providers
          • Setting up a Metamask Wallet
            • Import your seed phrase into Metamask
            • Import your private key into Metamask
            • Sign a transaction with Metamask
          • Setting up a Frame Wallet
            • Sign a Transaction with Frame
        • Troubleshooting
      • aragonOS
        • Introduction
        • Motivations
        • Developing with aragonOS
        • Reference documentation
        • Migrating to aragonOS 4 from aragonOS 3
        • Reference (aragonOS 3)
        • Smart Contract References
          • ACL
            • ACL
            • ACLSyntaxSugar
            • ACLHelpers
            • IACL
            • IACLOracle
          • APM
            • APMNamehash
            • APMRegistry
            • APMInternalAppNames
            • Repo
          • APPS
            • AppProxyBase
            • AppProxyPinned
            • AppProxyUpgradeable
            • AppStorage
            • AragonApp
            • UnsafeAragonApp
          • COMMON
            • Autopetrified
            • ConversionHelpers
            • DelegateProxy
            • DepositableDelegateProxy
            • DepositableStorage
            • EtherTokenConstant
            • IForwarder
            • IForwarderFee
            • IVaultRecoverable
            • Initializable
            • IsContract
            • Petrifiable
            • ReentrancyGuard
            • SafeERC20
            • TimeHelpers
            • Uint256Helpers
            • UnstructuredStorage
            • VaultRecoverable
          • ENS
            • ENSConstants
            • ENSSubdomainRegistrar
          • EVMSCRIPT
            • EVMScriptRegistry
            • EVMScriptRunner
            • IEVMScriptExecutor
            • IEVMScriptRegistry
            • EVMScriptRegistryConstants
            • ScriptHelpers
          • EVMSCRIPT/EXECUTORS
            • BaseEVMScriptExecutor
            • CallsScript
          • FACTORY
            • APMRegistryFactory
            • AppProxyFactory
            • DAOFactory
            • ENSFactory
            • EVMScriptRegistryFactory
          • KERNEL
            • IKernel
            • IKernelEvents
            • Kernel
            • KernelAppIds
            • KernelNamespaceConstants
            • KernelProxy
            • KernelStorage
      • aragonCLI
        • Introduction
        • Main commands
        • DAO commands
        • APM commands
        • IPFS commands
        • Global configuration
      • aragonPM
        • Introduction
        • Architecture
        • Reference documentation
      • aragonAPI
        • Introduction
        • Javascript
          • Quick Start
          • App API
          • React API
          • Wrapper
          • Providers
          • Architecture of apps
          • Background Scripts
      • aragonUI
        • Getting started
        • How to upgrade
        • BASE
          • Spacing
          • Colors
          • Text styles
          • Icons
          • Main
        • ACTIONS
          • Button
          • ContextMenu
        • NAVIGATION
          • Tabs
          • Pagination
          • BackButton
          • Link
          • Header
        • STRUCTURE
          • Bar
          • Box
          • Card
          • Split
          • DataView
          • Table
          • EmptyStateCard
          • IdentityBadge
          • TransactionBadge
          • Tag
          • Accordion
          • Timer
          • TokenAmount
          • EthIdenticon
          • TransactionProgress
        • DATA ENTRY
          • AutoComplete
          • DateRangePicker
          • DropDown
          • Switch
          • Radio
          • CheckBox
          • Slider
          • TextInput
          • SearchInput
          • AddressField
          • RadioGroup
          • RadioList
          • TextCopy
          • Field
        • VISUALIZATION
          • CircleGraph
          • LineChart
          • Distribution
        • FEEDBACK
          • Info
          • ProgressBar
          • LoadingRing
          • Toast
          • SyncIndicator
          • FloatIndicator
        • OVERLAYS
          • Help
          • Popover
          • Modal
          • SidePanel
        • ADVANCES
          • ButtonBase
          • FocusVisible
          • PublicUrl
          • Redraw
          • RedrawFromDate
          • Root
          • RootPortal
          • Viewport
      • aragonDS
        • Guidelines
          • Layout
          • Color
          • Iconography
          • Typography
          • Illustrations
        • Components
          • Overview
      • Aragon Connect
        • Guides
          • Aragon Basics
          • Getting started
          • Usage with React
        • Advanced
          • Custom Subgraph queries
          • Writing an App Subgraph
          • Writing an App Connector
        • Connectors
          • Organizations
          • Tokens app
          • Voting app
          • Finance app
        • API reference
          • connect()
          • App
          • Connectors
          • Organization
          • Permission
          • Repo
          • Role
          • TransactionIntent
          • TransactionPath
          • TransactionRequest
          • Types
          • Errors
      • App Center
        • App Center
        • Preparing Assets
        • Submitting Your App to the App Center
    • Product Tools
      • Aragon Govern
        • README
        • Introduction
          • Concepts and background
            • Govern Core concepts
            • ERC3000
          • Developers
            • Getting started
            • Govern.js API
            • Historical deployments
            • GraphQL API
            • Smart contracts breakdown
        • Deployments
          • Mainnet
          • Rinkeby
        • Packages
          • ERC 3k
          • Govern Console
          • Govern contract utils
          • Types
          • govern-create
          • Govern Server
          • govern-subgraph
          • govern-token
          • govern.js
      • Aragon Vocdoni
    • Aragon Client Glossary
  • THE ANT TOKEN
    • Aragon Network Token
      • About ANT
      • Historical token sale
    • ANTv1
      • Non-standard behaviours and gotchas
      • About the MiniMe token
      • The initial token sale flow
    • ANTv2
      • Upgrade portal
        • Troubleshooting
      • Contract interaction
      • Migrating on-chain liquidity
    • Developers
      • Quick start
      • Integrating ANT
      • Historical deployments
      • Security policy
  • ‼️FAQ
    • Products
      • Aragon Client
        • Where is my DAO?
        • DAO creation taking a long time to confirm
        • DAO is taking a long time to load
        • Failed DAO creation transaction
        • Why do I see a Blue Screen?
        • An unexpected error has occurred
        • App does not appear in Firefox
        • Receiving funds directly to the Agent or Vault address
        • How to Recover Funds accidentally sent to an Aragon App address
        • Depositing EURS in the Finance app
        • Which templates are available on the Ethereum Network?
        • Which templates are available on the Polygon Network?
        • Which templates are available on the Harmony Network?
        • Which templates are available on the Metis Andromeda Network?
        • How to delete a DAO
      • Aragon Govern
        • Which was the wallet address used to create the Aragon Govern DAO?
        • Where are my DAO tokens?
        • How to delete a DAO
        • How can I transfer funds to the Aragon Govern DAO?
      • Aragon Vocdoni
        • Is Vocdoni easy to use?
        • Is Vocdoni anonymous?
        • Is Vocdoni free?
        • Is my data safe with Vocdoni?
        • As an Organization, what can I do with Vocdoni?
      • Aragon Court
        • What is the current duration of the different stages of a dispute?
        • Dispute - Which fees need to be paid to create a dispute?
        • Dispute - Do I need to put collateral to create a dispute?
        • Appeals - How much money is needed to appeal a dispute? And to confirm the appeal? What is it for?
        • Appeals - If I have tokens staked or activated, can I lose them if I appeal a dispute?
        • Appeals - What happens to the collateral put up
        • Voting - Is a majority needed to win a vote?
        • Voting - What happens if there is a tie?
        • Voting - What does "Refuse to vote" mean? What happens if it's the most voted option?
        • Voting - Another guardian tried to collude. Can I punish this guardian?
        • Voting - What's the penalty for leaked votes?
        • Governance - Which parameters of Court can be changed? How?
        • Governance - Do parameter changes affect ongoing disputes?
        • Technical - Where is the Court "hosted"?
        • Technical - Where can I find the source code and technical documentation for Aragon Court?
        • ANJ conversion - What date will the lock-up period end?
        • ANJ conversion - If I have not staked my $ANJ, do I still get the lockup period price?
        • ANJ conversion - Will I get the 0.044 conversion if I convert after September 5th 2021?
        • ANJ conversion - How much will it cost to be a Guardian in Aragon Court with $ANT?
        • I can't see my tokens in the Dashboard
        • I activated my tokens but I can't see my probability of being drafted
    • Miscellaneous
      • Metamask wallet transaction alert
      • Is Aragon open source?
      • Where can I browse through the DAOs created on Aragon?
      • How to migrate from "old" DAI to "new" DAI
      • Security notice for organizations created before Aragon 0.8
      • General troubleshooting tips
    • ANT Token
      • What can I do with ANT?
      • Who holds ANT?
      • Who are the biggest ANT holders?
      • Long-term holding ANT - What benefits?
      • Can I delegate my network votes to somebody else?
      • Can I do flash loans with ANT?
      • Is there an ANT options market?
      • Are you planning to launch new network tokens?
      • My wallet isn't available on the Upgrade Portal
      • How can connect my Ledger to the Upgrade Portal?
      • I accidentally sent my "old" ANT to an exchange
      • ANJ conversion - What is the minimum number of $ANJ I need to participate in the 0.044 conversion?
      • ANJ conversion - What is the conversion rate ANJ to ANT v2?
Powered by GitBook
On this page
  • Environment setup
  • Creating a blank DAO
  • Adding a Token and Token Manager to your DAO
  • Adding a Voting App to your DAO
  • Adding a Vault and Finance App
  • Review & Finalize Permissions

Was this helpful?

  1. Developers
  2. General Tools
  3. Guides

How to create your first custom DAO using Aragon CLI!

PreviousGuidesNextHow to use the Agent App

Last updated 1 year ago

Was this helpful?

This guide will show you the process to deploy a blank DAO using Aragon CLI and configure it as a custom DAO for a cooperative organisation, let's say a cooperative of dairy farmers.

We assume you have a general understanding of Aragon stack.

Environment setup

Before starting you need to check if you have already installed all these prerequisites:

  • the right version of node.js (recommended v12.7 LTS version)

  • web3 provider: or (Frame is necessary for this guide).

  • the aragonCLI (Aragon Command Line Interface)

  • an

If installing IPFS on Linux, it can be easily done with: sudo snap install ipfs

If you haven't already installed them or if you need more info about this goes to the "Enviroment Setup" paragraph .

Creating a blank DAO

Warning

Installing Frame is necessary for this step. Read how to setup a Frame wallet. Select 'RINKEBY' network and make sure you open your new account (unfold it) in Frame for the transaction to appear.

Let's create a blank DAO! Insert and run the following command in your terminal:

 dao new --use-frame --env aragon:rinkeby

In the Frame app now a 'permission request' from aragonCLI should show up. 'Sign' the request.

After this a transaction to create the DAO should show up in Frame, also 'sign' this transaction:

Hint

Well done you just created your first DAO! You should now be able to open the DAO on: https://client.aragon.org/#/<dao-address>

Adding a Token and Token Manager to your DAO

Next we will add a token and a token-manager to your DAO. The following types of tokens can be created:

  • Membership: a non-transferrable token limited to 1 per account.

  • Reputation: a non-transferrable token without balance restriction.

  • Equity: a transferrable token without balance restriction.

For the dairy cooperative we want to start with a membership token: one farmer, one member.

First we need to deploy a MiniMe token. The dao new token command takes the following variables:

dao token new <token-name> <symbol> [decimal-units] [transfer-enabled]

Note

For our membership token we take "Member" as token-name, with "MBR" as symbol.

We want to set decimal-units to 0 (the default is 18).

The default of tranfer-enabled is true. By leaving transfered-enabled out of the command it takes the default value automatically, which is good for now since we will restrict transferability using the token-manager in a later step.

Warning

For the next step it is necessary to start an instance of Aragon Devchain. To do so open up an new tab or window in your terminal and run the following command:

aragon devchain --env aragon:rinkeby

So now run the following command in your terminal:

dao token new "Member" "MBR" 0 --use-frame --env aragon:rinkeby

Copy the token address from the terminal as we will need it later!

Next we need to deploy an instance of the token-manager app which will serve as the token-controller for the membership token we just created.

Note

Insert the DAO address in the below command and run it in your terminal:

dao install <dao-address> token-manager --app-init none --use-frame --env aragon:rinkeby

In order to get the token-manager address we need to run the following command:

dao apps <dao-address> --all --use-frame --env aragon:rinkeby

You should see a list of apps, and a token-manager instance listed under permissionless apps. Copy this address as we will need it later.

Next are going to set the token-address as the token-controller on our token, by running the following command:

dao token change-controller <token-address> <token-manager-address> --use-frame --env aragon:rinkeby

Now we are creating a MINT_ROLE permission for the token-manager so more farmers can be added as members to the dairy-DAO at a later point in time. Run the following command:

dao acl create <dao-address> <token-manager-address> MINT_ROLE <your-address> <your-address> --use-frame --env aragon:rinkeby

Warning

Make sure you do not accidentally include multiple spaces instead of 1 space between each variable in the command. Since if you do, you will run into this error:

✖ Not enough non-option arguments: got 4, need at least 5

We can now initialize the token manager using the dao exec command. The token-manager’s initialise function takes 3 parameters:

  1. minime token: token-address of a MiniMe token.

  2. transferrable: a boolean indicating if the token should be transferrable or not.

  3. uint: determining max number of tokens an address can control (use 0 if you do not want to restrict balances).

Note

We would not like dairy farmers to transfer their membership tokens, so we set the boolean to false. Then we want one address to control a maximum of 1 membership token, so the unit will be set to 1. Insert the data of the variables in the below command, and run it in your terminal:

dao exec <dao-address> <token-manager-address> initialize <token-address> false 1 --use-frame --env aragon:rinkeby

Warning

Adding a Voting App to your DAO

Since we already have a token and token-manager deployed all we have to do is install the voting-app. This can be done in one step using the dao install command and passing arguments via --app-init-args.

The voting-app requires the following initialization parameters:

  • minime token: token-address of a MiniMe token.

  • support required percentage: percentage of yeas in casted votes for a vote to succeed (expressed as a percentage of 10^18; eg. 10^16 = 1%, 10^18 = 100%).

  • min accept quorum: percentage of yeas in total possible votes for a vote to succeed (expressed as a percentage of 10^18; eg. 10^16 = 1%, 10^18 = 100%).

  • vote time: seconds that a vote will be open for token holders to vote (unless enough yeas or nays have been cast to make an early decision).

So if we want a voting-app instance with a support requirement of 60% and min accept quorum of 25% and a voting period of 7 days we would use the following command. Run the command in your terminal:

dao install <dao-address> voting --app-init-args <token-address> 600000000000000000 250000000000000000 604800 --use-frame --env aragon:rinkeby

Next you will need to assign the create votes permission. If you want all token holders to be able to create votes, we can assign the CREATE_VOTES_ROLE to the token-manager-address.

The following command grants token holders (so all members of the dairy-DAO) the ability to create votes. Also from now a vote will be required to manage changes to the permissions. Run the command:

dao acl create <dao-address> <voting-app-address> CREATE_VOTES_ROLE <token-manager-address> <voting-app-address> --use-frame --env aragon:rinkeby

Note

Adding a Vault and Finance App

Note

The vault-app can be installed without passing any specific initialization parameters. Run the following command in the terminal:

dao install <dao-address> vault --use-frame --env aragon:rinkeby

Copy the provided vault-address from the terminal, which will be needed later.

The finance-app however requires two initialization parameters:

  1. vault-address.

  2. budgeting period (in seconds).

If you are familiar with the finance-app in the UI, you may have noticed that there is not way to configure or set a budget. However, the smart-contracts allow you to set a per-asset budget which is reset each time period.

Eventually the UI will be updated to support these functions. If you don’t intend to use any of the budgetting functionality the budget period parameter doesn't matter but it does need to be passed. If you do plan on using the budgeting functionality however here is how it works:

For a given budget period P, a budget B can be set for asset A. The total volume of transfers of A cannot exceed its budget within a period P. So for example, if we initialize P as 1 Month, we could set a budget for DAI of 1000, and even if the vault contains more than 1000 DAI it will not be able to spend more than 1000 DAI per month. Keep in mind that the budget cannot be seen from the UI, so transactions which exceed the budget will just fail.

For demonstrations purposes, let's set install the finance-app with a budget period of 30 days (in seconds). Run the following command:

dao install <dao-address> finance --app-init-args <vault-address> 2592000 --use-frame --env aragon:rinkeby

Now we want to create a permission that grants the finance-app the TRANSFER_ROLE on the vault. For future possible changes we will also make voting required. Run the following command to do so:

dao acl create <dao-address> <vault-address> TRANSFER_ROLE <finance-address> <voting-address> --use-frame --env aragon:rinkeby

We also want to grant some permissions to the voting app on the finance-app. In that way voting will be required do the dairy-DAO members wish to make changes to the roles. Run the follwoing commands in the terminal:

dao acl create <dao-address> <finance-address> CREATE_PAYMENTS_ROLE <voting-address> <voting-address> --use-frame --env aragon:rinkeby

dao acl create <dao-address> <finance-address> EXECUTE_PAYMENTS_ROLE <voting-address> <voting-address> --use-frame --env aragon:rinkeby

dao acl create <dao-address> <finance-address> MANAGE_PAYMENTS_ROLE <voting-address> <voting-address> --use-frame --env aragon:rinkeby

Review & Finalize Permissions

To see what permissions are currently assigned, run the following dao acl command:

dao acl <dao-address> --use-frame --env aragon:rinkeby

You will notice that some key permissions have been granted and are managed by the address you used to perform these commands. By following these steps you are transferring authority as creator of the organization to other applications and entities defined above,

Warning

Transferring permissions is an irreversible process, so be careful not to revoke a permission before granting it to an appropriate entity!

You’ll want to grant permissions which are currently only assigned to your address to another entity (eg. voting-address):

dao acl grant <dao-address> <app-address> <ROLE> <voting-address> --use-frame --env aragon:rinkeby

You’ll want to revoke permissions for yourself once they have been granted to another entity:

dao acl revoke <dao-address> <app-address> <ROLE> <your-address> --use-frame --env aragon:rinkeby

You’ll want change the permission manager for permissions from your address to another entity (eg. voting-address):

dao acl set-manager <dao-address> <app-address> <ROLE> <voting-address> --use-frame --env aragon:rinkeby

Make sure you have sufficient Rinkeby Ethereum (ETH) in your wallet for the transaction fees. If not you can request for Rinkeby ETH . The transaction could take long. Increase the 'gas fees' to speed up the transaction.

Find the DAO address in the terminal, and make sure you select the 'Rinkeby' network in Aragon Client for your DAO to load (since Ethereum mainnet is default). You can change to Rinkeby network from here in the top right hand corner:

The DAO was created with the default . So it won’t have a token manager, vault, finance, or voting app installed yet.

Note The bare-kit has been deprecated and bare-template should be used instead. To learn more about templates check the.

The above command used the --use-frame and --env flags. You can find other possible flags , or by adding the --help flag to the command.

The contract is a standard ERC20 token with extra functionality.

The token-manager cannot be initialized unless it's already the controller of a MiniMe token. So in this case we want to use the dao install command with the --app-init none flag. In that way we can perform some actions before we initialize the token-manager. Read more about this here.

You can find more info about dao exec commands .

At this point if you open your DAO in a web browser you should be able to see the , and should be able to mint tokens from your-address. Open your DAO UI from here: https://client.aragon.org/#/<dao-address>

Even though we have initialized the token manager as transferrable = false, and token transfers fail, there is what appears to be a UI bug where the token manager will list the token as transferrable even though it is not. .

Adding a allows actions to be protected by a vote. This to ensure that the required support and quorum is reached in case of changes to your DAO. The dairy-DAO might want to transfer control to another member, such as change can then only be executed when the required majority of members is met.

At this point you should be able to open your organization in the browser and be able to create votes!

You can find more info about dao acl commands .

The vault-app is intended to securely store and manage funds but does not have its own user interface (UI). The provides an interface for the vault-app and provides some limited budgeting capabilities. In the future, it may make sense to install the vault app without the finance app, or the finance app with a different version of the vault app, but for now these two apps generally make sense to install as a pair.

For more information on what each of these roles do as well as additional roles made available by the finance-app, see the .

At this point you should be able to open your custom DAO in the web browser and manage tokens, create votes, and manage funds using the vault and finance apps!

While we have a mostly functional dairy-DAO need to be cleaned up because we do not want our personal address to have root authority in the organization. These steps can be done from the permissions UI (see image below), or directly from Aragon CLI.

At this point you should have changed permissions. Well done you successfully set up a custom DAO for the dairy-farmers cooperation. Let's toast to that!

🛠️
👏
🎉
🐮
🥛
🥛
🐮
Frame
Metamask
IPFS server.
here
here
here
https://client.aragon.org/#/
bare-template
introduction about them
MiniMeToken
token manager app installed
GitHub issue
voting-app
finance-app
repository
the permissions
here
flag
here
here