Profit Pools Spec [WIP] - SetProtocol/set-protocol-contracts GitHub Wiki
Taker Considerations
- How to efficiently aggregate liquidity across the different pools (infinite loop problem)
- It would suck if you have to approve to every single ProfitPool. Or need to send funds to every profit pool. It's a for loop of transfers
- Initially, there can be a low variety of ProfitPool spreads for few markets (e.g. 1% and 0.5%)
- However, there should be discovery of these markets. (Maybe only allow 20 basis point increments to limit queue size)
- Should be cheap & easy to calculate / derive blended cost and single source of approvals for all pairs. Starting to think that the factory should own approvals all the state.
- Oracle + Pair -> Spread (Usually oracles work only for a specific pair)
Properties
- Use the price feed / oracle you trust (as long as ETH/token pair)
- Tokenized and pooled positions of the same pair / spread
- Activity-based yield with defined requirements
Risks
- Oracle corruption
- Market / Oracle lag time
Smart Contracts
- ProfitPool: Smart contract with a defined token pair and spread requirements. Lower spreads should result in more activity. Higher spreads means lower activity
- ProfitPoolFactory: Used to add ProfitPools of new spread requirements. Each profit pool factory is linked to a certain oracle. Arbitrary token pairs don't really matter
ProfitPoolFactory
Design
- LinkedList to track spread tokens
- Stores balances of ProfitPools
- Serves as source of approval and transfers
State
- oracle
- tokenA
- tokenB
- spread -> address
State
ProfitPool.sol is ERC20
State
- tokenA
- tokenB
- spread
- AToBOracle
Functions
constructor(tokenA, tokenB, spread, oracleAddress)
Sets the above
deposit(uint256 quantity) payable external
Deposits the specified pool token quantities of the specified quantity and generates a token based on the contribution.
withdraw(uint256 quantity) payable external
Burns the representative token and withdraws the current available mix.
use(address token, uint256 quantity)
- Calls an external function smart contract that retrieves the quantity of tokens
- Validates that the required spread is made - based on the oraclePrice