# Governance Module

The **GovernanceModule** enables participating in the governance of component tokens held in the [SetToken](https://docs.indexcoop.com/index-coop-community-handbook/protocol/index-protocol/core-contracts/set-token). Examples of intended protocols include Aave, Compound, and Uniswap governance.

## Select Methods

### delegate()

`function delegate(ISetToken _setToken, string memory _governanceName, address _delegatee)`

**Manager only**. Delegate voting power to an Ethereum address. Note: for some governance adapters, delegating to self is equivalent to registering and delegating to zero address is revoking right to vote.

| Parameter Name   | Type      | Description                                                          |
| ---------------- | --------- | -------------------------------------------------------------------- |
| \_setToken       | ISetToken | Instance of the SetToken                                             |
| \_governanceName | string    | Human readable name of integration stored in the IntegrationRegistry |
| \_delegatee      | address   | Address of delegatee                                                 |

### propose()

`function propose(ISetToken _setToken, string memory _governanceName, bytes memory _proposalData)`

**Manager only**. Create a new proposal for a specified governance protocol.

| Parameter Name   | Type      | Description                                                          |
| ---------------- | --------- | -------------------------------------------------------------------- |
| \_setToken       | ISetToken | Instance of the SetToken                                             |
| \_governanceName | string    | Human readable name of integration stored in the IntegrationRegistry |
| \_proposalData   | bytes     | Byte data of proposal to pass into governance adapter                |

### vote()

`function vote(ISetToken _setToken, string memory _governanceName, uint256 _proposalId, bool _support, bytes memory _data)`

**Manager only**. Cast vote for a specific governance token held in the SetToken. Manager specifies whether to vote for or against a given proposal

| Parameter Name   | Type      | Description                                                          |
| ---------------- | --------- | -------------------------------------------------------------------- |
| \_setToken       | ISetToken | Instance of the SetToken                                             |
| \_governanceName | string    | Human readable name of integration stored in the IntegrationRegistry |
| \_proposalId     | uint256   | ID of the proposal to vote on                                        |
| \_support        | bool      | Boolean indicating whether to support proposal                       |
| \_data           | bytes     | Arbitrary bytes to be used to construct vote call data               |

### register()

`function register(ISetToken _setToken, string memory _governanceName)`

**Manager only**. Register for voting for the SetToken

| Parameter Name   | Type      | Description                                                          |
| ---------------- | --------- | -------------------------------------------------------------------- |
| \_setToken       | ISetToken | Instance of the SetToken                                             |
| \_governanceName | string    | Human readable name of integration stored in the IntegrationRegistry |

### revoke()

`function revoke(ISetToken _setToken, string memory _governanceName)`

**Manager only**. Revoke voting for the SetToken

| Parameter Name   | Type      | Description                                                          |
| ---------------- | --------- | -------------------------------------------------------------------- |
| \_setToken       | ISetToken | Instance of the SetToken                                             |
| \_governanceName | string    | Human readable name of integration stored in the IntegrationRegistry |

### initialize()

`function initialize(ISetToken _setToken)`

**Manager only.** Initializes this module to the SetToken.

| Parameter Name | Type      | Description             |
| -------------- | --------- | ----------------------- |
| \_setToken     | ISetToken | Address of the SetToken |
