# Governance

## Contract Upgradeability

The Aavegotchi Contracts implement the [EIP-2535 Diamond Standard](https://github.com/ethereum/EIPs/issues/2535), a new standard for fully-upgradeable smart contracts.&#x20;

The mechanism for upgrading a Diamond is by calling [`diamondCut()`](https://eips.ethereum.org/EIPS/eip-2535#the-diamondcut-function) which takes arguments of functions to replace, and what functions to replace them with.&#x20;

Initially, the `diamondCut()` upgrade function will only be callable by the Aavegotchi Team Multisig, whose Signees consist of Aavegotchi core team members, advisors with interests aligned with Aavegotchi, and trusted community members.&#x20;

Upgrades will only be executed when a majority of the Signees believe the upgrades are beneficial to the Aavegotchi project and have been fully-vetted and reviewed by third-party auditors.&#x20;

**It is our full intention to eventually transfer access to the `diamondCut()` function to the AavegotchiDAO.** But this is a process of gradual decentralization. The DAO must be ready for this responsibility, or else the protocol will be at risk.&#x20;

## DAO-Only Functions

Although the AavegotchiDAO does not initially have access to upgrading the contracts, there are many functions within the `DAOFacet.sol` it can call:

Initially, the Aavegotchi Multisig `contractOwner` will also have access to these functions, but in a future update this access will be restricted.

Below are all of the functions callable by the AavegotchiDAO. For more details visit [DAOFacet.sol](https://docs.aavegotchi.com/developers/aavegotchi-contracts/extending-aavegotchi-contracts/broken-reference).&#x20;

1. `setDAO()` transfers access to a new DAO, in the case of a migration.&#x20;
2. `addCollateralTypes()` adds new whitelisted collaterals that will appear in Portals.&#x20;
3. `updateCollateralModifiers()` updates the trait modifiers of a certain collateral.
4. `createHaunt()` creates a new Haunt, consisting of a certain size, with a set price and a randomly-appearing `bodyColor` property. Note: The previous Haunt must be completed before `createHaunt()` can be called.
5. `mintItems()` creates items of a given `itemType` and `value` and transfers them to a given `to` address.&#x20;
6. `grantExperience()` increases the experience of the given Aavegotchis by a given amount.&#x20;
7. `addItemTypes()` Creates (but does not mint) new `itemTypes`. Must be called before minting items, if they have not been created previously.
8. `addItemTypesAndSvgs()` Creates (but does not mint) new `itemTypes` and adds their associated SVG files to contract memory. Must be called before minting items, if they have not been created previously.
9. `addWearableSets()` adds new Wearable sets with the given parameters.
10. `setGameManager()` Sets a game manager contract to manage Aavegotchi minigames.&#x20;
