> For the complete documentation index, see [llms.txt](https://daostack-1.gitbook.io/v1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://daostack-1.gitbook.io/v1/guides/adding-plugins-to-a-dao/adding-an-existing-plugin.md).

# 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.&#x20;

### To add this plugin to an existing DAO:

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

Go to [MyCrypto](https://mycrypto.com/contracts/interact) 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):
>
> ![](https://2395785267-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MLiPJDJ4r1eiW8kTUdh%2F-MO6fCcXDEm5CJykLabx%2F-MO6sfBfnDgQFS6Llgs1%2FScreen%20Shot%202020-12-09%20at%209.21.54%20AM.png?alt=media\&token=1543514b-38a1-4b43-942e-5fe7d02ca096)
>
> \
> `_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

![An example of the filled out inputs](https://2395785267-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MLiPJDJ4r1eiW8kTUdh%2F-MO6fCcXDEm5CJykLabx%2F-MO7QSnhkJc1UZ5XSiV2%2Fexample%20form.png?alt=media\&token=6102ce9c-0e36-4981-8343-0c05d43ee506)

Sign and complete the transaction to deploy your new plugin!&#x20;

#### 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.

![](https://2395785267-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MLiPJDJ4r1eiW8kTUdh%2F-MO6fCcXDEm5CJykLabx%2F-MO7Qfi6cWa2i-tsP5zB%2FEtherscan.png?alt=media\&token=24552516-93aa-4874-904b-4477e0ad2236)

#### 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"

![](https://2395785267-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MLiPJDJ4r1eiW8kTUdh%2F-MO6fCcXDEm5CJykLabx%2F-MO7UHqJrg7Z2rhvLzPf%2Fproposal%20form.png?alt=media\&token=dd1540ed-aa06-4042-9b6e-9e20dfdfdf73)

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