More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 94 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 20480138 | 184 days ago | IN | 0.00149225 ETH | 0.0003593 | ||||
Deposit | 20203536 | 223 days ago | IN | 0.005 ETH | 0.000431 | ||||
Deposit | 19881757 | 268 days ago | IN | 0 ETH | 0.00177876 | ||||
Deposit | 19772699 | 283 days ago | IN | 0.00019885 ETH | 0.00142284 | ||||
Deposit | 19698260 | 293 days ago | IN | 0.00282423 ETH | 0.00238588 | ||||
Withdraw | 19523919 | 318 days ago | IN | 0 ETH | 0.00850454 | ||||
Deposit | 19517128 | 319 days ago | IN | 0 ETH | 0.00325977 | ||||
Set Approved Tar... | 19326296 | 346 days ago | IN | 0 ETH | 0.00320517 | ||||
Deposit | 18023167 | 528 days ago | IN | 0.019629 ETH | 0.00756214 | ||||
Deposit | 17675505 | 577 days ago | IN | 0.10729228 ETH | 0.01279265 | ||||
Withdraw | 17555789 | 594 days ago | IN | 0 ETH | 0.00726955 | ||||
Deposit | 17553471 | 594 days ago | IN | 0.082098 ETH | 0.00902211 | ||||
Withdraw | 17495427 | 602 days ago | IN | 0 ETH | 0.01704582 | ||||
Deposit | 17152332 | 651 days ago | IN | 0.7488421 ETH | 0.028362 | ||||
Deposit | 17071987 | 662 days ago | IN | 0.00898933 ETH | 0.00973685 | ||||
Deposit | 17061379 | 663 days ago | IN | 0.01895156 ETH | 0.00793196 | ||||
Deposit | 17060830 | 663 days ago | IN | 0.001906 ETH | 0.00541884 | ||||
Deposit | 17057707 | 664 days ago | IN | 0.073762 ETH | 0.00578583 | ||||
Deposit | 17055984 | 664 days ago | IN | 0.1 ETH | 0.00620781 | ||||
Deposit | 17022302 | 669 days ago | IN | 0 ETH | 0.02350803 | ||||
Deposit | 16965051 | 677 days ago | IN | 0.00274786 ETH | 0.00371297 | ||||
Deposit | 16945183 | 680 days ago | IN | 0.04622716 ETH | 0.00521067 | ||||
Deposit | 16938955 | 681 days ago | IN | 0.00067 ETH | 0.00687776 | ||||
Withdraw | 16938277 | 681 days ago | IN | 0 ETH | 0.02159205 | ||||
Deposit | 16933611 | 681 days ago | IN | 0.022849 ETH | 0.00947817 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20480138 | 184 days ago | 0.00149225 ETH | ||||
20203536 | 223 days ago | 0.005 ETH | ||||
19772699 | 283 days ago | 0.00019885 ETH | ||||
19698260 | 293 days ago | 0.00282423 ETH | ||||
18023167 | 528 days ago | 0.019629 ETH | ||||
17675505 | 577 days ago | 0.10729228 ETH | ||||
17555789 | 594 days ago | 0.0000155 ETH | ||||
17555789 | 594 days ago | 0.0000155 ETH | ||||
17553471 | 594 days ago | 0.082098 ETH | ||||
17495427 | 602 days ago | 0.7819714 ETH | ||||
17495427 | 602 days ago | 0.7819714 ETH | ||||
17152332 | 651 days ago | 0.7488421 ETH | ||||
17071987 | 662 days ago | 0.00898933 ETH | ||||
17061379 | 663 days ago | 0.01895156 ETH | ||||
17060830 | 663 days ago | 0.001906 ETH | ||||
17057707 | 664 days ago | 0.073762 ETH | ||||
17055984 | 664 days ago | 0.1 ETH | ||||
16965051 | 677 days ago | 0.00274786 ETH | ||||
16945183 | 680 days ago | 0.04622716 ETH | ||||
16938955 | 681 days ago | 0.00067 ETH | ||||
16938277 | 681 days ago | 0.19151495 ETH | ||||
16938277 | 681 days ago | 0.19151495 ETH | ||||
16933611 | 681 days ago | 0.022849 ETH | ||||
16909838 | 685 days ago | 0.00025938 ETH | ||||
16886213 | 688 days ago | 0.005564 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
YearnIntegration
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0 pragma solidity ^0.8.9; import "./base/CoinStatsBaseV1.sol"; import "../integrationInterface/IntegrationInterface.sol"; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } interface IYVault { function deposit(uint256) external; function deposit(uint256, address) external; function withdraw(uint256) external; function getPricePerFullShare() external view returns (uint256); function token() external view returns (address); function decimals() external view returns (uint256); // V2 function pricePerShare() external view returns (uint256); } interface IYVaultV1Registry { function getVaults() external view returns (address[] memory); function getVaultsLength() external view returns (uint256); } interface ICurveRegistry { function getSwapAddress(address tokenAddress) external view returns (address poolAddress); function getNumTokens(address poolAddress) external view returns (uint8 numTokens); } contract YearnIntegration is IntegrationInterface, CoinStatsBaseV1 { using SafeERC20 for IERC20; ICurveRegistry public curveRegistry; // solhint-disable-next-line var-name-mixedcase IYVaultV1Registry public V1Registry = IYVaultV1Registry(0x3eE41C098f9666ed2eA246f4D2558010e59d63A0); address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; event Deposit( address indexed from, address indexed pool, uint256 poolTokensReceived, address affiliate ); event Withdraw( address indexed from, address indexed pool, uint256 poolTokensReceived, address affiliate ); constructor( ICurveRegistry _curveRegistry, address curveIntegration, uint256 _goodwill, uint256 _affiliateSplit, address _vaultAddress ) CoinStatsBaseV1(_goodwill, _affiliateSplit, _vaultAddress) { // Curve Registry curveRegistry = _curveRegistry; // Curve approvedTargets[curveIntegration] = true; // 0x exchange approvedTargets[0xDef1C0ded9bec7F1a1670819833240f027b25EfF] = true; // 1inch exchange approvedTargets[0x1111111254fb6c44bAC0beD2854e76F90643097d] = true; } /** @notice Returns pools total supply @param vaultAddress Yearn pool address from which to get supply */ function getTotalSupply(address vaultAddress) public view returns (uint256) { return IERC20(vaultAddress).totalSupply(); } /** @notice Returns account balance from pool @param vaultAddress Yearn pool address from which to get balance @param account The account */ function getBalance(address vaultAddress, address account) public view override returns (uint256 balance) { return IERC20(vaultAddress).balanceOf(account); } /** @notice Adds liquidity to any Yearn vaults with ETH or ERC20 tokens @param entryTokenAddress The token used for entry (address(0) if ETH). @param entryTokenAmount The depositTokenAmount of entryTokenAddress to invest @param vaultAddress Yearn vault address @param depositTokenAddress Token to be transfered to poolAddress @param minExitTokenAmount Min acceptable amount of liquidity/stake tokens to reeive @param underlyingTarget Underlying target which will execute swap @param targetDepositTokenAddress Token which will be used to deposit fund in target contract @param swapTarget Underlying target's swap target @param swapData Data for swap @param affiliate Affiliate address */ function deposit( address entryTokenAddress, uint256 entryTokenAmount, address vaultAddress, address depositTokenAddress, uint256 minExitTokenAmount, address underlyingTarget, address targetDepositTokenAddress, address swapTarget, bytes calldata swapData, address affiliate ) external payable override whenNotPaused { // Transfer {entryTokens} to contract entryTokenAmount = _pullTokens(entryTokenAddress, entryTokenAmount); // Subtract goodwill entryTokenAmount -= _subtractGoodwill( entryTokenAddress, entryTokenAmount, affiliate, true ); if (entryTokenAddress == address(0)) { entryTokenAddress = ETH_ADDRESS; } // Swap {entryToken} to {depositToken} // Should return depositToken uint256 depositTokenAmount; if (underlyingTarget == address(0)) { depositTokenAmount = _fillQuote( entryTokenAddress, entryTokenAmount, depositTokenAddress, swapTarget, swapData ); } else { uint256 value; if (entryTokenAddress == ETH_ADDRESS) { value = entryTokenAmount; } else { _approveToken(entryTokenAddress, underlyingTarget, entryTokenAmount); } address poolAddress = curveRegistry.getSwapAddress(depositTokenAddress); // solhint-disable-next-line avoid-low-level-calls bytes memory callData = abi.encodeWithSignature( "deposit(address,uint256,address,address,uint256,address,address,address,bytes,address)", entryTokenAddress, entryTokenAmount, poolAddress, targetDepositTokenAddress, 0, address(0), address(0), swapTarget, swapData, affiliate ); depositTokenAmount = _fillCurveDepositQuote( depositTokenAddress, underlyingTarget, value, callData ); } uint256 tokensReceived = _makeDeposit( depositTokenAddress, depositTokenAmount, vaultAddress, minExitTokenAmount ); emit Deposit(msg.sender, vaultAddress, tokensReceived, affiliate); } function _makeDeposit( address depositTokenAddress, uint256 depositTokenAmount, address vaultAddress, uint256 minExitTokenAmount ) internal returns (uint256 tokensReceived) { // Deposit to Vault _approveToken(depositTokenAddress, vaultAddress); uint256 iniYVaultBal = IERC20(vaultAddress).balanceOf(msg.sender); IYVault(vaultAddress).deposit(depositTokenAmount, msg.sender); tokensReceived = IERC20(vaultAddress).balanceOf(msg.sender) - iniYVaultBal; require( tokensReceived >= minExitTokenAmount, "VaultDeposit: High Slippage" ); } /** @notice Removes liquidity from Yarn vaults in ETH or ERC20 tokens @param vaultAddress Yearn vault address @param vaultTokenAmount Token amount to be transferes to integration contract @param exitTokenAddress Specifies the token which will be send to caller @param minExitTokenAmount Min acceptable amount of tokens to reeive @param underlyingTarget Underlying target which will execute swap @param targetWithdrawTokenAddress Token which will be used to withdraw funds in target contract @param swapTarget Excecution target for the first swap @param swapData DEX quote data @param affiliate Affiliate address to share fees */ function withdraw( address vaultAddress, uint256 vaultTokenAmount, address exitTokenAddress, uint256 minExitTokenAmount, address underlyingTarget, address targetWithdrawTokenAddress, address swapTarget, bytes calldata swapData, address affiliate ) external payable override whenNotPaused { // Transfer {liquidityTokens} to contract vaultTokenAmount = _pullTokens(vaultAddress, vaultTokenAmount); // Get underlying token from vault address underlyingToken = IYVault(vaultAddress).token(); uint256 underlyingTokenReceived = _vaultWithdraw( vaultAddress, vaultTokenAmount, underlyingToken ); // Swap to {exitTokenAddress} uint256 exitTokenAmount; if (underlyingTarget == address(0)) { exitTokenAmount = _fillQuote( underlyingToken, underlyingTokenReceived, exitTokenAddress, swapTarget, swapData ); } else { _approveToken(underlyingToken, underlyingTarget); address poolAddress = curveRegistry.getSwapAddress(underlyingToken); // solhint-disable-next-line avoid-low-level-calls bytes memory callData = abi.encodeWithSignature( "withdraw(address,uint256,address,uint256,address,address,address,bytes,address)", poolAddress, underlyingTokenReceived, exitTokenAddress, 0, address(0), targetWithdrawTokenAddress, swapTarget, swapData, affiliate ); exitTokenAmount = _fillCurveWithdrawQuote( exitTokenAddress, underlyingTarget, callData ); } require(exitTokenAmount >= minExitTokenAmount, "Withdraw: High Slippage"); exitTokenAmount -= _subtractGoodwill( exitTokenAddress, exitTokenAmount, affiliate, true ); // Transfer tokens to caller if (exitTokenAddress == ETH_ADDRESS) { Address.sendValue(payable(msg.sender), exitTokenAmount); } else { IERC20(exitTokenAddress).safeTransfer(msg.sender, exitTokenAmount); } emit Withdraw(msg.sender, vaultAddress, exitTokenAmount, affiliate); } function _vaultWithdraw( address poolAddress, uint256 entryTokenAmount, address underlyingToken ) internal returns (uint256 underlyingReceived) { uint256 iniUnderlyingBal = _getBalance(underlyingToken); IYVault(poolAddress).withdraw(entryTokenAmount); underlyingReceived = _getBalance(underlyingToken) - iniUnderlyingBal; } function _fillQuote( address inputTokenAddress, uint256 inputTokenAmount, address outputTokenAddress, address swapTarget, bytes memory swapData ) internal returns (uint256 outputTokensBought) { if (inputTokenAddress == outputTokenAddress) { return inputTokenAmount; } if (swapTarget == WETH) { if ( outputTokenAddress == address(0) || outputTokenAddress == ETH_ADDRESS ) { IWETH(WETH).withdraw(inputTokenAmount); return inputTokenAmount; } else { IWETH(WETH).deposit{value: inputTokenAmount}(); return inputTokenAmount; } } uint256 value; if (inputTokenAddress == ETH_ADDRESS) { value = inputTokenAmount; } else { _approveToken(inputTokenAddress, swapTarget); } uint256 initialOutputTokenBalance = _getBalance(outputTokenAddress); // solhint-disable-next-line reason-string require(approvedTargets[swapTarget], "FillQuote: Target is not approved"); // solhint-disable-next-line avoid-low-level-calls (bool success, ) = swapTarget.call{value: value}(swapData); require(success, "FillQuote: Failed to swap tokens"); outputTokensBought = _getBalance(outputTokenAddress) - initialOutputTokenBalance; // solhint-disable-next-line reason-string require(outputTokensBought > 0, "FillQuote: Swapped to invalid token"); } function _fillCurveDepositQuote( address exitTokenAddress, address underlyingTarget, uint256 value, bytes memory callData ) internal returns (uint256 outputTokensBought) { uint256 initialOutputTokenBalance = _getBalance(exitTokenAddress); // solhint-disable-next-line reason-string require( approvedTargets[underlyingTarget], "FillQuote: Target is not approved" ); // solhint-disable-next-line avoid-low-level-calls (bool success, ) = underlyingTarget.call{value: value}(callData); require(success, "FillQuote: Failed to swap tokens"); outputTokensBought = _getBalance(exitTokenAddress) - initialOutputTokenBalance; // solhint-disable-next-line reason-string require(outputTokensBought > 0, "FillQuote: Swapped to invalid token"); } function _fillCurveWithdrawQuote( address exitTokenAddress, address underlyingTarget, bytes memory callData ) internal returns (uint256 outputTokensBought) { uint256 initialOutputTokenBalance = _getBalance(exitTokenAddress); // solhint-disable-next-line reason-string require( approvedTargets[underlyingTarget], "FillQuote: Target is not approved" ); // solhint-disable-next-line avoid-low-level-calls (bool success, ) = underlyingTarget.call(callData); require(success, "FillQuote: Failed to swap tokens"); outputTokensBought = _getBalance(exitTokenAddress) - initialOutputTokenBalance; // solhint-disable-next-line reason-string require(outputTokensBought > 0, "FillQuote: Swapped to invalid token"); } /** @notice Utility function to determine the quantity of underlying tokens removed from vault @param poolAddress Yearn vault from which to remove liquidity @param liquidity Quantity of vault tokens to remove @return Quantity of underlying LP or token removed */ function removeAssetReturn( address poolAddress, address, uint256 liquidity ) external view override returns (uint256) { require(liquidity > 0, "RAR: Zero amount return"); IYVault vault = IYVault(poolAddress); address[] memory v1Vaults = V1Registry.getVaults(); for (uint256 i = 0; i < V1Registry.getVaultsLength(); i++) { if (v1Vaults[i] == poolAddress) return (liquidity * (vault.getPricePerFullShare())) / (1e18); } return (liquidity * (vault.pricePerShare())) / (10**vault.decimals()); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.0; import "./FeesV1.sol"; interface IVault { function addAffiliateBalance( address affiliate, address token, uint256 affiliatePortion ) external; } abstract contract CoinStatsBaseV1 is FeesV1 { using SafeERC20 for IERC20; address public immutable VAULT; constructor( uint256 _goodwill, uint256 _affiliateSplit, address _vaultAddress ) FeesV1(_goodwill, _affiliateSplit) { VAULT = _vaultAddress; } /// @notice Sends provided token amount to the contract /// @param token represents token address to be transfered /// @param amount represents token amount to be transfered function _pullTokens(address token, uint256 amount) internal returns (uint256 balance) { if (token == address(0) || token == ETH_ADDRESS) { require(msg.value > 0, "ETH was not sent"); } else { // solhint-disable reason-string require(msg.value == 0, "Along with token, the ETH was also sent"); uint256 balanceBefore = _getBalance(token); // Transfers all tokens to current contract IERC20(token).safeTransferFrom(msg.sender, address(this), amount); return _getBalance(token) - balanceBefore; } return amount; } /// @notice Subtracts goodwill portion from given amount /// @dev If 0x00... address was given, then it will be replaced with 0xEeeEE... address /// @param token represents token address /// @param amount represents token amount /// @param affiliate goodwill affiliate /// @param enableGoodwill boolean representation whether to charge fee or not /// @return totalGoodwillPortion the amount of goodwill function _subtractGoodwill( address token, uint256 amount, address affiliate, bool enableGoodwill ) internal returns (uint256 totalGoodwillPortion) { bool whitelisted = feeWhitelist[msg.sender]; if (enableGoodwill && !whitelisted && (goodwill > 0)) { totalGoodwillPortion = (amount * goodwill) / 10000; if (token == address(0) || token == ETH_ADDRESS) { Address.sendValue(payable(VAULT), totalGoodwillPortion); } else { uint256 balanceBefore = IERC20(token).balanceOf(VAULT); IERC20(token).safeTransfer(VAULT, totalGoodwillPortion); totalGoodwillPortion = IERC20(token).balanceOf(VAULT) - balanceBefore; } if (affiliates[affiliate]) { if (token == address(0)) { token = ETH_ADDRESS; } uint256 affiliatePortion = (totalGoodwillPortion * affiliateSplit) / 100; IVault(VAULT).addAffiliateBalance(affiliate, token, affiliatePortion); } } } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.4; /// @title Protocol Integration Interface abstract contract IntegrationInterface { /** @dev The function must deposit assets to the protocol. @param entryTokenAddress Token to be transfered to integration contract from caller @param entryTokenAmount Token amount to be transferes to integration contract from caller @param \ Pool/Vault address to deposit funds @param depositTokenAddress Token to be transfered to poolAddress @param minExitTokenAmount Min acceptable amount of liquidity/stake tokens to reeive @param underlyingTarget Underlying target which will execute swap @param targetDepositTokenAddress Token which will be used to deposit fund in target contract @param swapTarget Underlying target's swap target @param swapData Data for swap @param affiliate Affiliate address */ function deposit( address entryTokenAddress, uint256 entryTokenAmount, address, address depositTokenAddress, uint256 minExitTokenAmount, address underlyingTarget, address targetDepositTokenAddress, address swapTarget, bytes calldata swapData, address affiliate ) external payable virtual; /** @dev The function must withdraw assets from the protocol. @param \ Pool/Vault address @param \ Token amount to be transferes to integration contract @param exitTokenAddress Specifies the token which will be send to caller @param minExitTokenAmount Min acceptable amount of tokens to reeive @param underlyingTarget Underlying target which will execute swap @param targetWithdrawTokenAddress Token which will be used to withdraw funds from target contract @param swapTarget Underlying target's swap target @param swapData Data for swap @param affiliate Affiliate address */ function withdraw( address, uint256, address exitTokenAddress, uint256 minExitTokenAmount, address underlyingTarget, address targetWithdrawTokenAddress, address swapTarget, bytes calldata swapData, address affiliate ) external payable virtual; /** @dev Returns account balance @param \ Pool/Vault address @param account User account address @return balance Returns user current balance */ function getBalance(address, address account) public view virtual returns (uint256 balance); /** @notice Utility function to determine the quantity and address of a token being removed @param \ Pool/Vault address from which liquidity should be removed @param [Optional] Token address token to be removed @param amount Quantity of LP tokens to remove. @return The amount of token removed */ function removeAssetReturn( address, address, uint256 amount ) external view virtual returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; abstract contract FeesV1 is Ownable { using SafeERC20 for IERC20; bool public paused = false; // If true, goodwill is not deducted mapping(address => bool) public feeWhitelist; uint256 public goodwill; uint256 public affiliateSplit; // Mapping from {affiliate} to {status} mapping(address => bool) public affiliates; // Mapping from {swapTarget} to {status} mapping(address => bool) public approvedTargets; // Mapping from {token} to {status} mapping(address => bool) public shouldResetAllowance; address internal constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; event ContractPauseStatusChanged(bool status); event FeeWhitelistUpdate(address _address, bool status); event GoodwillChange(uint256 newGoodwill); event AffiliateSplitChange(uint256 newAffiliateSplit); constructor(uint256 _goodwill, uint256 _affiliateSplit) { goodwill = _goodwill; affiliateSplit = _affiliateSplit; } modifier whenNotPaused() { require(!paused, "Contract is temporary paused"); _; } /// @notice Returns address token balance /// @param token address /// @return balance function _getBalance(address token) internal view returns (uint256 balance) { if (token == address(ETH_ADDRESS)) { balance = address(this).balance; } else { balance = IERC20(token).balanceOf(address(this)); } } /// @dev Gives MAX allowance to token spender /// @param token address to apporve /// @param spender address function _approveToken(address token, address spender) internal { IERC20 _token = IERC20(token); if (shouldResetAllowance[token]) { _token.safeApprove(spender, 0); _token.safeApprove(spender, type(uint256).max); } else if (_token.allowance(address(this), spender) > 0) return; else { _token.safeApprove(spender, type(uint256).max); } } /// @dev Gives allowance to token spender /// Resets initial allowance (USDC, USDT...) /// @param token address to apporve /// @param spender address /// @param amount of allowance function _approveToken( address token, address spender, uint256 amount ) internal { IERC20(token).safeIncreaseAllowance(address(spender), amount); } /// @notice To pause/unpause contract function toggleContractActive() public onlyOwner { paused = !paused; emit ContractPauseStatusChanged(paused); } /// @notice Whitelists addresses from paying goodwill function setFeeWhitelist(address _address, bool status) external onlyOwner { feeWhitelist[_address] = status; emit FeeWhitelistUpdate(_address, status); } /// @notice Changes goodwill % function setNewGoodwill(uint256 _newGoodwill) public onlyOwner { require(_newGoodwill <= 100, "Invalid goodwill value"); goodwill = _newGoodwill; emit GoodwillChange(_newGoodwill); } /// @notice Changes affiliate split % function setNewAffiliateSplit(uint256 _newAffiliateSplit) external onlyOwner { require(_newAffiliateSplit <= 100, "Invalid affilatesplit percent"); affiliateSplit = _newAffiliateSplit; emit AffiliateSplitChange(_newAffiliateSplit); } /// @notice Sets affiliate status function setAffiliates( address[] calldata _affiliates, bool[] calldata _status ) external onlyOwner { require( _affiliates.length == _status.length, "Affiliate: Invalid input length" ); for (uint256 i = 0; i < _affiliates.length; i++) { affiliates[_affiliates[i]] = _status[i]; } } ///@notice Sets approved targets function setApprovedTargets( address[] calldata targets, bool[] calldata isApproved ) external onlyOwner { require( targets.length == isApproved.length, "SetApprovedTargets: Invalid input length" ); for (uint256 i = 0; i < targets.length; i++) { approvedTargets[targets[i]] = isApproved[i]; } } ///@notice Sets address allowance that should be reset first function setShouldResetAllowance( address[] calldata tokens, bool[] calldata statuses ) external onlyOwner { require( tokens.length == statuses.length, "SetShouldResetAllowance: Invalid input length" ); for (uint256 i = 0; i < tokens.length; i++) { shouldResetAllowance[tokens[i]] = statuses[i]; } } receive() external payable { // solhint-disable-next-line require(msg.sender != tx.origin, "Do not send ETH directly"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); (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"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 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
[{"inputs":[{"internalType":"contract ICurveRegistry","name":"_curveRegistry","type":"address"},{"internalType":"address","name":"curveIntegration","type":"address"},{"internalType":"uint256","name":"_goodwill","type":"uint256"},{"internalType":"uint256","name":"_affiliateSplit","type":"uint256"},{"internalType":"address","name":"_vaultAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAffiliateSplit","type":"uint256"}],"name":"AffiliateSplitChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"ContractPauseStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"poolTokensReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"affiliate","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"FeeWhitelistUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newGoodwill","type":"uint256"}],"name":"GoodwillChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"poolTokensReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"affiliate","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"V1Registry","outputs":[{"internalType":"contract IYVaultV1Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"affiliateSplit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTargets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveRegistry","outputs":[{"internalType":"contract ICurveRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entryTokenAddress","type":"address"},{"internalType":"uint256","name":"entryTokenAmount","type":"uint256"},{"internalType":"address","name":"vaultAddress","type":"address"},{"internalType":"address","name":"depositTokenAddress","type":"address"},{"internalType":"uint256","name":"minExitTokenAmount","type":"uint256"},{"internalType":"address","name":"underlyingTarget","type":"address"},{"internalType":"address","name":"targetDepositTokenAddress","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vaultAddress","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vaultAddress","type":"address"}],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"removeAssetReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_affiliates","type":"address[]"},{"internalType":"bool[]","name":"_status","type":"bool[]"}],"name":"setAffiliates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bool[]","name":"isApproved","type":"bool[]"}],"name":"setApprovedTargets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setFeeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAffiliateSplit","type":"uint256"}],"name":"setNewAffiliateSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGoodwill","type":"uint256"}],"name":"setNewGoodwill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"bool[]","name":"statuses","type":"bool[]"}],"name":"setShouldResetAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shouldResetAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleContractActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vaultAddress","type":"address"},{"internalType":"uint256","name":"vaultTokenAmount","type":"uint256"},{"internalType":"address","name":"exitTokenAddress","type":"address"},{"internalType":"uint256","name":"minExitTokenAmount","type":"uint256"},{"internalType":"address","name":"underlyingTarget","type":"address"},{"internalType":"address","name":"targetWithdrawTokenAddress","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526000805460ff60a01b19169055600880546001600160a01b031916733ee41c098f9666ed2ea246f4d2558010e59d63a01790553480156200004457600080fd5b506040516200345f3803806200345f8339810160408190526200006791620001a4565b828282828262000077336200013b565b6002919091556003556001600160a01b03908116608052600780546001600160a01b031916988216989098179097555050505091166000908152600560205260408120805460ff1990811660019081179092557f339e546a45fee6f92ce52004b216c209adb448af2e76960c3b526d48a36982d48054821683179055731111111254fb6c44bac0bed2854e76f90643097d9092527f2347d33e2f5a596ba0e72427210e72fdbf8f6d428fbd9d404b523027f05c7f6a8054909216179055506200020d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620001a157600080fd5b50565b600080600080600060a08688031215620001bd57600080fd5b8551620001ca816200018b565b6020870151909550620001dd816200018b565b8094505060408601519250606086015191506080860151620001ff816200018b565b809150509295509295909350565b6080516132136200024c6000396000818161024f01528181611cd801528181611d1901528181611db001528181611dec0152611f1301526132136000f3fe60806040526004361061016a5760003560e01c8063715018a6116100d15780639779d1a61161008a578063d408f65711610064578063d408f657146104b2578063d4fac45d146104e2578063df7afea414610502578063f2fde38b1461051557600080fd5b80639779d1a61461044f5780639ebafcdf1461047f578063abd9813c1461049f57600080fd5b8063715018a61461038c5780638da5cb5b146103a15780638f65a67e146103bf5780639387a3c1146103df5780639735a6341461040f578063975767861461042f57600080fd5b80635c975abb116101235780635c975abb146102d55780635de0398e146102f6578063631127711461030c57806368da10ae1461032c5780636b9ace691461034c5780636da824de1461036c57600080fd5b80631385d24c146101cb57806327c24a5d146101e0578063364713a51461021d578063411557d11461023d5780634aabd106146102715780634f51e2941461029557600080fd5b366101c657333214156101c45760405162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c79000000000000000060448201526064015b60405180910390fd5b005b600080fd5b3480156101d757600080fd5b506101c4610535565b3480156101ec57600080fd5b50600754610200906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022957600080fd5b506101c46102383660046128b7565b6105c5565b34801561024957600080fd5b506102007f000000000000000000000000000000000000000000000000000000000000000081565b34801561027d57600080fd5b5061028760035481565b604051908152602001610214565b3480156102a157600080fd5b506102c56102b03660046128f0565b60046020526000908152604090205460ff1681565b6040519015158152602001610214565b3480156102e157600080fd5b506000546102c590600160a01b900460ff1681565b34801561030257600080fd5b5061028760025481565b34801561031857600080fd5b506101c46103273660046128b7565b610675565b34801561033857600080fd5b506102876103473660046128f0565b610725565b34801561035857600080fd5b506101c4610367366004612959565b61079e565b34801561037857600080fd5b506102876103873660046129c5565b6108cb565b34801561039857600080fd5b506101c4610c1e565b3480156103ad57600080fd5b506000546001600160a01b0316610200565b3480156103cb57600080fd5b506101c46103da366004612959565b610c54565b3480156103eb57600080fd5b506102c56103fa3660046128f0565b60066020526000908152604090205460ff1681565b34801561041b57600080fd5b506101c461042a366004612959565b610d64565b34801561043b57600080fd5b506101c461044a366004612a14565b610e85565b34801561045b57600080fd5b506102c561046a3660046128f0565b60056020526000908152604090205460ff1681565b34801561048b57600080fd5b50600854610200906001600160a01b031681565b6101c46104ad366004612a8f565b610f12565b3480156104be57600080fd5b506102c56104cd3660046128f0565b60016020526000908152604090205460ff1681565b3480156104ee57600080fd5b506102876104fd366004612b58565b61124a565b6101c4610510366004612b86565b6112c7565b34801561052157600080fd5b506101c46105303660046128f0565b61153c565b6000546001600160a01b0316331461055f5760405162461bcd60e51b81526004016101bb90612c5e565b6000805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040517f95945ab3c67d95255a29f74fa7d32f485520ef730a6a04b15fcf9e0d10e8d2fa936105bb9390049091161515815260200190565b60405180910390a1565b6000546001600160a01b031633146105ef5760405162461bcd60e51b81526004016101bb90612c5e565b60648111156106395760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420676f6f6477696c6c2076616c756560501b60448201526064016101bb565b60028190556040518181527f13fd85a3bad6b899f8e358b8e20163d0428fbd2c7e25c9f942f990707bb28e72906020015b60405180910390a150565b6000546001600160a01b0316331461069f5760405162461bcd60e51b81526004016101bb90612c5e565b60648111156106f05760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420616666696c61746573706c69742070657263656e7400000060448201526064016101bb565b60038190556040518181527fb9c1bd30bf37f976692f943c1ff914a04c714cdf1fd0b0fb34dabbc973e11b239060200161066a565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076057600080fd5b505afa158015610774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107989190612c93565b92915050565b6000546001600160a01b031633146107c85760405162461bcd60e51b81526004016101bb90612c5e565b82811461082d5760405162461bcd60e51b815260206004820152602d60248201527f53657453686f756c645265736574416c6c6f77616e63653a20496e76616c696460448201526c040d2dce0eae840d8cadccee8d609b1b60648201526084016101bb565b60005b838110156108c45782828281811061084a5761084a612cac565b905060200201602081019061085f9190612cc2565b6006600087878581811061087557610875612cac565b905060200201602081019061088a91906128f0565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806108bc81612cf5565b915050610830565b5050505050565b600080821161091c5760405162461bcd60e51b815260206004820152601760248201527f5241523a205a65726f20616d6f756e742072657475726e00000000000000000060448201526064016101bb565b6008546040805163226807c160e11b8152905186926000926001600160a01b03909116916344d00f82916004808201928692909190829003018186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a19190810190612d31565b905060005b600860009054906101000a90046001600160a01b03166001600160a01b03166344b19dfc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f457600080fd5b505afa158015610a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2c9190612c93565b811015610b1057866001600160a01b0316828281518110610a4f57610a4f612cac565b60200260200101516001600160a01b03161415610afe57670de0b6b3a7640000836001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa857600080fd5b505afa158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190612c93565b610aea9087612df6565b610af49190612e15565b9350505050610c17565b80610b0881612cf5565b9150506109a6565b50816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4a57600080fd5b505afa158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190612c93565b610b8d90600a612f1b565b826001600160a01b03166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc657600080fd5b505afa158015610bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfe9190612c93565b610c089086612df6565b610c129190612e15565b925050505b9392505050565b6000546001600160a01b03163314610c485760405162461bcd60e51b81526004016101bb90612c5e565b610c5260006115d7565b565b6000546001600160a01b03163314610c7e5760405162461bcd60e51b81526004016101bb90612c5e565b828114610ccd5760405162461bcd60e51b815260206004820152601f60248201527f416666696c696174653a20496e76616c696420696e707574206c656e6774680060448201526064016101bb565b60005b838110156108c457828282818110610cea57610cea612cac565b9050602002016020810190610cff9190612cc2565b60046000878785818110610d1557610d15612cac565b9050602002016020810190610d2a91906128f0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d5c81612cf5565b915050610cd0565b6000546001600160a01b03163314610d8e5760405162461bcd60e51b81526004016101bb90612c5e565b828114610dee5760405162461bcd60e51b815260206004820152602860248201527f536574417070726f766564546172676574733a20496e76616c696420696e70756044820152670e840d8cadccee8d60c31b60648201526084016101bb565b60005b838110156108c457828282818110610e0b57610e0b612cac565b9050602002016020810190610e209190612cc2565b60056000878785818110610e3657610e36612cac565b9050602002016020810190610e4b91906128f0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610e7d81612cf5565b915050610df1565b6000546001600160a01b03163314610eaf5760405162461bcd60e51b81526004016101bb90612c5e565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f9249c89b2d3c7c5c78955575d8eaf4339b9a8a42719fb642f9e0050dec8a6729910160405180910390a15050565b600054600160a01b900460ff1615610f6c5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742069732074656d706f72617279207061757365640000000060448201526064016101bb565b610f768a8a611627565b985060008a6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb357600080fd5b505afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190612f27565b90506000610ffa8c8c8461174a565b905060006001600160a01b0389166110565761104f83838d8a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117d092505050565b9050611142565b611060838a611a6a565b600754604051635dff8d3360e11b81526001600160a01b038581166004830152600092169063bbff1a669060240160206040518083038186803b1580156110a657600080fd5b505afa1580156110ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110de9190612f27565b9050600081848e6000808e8e8e8e8e6040516024016111069a99989796959493929190612f6d565b60408051601f198184030181529190526020810180516001600160e01b0316632af6604f60e21b179052905061113d8d8c83611b4b565b925050505b898110156111925760405162461bcd60e51b815260206004820152601760248201527f57697468647261773a204869676820536c69707061676500000000000000000060448201526064016101bb565b61119f8b82866001611c4e565b6111a99082612fe0565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111df576111da3382611f7c565b6111f3565b6111f36001600160a01b038c163383612095565b604080518281526001600160a01b0386811660208301528f169133917f3ed4ee04a905a278b050a856bbe7ddaaf327a30514373e65aa6103beeae488c391015b60405180910390a350505050505050505050505050565b6040516370a0823160e01b81526001600160a01b038281166004830152600091908416906370a082319060240160206040518083038186803b15801561128f57600080fd5b505afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190612c93565b600054600160a01b900460ff16156113215760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742069732074656d706f72617279207061757365640000000060448201526064016101bb565b61132b8b8b611627565b995061133a8b8b836001611c4e565b611344908b612fe0565b99506001600160a01b038b1661136c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9a505b60006001600160a01b0387166113c6576113bf8c8c8b8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117d092505050565b90506114e6565b60006001600160a01b038d1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156113f457508a6113ff565b6113ff8d898e6120f8565b600754604051635dff8d3360e11b81526001600160a01b038c81166004830152600092169063bbff1a669060240160206040518083038186803b15801561144557600080fd5b505afa158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d9190612f27565b905060008e8e838b60008060008e8e8e8e6040516024016114a89b9a99989796959493929190612ff7565b60408051601f198184030181529190526020810180516001600160e01b03166337debfa960e21b17905290506114e08c8b858461210c565b93505050505b60006114f48a838d8c612211565b604080518281526001600160a01b038681166020830152929350918d169133917f364bb76a44233df8584c690de6da7810626a5e77192f3ebc942c35bcb1add24f9101611233565b6000546001600160a01b031633146115665760405162461bcd60e51b81526004016101bb90612c5e565b6001600160a01b0381166115cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101bb565b6115d4816115d7565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b038316158061165b57506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156116a857600034116116a35760405162461bcd60e51b815260206004820152601060248201526f115512081dd85cc81b9bdd081cd95b9d60821b60448201526064016101bb565b611744565b34156117065760405162461bcd60e51b815260206004820152602760248201527f416c6f6e67207769746820746f6b656e2c20746865204554482077617320616c6044820152661cdbc81cd95b9d60ca1b60648201526084016101bb565b6000611711846123cf565b90506117286001600160a01b038516333086612441565b80611732856123cf565b61173c9190612fe0565b915050610798565b50919050565b600080611756836123cf565b604051632e1a7d4d60e01b8152600481018690529091506001600160a01b03861690632e1a7d4d90602401600060405180830381600087803b15801561179b57600080fd5b505af11580156117af573d6000803e3d6000fd5b50505050806117bd846123cf565b6117c79190612fe0565b95945050505050565b6000836001600160a01b0316866001600160a01b031614156117f35750836117c7565b6001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2141561192c576001600160a01b038416158061184a57506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156118bc57604051632e1a7d4d60e01b81526004810186905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b15801561189c57600080fd5b505af11580156118b0573d6000803e3d6000fd5b505050508490506117c7565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190b57600080fd5b505af115801561191f573d6000803e3d6000fd5b50505050508490506117c7565b60006001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561195a575084611964565b6119648785611a6a565b600061196f866123cf565b6001600160a01b03861660009081526005602052604090205490915060ff166119aa5760405162461bcd60e51b81526004016101bb90613074565b6000856001600160a01b031683866040516119c591906130e1565b60006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b5050905080611a285760405162461bcd60e51b81526004016101bb906130fd565b81611a32886123cf565b611a3c9190612fe0565b935060008411611a5e5760405162461bcd60e51b81526004016101bb90613132565b50505095945050505050565b6001600160a01b038216600090815260066020526040902054829060ff1615611abd57611aa26001600160a01b03821683600061247f565b611ab86001600160a01b0382168360001961247f565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919083169063dd62ed3e9060440160206040518083038186803b158015611b0857600080fd5b505afa158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b409190612c93565b1115611aa257505050565b600080611b57856123cf565b6001600160a01b03851660009081526005602052604090205490915060ff16611b925760405162461bcd60e51b81526004016101bb90613074565b6000846001600160a01b031684604051611bac91906130e1565b6000604051808303816000865af19150503d8060008114611be9576040519150601f19603f3d011682016040523d82523d6000602084013e611bee565b606091505b5050905080611c0f5760405162461bcd60e51b81526004016101bb906130fd565b81611c19876123cf565b611c239190612fe0565b925060008311611c455760405162461bcd60e51b81526004016101bb90613132565b50509392505050565b3360009081526001602052604081205460ff16828015611c6c575080155b8015611c7a57506000600254115b15611f735761271060025486611c909190612df6565b611c9a9190612e15565b91506001600160a01b0386161580611cce57506001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15611d0257611cfd7f000000000000000000000000000000000000000000000000000000000000000083611f7c565b611e7f565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600091908816906370a082319060240160206040518083038186803b158015611d6757600080fd5b505afa158015611d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9f9190612c93565b9050611dd56001600160a01b0388167f000000000000000000000000000000000000000000000000000000000000000085612095565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528291908916906370a082319060240160206040518083038186803b158015611e3957600080fd5b505afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190612c93565b611e7b9190612fe0565b9250505b6001600160a01b03841660009081526004602052604090205460ff1615611f73576001600160a01b038616611ec65773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee95505b6000606460035484611ed89190612df6565b611ee29190612e15565b604051631ca09d8960e21b81526001600160a01b0387811660048301528981166024830152604482018390529192507f000000000000000000000000000000000000000000000000000000000000000090911690637282762490606401600060405180830381600087803b158015611f5957600080fd5b505af1158015611f6d573d6000803e3d6000fd5b50505050505b50949350505050565b80471015611fcc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016101bb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612019576040519150601f19603f3d011682016040523d82523d6000602084013e61201e565b606091505b5050905080611ab85760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101bb565b6040516001600160a01b038316602482015260448101829052611ab890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526125a3565b611ab86001600160a01b0384168383612675565b600080612118866123cf565b6001600160a01b03861660009081526005602052604090205490915060ff166121535760405162461bcd60e51b81526004016101bb90613074565b6000856001600160a01b0316858560405161216e91906130e1565b60006040518083038185875af1925050503d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b50509050806121d15760405162461bcd60e51b81526004016101bb906130fd565b816121db886123cf565b6121e59190612fe0565b9250600083116122075760405162461bcd60e51b81526004016101bb90613132565b5050949350505050565b600061221d8584611a6a565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561225f57600080fd5b505afa158015612273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122979190612c93565b604051636e553f6560e01b8152600481018790523360248201529091506001600160a01b03851690636e553f6590604401600060405180830381600087803b1580156122e257600080fd5b505af11580156122f6573d6000803e3d6000fd5b50506040516370a0823160e01b81523360048201528392506001600160a01b03871691506370a082319060240160206040518083038186803b15801561233b57600080fd5b505afa15801561234f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123739190612c93565b61237d9190612fe0565b915082821015611f735760405162461bcd60e51b815260206004820152601b60248201527f5661756c744465706f7369743a204869676820536c697070616765000000000060448201526064016101bb565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156123fd575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561076057600080fd5b919050565b6040516001600160a01b03808516602483015283166044820152606481018290526124799085906323b872dd60e01b906084016120c1565b50505050565b8015806125085750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156124ce57600080fd5b505afa1580156124e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125069190612c93565b155b6125735760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016101bb565b6040516001600160a01b038316602482015260448101829052611ab890849063095ea7b360e01b906064016120c1565b60006125f8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127369092919063ffffffff16565b805190915015611ab857808060200190518101906126169190613175565b611ab85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101bb565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f99190612c93565b6127039190613192565b6040516001600160a01b03851660248201526044810182905290915061247990859063095ea7b360e01b906064016120c1565b6060612745848460008561274d565b949350505050565b6060824710156127ae5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101bb565b6001600160a01b0385163b6128055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bb565b600080866001600160a01b0316858760405161282191906130e1565b60006040518083038185875af1925050503d806000811461285e576040519150601f19603f3d011682016040523d82523d6000602084013e612863565b606091505b509150915061287382828661287e565b979650505050505050565b6060831561288d575081610c17565b82511561289d5782518084602001fd5b8160405162461bcd60e51b81526004016101bb91906131aa565b6000602082840312156128c957600080fd5b5035919050565b6001600160a01b03811681146115d457600080fd5b803561243c816128d0565b60006020828403121561290257600080fd5b8135610c17816128d0565b60008083601f84011261291f57600080fd5b50813567ffffffffffffffff81111561293757600080fd5b6020830191508360208260051b850101111561295257600080fd5b9250929050565b6000806000806040858703121561296f57600080fd5b843567ffffffffffffffff8082111561298757600080fd5b6129938883890161290d565b909650945060208701359150808211156129ac57600080fd5b506129b98782880161290d565b95989497509550505050565b6000806000606084860312156129da57600080fd5b83356129e5816128d0565b925060208401356129f5816128d0565b929592945050506040919091013590565b80151581146115d457600080fd5b60008060408385031215612a2757600080fd5b8235612a32816128d0565b91506020830135612a4281612a06565b809150509250929050565b60008083601f840112612a5f57600080fd5b50813567ffffffffffffffff811115612a7757600080fd5b60208301915083602082850101111561295257600080fd5b6000806000806000806000806000806101208b8d031215612aaf57600080fd5b8a35612aba816128d0565b995060208b0135985060408b0135612ad1816128d0565b975060608b0135965060808b0135612ae8816128d0565b955060a08b0135612af8816128d0565b945060c08b0135612b08816128d0565b935060e08b013567ffffffffffffffff811115612b2457600080fd5b612b308d828e01612a4d565b9094509250506101008b0135612b45816128d0565b809150509295989b9194979a5092959850565b60008060408385031215612b6b57600080fd5b8235612b76816128d0565b91506020830135612a42816128d0565b60008060008060008060008060008060006101408c8e031215612ba857600080fd5b8b35612bb3816128d0565b9a5060208c0135995060408c0135612bca816128d0565b985060608c0135612bda816128d0565b975060808c0135965060a08c0135612bf1816128d0565b955060c08c0135612c01816128d0565b9450612c0f60e08d016128e5565b93506101008c013567ffffffffffffffff811115612c2c57600080fd5b612c388e828f01612a4d565b9094509250612c4c90506101208d016128e5565b90509295989b509295989b9093969950565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612ca557600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cd457600080fd5b8135610c1781612a06565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d0957612d09612cdf565b5060010190565b634e487b7160e01b600052604160045260246000fd5b805161243c816128d0565b60006020808385031215612d4457600080fd5b825167ffffffffffffffff80821115612d5c57600080fd5b818501915085601f830112612d7057600080fd5b815181811115612d8257612d82612d10565b8060051b604051601f19603f83011681018181108582111715612da757612da7612d10565b604052918252848201925083810185019188831115612dc557600080fd5b938501935b82851015612dea57612ddb85612d26565b84529385019392850192612dca565b98975050505050505050565b6000816000190483118215151615612e1057612e10612cdf565b500290565b600082612e3257634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e72578160001904821115612e5857612e58612cdf565b80851615612e6557918102915b93841c9390800290612e3c565b509250929050565b600082612e8957506001610798565b81612e9657506000610798565b8160018114612eac5760028114612eb657612ed2565b6001915050610798565b60ff841115612ec757612ec7612cdf565b50506001821b610798565b5060208310610133831016604e8410600b8410161715612ef5575081810a610798565b612eff8383612e37565b8060001904821115612f1357612f13612cdf565b029392505050565b6000610c178383612e7a565b600060208284031215612f3957600080fd5b8151610c17816128d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b81168252602082018b9052898116604083015260ff89166060830152878116608083015286811660a083015285811660c083015261012060e08301819052600091612fc48483018789612f44565b925080851661010085015250509b9a5050505050505050505050565b600082821015612ff257612ff2612cdf565b500390565b6001600160a01b038c81168252602082018c90528a81166040830152898116606083015260ff8916608083015287811660a083015286811660c083015285811660e083015261014061010083018190526000916130578483018789612f44565b925080851661012085015250509c9b505050505050505050505050565b60208082526021908201527f46696c6c51756f74653a20546172676574206973206e6f7420617070726f76656040820152601960fa1b606082015260800190565b60005b838110156130d05781810151838201526020016130b8565b838111156124795750506000910152565b600082516130f38184602087016130b5565b9190910192915050565b6020808252818101527f46696c6c51756f74653a204661696c656420746f207377617020746f6b656e73604082015260600190565b60208082526023908201527f46696c6c51756f74653a205377617070656420746f20696e76616c696420746f60408201526235b2b760e91b606082015260800190565b60006020828403121561318757600080fd5b8151610c1781612a06565b600082198211156131a5576131a5612cdf565b500190565b60208152600082518060208401526131c98160408501602087016130b5565b601f01601f1916919091016040019291505056fea2646970667358221220946d3c7042d25046b7895cf3ee0ad7db5829ceec9554a7cd64b775c7b164e04764736f6c634300080900330000000000000000000000004f5ae0a4b4d40fc0fef1a11c6df50e4b5d2ec8ef000000000000000000000000820f9421b22d735e87e2253064074d67e4b5efd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff0
Deployed Bytecode
0x60806040526004361061016a5760003560e01c8063715018a6116100d15780639779d1a61161008a578063d408f65711610064578063d408f657146104b2578063d4fac45d146104e2578063df7afea414610502578063f2fde38b1461051557600080fd5b80639779d1a61461044f5780639ebafcdf1461047f578063abd9813c1461049f57600080fd5b8063715018a61461038c5780638da5cb5b146103a15780638f65a67e146103bf5780639387a3c1146103df5780639735a6341461040f578063975767861461042f57600080fd5b80635c975abb116101235780635c975abb146102d55780635de0398e146102f6578063631127711461030c57806368da10ae1461032c5780636b9ace691461034c5780636da824de1461036c57600080fd5b80631385d24c146101cb57806327c24a5d146101e0578063364713a51461021d578063411557d11461023d5780634aabd106146102715780634f51e2941461029557600080fd5b366101c657333214156101c45760405162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c79000000000000000060448201526064015b60405180910390fd5b005b600080fd5b3480156101d757600080fd5b506101c4610535565b3480156101ec57600080fd5b50600754610200906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022957600080fd5b506101c46102383660046128b7565b6105c5565b34801561024957600080fd5b506102007f0000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff081565b34801561027d57600080fd5b5061028760035481565b604051908152602001610214565b3480156102a157600080fd5b506102c56102b03660046128f0565b60046020526000908152604090205460ff1681565b6040519015158152602001610214565b3480156102e157600080fd5b506000546102c590600160a01b900460ff1681565b34801561030257600080fd5b5061028760025481565b34801561031857600080fd5b506101c46103273660046128b7565b610675565b34801561033857600080fd5b506102876103473660046128f0565b610725565b34801561035857600080fd5b506101c4610367366004612959565b61079e565b34801561037857600080fd5b506102876103873660046129c5565b6108cb565b34801561039857600080fd5b506101c4610c1e565b3480156103ad57600080fd5b506000546001600160a01b0316610200565b3480156103cb57600080fd5b506101c46103da366004612959565b610c54565b3480156103eb57600080fd5b506102c56103fa3660046128f0565b60066020526000908152604090205460ff1681565b34801561041b57600080fd5b506101c461042a366004612959565b610d64565b34801561043b57600080fd5b506101c461044a366004612a14565b610e85565b34801561045b57600080fd5b506102c561046a3660046128f0565b60056020526000908152604090205460ff1681565b34801561048b57600080fd5b50600854610200906001600160a01b031681565b6101c46104ad366004612a8f565b610f12565b3480156104be57600080fd5b506102c56104cd3660046128f0565b60016020526000908152604090205460ff1681565b3480156104ee57600080fd5b506102876104fd366004612b58565b61124a565b6101c4610510366004612b86565b6112c7565b34801561052157600080fd5b506101c46105303660046128f0565b61153c565b6000546001600160a01b0316331461055f5760405162461bcd60e51b81526004016101bb90612c5e565b6000805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040517f95945ab3c67d95255a29f74fa7d32f485520ef730a6a04b15fcf9e0d10e8d2fa936105bb9390049091161515815260200190565b60405180910390a1565b6000546001600160a01b031633146105ef5760405162461bcd60e51b81526004016101bb90612c5e565b60648111156106395760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420676f6f6477696c6c2076616c756560501b60448201526064016101bb565b60028190556040518181527f13fd85a3bad6b899f8e358b8e20163d0428fbd2c7e25c9f942f990707bb28e72906020015b60405180910390a150565b6000546001600160a01b0316331461069f5760405162461bcd60e51b81526004016101bb90612c5e565b60648111156106f05760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420616666696c61746573706c69742070657263656e7400000060448201526064016101bb565b60038190556040518181527fb9c1bd30bf37f976692f943c1ff914a04c714cdf1fd0b0fb34dabbc973e11b239060200161066a565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076057600080fd5b505afa158015610774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107989190612c93565b92915050565b6000546001600160a01b031633146107c85760405162461bcd60e51b81526004016101bb90612c5e565b82811461082d5760405162461bcd60e51b815260206004820152602d60248201527f53657453686f756c645265736574416c6c6f77616e63653a20496e76616c696460448201526c040d2dce0eae840d8cadccee8d609b1b60648201526084016101bb565b60005b838110156108c45782828281811061084a5761084a612cac565b905060200201602081019061085f9190612cc2565b6006600087878581811061087557610875612cac565b905060200201602081019061088a91906128f0565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806108bc81612cf5565b915050610830565b5050505050565b600080821161091c5760405162461bcd60e51b815260206004820152601760248201527f5241523a205a65726f20616d6f756e742072657475726e00000000000000000060448201526064016101bb565b6008546040805163226807c160e11b8152905186926000926001600160a01b03909116916344d00f82916004808201928692909190829003018186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a19190810190612d31565b905060005b600860009054906101000a90046001600160a01b03166001600160a01b03166344b19dfc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f457600080fd5b505afa158015610a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2c9190612c93565b811015610b1057866001600160a01b0316828281518110610a4f57610a4f612cac565b60200260200101516001600160a01b03161415610afe57670de0b6b3a7640000836001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa857600080fd5b505afa158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190612c93565b610aea9087612df6565b610af49190612e15565b9350505050610c17565b80610b0881612cf5565b9150506109a6565b50816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4a57600080fd5b505afa158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190612c93565b610b8d90600a612f1b565b826001600160a01b03166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc657600080fd5b505afa158015610bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfe9190612c93565b610c089086612df6565b610c129190612e15565b925050505b9392505050565b6000546001600160a01b03163314610c485760405162461bcd60e51b81526004016101bb90612c5e565b610c5260006115d7565b565b6000546001600160a01b03163314610c7e5760405162461bcd60e51b81526004016101bb90612c5e565b828114610ccd5760405162461bcd60e51b815260206004820152601f60248201527f416666696c696174653a20496e76616c696420696e707574206c656e6774680060448201526064016101bb565b60005b838110156108c457828282818110610cea57610cea612cac565b9050602002016020810190610cff9190612cc2565b60046000878785818110610d1557610d15612cac565b9050602002016020810190610d2a91906128f0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d5c81612cf5565b915050610cd0565b6000546001600160a01b03163314610d8e5760405162461bcd60e51b81526004016101bb90612c5e565b828114610dee5760405162461bcd60e51b815260206004820152602860248201527f536574417070726f766564546172676574733a20496e76616c696420696e70756044820152670e840d8cadccee8d60c31b60648201526084016101bb565b60005b838110156108c457828282818110610e0b57610e0b612cac565b9050602002016020810190610e209190612cc2565b60056000878785818110610e3657610e36612cac565b9050602002016020810190610e4b91906128f0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610e7d81612cf5565b915050610df1565b6000546001600160a01b03163314610eaf5760405162461bcd60e51b81526004016101bb90612c5e565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f9249c89b2d3c7c5c78955575d8eaf4339b9a8a42719fb642f9e0050dec8a6729910160405180910390a15050565b600054600160a01b900460ff1615610f6c5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742069732074656d706f72617279207061757365640000000060448201526064016101bb565b610f768a8a611627565b985060008a6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb357600080fd5b505afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190612f27565b90506000610ffa8c8c8461174a565b905060006001600160a01b0389166110565761104f83838d8a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117d092505050565b9050611142565b611060838a611a6a565b600754604051635dff8d3360e11b81526001600160a01b038581166004830152600092169063bbff1a669060240160206040518083038186803b1580156110a657600080fd5b505afa1580156110ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110de9190612f27565b9050600081848e6000808e8e8e8e8e6040516024016111069a99989796959493929190612f6d565b60408051601f198184030181529190526020810180516001600160e01b0316632af6604f60e21b179052905061113d8d8c83611b4b565b925050505b898110156111925760405162461bcd60e51b815260206004820152601760248201527f57697468647261773a204869676820536c69707061676500000000000000000060448201526064016101bb565b61119f8b82866001611c4e565b6111a99082612fe0565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111df576111da3382611f7c565b6111f3565b6111f36001600160a01b038c163383612095565b604080518281526001600160a01b0386811660208301528f169133917f3ed4ee04a905a278b050a856bbe7ddaaf327a30514373e65aa6103beeae488c391015b60405180910390a350505050505050505050505050565b6040516370a0823160e01b81526001600160a01b038281166004830152600091908416906370a082319060240160206040518083038186803b15801561128f57600080fd5b505afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190612c93565b600054600160a01b900460ff16156113215760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742069732074656d706f72617279207061757365640000000060448201526064016101bb565b61132b8b8b611627565b995061133a8b8b836001611c4e565b611344908b612fe0565b99506001600160a01b038b1661136c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9a505b60006001600160a01b0387166113c6576113bf8c8c8b8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117d092505050565b90506114e6565b60006001600160a01b038d1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156113f457508a6113ff565b6113ff8d898e6120f8565b600754604051635dff8d3360e11b81526001600160a01b038c81166004830152600092169063bbff1a669060240160206040518083038186803b15801561144557600080fd5b505afa158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d9190612f27565b905060008e8e838b60008060008e8e8e8e6040516024016114a89b9a99989796959493929190612ff7565b60408051601f198184030181529190526020810180516001600160e01b03166337debfa960e21b17905290506114e08c8b858461210c565b93505050505b60006114f48a838d8c612211565b604080518281526001600160a01b038681166020830152929350918d169133917f364bb76a44233df8584c690de6da7810626a5e77192f3ebc942c35bcb1add24f9101611233565b6000546001600160a01b031633146115665760405162461bcd60e51b81526004016101bb90612c5e565b6001600160a01b0381166115cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101bb565b6115d4816115d7565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b038316158061165b57506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156116a857600034116116a35760405162461bcd60e51b815260206004820152601060248201526f115512081dd85cc81b9bdd081cd95b9d60821b60448201526064016101bb565b611744565b34156117065760405162461bcd60e51b815260206004820152602760248201527f416c6f6e67207769746820746f6b656e2c20746865204554482077617320616c6044820152661cdbc81cd95b9d60ca1b60648201526084016101bb565b6000611711846123cf565b90506117286001600160a01b038516333086612441565b80611732856123cf565b61173c9190612fe0565b915050610798565b50919050565b600080611756836123cf565b604051632e1a7d4d60e01b8152600481018690529091506001600160a01b03861690632e1a7d4d90602401600060405180830381600087803b15801561179b57600080fd5b505af11580156117af573d6000803e3d6000fd5b50505050806117bd846123cf565b6117c79190612fe0565b95945050505050565b6000836001600160a01b0316866001600160a01b031614156117f35750836117c7565b6001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2141561192c576001600160a01b038416158061184a57506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156118bc57604051632e1a7d4d60e01b81526004810186905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b15801561189c57600080fd5b505af11580156118b0573d6000803e3d6000fd5b505050508490506117c7565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190b57600080fd5b505af115801561191f573d6000803e3d6000fd5b50505050508490506117c7565b60006001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561195a575084611964565b6119648785611a6a565b600061196f866123cf565b6001600160a01b03861660009081526005602052604090205490915060ff166119aa5760405162461bcd60e51b81526004016101bb90613074565b6000856001600160a01b031683866040516119c591906130e1565b60006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b5050905080611a285760405162461bcd60e51b81526004016101bb906130fd565b81611a32886123cf565b611a3c9190612fe0565b935060008411611a5e5760405162461bcd60e51b81526004016101bb90613132565b50505095945050505050565b6001600160a01b038216600090815260066020526040902054829060ff1615611abd57611aa26001600160a01b03821683600061247f565b611ab86001600160a01b0382168360001961247f565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919083169063dd62ed3e9060440160206040518083038186803b158015611b0857600080fd5b505afa158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b409190612c93565b1115611aa257505050565b600080611b57856123cf565b6001600160a01b03851660009081526005602052604090205490915060ff16611b925760405162461bcd60e51b81526004016101bb90613074565b6000846001600160a01b031684604051611bac91906130e1565b6000604051808303816000865af19150503d8060008114611be9576040519150601f19603f3d011682016040523d82523d6000602084013e611bee565b606091505b5050905080611c0f5760405162461bcd60e51b81526004016101bb906130fd565b81611c19876123cf565b611c239190612fe0565b925060008311611c455760405162461bcd60e51b81526004016101bb90613132565b50509392505050565b3360009081526001602052604081205460ff16828015611c6c575080155b8015611c7a57506000600254115b15611f735761271060025486611c909190612df6565b611c9a9190612e15565b91506001600160a01b0386161580611cce57506001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15611d0257611cfd7f0000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff083611f7c565b611e7f565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff081166004830152600091908816906370a082319060240160206040518083038186803b158015611d6757600080fd5b505afa158015611d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9f9190612c93565b9050611dd56001600160a01b0388167f0000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff085612095565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff0811660048301528291908916906370a082319060240160206040518083038186803b158015611e3957600080fd5b505afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190612c93565b611e7b9190612fe0565b9250505b6001600160a01b03841660009081526004602052604090205460ff1615611f73576001600160a01b038616611ec65773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee95505b6000606460035484611ed89190612df6565b611ee29190612e15565b604051631ca09d8960e21b81526001600160a01b0387811660048301528981166024830152604482018390529192507f0000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff090911690637282762490606401600060405180830381600087803b158015611f5957600080fd5b505af1158015611f6d573d6000803e3d6000fd5b50505050505b50949350505050565b80471015611fcc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016101bb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612019576040519150601f19603f3d011682016040523d82523d6000602084013e61201e565b606091505b5050905080611ab85760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101bb565b6040516001600160a01b038316602482015260448101829052611ab890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526125a3565b611ab86001600160a01b0384168383612675565b600080612118866123cf565b6001600160a01b03861660009081526005602052604090205490915060ff166121535760405162461bcd60e51b81526004016101bb90613074565b6000856001600160a01b0316858560405161216e91906130e1565b60006040518083038185875af1925050503d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b50509050806121d15760405162461bcd60e51b81526004016101bb906130fd565b816121db886123cf565b6121e59190612fe0565b9250600083116122075760405162461bcd60e51b81526004016101bb90613132565b5050949350505050565b600061221d8584611a6a565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561225f57600080fd5b505afa158015612273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122979190612c93565b604051636e553f6560e01b8152600481018790523360248201529091506001600160a01b03851690636e553f6590604401600060405180830381600087803b1580156122e257600080fd5b505af11580156122f6573d6000803e3d6000fd5b50506040516370a0823160e01b81523360048201528392506001600160a01b03871691506370a082319060240160206040518083038186803b15801561233b57600080fd5b505afa15801561234f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123739190612c93565b61237d9190612fe0565b915082821015611f735760405162461bcd60e51b815260206004820152601b60248201527f5661756c744465706f7369743a204869676820536c697070616765000000000060448201526064016101bb565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156123fd575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561076057600080fd5b919050565b6040516001600160a01b03808516602483015283166044820152606481018290526124799085906323b872dd60e01b906084016120c1565b50505050565b8015806125085750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156124ce57600080fd5b505afa1580156124e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125069190612c93565b155b6125735760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016101bb565b6040516001600160a01b038316602482015260448101829052611ab890849063095ea7b360e01b906064016120c1565b60006125f8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127369092919063ffffffff16565b805190915015611ab857808060200190518101906126169190613175565b611ab85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101bb565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f99190612c93565b6127039190613192565b6040516001600160a01b03851660248201526044810182905290915061247990859063095ea7b360e01b906064016120c1565b6060612745848460008561274d565b949350505050565b6060824710156127ae5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101bb565b6001600160a01b0385163b6128055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bb565b600080866001600160a01b0316858760405161282191906130e1565b60006040518083038185875af1925050503d806000811461285e576040519150601f19603f3d011682016040523d82523d6000602084013e612863565b606091505b509150915061287382828661287e565b979650505050505050565b6060831561288d575081610c17565b82511561289d5782518084602001fd5b8160405162461bcd60e51b81526004016101bb91906131aa565b6000602082840312156128c957600080fd5b5035919050565b6001600160a01b03811681146115d457600080fd5b803561243c816128d0565b60006020828403121561290257600080fd5b8135610c17816128d0565b60008083601f84011261291f57600080fd5b50813567ffffffffffffffff81111561293757600080fd5b6020830191508360208260051b850101111561295257600080fd5b9250929050565b6000806000806040858703121561296f57600080fd5b843567ffffffffffffffff8082111561298757600080fd5b6129938883890161290d565b909650945060208701359150808211156129ac57600080fd5b506129b98782880161290d565b95989497509550505050565b6000806000606084860312156129da57600080fd5b83356129e5816128d0565b925060208401356129f5816128d0565b929592945050506040919091013590565b80151581146115d457600080fd5b60008060408385031215612a2757600080fd5b8235612a32816128d0565b91506020830135612a4281612a06565b809150509250929050565b60008083601f840112612a5f57600080fd5b50813567ffffffffffffffff811115612a7757600080fd5b60208301915083602082850101111561295257600080fd5b6000806000806000806000806000806101208b8d031215612aaf57600080fd5b8a35612aba816128d0565b995060208b0135985060408b0135612ad1816128d0565b975060608b0135965060808b0135612ae8816128d0565b955060a08b0135612af8816128d0565b945060c08b0135612b08816128d0565b935060e08b013567ffffffffffffffff811115612b2457600080fd5b612b308d828e01612a4d565b9094509250506101008b0135612b45816128d0565b809150509295989b9194979a5092959850565b60008060408385031215612b6b57600080fd5b8235612b76816128d0565b91506020830135612a42816128d0565b60008060008060008060008060008060006101408c8e031215612ba857600080fd5b8b35612bb3816128d0565b9a5060208c0135995060408c0135612bca816128d0565b985060608c0135612bda816128d0565b975060808c0135965060a08c0135612bf1816128d0565b955060c08c0135612c01816128d0565b9450612c0f60e08d016128e5565b93506101008c013567ffffffffffffffff811115612c2c57600080fd5b612c388e828f01612a4d565b9094509250612c4c90506101208d016128e5565b90509295989b509295989b9093969950565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612ca557600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cd457600080fd5b8135610c1781612a06565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d0957612d09612cdf565b5060010190565b634e487b7160e01b600052604160045260246000fd5b805161243c816128d0565b60006020808385031215612d4457600080fd5b825167ffffffffffffffff80821115612d5c57600080fd5b818501915085601f830112612d7057600080fd5b815181811115612d8257612d82612d10565b8060051b604051601f19603f83011681018181108582111715612da757612da7612d10565b604052918252848201925083810185019188831115612dc557600080fd5b938501935b82851015612dea57612ddb85612d26565b84529385019392850192612dca565b98975050505050505050565b6000816000190483118215151615612e1057612e10612cdf565b500290565b600082612e3257634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e72578160001904821115612e5857612e58612cdf565b80851615612e6557918102915b93841c9390800290612e3c565b509250929050565b600082612e8957506001610798565b81612e9657506000610798565b8160018114612eac5760028114612eb657612ed2565b6001915050610798565b60ff841115612ec757612ec7612cdf565b50506001821b610798565b5060208310610133831016604e8410600b8410161715612ef5575081810a610798565b612eff8383612e37565b8060001904821115612f1357612f13612cdf565b029392505050565b6000610c178383612e7a565b600060208284031215612f3957600080fd5b8151610c17816128d0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b81168252602082018b9052898116604083015260ff89166060830152878116608083015286811660a083015285811660c083015261012060e08301819052600091612fc48483018789612f44565b925080851661010085015250509b9a5050505050505050505050565b600082821015612ff257612ff2612cdf565b500390565b6001600160a01b038c81168252602082018c90528a81166040830152898116606083015260ff8916608083015287811660a083015286811660c083015285811660e083015261014061010083018190526000916130578483018789612f44565b925080851661012085015250509c9b505050505050505050505050565b60208082526021908201527f46696c6c51756f74653a20546172676574206973206e6f7420617070726f76656040820152601960fa1b606082015260800190565b60005b838110156130d05781810151838201526020016130b8565b838111156124795750506000910152565b600082516130f38184602087016130b5565b9190910192915050565b6020808252818101527f46696c6c51756f74653a204661696c656420746f207377617020746f6b656e73604082015260600190565b60208082526023908201527f46696c6c51756f74653a205377617070656420746f20696e76616c696420746f60408201526235b2b760e91b606082015260800190565b60006020828403121561318757600080fd5b8151610c1781612a06565b600082198211156131a5576131a5612cdf565b500190565b60208152600082518060208401526131c98160408501602087016130b5565b601f01601f1916919091016040019291505056fea2646970667358221220946d3c7042d25046b7895cf3ee0ad7db5829ceec9554a7cd64b775c7b164e04764736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004f5ae0a4b4d40fc0fef1a11c6df50e4b5d2ec8ef000000000000000000000000820f9421b22d735e87e2253064074d67e4b5efd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff0
-----Decoded View---------------
Arg [0] : _curveRegistry (address): 0x4f5aE0A4B4d40Fc0FEf1a11C6dF50E4B5d2EC8eF
Arg [1] : curveIntegration (address): 0x820f9421B22D735E87e2253064074D67E4B5EFd1
Arg [2] : _goodwill (uint256): 0
Arg [3] : _affiliateSplit (uint256): 0
Arg [4] : _vaultAddress (address): 0x2D8eAf12FE45476ca0eBf815D3F1D9979814cFf0
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f5ae0a4b4d40fc0fef1a11c6df50e4b5d2ec8ef
Arg [1] : 000000000000000000000000820f9421b22d735e87e2253064074d67e4b5efd1
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000002d8eaf12fe45476ca0ebf815d3f1d9979814cff0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.301492 | 0.0000000000000001 | <$0.000001 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.