Iād like to summarise where this discussion has gone so far, by writing down concretely what the spec is that we want from this smart treasury.
Smart Treasury Candidate v0.1
The smart treasury will be built using a balancer smart pool which allows flexible parameter changes of the pool, as the needs of the protocol change over time.
- Tokens: IDLE, ETH,
- Weights (Initial): 99/1 (IDLE/ETH) [Gradually adjusted after bootstrapping]
- WeightsAfter3Months: 90/10 (IDLE/ETH)
- SwapFee: 0.5% (pending snapshot vote completion)
- UseWhiteList: False
- CanChangeSwapFee: True
- CanChangeWeights: True
- MinimumGradualUpdateDurationForSwapFee: 3 days
- CanChangeTokens: True
- AddTokenLockTime: 3 days
- CanLimitBPTSupply: False
Bootstrapping Mechanism Candidate v0.1
The mechanism for initially funding the smart treasury using the ecosystem fund, and fee treasury.
- Withdraw 130,000 IDLE from ecosystem fund (representing 1% of supply)
- Convert all assets in FeeTreasury to ETH
- If ETH value != 1,300 IDLE (1% of 130,000), sell UP TO 1300 IDLE on the open market until ETH value is equivalent to 1% of IDLE deposit
- Deposit IDLE & ETH into the pool, bootstrapping the smart treasury.
This will probably need to be written as a smart contract too.
There will need to be an IDLE and ETH oracle in order to do this calculation. I suggest a 7-day average of uniswap price.
Fee Collection Candidate v0.1
All idletokens (ie IdleUSDCYield, IdleDAIRisk ā¦) have the fee address pointing to FeeCollectionContract.
This is the minimum interface which the contract needs to implement.
interface FeeCollectionContract {
function deposit () {}
function setSplitRatio(uint ratio) {} // ratio of fees sent SmartTreasury vs FeeTreasury
function setFeeTreasuryAddress(address newFeeTreasuryAddress) {}
function setSmartTreasuryAddress(address newSmartTreasuryAddress) {}
function addAddressToWhiteList(address addressToAdd) {}
function removeAddressFromWhiteList(address addressToRemove) {}
function addTokenToDepositList(address tokenAddress){}
function removeTokenFromDepositList(address tokenAddress) {}
function setAdmin(address newAdmin) {}
}
This contract will keep track of tokens which IDLE can collect fees in, such as DAI, USDC, COMP, WBTC.
- deposit() should only be called by a whitelisted address, according to the split ratio, a portion will be directly sent to the Fee Treasury, the other portion will be converted to ETH, and added to the balancer SmartTreasury.
- SetSplitRatio() Set what portion of fees as sent to SmartTreasury vs the regular FeeTreasury.
I think initially the admin should be set to a dev multisig account, in case there is anything that they need to do to get this contract ready, and after that itās ownership can be transferred to governance.
I think the initial split ratio should be 80%, this, of course, can be adjusted over time by future governance.
Where to go from here
As a community, we should debate these parameters, and specs until we are happy with the requirements, then we can move onto the next phase.