# Guide: Creating a Voting Vault

Council's modularity allows developers to easily create new voting vaults for new Council deployments, add them to existing deployments through governance.Let's go over how to create your own [Voting Vault](/element-developer-docs/element-council-protocol/council-protocol-smart-contracts/voting-vaults.md) to extend Council's capabilities to fit your DAO's needs.

#### Requirements

This guide uses Solidity to write a Voting Vault smart contract. You'll need:

* Some experience with Solidity
* Council contracts

1. **Clone the repository**

Get started by cloning or forking the open source Council Kit GitHub repository:

{% embed url="<https://github.com/delvtech/council>" %}

2. The Voting Vault Interface

Voting vaults must retrieve a user's voting power and a specified timestamp (vote creation), and return it to CoreVoting when requested. It can also parse extra data for custom instructions:

![](https://i.imgur.com/KR0J7Ru.png)

For example, let's consider a vault that allows anyone who calls it to have any number of votes per request. In this case, the extraData parameter can be used to set the voting power

![](https://i.imgur.com/RqRFMkE.png)

The previous example does not seem very useful for governance, so let's consider a vault that gives voting power to holders of an NFT. You'll need a few more things

3. Voting Vault functions

You'll have to implement the following, at minimum:

* a function to track and update voting power (see [History.sol](https://github.com/delvtech/council/blob/main/contracts/libraries/History.sol) included in the repo)
* a deposit function
* queryVotePower function as required by the interface

![](https://i.imgur.com/THUkhoy.png)

4. Customize

You can tweak this contract by e.g. adding functions to withdraw or delegate, changing the votes given per NFT to a different number, making a function that considers rarity, or any other functionality you can think of.

5. &#x20;Add to your Council deployment

You can add the vault to your new Council deployment by simply adding the address in the included deployment script. Existing deployments would require a governance proposal.

![](https://i.imgur.com/7uk59S9.png)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://element-2.gitbook.io/element-developer-docs/element-council-protocol/guide-creating-a-voting-vault.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
