diff --git a/src/core/ElasticDAO.sol b/src/core/ElasticDAO.sol index 9bf2396..07acb24 100644 --- a/src/core/ElasticDAO.sol +++ b/src/core/ElasticDAO.sol @@ -2,15 +2,18 @@ pragma solidity 0.7.2; pragma experimental ABIEncoderV2; +import '../interfaces/IUniswapV2Pair.sol'; + import '../libraries/ElasticMath.sol'; import '../models/DAO.sol'; import '../models/Ecosystem.sol'; import '../models/Token.sol'; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import '@pie-dao/proxy/contracts/PProxy.sol'; +import 'hardhat/console.sol'; /** * @dev The ElasticDAO contract outlines and defines all the functionality @@ -23,6 +26,7 @@ contract ElasticDAO is ReentrancyGuard { address public ecosystemModelAddress; address public controller; address[] public summoners; + address[] public liquidityPools; bool public initialized; event ElasticGovernanceTokenDeployed(address indexed tokenAddress); @@ -35,6 +39,8 @@ contract ElasticDAO is ReentrancyGuard { uint256 actualAmount ); event JoinDAO(address indexed memberAddress, uint256 shareAmount, uint256 ethAmount); + event LiquidityPoolAdded(address indexed poolAddress); + event LiquidityPoolRemoved(address indexed poolAddress); event SeedDAO(address indexed summonerAddress, uint256 amount); event SummonedDAO(address indexed summonedBy); @@ -129,6 +135,17 @@ contract ElasticDAO is ReentrancyGuard { require(success, 'ElasticDAO: Build DAO Failed'); } + function addLiquidityPool(address _poolAddress) + external + onlyController + nonReentrant + returns (bool) + { + liquidityPools.push(_poolAddress); + + emit LiquidityPoolAdded(_poolAddress); + } + /** * @notice initializes the token of the DAO * @@ -199,6 +216,14 @@ contract ElasticDAO is ReentrancyGuard { emit ExitDAO(msg.sender, _deltaLambda, ethToBeTransfered); } + /** + * @notice this function returns the length of the liquidity pools array + * + */ + function getLiquidityPoolCount() public view returns (uint256) { + return liquidityPools.length; + } + /** * @notice this function is used to join the DAO after it has been summoned * Joining the DAO is syntactically equal to minting _deltaLambda for the function caller. @@ -253,6 +278,10 @@ contract ElasticDAO is ReentrancyGuard { bool success = tokenContract.mintShares(msg.sender, token.maxLambdaPurchase); require(success, 'ElasticDAO: Mint Shares Failed during Join'); + for (uint256 i = 0; i < liquidityPools.length; i += 1) { + IUniswapV2Pair(liquidityPools[i]).sync(); + } + // return extra ETH if (success && msg.value > deltaE) { (success, ) = msg.sender.call{ value: SafeMath.sub(msg.value, deltaE) }(''); @@ -298,6 +327,22 @@ contract ElasticDAO is ReentrancyGuard { } } + function removeLiquidityPool(address _poolAddress) + external + onlyController + nonReentrant + returns (bool) + { + for (uint256 i = 0; i < liquidityPools.length; i += 1) { + if (liquidityPools[i] == _poolAddress) { + liquidityPools[i] = liquidityPools[liquidityPools.length - 1]; + liquidityPools.pop(); + } + } + + emit LiquidityPoolRemoved(_poolAddress); + } + /** * @notice rewards @param _addresess with @param _amounts respectively * diff --git a/src/core/ElasticDAOFactory.sol b/src/core/ElasticDAOFactory.sol index 1b157c2..ca5dd8e 100644 --- a/src/core/ElasticDAOFactory.sol +++ b/src/core/ElasticDAOFactory.sol @@ -5,7 +5,7 @@ pragma experimental ABIEncoderV2; import './ElasticDAO.sol'; import '../models/Ecosystem.sol'; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import '@pie-dao/proxy/contracts/PProxy.sol'; diff --git a/src/interfaces/IUniswapV2Pair.sol b/src/interfaces/IUniswapV2Pair.sol new file mode 100644 index 0000000..cf29237 --- /dev/null +++ b/src/interfaces/IUniswapV2Pair.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPLv3 +pragma solidity 0.7.2; + +interface IUniswapV2Pair { + function sync() external; +} diff --git a/src/models/DAO.sol b/src/models/DAO.sol index 293a095..ff59f73 100644 --- a/src/models/DAO.sol +++ b/src/models/DAO.sol @@ -2,7 +2,7 @@ pragma solidity 0.7.2; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import './Ecosystem.sol'; import './EternalModel.sol'; diff --git a/src/models/Ecosystem.sol b/src/models/Ecosystem.sol index 45c33e4..9dde4b6 100644 --- a/src/models/Ecosystem.sol +++ b/src/models/Ecosystem.sol @@ -2,7 +2,7 @@ pragma solidity 0.7.2; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import './EternalModel.sol'; diff --git a/src/models/Token.sol b/src/models/Token.sol index 6fb7c1d..e671023 100644 --- a/src/models/Token.sol +++ b/src/models/Token.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPLv3 pragma solidity 0.7.2; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import './Ecosystem.sol'; import './EternalModel.sol'; diff --git a/src/models/TokenHolder.sol b/src/models/TokenHolder.sol index 3518045..7c27550 100644 --- a/src/models/TokenHolder.sol +++ b/src/models/TokenHolder.sol @@ -2,7 +2,7 @@ pragma solidity 0.7.2; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import './Ecosystem.sol'; import './EternalModel.sol'; diff --git a/src/tokens/ElasticGovernanceToken.sol b/src/tokens/ElasticGovernanceToken.sol index e1847cf..772d7aa 100644 --- a/src/tokens/ElasticGovernanceToken.sol +++ b/src/tokens/ElasticGovernanceToken.sol @@ -12,7 +12,7 @@ import '../models/Ecosystem.sol'; import '../models/Token.sol'; import '../models/TokenHolder.sol'; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; /** * @dev ElasticGovernanceToken contract outlines and defines all the functionality