# Governance & Crosschain

## InterestRate Ballot

#### `InterestRateBallot.cast(uint256 weight)`

Cast vote for the numerical value of the relative income percentage in Bishop NAV. `weight` is a number that should not exceed 1e18, representing 100%. To calculate the voting power the user, the function will synchronize its lock position with `VotingEscrow` contract.

## Controller Ballot

#### `ControllerBallot.cast(uint256[] weights)`

Cast a distribution of the user’s current voting power across all valid Tranchess funds, liquidity pools. and other eligible reward receivers. `weights` is an array of numbers that should sum up to 1e18, representing 100%. To calculate the voting power the user, the function will synchronize its lock position with `VotingEscrow` contract.

## VotingEscrow

This contract handles the main logic for creation, redemption and balance calculation of the vote-lock CHESS token `veCHESS`. `vecCHESS` is the governance token in Tranchess ecosystem. Users should lock up their CHESS token for a specified period of time in exchange for `veCHESS`. The balance of `veCHESS` diminishes linearly with respect to time for all users alike.

### Depositing/withdrawing veCHESS

#### `VotingEscrow.createLock(uint256 amount, uint256 unlockTime)`

Create a vote-lock position of `amount` CHESS expired at `unlockTime`. Note that the `unlockTime` must be at the end of a future week but cannot exceed the maximal allowed lock time `maxTimeAllowed`.

#### `VotingEscrow.increaseAmount(address account, uint256 amount)`

Increase the number of CHESS of an existing vote-lock position. Note that you cannot call `increaseAmount` upon an expired position; you will have to `withdraw` the previous position and use `createLock` to create a new position.

#### `VotingEscrow.increaseUnlockTime(uint256 unlockTime)`

Extend the expiration date of an existing vote-lock position. Note that you cannot call `increaseAmount` upon an expired position; you will have to `withdraw` the previous position and use `createLock` to create a new position.

#### `VotingEscrow.withdraw()`

Withdraw CHESS locked in expired positions.

### veCHESS Crosschain

#### `VotingEscrow.veChessCrossChain(uint256 amount, uint256 toChainID)`

Transfer `veCHESS` to the `VotingEscrow` on another chain specified by `toChainID` using Multichain’s AnyCall infrastructure. User should pay cross-chain fee in native currency (e.g. ETH on Ethereum) when calling this function. Exact fee amount can be queried from the AnyCall proxy contract, i.e. `IAnyCallV6Proxy(thisContract.anyCallProxy()).calcSrcFees(thisContract, toChainID, 96)`.
