diff --git a/content/sips/sip-390.md b/content/sips/sip-390.md new file mode 100644 index 000000000..fad43462f --- /dev/null +++ b/content/sips/sip-390.md @@ -0,0 +1,110 @@ +--- +sip: 390 +title: Delegate governance power from collateral token deposited in Synthetix +network: Ethereum, Optimism, Base & Arbitrum +status: Draft +type: Governance +author: GUNBOATs (@gunboatsss) +created: 2024-05-31 +--- + + + + +## Simple Summary + + + +Enable Synthetix to delegate governance power from token deposited in the system to any address set by governance. + +## Abstract + + + +Add `address delegatee` in `CollateralConfiguration.Data` field and a function call `delegate(address delegatee)` to token when `delegatee` is not set to `address(0)` + +## Motivation + + + +As Arbitrum deployment is accepting ARB as collateral, there is an opportunity to use the governance power in the token to vote on proposals. This could be set to delegate to multisig of Ambassador Council multisig. + +## Specification + + + +### Overview + + + +Add a call to delgate to token when address is not `address(0)` + +### Rationale + + + +As collateral configuration is already exists, the delegation can be piggybacked on top in V3 system. Not all token has delegate function and calling it will revert. Those cases will just have `delegatee` set as `address(0)`. In case of giving up voting power, the governance can change the address into dead address. + +### Technical Specification + + + +Add `IVotes` interface which is used by many governance token as following. + +```solidity +interface IVotes { + function delegate(address delegatee) external; +} +``` + +In `CollateralConfugration.Data` struct, add the following. +```diff +library CollateralConfiguration { + struct Data { + ... ++ address delegatee; + } +} +``` + +In `set` function, add the following. +```diff +function set(Data memory config) internal { + ... + if (config.issuanceRatioD18 < config.liquidationRatioD18) { + revert ParameterError.InvalidParameter( + "issuanceRatioD18", + "must be greater than liquidationRatioD18" + ); + } + ++ if(config.delegatee != address(0)) { ++ IVotes(config.tokenAddress).delegate(config.delegatee); ++ } + ... + storedConfig.depositingEnabled = config.depositingEnabled; ++ storedConfig.delegatee = config.delegatee; +} +``` +### Test Cases + + + +When `delegatee` is not `address(0)` + * it should call `delegate(address)` with `delegatee` as parameter. + * otherwise do nothing. + +### Configurable Values (Via SCCP) + + + +`address delegatee` a address to delegate to. +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).