# Welcome to Votium

This is the official source of info for everything regarding the Votium platform.

Feel free to [join our Discord](https://discord.com/invite/j6UnnVsH8t) / follow us on [Twitter ](https://twitter.com/VotiumProtocol)if you seek info which you haven't found in the documentation.


# Why Votium

Votium is an incentives platform where **vlCVX** holders can receive compensation from buyers interested in amassing voting power. Delegating/Voting incurs no risk to user funds, you always retain custody of your **vlCVX**.

Buyers can easily set the amount they are willing to pay in total for users to vote for their pool.

**vlCVX** holders can delegate their votes to Votium. We will choose the best incentive(s) on every proposal, so that you can delegate, sit back and enjoy the rewards without doing any work. You can also choose to vote on your own for your preferred incentive, using Convex's L2 voting system.

Votium accepts incentives of whitelisted ERC20 tokens.

Votium has **no withdrawal fees**, and a **low maintenance fee** applied to the incentives. Excluding gas, there is **no cost to use** the platform for delegators/voters.

Votium currently **does not have a native token.**


# How It Works

*Delegators who wish for Votium to vote for them are only required to delegate their votes **once** and will have their share registered on **all future incentives.** You can also choose to vote manually yourself, even if you are delegated.*

## Convex incentives:

A window to the buyers & voters will be opened for each gauge vote on Convex's L2 voting systems and will work like so:&#x20;

1. When a new Convex gauge vote begins, it will be listed on votium.app to receive incentives.
2. **Buyers** select their token to pay with, the amount to pay & which pool they would like the users to vote for.
3. A buyer can enter their incentive and increase it until the Convex vote is over.
4. Votium votes on behalf of their delegators, and confirms the number of vlCVX (including undelegated vlCVX) votes cast on the buyer's behalf.
5. The incentive is distributed among the voters via an airdrop.

{% content-ref url="/pages/-MeGLDYtY7FsjOUyc0Fs" %}
[Voter Manual](/explainers/voter-manual)
{% endcontent-ref %}


# Quickstart Guide&#x20;

This guide is meant to help users jump into the Votium ecosystem asap, please read the Voter Manual for a more comprehensive walkthrough and more details that are missing from this guide.

## Convex (vlCVX) incentives:

Start earning extra incentives with your CVX:

1. Lock your CVX for 16 weeks on [Convex](https://www.convexfinance.com/lock-cvx).
2. To start receiving Votium incentives, you have 2 options:
   1. **Delegate to Votium** via the delegate button on the [Votium website](https://votium.app/). Votium will vote on several incentivized pools for you and you won't have to do anything to receive incentives. Delegating is NOT mandatory. While delegated, **you can still vote manually** for a single pool if you would like to receive a specific incentive of only one token. You can also use third party tools like [The Union](https://llama.airforce/#/union/member) to streamline the process even further.
   2. **Vote manually** on Convex after incentives are deposited to Votium (when the proposal is live). For example, here is illustrated a $DAI incentive of 100,000 $DAI. To receive a share of the incentive you will have to vote for 3pool on Convex. You can click on the button on the bottom of the card to take you to the Convex voting page.

That's it! all you have to do is wait for the proposal to end, and the incentives will appear on the Votium claim page (or The Union if you are using it) \~24-48 hours after the proposal is over!

If you have questions left unanswered, please check out the [FAQ ](/faq/vlcvx-faq)page & join our [Discord](https://discord.com/invite/dvPcqPAbTh)!


# Voter Manual

This your Votium dashboard:

<figure><img src="https://1913623921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MeGI68rXodgI72Jprfp%2Fuploads%2F5VKpjpJu1b8lslUKomjz%2Fimage.png?alt=media&amp;token=253e4b81-7161-4f65-be1c-71ceb16e928a" alt=""><figcaption></figcaption></figure>

The dashboard will house all of the information and actions you can do as a delegator.

Make sure you connect your wallet with the **Connect Wallet** button on the top right, and connect to the Ethereum mainnet to start using Votium.

To switch between incentive markets click the switch button on the top right.

## VOTING (vlCVX)

To be eligible for a reward, you can either delegate your **vlCVX** to Votium, and we will do the optimized voting for you, or vote by yourself for a buyer's selected pool on the [Convex vote page](https://snapshot.org/#/cvx.eth).

The share of the incentive you receive will be relative to the % of the voting power you allocated to the pool.

To delegate to Votium, use the **Delegate** button on the right. Alternatively you can also [click here](https://www.convexfinance.com/lock-cvx) and delegate to Votium. These are all different ways of doing the same transaction, which interacts with the Convex smart contract and will only be required **once**.

Once delegated, **Your Delegated Amount** will display the amount of your locked CVX being delegated.

You can still vote manually after you've delegated to Votium. Voting manually on a proposal will temporarily prohibit delegation for said proposal. You are still delegated to Votium for all other and future proposals. You will receive the incentive of the pools you voted for (if there are incentives deposited for them through Votium).

*If you wish to remove your delegation permanently, you can do so at* [*https://www.convexfinance.com/lock-cvx*](https://www.convexfinance.com/lock-cvx)

## CLAIMING REWARDS

To claim your rewards, press the **My Votium** button, and you will arrive at the claim page, or [click here](https://votium.app/claim).

The rewards will be available for claim biweekly, \~24h-48h after vlCVX vote ends.

If you are using a third party tool (e.g. The Union), you will need to claim using their user interface.


# Buyer Manual

Please read the disclaimer before depositing an incentive:

{% content-ref url="/pages/fwpZbqqDohrPpvGgSfqN" %}
[Disclaimers](/faq/disclaimers)
{% endcontent-ref %}

## vlCVX

<figure><img src="https://1913623921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MeGI68rXodgI72Jprfp%2Fuploads%2F07ksNPj93tKSpGJcTmgg%2Fimage.png?alt=media&amp;token=cad776cd-173b-4d58-8353-095b10fc948c" alt=""><figcaption></figcaption></figure>

**Time Remaining** displays the time to the incentivization deadline.

### Incentivizing Your Pool

Underneath the card you will find the `Deposit A New Incentive` Button, which will take you to the deposit form.

<figure><img src="https://1913623921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MeGI68rXodgI72Jprfp%2Fuploads%2FiUjGiEnRVsPomVOoD2So%2Fimage.png?alt=media&amp;token=5866fa67-9d2d-446b-88e1-1a9496cc640f" alt=""><figcaption></figcaption></figure>

To deposit an incentive for vlCVX

1. Select the number of rounds you wish your deposit will be active for
2. Select the token you would like to pay with.
   1. OPTIONAL: You can also set a maximum number of tokens to pay for each vlCVX. Please consider the upsides and downsides for setting a max cap before choosing to do so. Rewards with a cap set below market rate may receive fewer votes.
3. Select the pool you wish voters to vote for.
4. Enter the number of tokens that will be rewarded to voters.
5. OPTIONAL: You can choose to Add Another Pool , this way you can deposit to multiple gauges in a single transaction.
6. OPTIONAL: Add addresses to blacklist from receiving your incentives. *(This feature will be added soon.)*
7. Deposit the incentive (You will be prompted to approve the ERC20 if you haven't yet).

### After depositing

1. All incentives can be optionally increased after being posted.&#x20;
   1. You may increase the number of tokens offered and or increase the maximum tokens offered per vlCVX, if a cap currently exists.&#x20;
   2. You cannot decrease the maximum offered, or create a cap if it does not already exist, or has already been removed.
   3. It is better to increase an incentive than to post a separate one for the same gauge, as each individual incentive will be treated separately, with its own parameters.
2. If an incentive has a max payout per vlCVX designated, and the entire reward is not consumed, the remainder of the reward will continue as a new incentive in the following round.
3. If an incentive is for a new gauge that is not approved until after the current round, and therefore cannot receive votes, it will continue as a new incentive in the following round.
4. If an incentive is for a gauge that does not exist, or has been killed, and receives no votes, the depositor will be able to withdraw the incentive, minus fee, after the results are finalized in the contract.

If you would like to incentivize with a token that isn't listed on the site, please contact the Votium team via [Discord ](https://discord.com/invite/dvPcqPAbTh)or [Twitter](https://twitter.com/VotiumProtocol).


# Address Forwarding, The Union

**Address Forwarding** is a feature that allows you to forward future Votium rewards to be claimed by a different address, or use a third party tool like [The Union](https://llama.airforce/#/union/).

To use this feature, locate the :pencil2: button at the `Forwarding Status` row of your Votium dashboard.

<figure><img src="https://1913623921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MeGI68rXodgI72Jprfp%2Fuploads%2FRJKXQjCzaFvqt0f9YTPC%2Fimage.png?alt=media&amp;token=67ebaf9a-2e7f-4629-ad50-56a4ed19655e" alt=""><figcaption><p>This user is forwarding his rewards to The Union</p></figcaption></figure>

The Address Forwarding feature is mainly popular for integrating and streamlining your Votium experience with third party tools (e.g. The Union).

All changes to address registrations have a one round waiting period before taking effect. When canceling an active registration, you will not be able to register a new forwarding address until the following round, meaning there will be one round with no forwarding.

**For advanced users:** Forwarding is transitive.

If a group of transitively forwarded addresses form a loop, the latest address registry that causes the loop will be ignored. Example: A->B->C->B will not all forward to B, but will instead end at C.


# Opt-Out Registries

There are two reward opt-out registries, one for Curve voting and one for f(x) voting. The registries exist for protocols that vote for their own incentivized pools and would rather their own vote not dilute the rate paid to everyone else. When a vlCVX voter opts out of a gauge, their vote for that gauge no longer earns a share of that gauge's incentives, and no longer dilutes the share paid to other voters.

Opting out is per gauge and per registry: a Curve gauge is declared on the Curve registry, an f(x) gauge on the f(x) registry. An opt-out never expires — it stands until the voter opts back in.

### For vlCVX voters who wish to opt out

vlCVX voters can find the Reward Opt-Out feature on the **My Votium** page. You may select any number of gauges from Curve or f(x) to opt out of.

The registries follow vlCVX epoch numbers, and any change takes effect in the **following** epoch. A voter who wants to opt out of, or back into, a gauge must therefore do so before the vote begins — much like delegation already works today. A change made while a vote is already open applies to the *next* vote, not the one in progress.

Opting out requires holding at least **100 vlCVX** at the epoch the change takes effect. Opting back in has no minimum and no gauge requirements, so a gauge that is later de-listed can never leave you stuck opted out of it.

Protocols that vote from a smart contract which lacks the capability of interacting with the registries may reach out to the Votium team directly to have their contract added or removed manually.

### For automated voters and reward distributors

The registries can be found at the following mainnet addresses:

* Curve: `0x5A5c248B39702E1A35bB854858B4Ae729D9c4405`
* f(x): `0x42dC5034C0699e98e2e5c0106B913c42810a618e`

Both went live in **epoch 240**. Epochs are vlCVX epoch indices, used verbatim.

#### Reading the exclusion list

`optOutCountAtEpoch(address _gauge, uint256 _epoch) external view returns (uint256)` — number of excluded addresses for one gauge. `O(log n)`, and it cannot fail on a gauge that the list functions below are too large for. Use it as a pre-flight and as a cross-check.

`optOutCountsAtEpoch(address[] calldata _gauges, uint256 _epoch) external view returns (uint256[] memory counts)` — the same, batched. Pass every gauge with deposits and get the number of excluded addresses for each one.

`optOutAtEpoch(address _gauge, uint256 _epoch) external view returns (address[] memory users)` — the full list of addresses excluded for a given gauge.

`optOutAtEpochFrom(address _gauge, uint256 _epoch, uint256 _startIndex, uint256 _maxScan) external view returns (address[] memory users, uint256 nextIndex, bool done)` — gas-safe step-over version of `optOutAtEpoch`. Call repeatedly, passing back `nextIndex`, and size the walk with `gaugeMemberCount(address _gauge)`.

{% hint style="danger" %}
**A read that fails means the gauge is too large — not that the list is empty.**

`optOutAtEpoch` has no size cap: on a large gauge it runs out of gas rather than reverting by name. Treating that as an empty set pays out to exactly the voters who asked to be excluded.

Cross-check every result against `optOutCountAtEpoch`, and switch to `optOutAtEpochFrom` when the whole-list read does not fit. Concatenating every window reproduces `optOutAtEpoch` exactly, and the totals must match the count.
{% endhint %}

{% hint style="warning" %}
**Loop `optOutAtEpochFrom` until `done` is true, not until the result is empty.**

A window containing no matches returns an empty array with `done` still `false`. Stopping there silently excludes nobody.
{% endhint %}

#### Reading withheld voting power

`withheldWeightAtEpoch(address _gauge, uint256 _epoch) external view returns (uint256)` — the vlCVX amount being excluded from a gauge, in 18 decimals, directly subtractable from the gauge total Convex reports. The registry does the whole calculation: it gathers the excluded list itself and resolves each address's votes and delegate contributions.

`withheldWeightForUsers(address _gauge, uint256 _epoch, address[] calldata _users) external view returns (uint256)` — gas-safe step-over version, taking a list of opted-out users and returning their total excluded amount. Pair it with slices from `optOutAtEpochFrom`.

Every address passed must genuinely be excluded from that gauge at that epoch, and none may repeat; both are enforced, since either would overstate what to withhold.

{% hint style="info" %}
**`withheldWeight*` accepts only epochs that carry a proposal.**

Gauge votes run on alternating epochs. An epoch without one reverts `OddEpoch` — note that the list and count functions above accept any epoch, so this restriction does not apply uniformly across the API.
{% endhint %}

#### Why not compute withheld weight yourself

The withheld figure is not simply the sum of each excluded voter's vlCVX balance. For every excluded address it counts the share of that address's own vote that went to this gauge, **plus** the share its delegate cast on its behalf. Both apply at once — an address can vote for itself and still have delegated weight counted through its delegate. Reproducing this offchain means replicating the delegation sync rules; the registry does it for you.

#### Epoch ranges

Queries outside the readable range **revert rather than returning empty**, so that a pre-deployment epoch is never mistaken for a verified "nobody opted out":

* below epoch 240 — reverts `PreDeployEpoch`
* above `currentEpoch() + 1` — reverts `FutureEpoch`

The first epoch that can report non-zero withheld weight is **242**. The registries went live during epoch 240, so the earliest an exclusion could take effect is 241, which carries no proposal. Epoch 240 returns a legitimate `0`.

Answers for settled epochs are immutable — an opt-out is never retroactive — so past results can be cached permanently.

#### Applying it

For the purpose of automated voting, a gauge's $/vlCVX should be calculated using the total vote weight reported by Convex, minus the `withheldWeight` reported by the opt-out registry.


# Contract Addresses

* Voter Proxy (\&Delegation Address): [0xde1E6A7ED0ad3F61D531a8a78E83CcDdbd6E0c49](https://etherscan.io/address/0xde1E6A7ED0ad3F61D531a8a78E83CcDdbd6E0c49)
* Votium v2: [0x63942E31E98f1833A234077f47880A66136a2D1e](https://etherscan.io/address/0x63942E31E98f1833A234077f47880A66136a2D1e)
* Votium(old): [0x19BBC3463Dd8d07f55438014b021Fb457EBD4595](https://etherscan.io/address/0x19bbc3463dd8d07f55438014b021fb457ebd4595)
* MultiMerkleStash: [0x378Ba9B73309bE80BF4C2c027aAD799766a7ED5A](https://etherscan.io/address/0x378ba9b73309be80bf4c2c027aad799766a7ed5a)
* StashController: [0x9d37A22cEc2f6b3635c61C253D192E68e85b1790](https://etherscan.io/address/0x9d37A22cEc2f6b3635c61C253D192E68e85b1790)
* VotiumVeCRV: [0xB4Fb1FD4AEC780BC255bF231189E9A244475d260](https://etherscan.io/address/0xB4Fb1FD4AEC780BC255bF231189E9A244475d260)
* veCRV Merkle Stash: [0x34590960981f98b55d236b70E8B4d9929ad89C9c](https://etherscan.io/address/0x34590960981f98b55d236b70E8B4d9929ad89C9c)
* veCRV Stash Controller: [0x496E2D5697af7754acfF7bB1175bBd0E76b8A0B9](https://etherscan.io/address/0x496E2D5697af7754acfF7bB1175bBd0E76b8A0B9)


# Rewards/Fees

## Current Rewards & Fees Structure

### vlCVX-veCRV incentives:

* 98% of the incentives are distributed among the voters according to their share of the voting power.
* 2% of the incentives go to Votium as a maintenance fee.

### vlCVX-FXN incentives:

* 96% of the incentives are distributed among the voters according to their share of the voting power.
* 4% of the incentives go to Votium as a maintenance fee.


# vlCVX FAQ

**vlCVX** holders are free to [delegate ](https://snapshot.org/#/delegate/cvx.eth/votium.eth)to Votium if they wish for the platform to vote for them to receive incentives.

Q. **Is there a short guide on how to use Votium?**

A. [Quickstart Guide](/explainers/quickstart-guide)

Q. **When are Votium rounds live?**

A. Votium rounds are live when the Convex gauge vote proposals are live, bi-weekly, on Thursday 00:00 UTC until Tuesday 00:00 UTC. You can delegate to Votium to vote for you or vote manually in that time window.

**Q. Do I have to delegate to Votium in order to receive incentives?**

A. No. You can vote yourself for any incentive you'd like, whether delegated or not. If you choose to delegate to Votium, we will vote for you. Votium will try to vote optimally for delegators, so that they would receive the best possible return for their votes. 5% of Votium's delegation power will be used to vote for the cvxCRV pool.

**Q. Can I vote myself if I'm delegated?**

A. Yes. Voting on a proposal will temporarily prohibit delegation for said proposal. You are still delegated to Votium for all other and future proposals.

**Q. How often do I have to delegate?**

A. Once. Your delegation is registered even if you lock more CVX, unlock CVX, sell it, buy more, etc. You only have to delegate again if you choose to remove your delegation through the Convex site.

**Q. When do I have to lock/delegate my CVX in order to be eligible for the incentives?**

A. Gauge weight votes are bi-weekly, starting Thursdays at 00:00 UTC and ending on Tuesdays 00:00 UTC. To be eligible for the incentive will you will have to lock before the proposal starts. For Votium to vote for you you will have to delegate before the proposal starts. If you have locked before the aforementioned time window, but did not delegate before it, please vote manually this proposal to be eligible for an incentive.

**Q. Where can I see the incentives for the next proposal?**

A.  The current incentives appear on the [Votium website](https://votium.app/). Displayed incentives are for the current gauge vote or, if already ended, the next gauge vote.

**Q. When are the rewards airdropped?**

A. Incentives will be distributed within 24h-48h from the proposal's end, and are given to whoever delegated to Votium/voted for incentivised pools on Convex. If you are using any third party tools, you will need to claim using their user interface.

**Q. Do I have to claim my incentive immediately?**

A. No. After the incentives are airdropped, they are yours to claim whenever, you can wait for rewards to stack in order to pay less gas when claiming.


# Risks

## Voters

Your **CVX/CRV** is NEVER staked on Votium, and we have no control over your funds.

Your locked CVX is always on Convex's smart contracts, therefore you are not exposed to any extra smart contract risks when using Votium, excluding the following:

1. If you choose to delegate, you will need to interact with the delegation function on Convex's own smart contract.
2. Claiming auction rewards via the Votium Merkle airdrop smart contract.

Interacting with a smart contract always introduces risks. Votium is experimental software provided "as is", use at your own discretion.

## Buyers

Buyers are exposed to smart contract risk by interacting with and depositing their incentive to the auction contract.

The methods of depositing and distributing incentives are very simple. Incentives will be distributed via an updateable merkle airdrop contract used by Sushi and others. Contracts will be available on GitHub and on Etherscan for review.

Interacting with a smart contract always introduces risks. Votium is experimental software provided "as is", use at your own discretion.


# Disclaimers

Please be aware of the following before depositing an incentive:

## Convex incentivisers:

1. Pools with less than 0.01% of the total votes on the Convex vote will not get any veCRV allocation.
2. You are responsible for being aware of all [Convex voting rules](https://docs.convexfinance.com/convexfinance/general-information/voting-and-gauge-weights) and keeping up with any changes to these rules. All deposits will be distributed to voters of the selected pool regardless of final veCRV vote impact.
3. Votium also offers a delegation service for vlCVX holders. If you're a buyer, anyone who votes for your desired pool, whether delegated or not, is eligible for a share of your deposited incentive. As for Votium's delegation vote, we take into consideration the current vote totals and may not allocate as many votes if the rewards are already diluted. We also reserve a small allocation for Convex pools, for the betterment of the Convex ecosystem.

Interacting with a smart contract always introduces risks. Votium is experimental software provided "as is", use at your own discretion.


# Audits

Votium has had an external audit performed by Blockian.

Minimizing contract security risk has been a primary focus. For a better understanding of risks involved with using Votium, please refer to the [Risks](/faq/risks) page.


# Multisig Admin Rights

Please note these describe functions in the original Votium contract. This page will be updated for v2 soon.\
\
Votium contract methods with special permissions fall under two categories:

* Multisig Admin functions
* Single-sign team only functions

All methods that control user funds fall under the Multisig Admin category.

These methods include:

```
VotiumBribe.sol
- setWhitelistRequired(bool)
    Sets requirement for erc20 bribes to be whitelisted first
    Default: true (whitelist required)
    Emits event `WhitelistRequirement(bool _requireWhitelist)`

- updateFeeAddress(address)
    Changes the address in which maintenance fees are sent

- updateFeeAmount(uint256)
    Allows the maintenance fee to be adjusted between 0% and 4%
    There is a hard limit of 4% that cannot be exceeded
    Emits event `UpdatedFee(uint256 _feeAmount)`

- modifyTeam(address, bool)
    Grants or removes permission for single-sign team address roles
    This method triggers the event `ModifiedTeam(address _member, bool _approval)`

- updateDistributor(address, address)
    Updates individual erc20 distribution contract address
    Emits event `UpdatedDistributor(address indexed _token, address _distributor)`



MerkleDistributor.sol
- freeze()
    Pause claims while merkle root is being updated

- unfreeze()
    Resume claims after merkle root update

- updateMerkleRoot(bytes32)
    Updates merkle root for claims and increments the update index
    Emits event 
    `MerkleRootUpdated(bytes32 indexed merkleRoot, uint256 indexed update)`
    
    
    
VotiumVeCRV.sol

- unlistToken(address)
    Disallows a token from being deposited in the future

- updateFeeAddress(address)
    Changes the address in which maintenance fees are sent

- updateFeeAmount(uint256)
    Allows the maintenance fee to be adjusted between 0% and 4%
    There is a hard limit of 4% that cannot be exceeded
    Emits event `UpdatedFee(uint256 _feeAmount)`

- modifyTeam(address, bool)
    Grants or removes permission for single-sign team address roles
    This method triggers the event `ModifiedTeam(address _member, bool _approval)`

- updateDistributor(address, address)
    Updates distribution contract address
    Emits event `UpdatedDistributor(address _distributor)`

- updateGaugeController(address)
    Updates Curve gauge controller (Used only for gauge address verification)
```

Single-sign team methods are limited to functions which do not pose a risk to user funds:

```
VotiumBribe.sol

- initiateProposal(bytes32, uint256, uint256)
    Registers a new proposal id, deadline, and max choice index.
    Requires that the same id has not been previously registered,
    and that the bribing deadline is in the future
    Emits event `Initiated(bytes32 _proposal)`


- approveDelegationVote(bytes32)
    Approves a msg hash for EIP1271 vote casting

- transferToDistributor(address)
    If there is an existent token balance and a distributor address set by
    multisig, the balance is forwarded to the distributor address

- whitelistToken(address) / whitelistTokens(address[])
    Add an individual token or multiple tokens to the whitelist registry
    Emits `event Whitelisted(address _token)`
    

VotiumVeCRV.sol

- listToken(address)

- listTokens(address[])
    Allows a token or tokens to be accepted for future deposits

```


