Skip to content

Commit

Permalink
Squashed
Browse files Browse the repository at this point in the history
  • Loading branch information
Your Name committed Oct 13, 2024
1 parent a21538f commit d99e2e3
Show file tree
Hide file tree
Showing 41 changed files with 1,017 additions and 731 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,5 @@ cache
artifacts

example-arguments.ts

deployed.txt
43 changes: 26 additions & 17 deletions const.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,43 +29,47 @@ export const ERROR = {
"!utilizedERC20DepositOpen"
,
FEE_RATE_GOVERNANCE_GREATER_THAN_100_PERCENT:
"!(_feeRateGovernance + feeRateManager <= ONE_HUNDRED_PERCENT)"
"!(_feeRateGovernance)"
,
FEE_RATE_MANAGER_GREATER_THAN_100_PERCENT:
"!(_feeRateManager + feeRateGovernance <= ONE_HUNDRED_PERCENT)"
,
INVALID_STRATEGY_ALLOCATION_TOTAL:
"!(utilizedV1EMPStrategyAllocationTotal == ONE_HUNDRED_PERCENT)"
"!(_feeRateManager)"
,
INVALID_BALANCE:
"!(balanceOf(msg.sender) >= _eRC20Amount)"
,
INVALID_UTILIZED_ERC20_AMOUNT_LENGTH:
"!(utilizedV1EMPStrategy.length == _v1EMPStrategyUtilizedERC20Amount.length)"
,
INVALID_UTILIZED_STRATEGY_ALLOCAITON:
"!(utilizedERC20AmountAllocationActual == iV1EMP.utilizedV1EMPStrategy_allocation(utilizedV1EMPStrategy[i]))"
,
INVALID_STRATEGY_ERC20_AMOUNTS_LENGTH:
"!(_v1EMPStrategyERC20Amount.length == _utilizedV1EMPStrategy.length)"
,
INVALID_UTILIZED_ERC20_LENGTH:
"!(_utilizedERC20Amount.length == utilizedERC20.length)"
,
INVALID_STRATEGY_UTILIZED_ERC20_AMOUNT_LENGTH:
"!(_v1EMPStrategyUtilizedERC20Amount.length == _utilizedV1EMPStrategy.length)"
,
WITHDRAW_NOT_OPEN:
"!utilizedERC20WithdrawOpen"
,
AMOUNTS_VALIDATOR_FAILURE:
"!I_V1_EMP_UTILITY.v1EMPStrategyUtilizedERC20AmountValid(address(this), _v1EMPStrategyUtilizedERC20Amount)"
,
INVALID:
"!valid"
,
UTILIZED_ERC20_NOT_AVAILABLE:
"!(utilizedERC20Available)"
,
ADDRESS_NOT_EMP:
"!(I_V1_EMP_REGISTRY.v1EMP_v1EMPId(_v1EMP) > 0)"
"!(_I_V1_EMP_REGISTRY.v1EMP_v1EMPId(_v1EMP) > 0)"
,
},
EMP_UTILITY:
{
INVALID_ALLOCATION:
"!(utilizedERC20AllocationActual == _v1EMP_utilizedERC20_utilizationERC20[_v1EMP][utilizedERC20[i]].allocation)"
,
UTILIZED_V1_EMP_STRATEGY_INVALID_ALLOCATION:
"!(utilizedV1EMPStrategyAllocationTotal == _I_V1_EMP_REGISTRY.ONE_HUNDRED_PERCENT())"
,
INVALID_V1_EMP_STRATEGY:
"!(_I_V1_EMP_REGISTRY.v1EMPStrategy_v1EMPStrategyId(_v1EMPStrategy[i]) > 0)"
,
},
STRATEGY: {
DEPOSIT_NOT_OPEN:
Expand All @@ -75,7 +79,7 @@ export const ERROR = {
"!(address(iV1EMPStrategyInteractor) != address(0))"
,
INVALID_ERC20_ALLOCATION_TOTAL:
"!(utilizedERC20AllocationTotal == IV1EMPStrategy(msg.sender).ONE_HUNDRED_PERCENT())"
"!(utilizedERC20AllocationTotal == _I_V1_EMP_REGISTRY.ONE_HUNDRED_PERCENT())"
,
INVALID_BALANCE:
"!(eMP_equity[msg.sender] >= _eRC20Amount)"
Expand All @@ -102,7 +106,12 @@ export const ERROR = {
"!utilizedERC20WithdrawOpen"
,
ERC20_NO_ETH_VALUE_FEED_AVAILABLE:
"!(I_V1_EMP_REGISTRY.eRC20_v1EMPERC20ETHValueFeed(_utilizedERC20[i]) != address(0))"
"!(_I_V1_EMP_REGISTRY.eRC20_v1EMPERC20ETHValueFeed(_utilizedERC20[i]) != address(0))"
,
},
STRATEGY_UTILITY: {
ADDRESS_NOT_STRATEGY:
"!(_I_V1_EMP_REGISTRY.v1EMPStrategy_v1EMPStrategyId(_v1EMPStrategy) > 0)"
,
},
NOT_COMPUTED:
Expand Down
130 changes: 48 additions & 82 deletions contracts/V1EMP.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import { IAccessControlEnumerable } from "@openzeppelin/contracts/access/IAccess
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";

import { IERC20, IV1EMP, IV1EMPRegistry, IV1EMPUtility } from "./interface/IV1EMP.sol";
import { IERC20, IV1EMP } from "./interface/IV1EMP.sol";
import { IV1EMPRegistry } from "./interface/IV1EMPRegistry.sol";
import { IV1EMPStrategy } from "./interface/IV1EMPStrategy.sol";
import { IV1EMPUtility } from "./interface/IV1EMPUtility.sol";


contract V1EMP is
Expand All @@ -23,29 +25,14 @@ contract V1EMP is
bool public override utilizedERC20WithdrawFull;
bool public override utilizedERC20WithdrawOpen;

uint256 public constant override ONE_HUNDRED_PERCENT = 1e18;

uint256 public override feeRateGovernance;
uint256 public override feeRateManager;

IV1EMPRegistry public immutable override I_V1_EMP_REGISTRY;
IV1EMPUtility public immutable override I_V1_EMP_UTILITY;
IV1EMPRegistry internal immutable _I_V1_EMP_REGISTRY;
IV1EMPUtility internal immutable _I_V1_EMP_UTILITY;

mapping (address utilizedV1EMPStrategy => uint256 allocation) public override utilizedV1EMPStrategy_allocation;


receive ()
external
payable
{}


fallback ()
external
payable
{}


constructor (
address _manager,
address _v1EMPRegistry,
Expand All @@ -58,15 +45,15 @@ contract V1EMP is
manager = _manager;
utilizedERC20WithdrawFull = _utilizedERC20WithdrawFull;

I_V1_EMP_REGISTRY = IV1EMPRegistry(_v1EMPRegistry);
I_V1_EMP_UTILITY = IV1EMPUtility(I_V1_EMP_REGISTRY.v1EMPUtility());
_I_V1_EMP_REGISTRY = IV1EMPRegistry(_v1EMPRegistry);
_I_V1_EMP_UTILITY = IV1EMPUtility(_I_V1_EMP_REGISTRY.v1EMPUtility());
}


modifier authGovernanceOrManager()
{
require(
msg.sender == manager || IAccessControlEnumerable(I_V1_EMP_REGISTRY.GOVERNANCE()).hasRole(bytes32(0), msg.sender),
msg.sender == manager || IAccessControlEnumerable(_I_V1_EMP_REGISTRY.GOVERNANCE()).hasRole(bytes32(0), msg.sender),
"!authorized"
);

Expand Down Expand Up @@ -103,10 +90,10 @@ contract V1EMP is
public
authGovernanceOrManager()
{
require(
_feeRateManager + feeRateGovernance <= ONE_HUNDRED_PERCENT,
"!(_feeRateManager + feeRateGovernance <= ONE_HUNDRED_PERCENT)"
);
if (feeRateGovernance + _feeRateManager > _I_V1_EMP_REGISTRY.ONE_HUNDRED_PERCENT())
{
revert("!(_feeRateManager)");
}

feeRateManager = _feeRateManager;
}
Expand All @@ -116,12 +103,12 @@ contract V1EMP is
public
override
{
require(IAccessControlEnumerable(I_V1_EMP_REGISTRY.GOVERNANCE()).hasRole(bytes32(0), msg.sender), "!authorized");
require(IAccessControlEnumerable(_I_V1_EMP_REGISTRY.GOVERNANCE()).hasRole(bytes32(0), msg.sender), "!authorized");

require(
_feeRateGovernance + feeRateManager <= ONE_HUNDRED_PERCENT,
"!(_feeRateGovernance + feeRateManager <= ONE_HUNDRED_PERCENT)"
);
if (_feeRateGovernance + feeRateManager > _I_V1_EMP_REGISTRY.ONE_HUNDRED_PERCENT())
{
revert("!(_feeRateGovernance)");
}

feeRateGovernance = _feeRateGovernance;
}
Expand All @@ -144,26 +131,30 @@ contract V1EMP is
{
utilizedERC20Update();

(bool valid, uint256 utilizedERC20AmountTotalETHValue) = I_V1_EMP_UTILITY.utilizedERC20AmountValid(
(
bool valid,
uint256 utilizedERC20AmountTotalETHValue,
string memory message
) = _I_V1_EMP_UTILITY.utilizedERC20AmountValid(
address(this),
_utilizedERC20Amount
);

require(valid, "!valid");
require(valid, message);

address[] memory _utilizedERC20 = I_V1_EMP_UTILITY.v1EMP_utilizedERC20(address(this));
address[] memory _utilizedERC20 = _I_V1_EMP_UTILITY.v1EMP_utilizedERC20(address(this));

for (uint256 i = 0; i < _utilizedERC20.length; i++)
{
IERC20(_utilizedERC20[i]).transferFrom(msg.sender, address(this), _utilizedERC20Amount[i]);
}

uint256 mintAmountManager = utilizedERC20AmountTotalETHValue * feeRateManager / ONE_HUNDRED_PERCENT;
uint256 mintAmountManager = utilizedERC20AmountTotalETHValue * feeRateManager / 1e18;

uint256 mintAmountGovernancePayTo = utilizedERC20AmountTotalETHValue * feeRateGovernance / ONE_HUNDRED_PERCENT;
uint256 mintAmountGovernancePayTo = utilizedERC20AmountTotalETHValue * feeRateGovernance / 1e18;

_mint(manager, mintAmountManager);
_mint(I_V1_EMP_REGISTRY.governancePayTo(), mintAmountGovernancePayTo);
_mint(_I_V1_EMP_REGISTRY.governancePayTo(), mintAmountGovernancePayTo);
_mint(msg.sender, utilizedERC20AmountTotalETHValue - mintAmountManager - mintAmountGovernancePayTo);
}

Expand All @@ -181,9 +172,9 @@ contract V1EMP is
public
override
{
I_V1_EMP_UTILITY.utilizedERC20Update();
_I_V1_EMP_UTILITY.utilizedERC20Update();

address[] memory __utilizedERC20 = I_V1_EMP_UTILITY.v1EMP_utilizedERC20(address(this));
address[] memory __utilizedERC20 = _I_V1_EMP_UTILITY.v1EMP_utilizedERC20(address(this));

for (uint256 i = 0; i < _utilizedV1EMPStrategy.length; i++)
{
Expand All @@ -207,33 +198,19 @@ contract V1EMP is

require(balanceOf(msg.sender) >= _eRC20Amount, "!(balanceOf(msg.sender) >= _eRC20Amount)");

bool utilizedERC20Available = true;

utilizedERC20Update();

address[] memory _utilizedERC20 = I_V1_EMP_UTILITY.v1EMP_utilizedERC20(address(this));

uint256[] memory _utilizedERC20TotalAmount = I_V1_EMP_UTILITY.utilizedERC20TotalBalance(address(this));

uint256[] memory transferAmount = new uint256[](_utilizedERC20.length);

for (uint256 i = 0; i < _utilizedERC20.length; i++)
{
require(totalSupply() != 0, "!(totalSupply() != 0)");

transferAmount[i] = _utilizedERC20TotalAmount[i] * 1e18 / totalSupply() * _eRC20Amount / 1e18;

if (IERC20(_utilizedERC20[i]).balanceOf(address(this)) < transferAmount[i])
{
utilizedERC20Available = false;

break;
}
}
(
bool utilizedERC20Available,
uint256[] memory transferAmount
) = _I_V1_EMP_UTILITY.utilizedERC20AvailableAndTransferAmount(
address(this),
_eRC20Amount
);

if (utilizedERC20Available)
{
for (uint256 i = 0; i < _utilizedERC20.length; i++)
for (uint256 i = 0; i < _I_V1_EMP_UTILITY.v1EMP_utilizedERC20(address(this)).length; i++)
{
transfer(msg.sender, transferAmount[i]);
}
Expand All @@ -251,9 +228,7 @@ contract V1EMP is

for (uint256 i = 0; i < _utilizedV1EMPStrategy.length; i++)
{
v1EMPStrategyERC20Amount[i] = _eRC20AmountPercentOfTotalSupply * IV1EMPStrategy(
_utilizedV1EMPStrategy[i]
).eMP_equity(
v1EMPStrategyERC20Amount[i] = _eRC20AmountPercentOfTotalSupply * IV1EMPStrategy(_utilizedV1EMPStrategy[i]).eMP_equity(
address(this)
) / 1e18;
}
Expand Down Expand Up @@ -288,15 +263,12 @@ contract V1EMP is
override
utilizedERC20DepositOpenRequired()
{
require(
_v1EMPStrategyUtilizedERC20Amount.length == _utilizedV1EMPStrategy.length,
"!(_v1EMPStrategyUtilizedERC20Amount.length == _utilizedV1EMPStrategy.length)"
(bool valid, string memory message) = _I_V1_EMP_UTILITY.v1EMPStrategyUtilizedERC20AmountValid(
address(this),
_v1EMPStrategyUtilizedERC20Amount
);

require(
I_V1_EMP_UTILITY.v1EMPStrategyUtilizedERC20AmountValid(address(this), _v1EMPStrategyUtilizedERC20Amount),
"!I_V1_EMP_UTILITY.v1EMPStrategyUtilizedERC20AmountValid(address(this), _v1EMPStrategyUtilizedERC20Amount)"
);
require(valid, message);

for (uint256 i = 0; i < _utilizedV1EMPStrategy.length; i++)
{
Expand All @@ -315,20 +287,14 @@ contract V1EMP is
"!(!utilizedERC20DepositOpen && !utilizedERC20WithdrawOpen)"
);

require(_v1EMPStrategy.length == _allocation.length, "!(_v1EMPStrategy.length == _allocation.length)");

uint256 utilizedV1EMPStrategyAllocationTotal;

for (uint256 i = 0; i < _allocation.length; i++)
{
utilizedV1EMPStrategyAllocationTotal += _allocation[i];
}

require(
utilizedV1EMPStrategyAllocationTotal == ONE_HUNDRED_PERCENT,
"!(utilizedV1EMPStrategyAllocationTotal == ONE_HUNDRED_PERCENT)"
(bool valid, string memory message) = _I_V1_EMP_UTILITY.utilizedV1EMPStrategyValid(
address(this),
_v1EMPStrategy,
_allocation
);

require(valid, message);

delete _utilizedV1EMPStrategy;

for (uint256 i = 0; i < _v1EMPStrategy.length; i++)
Expand Down
1 change: 0 additions & 1 deletion contracts/V1EMPArrayUtility.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ contract V1EMPArrayUtility is
{
address[] internal _uniqueAddresses;

/// @inheritdoc IV1EMPArrayUtility
bool public override duplicateFound;

mapping(address => bool) public seen;
Expand Down
12 changes: 0 additions & 12 deletions contracts/V1EMPDeployer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,6 @@ contract V1EMPDeployer is
IV1EMPRegistry public immutable I_V1_EMP_REGISTRY;


receive ()
external
payable
{}


fallback ()
external
payable
{}


constructor (address _v1EMPRegistry)
{
I_V1_EMP_REGISTRY = IV1EMPRegistry(_v1EMPRegistry);
Expand Down
Loading

0 comments on commit d99e2e3

Please sign in to comment.