---
# System prepended metadata

title: Bali Upgrade Reference

---

# Bali Upgrade Reference


## New options for contract deployment params
- `Token.reservedUntilTokenId`
    - Reserve N tokens for claiming via an authorized minter.
    - For colleciton plus this option will be set to the original tokens total supply
- `Token.metadataRenderer`
    - The address of an alternate metadata renderer to use with this DAO.
    - Defaults to the standard renderer in address 0 is provided
- `Auction.founderRewardRecipent`
    - The address to send founder protocol rewards to
- `Auction.founderRewardBPS`
    - The percentage of each bid a founder will recieve in Basis Points


## How to use the new minters
To use a minter it must be set with `Token.updateMinters`.

### MerkleReserveMinter
- initilize with `setMintSettings` 
    - `mintStart` the timestamp for minting to start
    - `mintEnd` the timestamp for minting to end
    - `pricePerToken` the price for one token in wei
    - `merkleRoot` the merkle root to use for the allow list
- `function mintFromReserve(address tokenContract, MerkleClaim[] calldata claims)`
    - pass the DAOs token contract as `tokenContract`
    - pass an array of `MerkleClaim` as `claims`
        - `mintTo`: user to mint tokens to
        - `tokenId`: selected token to claim
        - `merkleProof`: the generated merkle proof for a claim generated from abi.encode(mintTo, tokenId) as the leaf
- When using this minter it is possible for early claimers to frontrun governance which could be critical if a DAO has no veto set. to mitigate this be sure to call `updateDelayedGovernanceExpirationTimestamp` on the `Governor` contract and set a `_newDelayedTimestamp` of at least 24 hours after `mintStart`.
- A service like https://lanyard.org/ can be used to create merkle roots / proofs

## How to use a custom metadata renderer
- provide an address via `Token.metadataRenderer` when creating a new DAO. call the initilization function on the new metadata renderer proxy once deployed. 
- to build a custom renderer follow examples in this repo: https://github.com/neokry/builder-renderers (these are unaudited use at your own risk)
- if a custom renderer is set after DAO deployment be sure that all calls to `tokenURI` with current tokenIds will not revert. THIS WILL CAUSE ISSUES if `tokenURI` reverts

## How to use protocol rewards for auctions
- call `createBidWithReferral` on the auction contract and pass in a `_referral` address. 
- 2.5% of the auction bid will go to the `_referral` address of the winning bid
- if `founderRewardRecipent` and `founderRewardBPS` the amount of `founderRewardBPS` in percent will be sent to the `founderRewardRecipent`. 

## How to claim protocol rewards
Users can claim protocol rewards via the `ProtocolRewards` contract with either of these functions
- `function withdraw(address to, uint256 amount)` to withdraw an `amount` from a users reward balance to a specified address `to`
- `function withdrawFor(address to, uint256 amount)` to withdraw an `amount` from a spcified account `to`