Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
PoolLogic
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // Transaction Types in execTransaction() // 1. Approve: Approving a token for spending by different address/contract // 2. Exchange: Exchange/trade of tokens eg. Uniswap, Synthetix // 3. AddLiquidity: Add liquidity of Uniswap, Sushiswap // 4. RemoveLiquidity: Remove liquidity of Uniswap, Sushiswap // 5. Stake: Stake tokens into a third party contract (eg. Sushi yield farming) // 6. Unstake: Unstake tokens from a third party contract (eg. Sushi yield farming) // 7. Claim: Claim rewards tokens from a third party contract (eg. SUSHI & MATIC rewards) // 8. UnstakeAndClaim: Unstake tokens and claim rewards from a third party contract // 9. Deposit: Aave deposit tokens -> get Aave Interest Bearing Token // 10. Withdraw: Withdraw tokens from Aave Interest Bearing Token // 11. SetUserUseReserveAsCollateral: Aave set reserve asset to be used as collateral // 12. Borrow: Aave borrow tokens // 13. Repay: Aave repay tokens // 14. SwapBorrowRateMode: Aave change borrow rate mode (stable/variable) // 15. RebalanceStableBorrowRate: Aave rebalance stable borrow rate // 16. JoinPool: Balancer join pool // 17. ExitPool: Balancer exit pool // 18. Deposit: EasySwapper Deposit // 19. Withdraw: EasySwapper Withdraw // 20. Mint: Uniswap V3 Mint position // 21. IncreaseLiquidity: Uniswap V3 increase liquidity position // 22. DecreaseLiquidity: Uniswap V3 decrease liquidity position // 23. Burn: Uniswap V3 Burn position // 24. Collect: Uniswap V3 collect fees // 25. Multicall: Uniswap V3 Multicall // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "./interfaces/IERC20Extended.sol"; import "./interfaces/IHasDaoInfo.sol"; import "./interfaces/IHasFeeInfo.sol"; import "./interfaces/IHasGuardInfo.sol"; import "./interfaces/IPoolFactory.sol"; import "./interfaces/IHasAssetInfo.sol"; import "./interfaces/IHasPausable.sol"; import "./interfaces/IPoolManagerLogic.sol"; import "./interfaces/IPoolPerformance.sol"; import "./interfaces/IHasSupportedAsset.sol"; import "./interfaces/IHasPoolPerformance.sol"; import "./interfaces/IHasOwnable.sol"; import "./interfaces/IHasDaoInfo.sol"; import "./interfaces/IManaged.sol"; import "./interfaces/guards/IGuard.sol"; import "./interfaces/guards/IAssetGuard.sol"; import "./interfaces/guards/IAaveLendingPoolAssetGuard.sol"; import "./utils/AddressHelper.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; /// @notice Logic implementation for pool contract PoolLogic is ERC20Upgradeable, ReentrancyGuardUpgradeable { using SafeMathUpgradeable for uint256; using AddressHelper for address; event Deposit( address fundAddress, address investor, address assetDeposited, uint256 amountDeposited, uint256 valueDeposited, uint256 fundTokensReceived, uint256 totalInvestorFundTokens, uint256 fundValue, uint256 totalSupply, uint256 time ); struct WithdrawnAsset { address asset; uint256 amount; bool externalWithdrawProcessed; } event Withdrawal( address fundAddress, address investor, uint256 valueWithdrawn, uint256 fundTokensWithdrawn, uint256 totalInvestorFundTokens, uint256 fundValue, uint256 totalSupply, WithdrawnAsset[] withdrawnAssets, uint256 time ); event TransactionExecuted(address pool, address manager, uint16 transactionType, uint256 time); event PoolPrivacyUpdated(bool isPoolPrivate); event ManagerFeeMinted( address pool, address manager, uint256 available, uint256 daoFee, uint256 managerFee, uint256 tokenPriceAtLastFeeMint ); event PoolManagerLogicSet(address poolManagerLogic, address from); bool public privatePool; address public creator; uint256 public creationTime; address public factory; // Manager fees uint256 public tokenPriceAtLastFeeMint; mapping(address => uint256) public lastDeposit; address public poolManagerLogic; mapping(address => uint256) public lastWhitelistTransfer; uint256 public lastFeeMintTime; modifier onlyPrivate() { require(msg.sender == manager() || !privatePool || isMemberAllowed(msg.sender), "only members allowed"); _; } modifier onlyManager() { require(msg.sender == manager(), "only manager"); _; } modifier whenNotPaused() { require(!IHasPausable(factory).isPaused(), "contracts paused"); _; } /// @notice Initialize the pool /// @param _factory address of the factory /// @param _privatePool true if the pool is private, false otherwise /// @param _fundName name of the fund /// @param _fundSymbol symbol of the fund function initialize( address _factory, bool _privatePool, string memory _fundName, string memory _fundSymbol ) external initializer { require(_factory != address(0), "Invalid factory"); __ERC20_init(_fundName, _fundSymbol); __ReentrancyGuard_init(); factory = _factory; _setPoolPrivacy(_privatePool); creator = msg.sender; creationTime = block.timestamp; lastFeeMintTime = block.timestamp; tokenPriceAtLastFeeMint = 10**18; IPoolPerformance(IHasPoolPerformance(factory).poolPerformanceAddress()).initializePool(); } /// @notice Before token transfer hook /// @param from address of the token owner /// @param to address of the token receiver /// @param amount amount of tokens to transfer function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); // Minting if (from == address(0)) { return; } bool isWhitelisted = IPoolFactory(factory).transferWhitelist(from); if (isWhitelisted) { lastWhitelistTransfer[to] = block.timestamp; return; } // Users that receive tokens from a whitelisted source cannot withdraw, or transfer them on, for 5 minutes require(lastWhitelistTransfer[from].add(5 minutes) < block.timestamp, "whitelist cooldown active"); require(getExitRemainingCooldown(from) == 0, "cooldown active"); } /// @notice Set the pool privacy /// @param _privatePool true if the pool is private, false otherwise function setPoolPrivate(bool _privatePool) external onlyManager { require(privatePool != _privatePool, "flag must be different"); _setPoolPrivacy(_privatePool); } /// @notice Set the pool privacy internal call /// @param _privacy true if the pool is private, false otherwise function _setPoolPrivacy(bool _privacy) internal { privatePool = _privacy; emit PoolPrivacyUpdated(_privacy); } /// @notice Deposit funds into the pool /// @param _asset Address of the token /// @param _amount Amount of tokens to deposit /// @return liquidityMinted Amount of liquidity minted function deposit(address _asset, uint256 _amount) external onlyPrivate whenNotPaused returns (uint256 liquidityMinted) { require(IPoolManagerLogic(poolManagerLogic).isDepositAsset(_asset), "invalid deposit asset"); lastDeposit[msg.sender] = block.timestamp; uint256 fundValue = _mintManagerFee(); uint256 totalSupplyBefore = totalSupply(); _asset.tryAssemblyCall( abi.encodeWithSelector(IERC20Upgradeable.transferFrom.selector, msg.sender, address(this), _amount) ); IPoolPerformance(IHasPoolPerformance(factory).poolPerformanceAddress()).changeAssetBalance(_asset, _amount, 0); uint256 usdAmount = IPoolManagerLogic(poolManagerLogic).assetValue(_asset, _amount); if (totalSupplyBefore > 0) { //total balance converted to susd that this contract holds //need to calculate total value of synths in this contract liquidityMinted = usdAmount.mul(totalSupplyBefore).div(fundValue); } else { liquidityMinted = usdAmount; } _mint(msg.sender, liquidityMinted); emit Deposit( address(this), msg.sender, _asset, _amount, usdAmount, liquidityMinted, balanceOf(msg.sender), fundValue.add(usdAmount), totalSupplyBefore.add(liquidityMinted), block.timestamp ); } function withdraw(uint256 _fundTokenAmount) external { withdrawTo(msg.sender, _fundTokenAmount); } /// @notice Withdraw assets based on the fund token amount /// @param _fundTokenAmount the fund token amount function withdrawTo(address _recipient, uint256 _fundTokenAmount) public virtual nonReentrant whenNotPaused { require(lastDeposit[msg.sender] < block.timestamp, "can withdraw shortly"); require(balanceOf(msg.sender) >= _fundTokenAmount, "insufficient balance"); // calculate the exit fee uint256 fundValue = _mintManagerFee(); // calculate the proportion uint256 portion = _fundTokenAmount.mul(10**18).div(totalSupply()); // first return funded tokens _burn(msg.sender, _fundTokenAmount); // TODO: Combining into one line to fix stack too deep, // need to refactor some variables into struct in order to have more variables IHasSupportedAsset.Asset[] memory _supportedAssets = IHasSupportedAsset(poolManagerLogic).getSupportedAssets(); WithdrawnAsset[] memory withdrawnAssets = new WithdrawnAsset[](_supportedAssets.length); uint16 index = 0; for (uint256 i = 0; i < _supportedAssets.length; i++) { (address asset, uint256 portionOfAssetBalance, bool externalWithdrawProcessed) = _withdrawProcessing( _supportedAssets[i].asset, _recipient, portion ); if (portionOfAssetBalance > 0) { require(asset != address(0), "requires asset to withdraw"); // Ignoring return value for transfer as want to transfer no matter what happened asset.tryAssemblyCall( abi.encodeWithSelector(IERC20Upgradeable.transfer.selector, _recipient, portionOfAssetBalance) ); } if (externalWithdrawProcessed || portionOfAssetBalance > 0) { withdrawnAssets[index] = WithdrawnAsset({ asset: asset, amount: portionOfAssetBalance, externalWithdrawProcessed: externalWithdrawProcessed }); index++; } } IPoolPerformance poolPerformance = IPoolPerformance(IHasPoolPerformance(factory).poolPerformanceAddress()); // We must now update our internal balances to whatever the result of the withdraw if (totalSupply() == 0) { poolPerformance.resetInternalValueFactor(); } poolPerformance.updateInternalBalances(); // Reduce length for withdrawnAssets to remove the empty items uint256 reduceLength = _supportedAssets.length.sub(index); assembly { mstore(withdrawnAssets, sub(mload(withdrawnAssets), reduceLength)) } uint256 valueWithdrawn = portion.mul(fundValue).div(10**18); emit Withdrawal( address(this), msg.sender, valueWithdrawn, _fundTokenAmount, balanceOf(msg.sender), fundValue.sub(valueWithdrawn), totalSupply(), withdrawnAssets, block.timestamp ); } /// @notice Perform any additional processing on withdrawal of asset /// @dev Checks for staked tokens and withdraws them to the investor account /// @param asset Asset for withdrawal processing /// @param to Investor account to send withdrawed tokens to /// @param portion Portion of investor withdrawal of the total dHedge pool /// @return withdrawAsset Asset to be withdrawed /// @return withdrawBalance Asset balance amount to be withdrawed /// @return externalWithdrawProcessed A boolean for success or fail transaction function _withdrawProcessing( address asset, address to, uint256 portion ) internal returns ( address, // withdrawAsset uint256, // withdrawBalance bool externalWithdrawProcessed ) { // Withdraw any external tokens (eg. staked tokens in other contracts) address guard = IHasGuardInfo(factory).getAssetGuard(asset); require(guard != address(0), "invalid guard"); (address withdrawAsset, uint256 withdrawBalance, IAssetGuard.MultiTransaction[] memory transactions) = IAssetGuard( guard ).withdrawProcessing(address(this), asset, portion, to); uint256 txCount = transactions.length; if (txCount > 0) { uint256 assetBalanceBefore; if (withdrawAsset != address(0)) { assetBalanceBefore = IERC20Upgradeable(withdrawAsset).balanceOf(address(this)); } for (uint256 i = 0; i < txCount; i++) { externalWithdrawProcessed = transactions[i].to.tryAssemblyCall(transactions[i].txData); } if (withdrawAsset != address(0)) { // calculated the balance change after withdraw process. uint256 assetBalanceAfter = IERC20Upgradeable(withdrawAsset).balanceOf(address(this)); withdrawBalance = withdrawBalance.add(assetBalanceAfter.sub(assetBalanceBefore)); } } return (withdrawAsset, withdrawBalance, externalWithdrawProcessed); } /// @notice Function to let pool talk to other protocol /// @dev execute transaction for the pool /// @param to The destination address for pool to talk to /// @param data The data that going to send in the transaction /// @return success A boolean for success or fail transaction function execTransaction(address to, bytes memory data) external nonReentrant whenNotPaused returns (bool success) { require(to != address(0), "non-zero address is required"); IPoolPerformance poolPerformance = IPoolPerformance(IHasPoolPerformance(factory).poolPerformanceAddress()); poolPerformance.recordExternalValue(address(this)); address contractGuard = IHasGuardInfo(factory).getContractGuard(to); address assetGuard = IHasGuardInfo(factory).getAssetGuard(to); uint16 txType; bool isPublic; if (contractGuard != address(0)) { (txType, isPublic) = IGuard(contractGuard).txGuard(poolManagerLogic, to, data); } else { require(assetGuard != address(0), "Guard not found"); // only asset guard is available require(IHasSupportedAsset(poolManagerLogic).isSupportedAsset(to), "asset not enabled in pool"); } if (txType == 0 && assetGuard != address(0)) { // contract guard is not available (txType, isPublic) = IGuard(assetGuard).txGuard(poolManagerLogic, to, data); } require(txType > 0, "invalid transaction"); // solhint-disable-next-line reason-string require(isPublic || msg.sender == manager() || msg.sender == trader(), "only manager or trader or public function"); success = to.tryAssemblyCall(data); // We must now update our internal balances to whatever the result of this tx is poolPerformance.updateInternalBalances(); emit TransactionExecuted(address(this), manager(), txType, block.timestamp); } struct FundSummary { string name; uint256 totalSupply; uint256 totalFundValue; address manager; string managerName; uint256 creationTime; bool privatePool; uint256 performanceFeeNumerator; uint256 managerFeeNumerator; uint256 managerFeeDenominator; uint256 exitFeeNumerator; uint256 exitFeeDenominator; } /// @notice Get fund summary of the pool /// @return Fund summary of the pool function getFundSummary() external view returns (FundSummary memory) { (uint256 performanceFeeNumerator, uint256 managerFeeNumerator, uint256 managerFeeDenominator) = IPoolManagerLogic( poolManagerLogic ).getFee(); (uint256 exitFeeNumerator, uint256 exitFeeDenominator) = IHasFeeInfo(factory).getExitFee(); return FundSummary( name(), totalSupply(), IPoolManagerLogic(poolManagerLogic).totalFundValue(), manager(), managerName(), creationTime, privatePool, performanceFeeNumerator, managerFeeNumerator, managerFeeDenominator, exitFeeNumerator, exitFeeDenominator ); } /// @notice Get price of the asset adjusted for any unminted manager fees /// @param price A price of the asset function tokenPrice() external view returns (uint256 price) { (uint256 managerFee, uint256 fundValue) = availableManagerFeeAndTotalFundValue(); uint256 tokenSupply = totalSupply().add(managerFee); price = _tokenPrice(fundValue, tokenSupply); } function tokenPriceWithoutManagerFee() external view returns (uint256 price) { uint256 fundValue = IPoolManagerLogic(poolManagerLogic).totalFundValue(); uint256 tokenSupply = totalSupply(); price = _tokenPrice(fundValue, tokenSupply); } /// @notice Get price of the asset internal call /// @param _fundValue The total fund value of the pool /// @param _tokenSupply The total token supply of the pool /// @return price A price of the asset function _tokenPrice(uint256 _fundValue, uint256 _tokenSupply) internal pure returns (uint256 price) { if (_tokenSupply == 0 || _fundValue == 0) return 0; price = _fundValue.mul(10**18).div(_tokenSupply); } /// @notice Get available manager fee of the pool /// @return fee available manager fee of the pool function availableManagerFee() public view returns (uint256 fee) { (fee, ) = availableManagerFeeAndTotalFundValue(); } /// @notice Get available manager fee of the pool and totalFundValue /// @return fee available manager fee of the pool function availableManagerFeeAndTotalFundValue() public view returns (uint256 fee, uint256 fundValue) { fundValue = IPoolManagerLogic(poolManagerLogic).totalFundValue(); uint256 tokenSupply = totalSupply(); (uint256 performanceFeeNumerator, uint256 managerFeeNumerator, uint256 managerFeeDenominator) = IPoolManagerLogic( poolManagerLogic ).getFee(); fee = _availableManagerFee( fundValue, tokenSupply, performanceFeeNumerator, managerFeeNumerator, managerFeeDenominator ); } /// @notice Get available manager fee of the pool internal call /// @param _fundValue The total fund value of the pool /// @param _tokenSupply The total token supply of the pool /// @param _performanceFeeNumerator The manager fee numerator /// @param _managerFeeNumerator The streaming fee numerator /// @param _feeDenominator The fee denominator /// @return available manager fee of the pool function _availableManagerFee( uint256 _fundValue, uint256 _tokenSupply, uint256 _performanceFeeNumerator, uint256 _managerFeeNumerator, uint256 _feeDenominator ) internal view returns (uint256 available) { if (_tokenSupply == 0 || _fundValue == 0) return 0; uint256 currentTokenPrice = _fundValue.mul(10**18).div(_tokenSupply); if (currentTokenPrice > tokenPriceAtLastFeeMint) { available = currentTokenPrice .sub(tokenPriceAtLastFeeMint) .mul(_tokenSupply) .mul(_performanceFeeNumerator) .div(_feeDenominator) .div(currentTokenPrice); } // this timestamp for old pools would be zero at the first time if (lastFeeMintTime != 0) { uint256 timeChange = block.timestamp.sub(lastFeeMintTime); uint256 streamingFee = _tokenSupply.mul(timeChange).mul(_managerFeeNumerator).div(_feeDenominator).div(365 days); available = available.add(streamingFee); } } /// @notice Mint the manager fee of the pool function mintManagerFee() external whenNotPaused { _mintManagerFee(); } /// @notice Get mint manager fee of the pool internal call /// @return fundValue The total fund value of the pool function _mintManagerFee() internal returns (uint256 fundValue) { // This has to run on deposit IPoolPerformance(IHasPoolPerformance(factory).poolPerformanceAddress()).recordExternalValue(address(this)); fundValue = IPoolManagerLogic(poolManagerLogic).totalFundValue(); uint256 tokenSupply = totalSupply(); (uint256 performanceFeeNumerator, uint256 managerFeeNumerator, uint256 managerFeeDenominator) = IPoolManagerLogic( poolManagerLogic ).getFee(); uint256 available = _availableManagerFee( fundValue, tokenSupply, performanceFeeNumerator, managerFeeNumerator, managerFeeDenominator ); // Ignore dust when minting performance fees if (available < 10000) return fundValue; address daoAddress = IHasDaoInfo(factory).daoAddress(); uint256 daoFeeNumerator; uint256 daoFeeDenominator; (daoFeeNumerator, daoFeeDenominator) = IHasDaoInfo(factory).getDaoFee(); uint256 daoFee = available.mul(daoFeeNumerator).div(daoFeeDenominator); uint256 managerFee = available.sub(daoFee); if (daoFee > 0) _mint(daoAddress, daoFee); if (managerFee > 0) _mint(manager(), managerFee); tokenPriceAtLastFeeMint = _tokenPrice(fundValue, tokenSupply); lastFeeMintTime = block.timestamp; emit ManagerFeeMinted(address(this), manager(), available, daoFee, managerFee, tokenPriceAtLastFeeMint); } /// @notice Get exit cooldown of the pool /// @return exitCooldown The exit cooldown of the pool function getExitCooldown() public view returns (uint256 exitCooldown) { exitCooldown = IHasFeeInfo(factory).getExitCooldown(); } /// @notice Get exit remaining time of the pool /// @return remaining The remaining exit time of the pool function getExitRemainingCooldown(address sender) public view returns (uint256 remaining) { uint256 cooldown = getExitCooldown(); uint256 cooldownFinished = lastDeposit[sender].add(cooldown); if (cooldownFinished < block.timestamp) return 0; remaining = cooldownFinished.sub(block.timestamp); } /// @notice Set address for pool manager logic function setPoolManagerLogic(address _poolManagerLogic) external returns (bool) { require(_poolManagerLogic != address(0), "Invalid poolManagerLogic address"); require( msg.sender == address(factory) || msg.sender == IHasOwnable(factory).owner(), "only owner or factory allowed" ); poolManagerLogic = _poolManagerLogic; emit PoolManagerLogicSet(_poolManagerLogic, msg.sender); return true; } /// @notice Get address of the manager /// @return _manager The address of the manager function manager() internal view returns (address _manager) { _manager = IManaged(poolManagerLogic).manager(); } /// @notice Get address of the trader /// @return _trader The address of the trader function trader() internal view returns (address _trader) { _trader = IManaged(poolManagerLogic).trader(); } /// @notice Get name of the manager /// @return _managerName The name of the manager function managerName() public view returns (string memory _managerName) { _managerName = IManaged(poolManagerLogic).managerName(); } /// @notice Return boolean if the address is a member of the list /// @param member The address of the member /// @return True if the address is a member of the list, false otherwise function isMemberAllowed(address member) public view returns (bool) { return IPoolManagerLogic(poolManagerLogic).isMemberAllowed(member); } /// @notice execute function of aave flash loan /// @dev This function is called after your contract has received the flash loaned amount /// @param assets the loaned assets /// @param amounts the loaned amounts per each asset /// @param premiums the additional owed amount per each asset /// @param originator the origin caller address of the flash loan /// @param params Variadic packed params to pass to the receiver as extra information function executeOperation( address[] memory assets, uint256[] memory amounts, uint256[] memory premiums, address originator, bytes memory params ) external returns (bool success) { require(originator == address(this), "only pool flash loan origin"); address aaveLendingPoolAssetGuard = IHasGuardInfo(factory).getAssetGuard(msg.sender); require( aaveLendingPoolAssetGuard != address(0) && msg.sender == IAaveLendingPoolAssetGuard(aaveLendingPoolAssetGuard).aaveLendingPool(), "invalid lending pool" ); (uint256[] memory interestRateModes, uint256 portion) = abi.decode(params, (uint256[], uint256)); address weth = IHasGuardInfo(factory).getAddress("weth"); uint256 wethBalanceBefore = IERC20Upgradeable(weth).balanceOf(address(this)); IAssetGuard.MultiTransaction[] memory transactions = IAaveLendingPoolAssetGuard(aaveLendingPoolAssetGuard) .flashloanProcessing(address(this), portion, assets, amounts, premiums, interestRateModes); for (uint256 i = 0; i < transactions.length; i++) { success = transactions[i].to.tryAssemblyCall(transactions[i].txData); } // Liquidation of collateral not enough to pay off debt, flashloan repayment stealing pool's weth require( wethBalanceBefore == 0 || wethBalanceBefore <= IERC20Upgradeable(weth).balanceOf(address(this)), "too high slippage" ); } uint256[48] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; // With aditional optional views interface IERC20Extended { // ERC20 Optional Views function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); // Views function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function scaledBalanceOf(address user) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); // Mutative functions function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); // Events event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IHasDaoInfo { function getDaoFee() external view returns (uint256, uint256); function daoAddress() external view returns (address); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IHasFeeInfo { // Manager fee function getMaximumFee() external view returns ( uint256, uint256, uint256 ); function maximumPerformanceFeeNumeratorChange() external view returns (uint256); function performanceFeeNumeratorChangeDelay() external view returns (uint256); function getExitFee() external view returns (uint256, uint256); function getExitCooldown() external view returns (uint256); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IHasGuardInfo { // Get guard function getContractGuard(address extContract) external view returns (address); // Get asset guard function getAssetGuard(address extContract) external view returns (address); // Get mapped addresses from Governance function getAddress(bytes32 name) external view returns (address); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IPoolFactory { function governanceAddress() external view returns (address); function poolPerformanceAddress() external view returns (address); function isPool(address pool) external view returns (bool); // Check if address can bypass 24h lock function transferWhitelist(address from) external view returns (bool); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IHasAssetInfo { function isValidAsset(address asset) external view returns (bool); function getAssetPrice(address asset) external view returns (uint256); function getAssetType(address asset) external view returns (uint16); function getMaximumSupportedAssetCount() external view returns (uint256); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IHasPausable { function isPaused() external view returns (bool); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IPoolManagerLogic { function poolLogic() external view returns (address); function isDepositAsset(address asset) external view returns (bool); function validateAsset(address asset) external view returns (bool); function assetValue(address asset) external view returns (uint256); function assetValue(address asset, uint256 amount) external view returns (uint256); function assetBalance(address asset) external view returns (uint256 balance); function factory() external view returns (address); function setPoolLogic(address fundAddress) external returns (bool); function totalFundValue() external view returns (uint256); function isMemberAllowed(address member) external view returns (bool); function getFee() external view returns ( uint256, uint256, uint256 ); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT import "./IHasSupportedAsset.sol"; pragma solidity 0.7.6; pragma experimental ABIEncoderV2; interface IPoolPerformance { function changeAssetBalance( address asset, uint256 plusAmount, uint256 minusAmount ) external; function hasExternalBalances(address poolAddress) external view returns (bool); function updateInternalBalances() external; function getBalancesSnapshot(address poolManagerAddress, IHasSupportedAsset.Asset[] memory supportedAssets) external view returns (uint256[] memory supportedAssetBalances); function updatedInternalBalancesByDiff( IHasSupportedAsset.Asset[] memory supportedAssets, uint256[] memory beforeSupportedAssetBalances, uint256[] memory afterSupportedAssetBalances ) external; function recordExternalValue(address poolAddress) external; function adjustInternalValueFactor(uint256 a, uint256 b) external; function resetInternalValueFactor() external; function initializePool() external; function tokenPriceAdjustedForManagerFee(address poolAddress) external view returns (uint256); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; interface IHasSupportedAsset { struct Asset { address asset; bool isDeposit; } function getSupportedAssets() external view returns (Asset[] memory); function isSupportedAsset(address asset) external view returns (bool); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IHasPoolPerformance { function poolPerformanceAddress() external view returns (address); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IHasOwnable { function owner() external view returns (address); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IManaged { function manager() external view returns (address); function trader() external view returns (address); function managerName() external view returns (string memory); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; interface IGuard { event ExchangeFrom(address fundAddress, address sourceAsset, uint256 sourceAmount, address dstAsset, uint256 time); event ExchangeTo(address fundAddress, address sourceAsset, address dstAsset, uint256 dstAmount, uint256 time); function txGuard( address poolManagerLogic, address to, bytes calldata data ) external returns (uint16 txType, bool isPublic); }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "../IHasSupportedAsset.sol"; interface IAssetGuard { struct MultiTransaction { address to; bytes txData; } function withdrawProcessing( address pool, address asset, uint256 withdrawPortion, address to ) external view returns ( address, uint256, MultiTransaction[] memory transactions ); function getBalance(address pool, address asset) external view returns (uint256 balance); function getDecimals(address asset) external view returns (uint256 decimals); function removeAssetCheck(address poolLogic, address asset) external view; }
// // __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "./IAssetGuard.sol"; interface IAaveLendingPoolAssetGuard { function flashloanProcessing( address pool, uint256 portion, address[] memory repayAssets, uint256[] memory repayAmounts, uint256[] memory premiums, uint256[] memory interestRateModes ) external view returns (IAssetGuard.MultiTransaction[] memory transactions); function aaveLendingPool() external view returns (address); }
// __ __ __ ________ _______ ______ ________ // / |/ | / |/ |/ \ / \ / | // ____$$ |$$ | $$ |$$$$$$$$/ $$$$$$$ |/$$$$$$ |$$$$$$$$/ // / $$ |$$ |__$$ |$$ |__ $$ | $$ |$$ | _$$/ $$ |__ // /$$$$$$$ |$$ $$ |$$ | $$ | $$ |$$ |/ |$$ | // $$ | $$ |$$$$$$$$ |$$$$$/ $$ | $$ |$$ |$$$$ |$$$$$/ // $$ \__$$ |$$ | $$ |$$ |_____ $$ |__$$ |$$ \__$$ |$$ |_____ // $$ $$ |$$ | $$ |$$ |$$ $$/ $$ $$/ $$ | // $$$$$$$/ $$/ $$/ $$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$$/ // // dHEDGE DAO - https://dhedge.org // // Copyright (c) 2021 dHEDGE DAO // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // // SPDX-License-Identifier: MIT // import "./BytesLib.sol"; pragma solidity 0.7.6; /** * @title A library for Address utils. */ library AddressHelper { /** * @notice try a contract call via assembly * @param to the contract address * @param data the call data * @return success if the contract call is successful or not */ function tryAssemblyCall(address to, bytes memory data) internal returns (bool success) { assembly { success := call(gas(), to, 0, add(data, 0x20), mload(data), 0, 0) switch iszero(success) case 1 { let size := returndatasize() returndatacopy(0x00, 0x00, size) revert(0x00, size) } } } /** * @notice try a contract delegatecall via assembly * @param to the contract address * @param data the call data * @return success if the contract call is successful or not */ function tryAssemblyDelegateCall(address to, bytes memory data) internal returns (bool success) { assembly { success := delegatecall(gas(), to, add(data, 0x20), mload(data), 0, 0) switch iszero(success) case 1 { let size := returndatasize() returndatacopy(0x00, 0x00, size) revert(0x00, size) } } } // /** // * @notice try a contract call // * @param to the contract address // * @param data the call data // * @return success if the contract call is successful or not // */ // function tryCall(address to, bytes memory data) internal returns (bool) { // (bool success, bytes memory res) = to.call(data); // // Get the revert message of the call and revert with it if the call failed // require(success, _getRevertMsg(res)); // return success; // } // /** // * @dev Get the revert message from a call // * @notice This is needed in order to get the human-readable revert message from a call // * @param response Response of the call // * @return Revert message string // */ // function _getRevertMsg(bytes memory response) internal pure returns (string memory) { // // If the response length is less than 68, then the transaction failed silently (without a revert message) // if (response.length < 68) return "Transaction reverted silently"; // bytes memory revertData = response.slice(4, response.length - 4); // Remove the selector which is the first 4 bytes // return abi.decode(revertData, (string)); // All that remains is the revert string // } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "../../utils/ContextUpgradeable.sol"; import "./IERC20Upgradeable.sol"; import "../../math/SafeMathUpgradeable.sol"; import "../../proxy/Initializable.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable { using SafeMathUpgradeable for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "../proxy/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../proxy/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; import "../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fundAddress","type":"address"},{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"address","name":"assetDeposited","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountDeposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"valueDeposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fundTokensReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalInvestorFundTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fundValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"uint256","name":"available","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"managerFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPriceAtLastFeeMint","type":"uint256"}],"name":"ManagerFeeMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolManagerLogic","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"}],"name":"PoolManagerLogicSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPoolPrivate","type":"bool"}],"name":"PoolPrivacyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"uint16","name":"transactionType","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fundAddress","type":"address"},{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"uint256","name":"valueWithdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fundTokensWithdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalInvestorFundTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fundValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"},{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"externalWithdrawProcessed","type":"bool"}],"indexed":false,"internalType":"struct PoolLogic.WithdrawnAsset[]","name":"withdrawnAssets","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableManagerFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableManagerFeeAndTotalFundValue","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"fundValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"liquidityMinted","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execTransaction","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"originator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExitCooldown","outputs":[{"internalType":"uint256","name":"exitCooldown","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"getExitRemainingCooldown","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundSummary","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"totalFundValue","type":"uint256"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"string","name":"managerName","type":"string"},{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"bool","name":"privatePool","type":"bool"},{"internalType":"uint256","name":"performanceFeeNumerator","type":"uint256"},{"internalType":"uint256","name":"managerFeeNumerator","type":"uint256"},{"internalType":"uint256","name":"managerFeeDenominator","type":"uint256"},{"internalType":"uint256","name":"exitFeeNumerator","type":"uint256"},{"internalType":"uint256","name":"exitFeeDenominator","type":"uint256"}],"internalType":"struct PoolLogic.FundSummary","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bool","name":"_privatePool","type":"bool"},{"internalType":"string","name":"_fundName","type":"string"},{"internalType":"string","name":"_fundSymbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"member","type":"address"}],"name":"isMemberAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFeeMintTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastWhitelistTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerName","outputs":[{"internalType":"string","name":"_managerName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintManagerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolManagerLogic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privatePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolManagerLogic","type":"address"}],"name":"setPoolManagerLogic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_privatePool","type":"bool"}],"name":"setPoolPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceAtLastFeeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceWithoutManagerFee","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fundTokenAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_fundTokenAmount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614e6f806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063750226de11610130578063aee88334116100b8578063d8270dce1161007c578063d8270dce1461046c578063dd62ed3e14610474578063df8ff12f14610487578063edbf6f501461048f578063fed4416a1461049757610232565b8063aee8833414610423578063b8ea2b6e14610436578063bbbf725b14610449578063c45a01551461045c578063cc3c6df61461046457610232565b8063920f5c84116100ff578063920f5c84146103da57806395d89b41146103ed578063a457c2d7146103f5578063a77134e414610408578063a9059cbb1461041057610232565b8063750226de146103a45780637714f39d146103b75780637ae7cfb5146103bf5780637ff9b596146103d257610232565b80632e1a7d4d116101be5780634501b088116101825780634501b0881461035b57806347e7ef24146103635780635426f81d1461037657806359b5e75e1461038957806370a082311461039157610232565b80632e1a7d4d146102f75780632e98e65d1461030a578063313ce5671461032057806339509351146103355780633babaad51461034857610232565b80631c5918d2116102055780631c5918d21461029f5780631e50a4a6146102b4578063205c2878146102bc57806323b872dd146102d157806329d16ee8146102e457610232565b806302d05d3f1461023757806306fdde0314610255578063095ea7b31461026a57806318160ddd1461028a575b600080fd5b61023f61049f565b60405161024c91906143cb565b60405180910390f35b61025d6104b3565b60405161024c91906146bb565b61027d610278366004613ee6565b61054a565b60405161024c91906146b0565b610292610568565b60405161024c9190614bd1565b6102a761056e565b60405161024c9190614b07565b61023f610799565b6102cf6102ca366004613ee6565b6107a8565b005b61027d6102df366004613dd4565b610d19565b6102926102f2366004613d64565b610da1565b6102cf6103053660046142d2565b610db3565b610312610dc0565b60405161024c929190614bda565b610328610eff565b60405161024c9190614be8565b61027d610343366004613ee6565b610f08565b6102cf610356366004614221565b610f56565b610292610fc0565b610292610371366004613ee6565b611042565b6102cf610384366004613e14565b611467565b61027d611664565b61029261039f366004613d64565b61166d565b61027d6103b2366004613d64565b61168c565b6102926117dc565b61027d6103cd366004613e99565b6117e2565b610292611e3f565b61027d6103e8366004613f68565b611e78565b61025d61229c565b61027d610403366004613ee6565b6122fd565b610292612365565b61027d61041e366004613ee6565b61240d565b610292610431366004613d64565b612421565b610292610444366004613d64565b612433565b61027d610457366004613d64565b61248c565b61023f61250d565b6102cf61251c565b6102926125c7565b610292610482366004613d9c565b6125cd565b6102926125f8565b6102926125fe565b61025d61260e565b60975461010090046001600160a01b031681565b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b820191906000526020600020905b81548152906001019060200180831161052257829003601f168201915b505050505090505b90565b600061055e61055761268f565b8484612693565b5060015b92915050565b60355490565b610576613a7b565b6000806000609c60009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160606040518083038186803b1580156105c957600080fd5b505afa1580156105dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106019190614325565b925092509250600080609960009054906101000a90046001600160a01b03166001600160a01b031663ecb0116a6040518163ffffffff1660e01b8152600401604080518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190614302565b915091506040518061018001604052806106a76104b3565b81526020016106b4610568565b8152609c5460408051632b583ff360e21b815290516020938401936001600160a01b039093169263ad60ffcc9260048082019391829003018186803b1580156106fc57600080fd5b505afa158015610710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073491906142ea565b815260200161074161277f565b6001600160a01b0316815260200161075761260e565b8152609854602082015260975460ff16151560408201526060810196909652608086019490945260a085019290925260c084015260e090920191909152905090565b609c546001600160a01b031681565b60026065541415610800576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555609954604080516358c3de9360e11b815290516001600160a01b039092169163b187bd2691600480820192602092909190829003018186803b15801561084a57600080fd5b505afa15801561085e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610882919061423d565b156108a85760405162461bcd60e51b815260040161089f90614a51565b60405180910390fd5b336000908152609b602052604090205442116108d65760405162461bcd60e51b815260040161089f90614894565b806108e03361166d565b10156108fe5760405162461bcd60e51b815260040161089f90614924565b60006109086127fc565b9050600061092f610917610568565b61092985670de0b6b3a7640000612bce565b90612c27565b905061093b3384612c8e565b609c546040805163e5406dbf60e01b815290516000926001600160a01b03169163e5406dbf9160048083019286929190829003018186803b15801561097f57600080fd5b505afa158015610993573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109bb919081019061407f565b9050600081516001600160401b03811180156109d657600080fd5b50604051908082528060200260200182016040528015610a1057816020015b6109fd613ae7565b8152602001906001900390816109f55790505b5090506000805b8351811015610b40576000806000610a47878581518110610a3457fe5b6020026020010151600001518c8a612d8a565b919450925090508115610adc576001600160a01b038316610a7a5760405162461bcd60e51b815260040161089f90614aa2565b610ada63a9059cbb60e01b8c84604051602401610a989291906145d6565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b0385169061305e565b505b8080610ae85750600082115b15610b35576040518060600160405280846001600160a01b03168152602001838152602001821515815250868661ffff1681518110610b2357fe5b60209081029190910101526001909401935b505050600101610a17565b506099546040805163af89021560e01b815290516000926001600160a01b03169163af890215916004808301926020929190829003018186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe9190613d80565b9050610bc8610568565b610c2057806001600160a01b031663b482cd9b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c0757600080fd5b505af1158015610c1b573d6000803e3d6000fd5b505050505b806001600160a01b031663994449326040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c5b57600080fd5b505af1158015610c6f573d6000803e3d6000fd5b5050855160009250610c86915061ffff8516613091565b8451819003855290506000610ca7670de0b6b3a7640000610929898b612bce565b90507ffad3d7f9ed107ffa7fc8ce8baa521effc3650ec48a4d1dd36bdb9c4b91db12953033838c610cd73361166d565b610ce18e88613091565b610ce9610568565b8c42604051610d0099989796959493929190614473565b60405180910390a1505060016065555050505050505050565b6000610d268484846130ee565b610d9684610d3261268f565b610d9185604051806060016040528060288152602001614d83602891396001600160a01b038a16600090815260346020526040812090610d7061268f565b6001600160a01b03168152602081019190915260400160002054919061324b565b612693565b5060015b9392505050565b609b6020526000908152604090205481565b610dbd33826107a8565b50565b600080609c60009054906101000a90046001600160a01b03166001600160a01b031663ad60ffcc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1157600080fd5b505afa158015610e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4991906142ea565b90506000610e55610568565b90506000806000609c60009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160606040518083038186803b158015610eaa57600080fd5b505afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee29190614325565b925092509250610ef585858585856132e2565b9550505050509091565b60385460ff1690565b600061055e610f1561268f565b84610d918560346000610f2661268f565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906133a5565b610f5e61277f565b6001600160a01b0316336001600160a01b031614610f8e5760405162461bcd60e51b815260040161089f90614837565b60975460ff1615158115151415610fb75760405162461bcd60e51b815260040161089f90614807565b610dbd816133ff565b609954604080516308a0361160e31b815290516000926001600160a01b031691634501b088916004808301926020929190829003018186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103d91906142ea565b905090565b600061104c61277f565b6001600160a01b0316336001600160a01b0316148061106e575060975460ff16155b8061107d575061107d3361248c565b6110995760405162461bcd60e51b815260040161089f90614783565b609960009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b1580156110e757600080fd5b505afa1580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f919061423d565b1561113c5760405162461bcd60e51b815260040161089f90614a51565b609c5460405163bdbef07d60e01b81526001600160a01b039091169063bdbef07d9061116c9086906004016143cb565b60206040518083038186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bc919061423d565b6111d85760405162461bcd60e51b815260040161089f90614952565b336000908152609b602052604081204290556111f26127fc565b905060006111fe610568565b90506112626323b872dd60e01b333087604051602401611220939291906143df565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b0387169061305e565b50609960009054906101000a90046001600160a01b03166001600160a01b031663af8902156040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b157600080fd5b505afa1580156112c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e99190613d80565b6001600160a01b0316639718fc7a868660006040518463ffffffff1660e01b81526004016113199392919061468f565b600060405180830381600087803b15801561133357600080fd5b505af1158015611347573d6000803e3d6000fd5b5050609c546040516314e03fdd60e11b8152600093506001600160a01b0390911691506329c07fba9061138090899089906004016145d6565b60206040518083038186803b15801561139857600080fd5b505afa1580156113ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d091906142ea565b905081156113ed576113e6836109298385612bce565b93506113f1565b8093505b6113fb3385613448565b7f97e6c213c123075e233a6f2323f33d8319141b993ab05e9e2f7eb2eda08cb94430338888858961142b3361166d565b6114358b8a6133a5565b61143f8b8e6133a5565b426040516114569a9998979695949392919061441d565b60405180910390a150505092915050565b600054610100900460ff1680611480575061148061353a565b8061148e575060005460ff16155b6114c95760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff161580156114f4576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03851661151a5760405162461bcd60e51b815260040161089f906149ba565b611524838361354b565b61152c613601565b609980546001600160a01b0319166001600160a01b038716179055611550846133ff565b60978054610100600160a81b0319163361010002179055426098819055609e55670de0b6b3a7640000609a556099546040805163af89021560e01b815290516001600160a01b039092169163af89021591600481810192602092909190829003018186803b1580156115c157600080fd5b505afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f99190613d80565b6001600160a01b031663250e6de06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561163357600080fd5b505af1158015611647573d6000803e3d6000fd5b50505050801561165d576000805461ff00191690555b5050505050565b60975460ff1681565b6001600160a01b0381166000908152603360205260409020545b919050565b60006001600160a01b0382166116b45760405162461bcd60e51b815260040161089f90614717565b6099546001600160a01b03163314806117635750609960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561171657600080fd5b505afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e9190613d80565b6001600160a01b0316336001600160a01b0316145b61177f5760405162461bcd60e51b815260040161089f906149e3565b609c80546001600160a01b0319166001600160a01b0384161790556040517f63fb64c359a4cae97e1bf003c1ab11390b5f0e18cc5b3d67b90bd61c0f5c52fd906117cc9084903390614403565b60405180910390a1506001919050565b609a5481565b60006002606554141561183c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555609954604080516358c3de9360e11b815290516001600160a01b039092169163b187bd2691600480820192602092909190829003018186803b15801561188657600080fd5b505afa15801561189a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118be919061423d565b156118db5760405162461bcd60e51b815260040161089f90614a51565b6001600160a01b0383166119015760405162461bcd60e51b815260040161089f90614a1a565b6099546040805163af89021560e01b815290516000926001600160a01b03169163af890215916004808301926020929190829003018186803b15801561194657600080fd5b505afa15801561195a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197e9190613d80565b604051635549c01960e01b81529091506001600160a01b03821690635549c019906119ad9030906004016143cb565b600060405180830381600087803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b5050609954604051634f8419b960e01b8152600093506001600160a01b039091169150634f8419b990611a129088906004016143cb565b60206040518083038186803b158015611a2a57600080fd5b505afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a629190613d80565b609954604051633f30232f60e21b81529192506000916001600160a01b039091169063fcc08cbc90611a989089906004016143cb565b60206040518083038186803b158015611ab057600080fd5b505afa158015611ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae89190613d80565b90506000806001600160a01b03841615611b8d57609c54604051636179309d60e01b81526001600160a01b0386811692636179309d92611b3292909116908c908c9060040161451c565b6040805180830381600087803b158015611b4b57600080fd5b505af1158015611b5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b83919061429e565b9092509050611c4f565b6001600160a01b038316611bb35760405162461bcd60e51b815260040161089f90614981565b609c54604051634df48c7360e11b81526001600160a01b0390911690639be918e690611be3908b906004016143cb565b60206040518083038186803b158015611bfb57600080fd5b505afa158015611c0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c33919061423d565b611c4f5760405162461bcd60e51b815260040161089f9061474c565b61ffff8216158015611c6957506001600160a01b03831615155b15611cfb57609c54604051636179309d60e01b81526001600160a01b0385811692636179309d92611ca492909116908c908c9060040161451c565b6040805180830381600087803b158015611cbd57600080fd5b505af1158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf5919061429e565b90925090505b60008261ffff1611611d1f5760405162461bcd60e51b815260040161089f906147b1565b8080611d435750611d2e61277f565b6001600160a01b0316336001600160a01b0316145b80611d665750611d516136aa565b6001600160a01b0316336001600160a01b0316145b611d825760405162461bcd60e51b815260040161089f906146ce565b611d956001600160a01b0389168861305e565b9550846001600160a01b031663994449326040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611dd257600080fd5b505af1158015611de6573d6000803e3d6000fd5b505050507f14464fb67b1871a79e726fa7af525f8fff56e9e5649d511e47f3a357ae31d20730611e1461277f565b8442604051611e269493929190614548565b60405180910390a1505060016065555091949350505050565b6000806000611e4c610dc0565b915091506000611e6483611e5e610568565b906133a5565b9050611e7082826136ef565b935050505090565b60006001600160a01b0383163014611ea25760405162461bcd60e51b815260040161089f9061485d565b609954604051633f30232f60e21b81526000916001600160a01b03169063fcc08cbc90611ed39033906004016143cb565b60206040518083038186803b158015611eeb57600080fd5b505afa158015611eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f239190613d80565b90506001600160a01b03811615801590611fbe5750806001600160a01b031663e9d337b86040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190613d80565b6001600160a01b0316336001600160a01b0316145b611fda5760405162461bcd60e51b815260040161089f90614ad9565b60008084806020019051810190611ff1919061418a565b6099546040516321f8a72160e01b81529294509092506000916001600160a01b03909116906321f8a72190612028906004016149aa565b60206040518083038186803b15801561204057600080fd5b505afa158015612054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120789190613d80565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016120a891906143cb565b60206040518083038186803b1580156120c057600080fd5b505afa1580156120d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f891906142ea565b90506000856001600160a01b031663952bfb1630868f8f8f8b6040518763ffffffff1660e01b8152600401612132969594939291906145ef565b60006040518083038186803b15801561214a57600080fd5b505afa15801561215e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121869190810190614158565b905060005b81518110156121e8576121de8282815181106121a357fe5b6020026020010151602001518383815181106121bb57fe5b6020026020010151600001516001600160a01b031661305e90919063ffffffff16565b975060010161218b565b5081158061227157506040516370a0823160e01b81526001600160a01b038416906370a082319061221d9030906004016143cb565b60206040518083038186803b15801561223557600080fd5b505afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d91906142ea565b8211155b61228d5760405162461bcd60e51b815260040161089f906148f9565b50505050505095945050505050565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b600061055e61230a61268f565b84610d9185604051806060016040528060258152602001614e15602591396034600061233461268f565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061324b565b600080609c60009054906101000a90046001600160a01b03166001600160a01b031663ad60ffcc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123b657600080fd5b505afa1580156123ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ee91906142ea565b905060006123fa610568565b905061240682826136ef565b9250505090565b600061055e61241a61268f565b84846130ee565b609d6020526000908152604090205481565b60008061243e610fc0565b6001600160a01b0384166000908152609b60205260408120549192509061246590836133a5565b90504281101561247a57600092505050611687565b6124848142613091565b949350505050565b609c5460405163bbbf725b60e01b81526000916001600160a01b03169063bbbf725b906124bd9085906004016143cb565b60206040518083038186803b1580156124d557600080fd5b505afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610562919061423d565b6099546001600160a01b031681565b609960009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561256a57600080fd5b505afa15801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a2919061423d565b156125bf5760405162461bcd60e51b815260040161089f90614a51565b610dbd6127fc565b60985481565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b609e5481565b6000612608610dc0565b50919050565b609c5460408051637f6a20b560e11b815290516060926001600160a01b03169163fed4416a916004808301926000929190829003018186803b15801561265357600080fd5b505afa158015612667573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261103d9190810190614259565b3390565b6001600160a01b0383166126d85760405162461bcd60e51b8152600401808060200182810382526024815260200180614df16024913960400191505060405180910390fd5b6001600160a01b03821661271d5760405162461bcd60e51b8152600401808060200182810382526022815260200180614cec6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b609c546040805163481c6a7560e01b815290516000926001600160a01b03169163481c6a75916004808301926020929190829003018186803b1580156127c457600080fd5b505afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103d9190613d80565b6099546040805163af89021560e01b815290516000926001600160a01b03169163af890215916004808301926020929190829003018186803b15801561284157600080fd5b505afa158015612855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128799190613d80565b6001600160a01b0316635549c019306040518263ffffffff1660e01b81526004016128a491906143cb565b600060405180830381600087803b1580156128be57600080fd5b505af11580156128d2573d6000803e3d6000fd5b50505050609c60009054906101000a90046001600160a01b03166001600160a01b031663ad60ffcc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561292457600080fd5b505afa158015612938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295c91906142ea565b90506000612968610568565b90506000806000609c60009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160606040518083038186803b1580156129bd57600080fd5b505afa1580156129d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f59190614325565b9250925092506000612a0a86868686866132e2565b9050612710811015612a20575050505050610547565b6099546040805163084c71a360e21b815290516000926001600160a01b031691632131c68c916004808301926020929190829003018186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9d9190613d80565b6099546040805163272b69b960e21b8152815193945060009384936001600160a01b031692639cada6e49260048082019391829003018186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1b9190614302565b90925090506000612b30826109298786612bce565b90506000612b3e8683613091565b90508115612b5057612b508583613448565b8015612b6757612b67612b6161277f565b82613448565b612b718b8b6136ef565b609a5542609e557f755a8059d66d8d243bc9f6913f429a811f154599d0538bb0b6a2ac23f23d2ccd30612ba261277f565b609a54604051612bb99392918b91889188916145a0565b60405180910390a15050505050505050505090565b600082612bdd57506000610562565b82820282848281612bea57fe5b0414610d9a5760405162461bcd60e51b8152600401808060200182810382526021815260200180614d626021913960400191505060405180910390fd5b6000808211612c7d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612c8657fe5b049392505050565b6001600160a01b038216612cd35760405162461bcd60e51b8152600401808060200182810382526021815260200180614dab6021913960400191505060405180910390fd5b612cdf8260008361371f565b612d1c81604051806060016040528060228152602001614cca602291396001600160a01b038516600090815260336020526040902054919061324b565b6001600160a01b038316600090815260336020526040902055603554612d429082613091565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b609954604051633f30232f60e21b81526000918291829182916001600160a01b039091169063fcc08cbc90612dc3908a906004016143cb565b60206040518083038186803b158015612ddb57600080fd5b505afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e139190613d80565b90506001600160a01b038116612e3b5760405162461bcd60e51b815260040161089f90614a7b565b6000806000836001600160a01b0316636f8ae202308c8b8d6040518563ffffffff1660e01b8152600401612e729493929190614575565b60006040518083038186803b158015612e8a57600080fd5b505afa158015612e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ec69190810190613f11565b80519295509093509150801561304d5760006001600160a01b03851615612f66576040516370a0823160e01b81526001600160a01b038616906370a0823190612f139030906004016143cb565b60206040518083038186803b158015612f2b57600080fd5b505afa158015612f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6391906142ea565b90505b60005b82811015612fa257612f98848281518110612f8057fe5b6020026020010151602001518583815181106121bb57fe5b9750600101612f69565b506001600160a01b0385161561304b576040516370a0823160e01b81526000906001600160a01b038716906370a0823190612fe19030906004016143cb565b60206040518083038186803b158015612ff957600080fd5b505afa15801561300d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303191906142ea565b90506130476130408284613091565b86906133a5565b9450505b505b509195509350505093509350939050565b60008060008351602085016000875af1905080156001811461307f5761308a565b3d806000803e806000fd5b5092915050565b6000828211156130e8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b0383166131335760405162461bcd60e51b8152600401808060200182810382526025815260200180614dcc6025913960400191505060405180910390fd5b6001600160a01b0382166131785760405162461bcd60e51b8152600401808060200182810382526023815260200180614ca76023913960400191505060405180910390fd5b61318383838361371f565b6131c081604051806060016040528060268152602001614d0e602691396001600160a01b038616600090815260336020526040902054919061324b565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546131ef90826133a5565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156132da5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561329f578181015183820152602001613287565b50505050905090810190601f1680156132cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008415806132ef575085155b156132fc5750600061339c565b60006133148661092989670de0b6b3a7640000612bce565b9050609a5481111561334e5761334b8161092985610929896133458c613345609a548a61309190919063ffffffff16565b90612bce565b91505b609e541561339a57600061336d609e544261309190919063ffffffff16565b905060006133896301e1338061092987818a6133458e89612bce565b905061339584826133a5565b935050505b505b95945050505050565b600082820183811015610d9a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6097805460ff19168215151790556040517f8d75e9ede4188432084b863d70b3416010c97547dfeb4fc17734d2e997ee0f399061343d9083906146b0565b60405180910390a150565b6001600160a01b0382166134a3576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6134af6000838361371f565b6035546134bc90826133a5565b6035556001600160a01b0382166000908152603360205260409020546134e290826133a5565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600061354530613857565b15905090565b600054610100900460ff1680613564575061356461353a565b80613572575060005460ff16155b6135ad5760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff161580156135d8576000805460ff1961ff0019909116610100171660011790555b6135e061385d565b6135ea83836138fd565b80156135fc576000805461ff00191690555b505050565b600054610100900460ff168061361a575061361a61353a565b80613628575060005460ff16155b6136635760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff1615801561368e576000805460ff1961ff0019909116610100171660011790555b6136966139d5565b8015610dbd576000805461ff001916905550565b609c5460408051631758078b60e01b815290516000926001600160a01b031691631758078b916004808301926020929190829003018186803b1580156127c457600080fd5b60008115806136fc575082155b1561370957506000610562565b610d9a8261092985670de0b6b3a7640000612bce565b61372a8383836135fc565b6001600160a01b03831661373d576135fc565b609954604051637ffbe24160e01b81526000916001600160a01b031690637ffbe2419061376e9087906004016143cb565b60206040518083038186803b15801561378657600080fd5b505afa15801561379a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137be919061423d565b905080156137e757506001600160a01b0382166000908152609d602052604090204290556135fc565b6001600160a01b0384166000908152609d6020526040902054429061380e9061012c6133a5565b1061382b5760405162461bcd60e51b815260040161089f906148c2565b61383484612433565b156138515760405162461bcd60e51b815260040161089f906147de565b50505050565b3b151590565b600054610100900460ff1680613876575061387661353a565b80613884575060005460ff16155b6138bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff16158015613696576000805460ff1961ff0019909116610100171660011790558015610dbd576000805461ff001916905550565b600054610100900460ff1680613916575061391661353a565b80613924575060005460ff16155b61395f5760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff1615801561398a576000805460ff1961ff0019909116610100171660011790555b825161399d906036906020860190613b07565b5081516139b1906037906020850190613b07565b506038805460ff1916601217905580156135fc576000805461ff0019169055505050565b600054610100900460ff16806139ee57506139ee61353a565b806139fc575060005460ff16155b613a375760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff16158015613a62576000805460ff1961ff0019909116610100171660011790555b60016065558015610dbd576000805461ff001916905550565b60405180610180016040528060608152602001600081526020016000815260200160006001600160a01b03168152602001606081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613b3d5760008555613b83565b82601f10613b5657805160ff1916838001178555613b83565b82800160010185558215613b83579182015b82811115613b83578251825591602001919060010190613b68565b50613b8f929150613b93565b5090565b5b80821115613b8f5760008155600101613b94565b6000613bbb613bb684614c36565b614bf6565b9050828152838383011115613bcf57600080fd5b610d9a836020830184614c57565b803561168781614c83565b600082601f830112613bf8578081fd5b81516020613c08613bb683614c19565b82815281810190858301855b85811015613cb15781518801604080601f19838d03011215613c34578889fd5b80518181016001600160401b038282108183111715613c4f57fe5b9083528389015190613c6082614c83565b908252838301519080821115613c74578b8cfd5b508084019350508b603f840112613c8957898afd5b613c998c89850151848601613ba8565b81890152865250509284019290840190600101613c14565b5090979650505050505050565b600082601f830112613cce578081fd5b81356020613cde613bb683614c19565b8281528181019085830183850287018401881015613cfa578586fd5b855b85811015613cb157813584529284019290840190600101613cfc565b600082601f830112613d28578081fd5b8135613d36613bb682614c36565b818152846020838601011115613d4a578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613d75578081fd5b8135610d9a81614c83565b600060208284031215613d91578081fd5b8151610d9a81614c83565b60008060408385031215613dae578081fd5b8235613db981614c83565b91506020830135613dc981614c83565b809150509250929050565b600080600060608486031215613de8578081fd5b8335613df381614c83565b92506020840135613e0381614c83565b929592945050506040919091013590565b60008060008060808587031215613e29578182fd5b8435613e3481614c83565b93506020850135613e4481614c98565b925060408501356001600160401b0380821115613e5f578384fd5b613e6b88838901613d18565b93506060870135915080821115613e80578283fd5b50613e8d87828801613d18565b91505092959194509250565b60008060408385031215613eab578182fd5b8235613eb681614c83565b915060208301356001600160401b03811115613ed0578182fd5b613edc85828601613d18565b9150509250929050565b60008060408385031215613ef8578182fd5b8235613f0381614c83565b946020939093013593505050565b600080600060608486031215613f25578081fd5b8351613f3081614c83565b6020850151604086015191945092506001600160401b03811115613f52578182fd5b613f5e86828701613be8565b9150509250925092565b600080600080600060a08688031215613f7f578283fd5b85356001600160401b0380821115613f95578485fd5b818801915088601f830112613fa8578485fd5b81356020613fb8613bb683614c19565b82815281810190858301838502870184018e1015613fd457898afd5b8996505b84871015613fff578035613feb81614c83565b835260019690960195918301918301613fd8565b5099505089013592505080821115614015578485fd5b61402189838a01613cbe565b95506040880135915080821115614036578485fd5b61404289838a01613cbe565b945061405060608901613bdd565b93506080880135915080821115614065578283fd5b5061407288828901613d18565b9150509295509295909350565b60006020808385031215614091578182fd5b82516001600160401b03808211156140a7578384fd5b818501915085601f8301126140ba578384fd5b81516140c8613bb682614c19565b818152848101908486016040808502870188018b10156140e6578889fd5b8896505b848710156141495780828c031215614100578889fd5b8051818101818110888211171561411357fe5b8252825161412081614c83565b81528289015161412f81614c98565b818a015284526001969096019592870192908101906140ea565b50909998505050505050505050565b600060208284031215614169578081fd5b81516001600160401b0381111561417e578182fd5b61248484828501613be8565b6000806040838503121561419c578182fd5b82516001600160401b038111156141b1578283fd5b8301601f810185136141c1578283fd5b805160206141d1613bb683614c19565b82815281810190848301838502860184018a10156141ed578788fd5b8795505b8486101561420f5780518352600195909501949183019183016141f1565b50969091015195979596505050505050565b600060208284031215614232578081fd5b8135610d9a81614c98565b60006020828403121561424e578081fd5b8151610d9a81614c98565b60006020828403121561426a578081fd5b81516001600160401b0381111561427f578182fd5b8201601f8101841361428f578182fd5b61248484825160208401613ba8565b600080604083850312156142b0578182fd5b825161ffff811681146142c1578283fd5b6020840151909250613dc981614c98565b6000602082840312156142e3578081fd5b5035919050565b6000602082840312156142fb578081fd5b5051919050565b60008060408385031215614314578182fd5b505080516020909101519092909150565b600080600060608486031215614339578081fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561438e57815187529582019590820190600101614372565b509495945050505050565b15159052565b600081518084526143b7816020860160208601614c57565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039a8b168152988a1660208a01529690981660408801526060870194909452608086019290925260a085015260c084015260e08301526101008201929092526101208101919091526101400190565b600061012080830160018060a01b03808e1685526020818e168187015260408d8188015260608d818901528c60808901528b60a08901528a60c08901528560e0890152849550895180865261014089019650838b019550875b818110156144fd57865180518716895285810151868a015284015115158489015296820196958401956001016144cc565b505050505061010094909401949094529b9a5050505050505050505050565b6001600160a01b0384811682528316602082015260606040820181905260009061339c9083018461439f565b6001600160a01b03948516815292909316602083015261ffff166040820152606081019190915260800190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03968716815294909516602085015260408401929092526060830152608082015260a081019190915260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b038781168252602080830188905260c060408401819052875190840181905260009288830192909160e0860190855b81811015614643578551851683529483019491830191600101614625565b50508581036060870152614657818a61435f565b9350505050828103608084015261466e818661435f565b905082810360a0840152614682818561435f565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b600060208252610d9a602083018461439f565b60208082526029908201527f6f6e6c79206d616e61676572206f7220747261646572206f72207075626c696360408201526810333ab731ba34b7b760b91b606082015260800190565b6020808252818101527f496e76616c696420706f6f6c4d616e616765724c6f6769632061646472657373604082015260600190565b60208082526019908201527f6173736574206e6f7420656e61626c656420696e20706f6f6c00000000000000604082015260600190565b6020808252601490820152731bdb9b1e481b595b58995c9cc8185b1b1bddd95960621b604082015260600190565b60208082526013908201527234b73b30b634b2103a3930b739b0b1ba34b7b760691b604082015260600190565b6020808252600f908201526e636f6f6c646f776e2061637469766560881b604082015260600190565b602080825260169082015275199b1859c81b5d5cdd08189948191a5999995c995b9d60521b604082015260600190565b6020808252600c908201526b37b7363c9036b0b730b3b2b960a11b604082015260600190565b6020808252601b908201527f6f6e6c7920706f6f6c20666c617368206c6f616e206f726967696e0000000000604082015260600190565b60208082526014908201527363616e2077697468647261772073686f72746c7960601b604082015260600190565b60208082526019908201527f77686974656c69737420636f6f6c646f776e2061637469766500000000000000604082015260600190565b602080825260119082015270746f6f206869676820736c69707061676560781b604082015260600190565b602080825260149082015273696e73756666696369656e742062616c616e636560601b604082015260600190565b6020808252601590820152741a5b9d985b1a590819195c1bdcda5d08185cdcd95d605a1b604082015260600190565b6020808252600f908201526e11dd585c99081b9bdd08199bdd5b99608a1b604082015260600190565b630eecae8d60e31b815260200190565b6020808252600f908201526e496e76616c696420666163746f727960881b604082015260600190565b6020808252601d908201527f6f6e6c79206f776e6572206f7220666163746f727920616c6c6f776564000000604082015260600190565b6020808252601c908201527f6e6f6e2d7a65726f206164647265737320697320726571756972656400000000604082015260600190565b60208082526010908201526f18dbdb9d1c9858dd1cc81c185d5cd95960821b604082015260600190565b6020808252600d908201526c1a5b9d985b1a590819dd585c99609a1b604082015260600190565b6020808252601a908201527f726571756972657320617373657420746f207769746864726177000000000000604082015260600190565b6020808252601490820152731a5b9d985b1a59081b195b991a5b99c81c1bdbdb60621b604082015260600190565b6000602082528251610180806020850152614b266101a085018361439f565b915060208501516040850152604085015160608501526060850151614b4e6080860182614352565b506080850151848303601f190160a0860152614b6a838261439f565b92505060a085015160c085015260c0850151614b8960e0860182614399565b5060e085015161010085810191909152850151610120808601919091528501516101408086019190915285015161016080860191909152909401519390920192909252919050565b90815260200190565b918252602082015260400190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715614c1157fe5b604052919050565b60006001600160401b03821115614c2c57fe5b5060209081020190565b60006001600160401b03821115614c4957fe5b50601f01601f191660200190565b60005b83811015614c72578181015183820152602001614c5a565b838111156138515750506000910152565b6001600160a01b0381168114610dbd57600080fd5b8015158114610dbd57600080fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207d72b009172aeead2e7de255263628b19e483e6c31c1b94e688fd74d59963f7d64736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063750226de11610130578063aee88334116100b8578063d8270dce1161007c578063d8270dce1461046c578063dd62ed3e14610474578063df8ff12f14610487578063edbf6f501461048f578063fed4416a1461049757610232565b8063aee8833414610423578063b8ea2b6e14610436578063bbbf725b14610449578063c45a01551461045c578063cc3c6df61461046457610232565b8063920f5c84116100ff578063920f5c84146103da57806395d89b41146103ed578063a457c2d7146103f5578063a77134e414610408578063a9059cbb1461041057610232565b8063750226de146103a45780637714f39d146103b75780637ae7cfb5146103bf5780637ff9b596146103d257610232565b80632e1a7d4d116101be5780634501b088116101825780634501b0881461035b57806347e7ef24146103635780635426f81d1461037657806359b5e75e1461038957806370a082311461039157610232565b80632e1a7d4d146102f75780632e98e65d1461030a578063313ce5671461032057806339509351146103355780633babaad51461034857610232565b80631c5918d2116102055780631c5918d21461029f5780631e50a4a6146102b4578063205c2878146102bc57806323b872dd146102d157806329d16ee8146102e457610232565b806302d05d3f1461023757806306fdde0314610255578063095ea7b31461026a57806318160ddd1461028a575b600080fd5b61023f61049f565b60405161024c91906143cb565b60405180910390f35b61025d6104b3565b60405161024c91906146bb565b61027d610278366004613ee6565b61054a565b60405161024c91906146b0565b610292610568565b60405161024c9190614bd1565b6102a761056e565b60405161024c9190614b07565b61023f610799565b6102cf6102ca366004613ee6565b6107a8565b005b61027d6102df366004613dd4565b610d19565b6102926102f2366004613d64565b610da1565b6102cf6103053660046142d2565b610db3565b610312610dc0565b60405161024c929190614bda565b610328610eff565b60405161024c9190614be8565b61027d610343366004613ee6565b610f08565b6102cf610356366004614221565b610f56565b610292610fc0565b610292610371366004613ee6565b611042565b6102cf610384366004613e14565b611467565b61027d611664565b61029261039f366004613d64565b61166d565b61027d6103b2366004613d64565b61168c565b6102926117dc565b61027d6103cd366004613e99565b6117e2565b610292611e3f565b61027d6103e8366004613f68565b611e78565b61025d61229c565b61027d610403366004613ee6565b6122fd565b610292612365565b61027d61041e366004613ee6565b61240d565b610292610431366004613d64565b612421565b610292610444366004613d64565b612433565b61027d610457366004613d64565b61248c565b61023f61250d565b6102cf61251c565b6102926125c7565b610292610482366004613d9c565b6125cd565b6102926125f8565b6102926125fe565b61025d61260e565b60975461010090046001600160a01b031681565b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b820191906000526020600020905b81548152906001019060200180831161052257829003601f168201915b505050505090505b90565b600061055e61055761268f565b8484612693565b5060015b92915050565b60355490565b610576613a7b565b6000806000609c60009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160606040518083038186803b1580156105c957600080fd5b505afa1580156105dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106019190614325565b925092509250600080609960009054906101000a90046001600160a01b03166001600160a01b031663ecb0116a6040518163ffffffff1660e01b8152600401604080518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190614302565b915091506040518061018001604052806106a76104b3565b81526020016106b4610568565b8152609c5460408051632b583ff360e21b815290516020938401936001600160a01b039093169263ad60ffcc9260048082019391829003018186803b1580156106fc57600080fd5b505afa158015610710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073491906142ea565b815260200161074161277f565b6001600160a01b0316815260200161075761260e565b8152609854602082015260975460ff16151560408201526060810196909652608086019490945260a085019290925260c084015260e090920191909152905090565b609c546001600160a01b031681565b60026065541415610800576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555609954604080516358c3de9360e11b815290516001600160a01b039092169163b187bd2691600480820192602092909190829003018186803b15801561084a57600080fd5b505afa15801561085e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610882919061423d565b156108a85760405162461bcd60e51b815260040161089f90614a51565b60405180910390fd5b336000908152609b602052604090205442116108d65760405162461bcd60e51b815260040161089f90614894565b806108e03361166d565b10156108fe5760405162461bcd60e51b815260040161089f90614924565b60006109086127fc565b9050600061092f610917610568565b61092985670de0b6b3a7640000612bce565b90612c27565b905061093b3384612c8e565b609c546040805163e5406dbf60e01b815290516000926001600160a01b03169163e5406dbf9160048083019286929190829003018186803b15801561097f57600080fd5b505afa158015610993573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109bb919081019061407f565b9050600081516001600160401b03811180156109d657600080fd5b50604051908082528060200260200182016040528015610a1057816020015b6109fd613ae7565b8152602001906001900390816109f55790505b5090506000805b8351811015610b40576000806000610a47878581518110610a3457fe5b6020026020010151600001518c8a612d8a565b919450925090508115610adc576001600160a01b038316610a7a5760405162461bcd60e51b815260040161089f90614aa2565b610ada63a9059cbb60e01b8c84604051602401610a989291906145d6565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b0385169061305e565b505b8080610ae85750600082115b15610b35576040518060600160405280846001600160a01b03168152602001838152602001821515815250868661ffff1681518110610b2357fe5b60209081029190910101526001909401935b505050600101610a17565b506099546040805163af89021560e01b815290516000926001600160a01b03169163af890215916004808301926020929190829003018186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe9190613d80565b9050610bc8610568565b610c2057806001600160a01b031663b482cd9b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c0757600080fd5b505af1158015610c1b573d6000803e3d6000fd5b505050505b806001600160a01b031663994449326040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c5b57600080fd5b505af1158015610c6f573d6000803e3d6000fd5b5050855160009250610c86915061ffff8516613091565b8451819003855290506000610ca7670de0b6b3a7640000610929898b612bce565b90507ffad3d7f9ed107ffa7fc8ce8baa521effc3650ec48a4d1dd36bdb9c4b91db12953033838c610cd73361166d565b610ce18e88613091565b610ce9610568565b8c42604051610d0099989796959493929190614473565b60405180910390a1505060016065555050505050505050565b6000610d268484846130ee565b610d9684610d3261268f565b610d9185604051806060016040528060288152602001614d83602891396001600160a01b038a16600090815260346020526040812090610d7061268f565b6001600160a01b03168152602081019190915260400160002054919061324b565b612693565b5060015b9392505050565b609b6020526000908152604090205481565b610dbd33826107a8565b50565b600080609c60009054906101000a90046001600160a01b03166001600160a01b031663ad60ffcc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1157600080fd5b505afa158015610e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4991906142ea565b90506000610e55610568565b90506000806000609c60009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160606040518083038186803b158015610eaa57600080fd5b505afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee29190614325565b925092509250610ef585858585856132e2565b9550505050509091565b60385460ff1690565b600061055e610f1561268f565b84610d918560346000610f2661268f565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906133a5565b610f5e61277f565b6001600160a01b0316336001600160a01b031614610f8e5760405162461bcd60e51b815260040161089f90614837565b60975460ff1615158115151415610fb75760405162461bcd60e51b815260040161089f90614807565b610dbd816133ff565b609954604080516308a0361160e31b815290516000926001600160a01b031691634501b088916004808301926020929190829003018186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103d91906142ea565b905090565b600061104c61277f565b6001600160a01b0316336001600160a01b0316148061106e575060975460ff16155b8061107d575061107d3361248c565b6110995760405162461bcd60e51b815260040161089f90614783565b609960009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b1580156110e757600080fd5b505afa1580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f919061423d565b1561113c5760405162461bcd60e51b815260040161089f90614a51565b609c5460405163bdbef07d60e01b81526001600160a01b039091169063bdbef07d9061116c9086906004016143cb565b60206040518083038186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bc919061423d565b6111d85760405162461bcd60e51b815260040161089f90614952565b336000908152609b602052604081204290556111f26127fc565b905060006111fe610568565b90506112626323b872dd60e01b333087604051602401611220939291906143df565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b0387169061305e565b50609960009054906101000a90046001600160a01b03166001600160a01b031663af8902156040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b157600080fd5b505afa1580156112c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e99190613d80565b6001600160a01b0316639718fc7a868660006040518463ffffffff1660e01b81526004016113199392919061468f565b600060405180830381600087803b15801561133357600080fd5b505af1158015611347573d6000803e3d6000fd5b5050609c546040516314e03fdd60e11b8152600093506001600160a01b0390911691506329c07fba9061138090899089906004016145d6565b60206040518083038186803b15801561139857600080fd5b505afa1580156113ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d091906142ea565b905081156113ed576113e6836109298385612bce565b93506113f1565b8093505b6113fb3385613448565b7f97e6c213c123075e233a6f2323f33d8319141b993ab05e9e2f7eb2eda08cb94430338888858961142b3361166d565b6114358b8a6133a5565b61143f8b8e6133a5565b426040516114569a9998979695949392919061441d565b60405180910390a150505092915050565b600054610100900460ff1680611480575061148061353a565b8061148e575060005460ff16155b6114c95760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff161580156114f4576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03851661151a5760405162461bcd60e51b815260040161089f906149ba565b611524838361354b565b61152c613601565b609980546001600160a01b0319166001600160a01b038716179055611550846133ff565b60978054610100600160a81b0319163361010002179055426098819055609e55670de0b6b3a7640000609a556099546040805163af89021560e01b815290516001600160a01b039092169163af89021591600481810192602092909190829003018186803b1580156115c157600080fd5b505afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f99190613d80565b6001600160a01b031663250e6de06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561163357600080fd5b505af1158015611647573d6000803e3d6000fd5b50505050801561165d576000805461ff00191690555b5050505050565b60975460ff1681565b6001600160a01b0381166000908152603360205260409020545b919050565b60006001600160a01b0382166116b45760405162461bcd60e51b815260040161089f90614717565b6099546001600160a01b03163314806117635750609960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561171657600080fd5b505afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e9190613d80565b6001600160a01b0316336001600160a01b0316145b61177f5760405162461bcd60e51b815260040161089f906149e3565b609c80546001600160a01b0319166001600160a01b0384161790556040517f63fb64c359a4cae97e1bf003c1ab11390b5f0e18cc5b3d67b90bd61c0f5c52fd906117cc9084903390614403565b60405180910390a1506001919050565b609a5481565b60006002606554141561183c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555609954604080516358c3de9360e11b815290516001600160a01b039092169163b187bd2691600480820192602092909190829003018186803b15801561188657600080fd5b505afa15801561189a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118be919061423d565b156118db5760405162461bcd60e51b815260040161089f90614a51565b6001600160a01b0383166119015760405162461bcd60e51b815260040161089f90614a1a565b6099546040805163af89021560e01b815290516000926001600160a01b03169163af890215916004808301926020929190829003018186803b15801561194657600080fd5b505afa15801561195a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197e9190613d80565b604051635549c01960e01b81529091506001600160a01b03821690635549c019906119ad9030906004016143cb565b600060405180830381600087803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b5050609954604051634f8419b960e01b8152600093506001600160a01b039091169150634f8419b990611a129088906004016143cb565b60206040518083038186803b158015611a2a57600080fd5b505afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a629190613d80565b609954604051633f30232f60e21b81529192506000916001600160a01b039091169063fcc08cbc90611a989089906004016143cb565b60206040518083038186803b158015611ab057600080fd5b505afa158015611ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae89190613d80565b90506000806001600160a01b03841615611b8d57609c54604051636179309d60e01b81526001600160a01b0386811692636179309d92611b3292909116908c908c9060040161451c565b6040805180830381600087803b158015611b4b57600080fd5b505af1158015611b5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b83919061429e565b9092509050611c4f565b6001600160a01b038316611bb35760405162461bcd60e51b815260040161089f90614981565b609c54604051634df48c7360e11b81526001600160a01b0390911690639be918e690611be3908b906004016143cb565b60206040518083038186803b158015611bfb57600080fd5b505afa158015611c0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c33919061423d565b611c4f5760405162461bcd60e51b815260040161089f9061474c565b61ffff8216158015611c6957506001600160a01b03831615155b15611cfb57609c54604051636179309d60e01b81526001600160a01b0385811692636179309d92611ca492909116908c908c9060040161451c565b6040805180830381600087803b158015611cbd57600080fd5b505af1158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf5919061429e565b90925090505b60008261ffff1611611d1f5760405162461bcd60e51b815260040161089f906147b1565b8080611d435750611d2e61277f565b6001600160a01b0316336001600160a01b0316145b80611d665750611d516136aa565b6001600160a01b0316336001600160a01b0316145b611d825760405162461bcd60e51b815260040161089f906146ce565b611d956001600160a01b0389168861305e565b9550846001600160a01b031663994449326040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611dd257600080fd5b505af1158015611de6573d6000803e3d6000fd5b505050507f14464fb67b1871a79e726fa7af525f8fff56e9e5649d511e47f3a357ae31d20730611e1461277f565b8442604051611e269493929190614548565b60405180910390a1505060016065555091949350505050565b6000806000611e4c610dc0565b915091506000611e6483611e5e610568565b906133a5565b9050611e7082826136ef565b935050505090565b60006001600160a01b0383163014611ea25760405162461bcd60e51b815260040161089f9061485d565b609954604051633f30232f60e21b81526000916001600160a01b03169063fcc08cbc90611ed39033906004016143cb565b60206040518083038186803b158015611eeb57600080fd5b505afa158015611eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f239190613d80565b90506001600160a01b03811615801590611fbe5750806001600160a01b031663e9d337b86040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190613d80565b6001600160a01b0316336001600160a01b0316145b611fda5760405162461bcd60e51b815260040161089f90614ad9565b60008084806020019051810190611ff1919061418a565b6099546040516321f8a72160e01b81529294509092506000916001600160a01b03909116906321f8a72190612028906004016149aa565b60206040518083038186803b15801561204057600080fd5b505afa158015612054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120789190613d80565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016120a891906143cb565b60206040518083038186803b1580156120c057600080fd5b505afa1580156120d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f891906142ea565b90506000856001600160a01b031663952bfb1630868f8f8f8b6040518763ffffffff1660e01b8152600401612132969594939291906145ef565b60006040518083038186803b15801561214a57600080fd5b505afa15801561215e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121869190810190614158565b905060005b81518110156121e8576121de8282815181106121a357fe5b6020026020010151602001518383815181106121bb57fe5b6020026020010151600001516001600160a01b031661305e90919063ffffffff16565b975060010161218b565b5081158061227157506040516370a0823160e01b81526001600160a01b038416906370a082319061221d9030906004016143cb565b60206040518083038186803b15801561223557600080fd5b505afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d91906142ea565b8211155b61228d5760405162461bcd60e51b815260040161089f906148f9565b50505050505095945050505050565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b600061055e61230a61268f565b84610d9185604051806060016040528060258152602001614e15602591396034600061233461268f565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061324b565b600080609c60009054906101000a90046001600160a01b03166001600160a01b031663ad60ffcc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123b657600080fd5b505afa1580156123ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ee91906142ea565b905060006123fa610568565b905061240682826136ef565b9250505090565b600061055e61241a61268f565b84846130ee565b609d6020526000908152604090205481565b60008061243e610fc0565b6001600160a01b0384166000908152609b60205260408120549192509061246590836133a5565b90504281101561247a57600092505050611687565b6124848142613091565b949350505050565b609c5460405163bbbf725b60e01b81526000916001600160a01b03169063bbbf725b906124bd9085906004016143cb565b60206040518083038186803b1580156124d557600080fd5b505afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610562919061423d565b6099546001600160a01b031681565b609960009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561256a57600080fd5b505afa15801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a2919061423d565b156125bf5760405162461bcd60e51b815260040161089f90614a51565b610dbd6127fc565b60985481565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b609e5481565b6000612608610dc0565b50919050565b609c5460408051637f6a20b560e11b815290516060926001600160a01b03169163fed4416a916004808301926000929190829003018186803b15801561265357600080fd5b505afa158015612667573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261103d9190810190614259565b3390565b6001600160a01b0383166126d85760405162461bcd60e51b8152600401808060200182810382526024815260200180614df16024913960400191505060405180910390fd5b6001600160a01b03821661271d5760405162461bcd60e51b8152600401808060200182810382526022815260200180614cec6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b609c546040805163481c6a7560e01b815290516000926001600160a01b03169163481c6a75916004808301926020929190829003018186803b1580156127c457600080fd5b505afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103d9190613d80565b6099546040805163af89021560e01b815290516000926001600160a01b03169163af890215916004808301926020929190829003018186803b15801561284157600080fd5b505afa158015612855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128799190613d80565b6001600160a01b0316635549c019306040518263ffffffff1660e01b81526004016128a491906143cb565b600060405180830381600087803b1580156128be57600080fd5b505af11580156128d2573d6000803e3d6000fd5b50505050609c60009054906101000a90046001600160a01b03166001600160a01b031663ad60ffcc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561292457600080fd5b505afa158015612938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295c91906142ea565b90506000612968610568565b90506000806000609c60009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160606040518083038186803b1580156129bd57600080fd5b505afa1580156129d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f59190614325565b9250925092506000612a0a86868686866132e2565b9050612710811015612a20575050505050610547565b6099546040805163084c71a360e21b815290516000926001600160a01b031691632131c68c916004808301926020929190829003018186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9d9190613d80565b6099546040805163272b69b960e21b8152815193945060009384936001600160a01b031692639cada6e49260048082019391829003018186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1b9190614302565b90925090506000612b30826109298786612bce565b90506000612b3e8683613091565b90508115612b5057612b508583613448565b8015612b6757612b67612b6161277f565b82613448565b612b718b8b6136ef565b609a5542609e557f755a8059d66d8d243bc9f6913f429a811f154599d0538bb0b6a2ac23f23d2ccd30612ba261277f565b609a54604051612bb99392918b91889188916145a0565b60405180910390a15050505050505050505090565b600082612bdd57506000610562565b82820282848281612bea57fe5b0414610d9a5760405162461bcd60e51b8152600401808060200182810382526021815260200180614d626021913960400191505060405180910390fd5b6000808211612c7d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612c8657fe5b049392505050565b6001600160a01b038216612cd35760405162461bcd60e51b8152600401808060200182810382526021815260200180614dab6021913960400191505060405180910390fd5b612cdf8260008361371f565b612d1c81604051806060016040528060228152602001614cca602291396001600160a01b038516600090815260336020526040902054919061324b565b6001600160a01b038316600090815260336020526040902055603554612d429082613091565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b609954604051633f30232f60e21b81526000918291829182916001600160a01b039091169063fcc08cbc90612dc3908a906004016143cb565b60206040518083038186803b158015612ddb57600080fd5b505afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e139190613d80565b90506001600160a01b038116612e3b5760405162461bcd60e51b815260040161089f90614a7b565b6000806000836001600160a01b0316636f8ae202308c8b8d6040518563ffffffff1660e01b8152600401612e729493929190614575565b60006040518083038186803b158015612e8a57600080fd5b505afa158015612e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ec69190810190613f11565b80519295509093509150801561304d5760006001600160a01b03851615612f66576040516370a0823160e01b81526001600160a01b038616906370a0823190612f139030906004016143cb565b60206040518083038186803b158015612f2b57600080fd5b505afa158015612f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6391906142ea565b90505b60005b82811015612fa257612f98848281518110612f8057fe5b6020026020010151602001518583815181106121bb57fe5b9750600101612f69565b506001600160a01b0385161561304b576040516370a0823160e01b81526000906001600160a01b038716906370a0823190612fe19030906004016143cb565b60206040518083038186803b158015612ff957600080fd5b505afa15801561300d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303191906142ea565b90506130476130408284613091565b86906133a5565b9450505b505b509195509350505093509350939050565b60008060008351602085016000875af1905080156001811461307f5761308a565b3d806000803e806000fd5b5092915050565b6000828211156130e8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b0383166131335760405162461bcd60e51b8152600401808060200182810382526025815260200180614dcc6025913960400191505060405180910390fd5b6001600160a01b0382166131785760405162461bcd60e51b8152600401808060200182810382526023815260200180614ca76023913960400191505060405180910390fd5b61318383838361371f565b6131c081604051806060016040528060268152602001614d0e602691396001600160a01b038616600090815260336020526040902054919061324b565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546131ef90826133a5565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156132da5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561329f578181015183820152602001613287565b50505050905090810190601f1680156132cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008415806132ef575085155b156132fc5750600061339c565b60006133148661092989670de0b6b3a7640000612bce565b9050609a5481111561334e5761334b8161092985610929896133458c613345609a548a61309190919063ffffffff16565b90612bce565b91505b609e541561339a57600061336d609e544261309190919063ffffffff16565b905060006133896301e1338061092987818a6133458e89612bce565b905061339584826133a5565b935050505b505b95945050505050565b600082820183811015610d9a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6097805460ff19168215151790556040517f8d75e9ede4188432084b863d70b3416010c97547dfeb4fc17734d2e997ee0f399061343d9083906146b0565b60405180910390a150565b6001600160a01b0382166134a3576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6134af6000838361371f565b6035546134bc90826133a5565b6035556001600160a01b0382166000908152603360205260409020546134e290826133a5565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600061354530613857565b15905090565b600054610100900460ff1680613564575061356461353a565b80613572575060005460ff16155b6135ad5760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff161580156135d8576000805460ff1961ff0019909116610100171660011790555b6135e061385d565b6135ea83836138fd565b80156135fc576000805461ff00191690555b505050565b600054610100900460ff168061361a575061361a61353a565b80613628575060005460ff16155b6136635760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff1615801561368e576000805460ff1961ff0019909116610100171660011790555b6136966139d5565b8015610dbd576000805461ff001916905550565b609c5460408051631758078b60e01b815290516000926001600160a01b031691631758078b916004808301926020929190829003018186803b1580156127c457600080fd5b60008115806136fc575082155b1561370957506000610562565b610d9a8261092985670de0b6b3a7640000612bce565b61372a8383836135fc565b6001600160a01b03831661373d576135fc565b609954604051637ffbe24160e01b81526000916001600160a01b031690637ffbe2419061376e9087906004016143cb565b60206040518083038186803b15801561378657600080fd5b505afa15801561379a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137be919061423d565b905080156137e757506001600160a01b0382166000908152609d602052604090204290556135fc565b6001600160a01b0384166000908152609d6020526040902054429061380e9061012c6133a5565b1061382b5760405162461bcd60e51b815260040161089f906148c2565b61383484612433565b156138515760405162461bcd60e51b815260040161089f906147de565b50505050565b3b151590565b600054610100900460ff1680613876575061387661353a565b80613884575060005460ff16155b6138bf5760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff16158015613696576000805460ff1961ff0019909116610100171660011790558015610dbd576000805461ff001916905550565b600054610100900460ff1680613916575061391661353a565b80613924575060005460ff16155b61395f5760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff1615801561398a576000805460ff1961ff0019909116610100171660011790555b825161399d906036906020860190613b07565b5081516139b1906037906020850190613b07565b506038805460ff1916601217905580156135fc576000805461ff0019169055505050565b600054610100900460ff16806139ee57506139ee61353a565b806139fc575060005460ff16155b613a375760405162461bcd60e51b815260040180806020018281038252602e815260200180614d34602e913960400191505060405180910390fd5b600054610100900460ff16158015613a62576000805460ff1961ff0019909116610100171660011790555b60016065558015610dbd576000805461ff001916905550565b60405180610180016040528060608152602001600081526020016000815260200160006001600160a01b03168152602001606081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613b3d5760008555613b83565b82601f10613b5657805160ff1916838001178555613b83565b82800160010185558215613b83579182015b82811115613b83578251825591602001919060010190613b68565b50613b8f929150613b93565b5090565b5b80821115613b8f5760008155600101613b94565b6000613bbb613bb684614c36565b614bf6565b9050828152838383011115613bcf57600080fd5b610d9a836020830184614c57565b803561168781614c83565b600082601f830112613bf8578081fd5b81516020613c08613bb683614c19565b82815281810190858301855b85811015613cb15781518801604080601f19838d03011215613c34578889fd5b80518181016001600160401b038282108183111715613c4f57fe5b9083528389015190613c6082614c83565b908252838301519080821115613c74578b8cfd5b508084019350508b603f840112613c8957898afd5b613c998c89850151848601613ba8565b81890152865250509284019290840190600101613c14565b5090979650505050505050565b600082601f830112613cce578081fd5b81356020613cde613bb683614c19565b8281528181019085830183850287018401881015613cfa578586fd5b855b85811015613cb157813584529284019290840190600101613cfc565b600082601f830112613d28578081fd5b8135613d36613bb682614c36565b818152846020838601011115613d4a578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613d75578081fd5b8135610d9a81614c83565b600060208284031215613d91578081fd5b8151610d9a81614c83565b60008060408385031215613dae578081fd5b8235613db981614c83565b91506020830135613dc981614c83565b809150509250929050565b600080600060608486031215613de8578081fd5b8335613df381614c83565b92506020840135613e0381614c83565b929592945050506040919091013590565b60008060008060808587031215613e29578182fd5b8435613e3481614c83565b93506020850135613e4481614c98565b925060408501356001600160401b0380821115613e5f578384fd5b613e6b88838901613d18565b93506060870135915080821115613e80578283fd5b50613e8d87828801613d18565b91505092959194509250565b60008060408385031215613eab578182fd5b8235613eb681614c83565b915060208301356001600160401b03811115613ed0578182fd5b613edc85828601613d18565b9150509250929050565b60008060408385031215613ef8578182fd5b8235613f0381614c83565b946020939093013593505050565b600080600060608486031215613f25578081fd5b8351613f3081614c83565b6020850151604086015191945092506001600160401b03811115613f52578182fd5b613f5e86828701613be8565b9150509250925092565b600080600080600060a08688031215613f7f578283fd5b85356001600160401b0380821115613f95578485fd5b818801915088601f830112613fa8578485fd5b81356020613fb8613bb683614c19565b82815281810190858301838502870184018e1015613fd457898afd5b8996505b84871015613fff578035613feb81614c83565b835260019690960195918301918301613fd8565b5099505089013592505080821115614015578485fd5b61402189838a01613cbe565b95506040880135915080821115614036578485fd5b61404289838a01613cbe565b945061405060608901613bdd565b93506080880135915080821115614065578283fd5b5061407288828901613d18565b9150509295509295909350565b60006020808385031215614091578182fd5b82516001600160401b03808211156140a7578384fd5b818501915085601f8301126140ba578384fd5b81516140c8613bb682614c19565b818152848101908486016040808502870188018b10156140e6578889fd5b8896505b848710156141495780828c031215614100578889fd5b8051818101818110888211171561411357fe5b8252825161412081614c83565b81528289015161412f81614c98565b818a015284526001969096019592870192908101906140ea565b50909998505050505050505050565b600060208284031215614169578081fd5b81516001600160401b0381111561417e578182fd5b61248484828501613be8565b6000806040838503121561419c578182fd5b82516001600160401b038111156141b1578283fd5b8301601f810185136141c1578283fd5b805160206141d1613bb683614c19565b82815281810190848301838502860184018a10156141ed578788fd5b8795505b8486101561420f5780518352600195909501949183019183016141f1565b50969091015195979596505050505050565b600060208284031215614232578081fd5b8135610d9a81614c98565b60006020828403121561424e578081fd5b8151610d9a81614c98565b60006020828403121561426a578081fd5b81516001600160401b0381111561427f578182fd5b8201601f8101841361428f578182fd5b61248484825160208401613ba8565b600080604083850312156142b0578182fd5b825161ffff811681146142c1578283fd5b6020840151909250613dc981614c98565b6000602082840312156142e3578081fd5b5035919050565b6000602082840312156142fb578081fd5b5051919050565b60008060408385031215614314578182fd5b505080516020909101519092909150565b600080600060608486031215614339578081fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561438e57815187529582019590820190600101614372565b509495945050505050565b15159052565b600081518084526143b7816020860160208601614c57565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039a8b168152988a1660208a01529690981660408801526060870194909452608086019290925260a085015260c084015260e08301526101008201929092526101208101919091526101400190565b600061012080830160018060a01b03808e1685526020818e168187015260408d8188015260608d818901528c60808901528b60a08901528a60c08901528560e0890152849550895180865261014089019650838b019550875b818110156144fd57865180518716895285810151868a015284015115158489015296820196958401956001016144cc565b505050505061010094909401949094529b9a5050505050505050505050565b6001600160a01b0384811682528316602082015260606040820181905260009061339c9083018461439f565b6001600160a01b03948516815292909316602083015261ffff166040820152606081019190915260800190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03968716815294909516602085015260408401929092526060830152608082015260a081019190915260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b038781168252602080830188905260c060408401819052875190840181905260009288830192909160e0860190855b81811015614643578551851683529483019491830191600101614625565b50508581036060870152614657818a61435f565b9350505050828103608084015261466e818661435f565b905082810360a0840152614682818561435f565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b600060208252610d9a602083018461439f565b60208082526029908201527f6f6e6c79206d616e61676572206f7220747261646572206f72207075626c696360408201526810333ab731ba34b7b760b91b606082015260800190565b6020808252818101527f496e76616c696420706f6f6c4d616e616765724c6f6769632061646472657373604082015260600190565b60208082526019908201527f6173736574206e6f7420656e61626c656420696e20706f6f6c00000000000000604082015260600190565b6020808252601490820152731bdb9b1e481b595b58995c9cc8185b1b1bddd95960621b604082015260600190565b60208082526013908201527234b73b30b634b2103a3930b739b0b1ba34b7b760691b604082015260600190565b6020808252600f908201526e636f6f6c646f776e2061637469766560881b604082015260600190565b602080825260169082015275199b1859c81b5d5cdd08189948191a5999995c995b9d60521b604082015260600190565b6020808252600c908201526b37b7363c9036b0b730b3b2b960a11b604082015260600190565b6020808252601b908201527f6f6e6c7920706f6f6c20666c617368206c6f616e206f726967696e0000000000604082015260600190565b60208082526014908201527363616e2077697468647261772073686f72746c7960601b604082015260600190565b60208082526019908201527f77686974656c69737420636f6f6c646f776e2061637469766500000000000000604082015260600190565b602080825260119082015270746f6f206869676820736c69707061676560781b604082015260600190565b602080825260149082015273696e73756666696369656e742062616c616e636560601b604082015260600190565b6020808252601590820152741a5b9d985b1a590819195c1bdcda5d08185cdcd95d605a1b604082015260600190565b6020808252600f908201526e11dd585c99081b9bdd08199bdd5b99608a1b604082015260600190565b630eecae8d60e31b815260200190565b6020808252600f908201526e496e76616c696420666163746f727960881b604082015260600190565b6020808252601d908201527f6f6e6c79206f776e6572206f7220666163746f727920616c6c6f776564000000604082015260600190565b6020808252601c908201527f6e6f6e2d7a65726f206164647265737320697320726571756972656400000000604082015260600190565b60208082526010908201526f18dbdb9d1c9858dd1cc81c185d5cd95960821b604082015260600190565b6020808252600d908201526c1a5b9d985b1a590819dd585c99609a1b604082015260600190565b6020808252601a908201527f726571756972657320617373657420746f207769746864726177000000000000604082015260600190565b6020808252601490820152731a5b9d985b1a59081b195b991a5b99c81c1bdbdb60621b604082015260600190565b6000602082528251610180806020850152614b266101a085018361439f565b915060208501516040850152604085015160608501526060850151614b4e6080860182614352565b506080850151848303601f190160a0860152614b6a838261439f565b92505060a085015160c085015260c0850151614b8960e0860182614399565b5060e085015161010085810191909152850151610120808601919091528501516101408086019190915285015161016080860191909152909401519390920192909252919050565b90815260200190565b918252602082015260400190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715614c1157fe5b604052919050565b60006001600160401b03821115614c2c57fe5b5060209081020190565b60006001600160401b03821115614c4957fe5b50601f01601f191660200190565b60005b83811015614c72578181015183820152602001614c5a565b838111156138515750506000910152565b6001600160a01b0381168114610dbd57600080fd5b8015158114610dbd57600080fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207d72b009172aeead2e7de255263628b19e483e6c31c1b94e688fd74d59963f7d64736f6c63430007060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.