Adding an Existing Plugin

In Arc v1, adding plugins to a DAO follows a two step process:

  1. Deploy the plugin contract, for which we will sometimes provide a factory contract.

  2. Propose adding the plugin to the DAO (then pass and execute this proposal).

Multicall Plugin

The multicall plugin allows a DAO to call any set of Ethereum methods in sequence using a single proposal. You optionally may limit the callable methods using a whitelist of addresses.

To add this plugin to an existing DAO:

1. Deploy a new Multicall plugin using the factory contract.

Go to MyCrypto and fill in the factory contract address for your DAO's network:

Network

Address

Mainnet

0x02CF3E5759C9150B65C8476D0121f2BB66BFfFcd

Rinkeby

0x5e758CA1F282502790DcBEC17cBF5Cf8F031752B

xDai

0x99e226ff96C96C9ec8e4908b152fD334B2ABEBCC

Add the factory contract's ABI and click "Access":

[
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "genericSchemeMultiCall",
"type": "address"
}
],
"name": "NewGenericSchemeMultiCall",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "CUSTOM",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "FAST",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "NORMAL",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "SLOW",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "contract Avatar",
"name": "_avatar",
"type": "address"
},
{
"internalType": "contract IntVoteInterface",
"name": "_votingMachine",
"type": "address"
},
{
"internalType": "uint8",
"name": "_voteParamsType",
"type": "uint8"
},
{
"internalType": "uint256[11]",
"name": "_votingParams",
"type": "uint256[11]"
},
{
"internalType": "address",
"name": "_voteOnBehalf",
"type": "address"
},
{
"internalType": "address[]",
"name": "_contractsWhiteList",
"type": "address[]"
},
{
"internalType": "string",
"name": "_descriptionHash",
"type": "string"
}
],
"name": "createGenericSchemeMultiCallSimple",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
]

Under "Read / Write Contract," select:createGenericSchemeMultiCallSimple

Fill in the inputs:

_avatar address: your DAO's main address This can be found at alchemy.daostack.io/dao/{your avatar address}. _votingMachine address: your DAO's voting machine address Find your DAO's voting machine address by navigating to the info tab for one of your DAO's existing plugins (alchemy.daostack.io/dao/{your dao address}/scheme/{plugin address}/info):

_voteParamsType uint8: 0, 1, 2, or 3

Input

Result

0

custom parameters (see _votingParams)

1

"Fast" preset parameters (easier & faster to pass proposals)

2

"Medium" preset parameters

3

"Slow" preset parameters (slower & harder to pass proposals)

_votingParams uint256[11]: voting parameters If you've selected "1", "2", or "3" for the _voteParamsType, just enter an empty array, "[]", here. If you've chosen "0", you will need to provide an 11 number array. An example, along with the corresponding parameter names, is provided here:

[_queuedVoteRequiredPercentage,
_queuedVotePeriodLimit,
_boostedVotePeriodLimit,
_preBoostedVotePeriodLimit,
_thresholdConst,
_quietEndingPeriod,
_proposingRepReward,
_votersReputationLossRatio,
_minimumDaoBounty,
_daoBountyConst,
_activationTime]

["50","2592000","259200","86400","1200","86400","0","0","250000000000000000000","10","0"]

_voteOnBehalf address: 0x0000000000000000000000000000000000000000 _contractsWhiteList address[]: [] (if not whitelisting) If you do wish to use a whitelist, list the addresses you wish to include here: ["address1","address2"...]. _descriptionHash string: 0x

Sign and complete the transaction to deploy your new plugin!

2. Get the address of your new plugin from Etherscan.

Go to Etherscan's record of the transaction. Click "Logs", then switch the Data dropdown from "Hex" to "Address." Copy the address that appears: this is the address of your new plugin.

3. Propose to add this plugin to your DAO.

Now, it's time to add the plugin to your DAO! Navigate to the "Plugin Manager" in your DAO, and create a new proposal. Fill out the form as expected, with these exceptions:

Plugin: your new plugin's address Parameters Hash: 0x0000000000000000000000000000000000000000000000000000000000000000 Permissions: check "call genericCall on behalf of"

Click "Submit proposal." If everything was done correctly, when this proposal passes and is executed, your DAO will now have the new plugin!

Last updated