Address Details
contract
0x70D0812C8c9eDa12782Cc340aA89C19d5cD53c32
- Contract Name
- NoExternalStrategy
- Creator
- 0xd1ae7f–6b8733 at 0x9dddba–970547
- Balance
- 0 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- Fetching transactions...
- Transfers
- Fetching transfers...
- Gas Used
- Fetching gas used...
- Last Balance Update
- 13753242
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- NoExternalStrategy
- Optimization enabled
- true
- Compiler version
- v0.8.7+commit.e28d00a7
- Optimization runs
- 1500
- EVM Version
- london
- Verified at
- 2022-06-28T19:35:41.925868Z
project:/contracts/strategies/NoExternalStrategy.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.7; import "./IStrategy.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; //*********************************************************************// // --------------------------- custom errors ------------------------- // //*********************************************************************// error INVALID_REWARD_TOKEN(); error TOKEN_TRANSFER_FAILURE(); error TRANSACTIONAL_TOKEN_TRANSFER_FAILURE(); /** @notice This strategy holds the deposited funds without transferring them to an external protocol. @author Francis Odisi & Viraz Malhotra. */ contract NoExternalStrategy is Ownable, IStrategy { /// @notice inbound token (deposit token) address IERC20 public inboundToken; /// @notice reward token address IERC20[] public rewardTokens; //*********************************************************************// // ------------------------- external views -------------------------- // //*********************************************************************// /** @notice Get strategy owner address. @return Strategy owner. */ function strategyOwner() external view override returns (address) { return super.owner(); } /** @notice Returns the total accumulated amount (i.e., principal + interest) stored in curve. Intended for usage by external clients and in case of variable deposit pools. @return Total accumulated amount. */ function getTotalAmount() external view override returns (uint256) { return address(inboundToken) == address(0) ? address(this).balance : inboundToken.balanceOf(address(this)); } /** @notice Get the expected net deposit amount (amount minus slippage) for a given amount. Used only for AMM strategies. @return net amount. */ function getNetDepositAmount(uint256 _amount) external pure override returns (uint256) { return _amount; } /** @notice Returns the underlying token address. @return Returns the underlying inbound (deposit) token address. */ function getUnderlyingAsset() external view override returns (address) { return address(inboundToken); } /** @notice Returns the instances of the reward tokens */ function getRewardTokens() external view override returns (IERC20[] memory) { return rewardTokens; } //*********************************************************************// // -------------------------- constructor ---------------------------- // //*********************************************************************// /** @param _inboundCurrency inbound currency address. */ constructor(address _inboundCurrency, IERC20[] memory _rewardTokens) { inboundToken = IERC20(_inboundCurrency); for (uint256 i = 0; i < _rewardTokens.length; i++) { if (address(_rewardTokens[i]) == address(0)) { revert INVALID_REWARD_TOKEN(); } } rewardTokens = _rewardTokens; } //*********************************************************************// // ------------------------- internal method -------------------------- // //*********************************************************************// /** @notice Transfers inbound token amount back to pool. @param _inboundCurrency Address of the inbound token. @param _amount transfer amount */ function _transferInboundTokenToPool(address _inboundCurrency, uint256 _amount) internal { if (_inboundCurrency == address(0)) { (bool success, ) = msg.sender.call{ value: _amount }(""); if (!success) { revert TRANSACTIONAL_TOKEN_TRANSFER_FAILURE(); } } else { bool success = IERC20(_inboundCurrency).transfer(msg.sender, _amount); if (!success) { revert TOKEN_TRANSFER_FAILURE(); } } } /** @notice Deposits funds into this contract. @param _inboundCurrency Address of the inbound token. @param _minAmount Used for aam strategies, since every strategy overrides from the same strategy interface hence it is defined here. _minAmount isn't needed in this strategy but since all strategies override from the same interface and the amm strategies need it hence it is used here. */ function invest(address _inboundCurrency, uint256 _minAmount) external payable override onlyOwner {} /** @notice Withdraws funds from this strategy in case of an early withdrawal. @param _inboundCurrency Address of the inbound token. @param _amount Amount to withdraw. @param _minAmount Used for aam strategies, since every strategy overrides from the same strategy interface hence it is defined here. _minAmount isn't needed in this strategy but since all strategies override from the same interface and the amm strategies need it hence it is used here. */ function earlyWithdraw( address _inboundCurrency, uint256 _amount, uint256 _minAmount ) external override onlyOwner { _transferInboundTokenToPool(_inboundCurrency, _amount); } /** @notice Redeems funds from this strategy when the waiting round for the good ghosting pool is over. @param _inboundCurrency Address of the inbound token. @param _amount Amount to withdraw. @param variableDeposits Bool Flag which determines whether the deposit is to be made in context of a variable deposit pool or not. @param _minAmount Used for aam strategies, since every strategy overrides from the same strategy interface hence it is defined here. _minAmount isn't needed in this strategy but since all strategies override from the same interface and the amm strategies need it hence it is used here. @param disableRewardTokenClaim Reward claim disable flag. */ function redeem( address _inboundCurrency, uint256 _amount, bool variableDeposits, uint256 _minAmount, bool disableRewardTokenClaim ) external override onlyOwner { uint256 _balance = _inboundCurrency == address(0) ? address(this).balance : IERC20(_inboundCurrency).balanceOf(address(this)); uint256 redeemAmount = variableDeposits ? _amount : _balance; // safety check since funds don't get transferred to a extrnal protocol if (redeemAmount > _balance) { redeemAmount = _balance; } _transferInboundTokenToPool(_inboundCurrency, redeemAmount); if (!disableRewardTokenClaim) { for (uint256 i = 0; i < rewardTokens.length; i++) { // safety check since funds don't get transferred to a extrnal protocol if (IERC20(rewardTokens[i]).balanceOf(address(this)) != 0) { bool success = IERC20(rewardTokens[i]).transfer( msg.sender, IERC20(rewardTokens[i]).balanceOf(address(this)) ); if (!success) { revert TOKEN_TRANSFER_FAILURE(); } } } } } /** @notice Returns total accumulated reward token amount. @param disableRewardTokenClaim Reward claim disable flag. */ function getAccumulatedRewardTokenAmounts(bool disableRewardTokenClaim) external view override returns (uint256[] memory) { uint256[] memory amounts = new uint256[](rewardTokens.length); for (uint256 i = 0; i < rewardTokens.length; i++) { amounts[i] = rewardTokens[i].balanceOf(address(this)); } return amounts; } // Fallback Functions for calldata and reciever for handling only ether transfer receive() external payable {} }
/_openzeppelin/contracts/access/Ownable.sol
// 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); } }
/_openzeppelin/contracts/token/ERC20/IERC20.sol
// 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); }
/_openzeppelin/contracts/utils/Context.sol
// 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; } }
/project_/contracts/strategies/IStrategy.sol
pragma solidity ^0.8.7; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IStrategy { function invest(address _inboundCurrency, uint256 _minAmount) external payable; function earlyWithdraw( address _inboundCurrency, uint256 _amount, uint256 _minAmount ) external; function redeem( address _inboundCurrency, uint256 _amount, bool variableDeposits, uint256 _minAmount, bool disableRewardTokenClaim ) external; function getTotalAmount() external view returns (uint256); function getNetDepositAmount(uint256 _amount) external view returns (uint256); function getAccumulatedRewardTokenAmounts(bool disableRewardTokenClaim) external returns (uint256[] memory); function getRewardTokens() external view returns (IERC20[] memory); function getUnderlyingAsset() external view returns (address); function strategyOwner() external view returns (address); }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_inboundCurrency","internalType":"address"},{"type":"address[]","name":"_rewardTokens","internalType":"contract IERC20[]"}]},{"type":"error","name":"INVALID_REWARD_TOKEN","inputs":[]},{"type":"error","name":"TOKEN_TRANSFER_FAILURE","inputs":[]},{"type":"error","name":"TRANSACTIONAL_TOKEN_TRANSFER_FAILURE","inputs":[]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"earlyWithdraw","inputs":[{"type":"address","name":"_inboundCurrency","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_minAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getAccumulatedRewardTokenAmounts","inputs":[{"type":"bool","name":"disableRewardTokenClaim","internalType":"bool"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNetDepositAmount","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"contract IERC20[]"}],"name":"getRewardTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getUnderlyingAsset","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"inboundToken","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"invest","inputs":[{"type":"address","name":"_inboundCurrency","internalType":"address"},{"type":"uint256","name":"_minAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"redeem","inputs":[{"type":"address","name":"_inboundCurrency","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"variableDeposits","internalType":"bool"},{"type":"uint256","name":"_minAmount","internalType":"uint256"},{"type":"bool","name":"disableRewardTokenClaim","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"rewardTokens","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"strategyOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604051620011d3380380620011d38339810160408190526200003491620001cf565b6200003f33620000ec565b600180546001600160a01b0319166001600160a01b03841617905560005b8151811015620000cd5760006001600160a01b0316828281518110620000875762000087620002eb565b60200260200101516001600160a01b03161415620000b857604051631a26e5dd60e31b815260040160405180910390fd5b80620000c481620002c1565b9150506200005d565b508051620000e39060029060208401906200013c565b50505062000330565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000194579160200282015b828111156200019457825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200015d565b50620001a2929150620001a6565b5090565b5b80821115620001a25760008155600101620001a7565b8051620001ca8162000317565b919050565b60008060408385031215620001e357600080fd5b8251620001f08162000317565b602084810151919350906001600160401b03808211156200021057600080fd5b818601915086601f8301126200022557600080fd5b8151818111156200023a576200023a62000301565b8060051b604051601f19603f8301168101818110858211171562000262576200026262000301565b604052828152858101935084860182860187018b10156200028257600080fd5b600095505b83861015620002b0576200029b81620001bd565b85526001959095019493860193860162000287565b508096505050505050509250929050565b6000600019821415620002e457634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200032d57600080fd5b50565b610e9380620003406000396000f3fe6080604052600436106100e15760003560e01c80637bb7bed11161007f578063c4f59f9b11610059578063c4f59f9b1461022d578063ca63279b1461024f578063e3daf456146101fc578063f2fde38b1461027c57600080fd5b80637bb7bed1146101dc5780638da5cb5b146101fc578063b9b8c2461461021a57600080fd5b80634bfd6571116100bb5780634bfd65711461016657806365237abb1461018657806365ac4341146101b2578063715018a6146101c757600080fd5b80631b206b73146100ed5780632e3d5fbf146101245780634281b1fb1461014657600080fd5b366100e857005b600080fd5b3480156100f957600080fd5b506001546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561013057600080fd5b5061014461013f366004610c79565b61029c565b005b34801561015257600080fd5b50600154610107906001600160a01b031681565b34801561017257600080fd5b50610144610181366004610cd6565b610602565b34801561019257600080fd5b506101a46101a1366004610d43565b90565b60405190815260200161011b565b3480156101be57600080fd5b506101a461066b565b3480156101d357600080fd5b50610144610704565b3480156101e857600080fd5b506101076101f7366004610d43565b61076a565b34801561020857600080fd5b506000546001600160a01b0316610107565b610144610228366004610c4f565b610794565b34801561023957600080fd5b506102426107f2565b60405161011b9190610d75565b34801561025b57600080fd5b5061026f61026a366004610d09565b610854565b60405161011b9190610dc2565b34801561028857600080fd5b50610144610297366004610c2d565b61097b565b6000546001600160a01b031633146102fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60006001600160a01b03861615610388576040516370a0823160e01b81523060048201526001600160a01b038716906370a082319060240160206040518083038186803b15801561034b57600080fd5b505afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610d5c565b61038a565b475b9050600084610399578161039b565b855b9050818111156103a85750805b6103b28782610a5d565b826105f95760005b6002548110156105f757600281815481106103d7576103d7610e23565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561042357600080fd5b505afa158015610437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045b9190610d5c565b156105e55760006002828154811061047557610475610e23565b600091825260209091200154600280546001600160a01b039092169163a9059cbb913391869081106104a9576104a9610e23565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156104f557600080fd5b505afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610d5c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561058b57600080fd5b505af115801561059f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c39190610d26565b9050806105e357604051638dc18fdb60e01b815260040160405180910390fd5b505b806105ef81610dfa565b9150506103ba565b505b50505050505050565b6000546001600160a01b0316331461065c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b6106668383610a5d565b505050565b6001546000906001600160a01b0316156106ff576001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fa9190610d5c565b905090565b504790565b6000546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b6107686000610ba9565b565b6002818154811061077a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146107ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b5050565b6060600280548060200260200160405190810160405280929190818152602001828054801561084a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161082c575b5050505050905090565b60025460609060009067ffffffffffffffff81111561087557610875610e39565b60405190808252806020026020018201604052801561089e578160200160208202803683370190505b50905060005b60025481101561097457600281815481106108c1576108c1610e23565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561090d57600080fd5b505afa158015610921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109459190610d5c565b82828151811061095757610957610e23565b60209081029190910101528061096c81610dfa565b9150506108a4565b5092915050565b6000546001600160a01b031633146109d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b6001600160a01b038116610a515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102f2565b610a5a81610ba9565b50565b6001600160a01b038216610aed57604051600090339083908381818185875af1925050503d8060008114610aad576040519150601f19603f3d011682016040523d82523d6000602084013e610ab2565b606091505b5050905080610666576040517f9a98b7a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290526000906001600160a01b0384169063a9059cbb90604401602060405180830381600087803b158015610b5157600080fd5b505af1158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190610d26565b90508061066657604051638dc18fdb60e01b815260040160405180910390fd5b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b0381168114610c2857600080fd5b919050565b600060208284031215610c3f57600080fd5b610c4882610c11565b9392505050565b60008060408385031215610c6257600080fd5b610c6b83610c11565b946020939093013593505050565b600080600080600060a08688031215610c9157600080fd5b610c9a86610c11565b9450602086013593506040860135610cb181610e4f565b9250606086013591506080860135610cc881610e4f565b809150509295509295909350565b600080600060608486031215610ceb57600080fd5b610cf484610c11565b95602085013595506040909401359392505050565b600060208284031215610d1b57600080fd5b8135610c4881610e4f565b600060208284031215610d3857600080fd5b8151610c4881610e4f565b600060208284031215610d5557600080fd5b5035919050565b600060208284031215610d6e57600080fd5b5051919050565b6020808252825182820181905260009190848201906040850190845b81811015610db65783516001600160a01b031683529284019291840191600101610d91565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610db657835183529284019291840191600101610dde565b6000600019821415610e1c57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610a5a57600080fdfea26469706673582212209b667e462467e1379f24c7edc00b0b6341687b4139dc0424f0885a9cbae82f9664736f6c63430008070033000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x6080604052600436106100e15760003560e01c80637bb7bed11161007f578063c4f59f9b11610059578063c4f59f9b1461022d578063ca63279b1461024f578063e3daf456146101fc578063f2fde38b1461027c57600080fd5b80637bb7bed1146101dc5780638da5cb5b146101fc578063b9b8c2461461021a57600080fd5b80634bfd6571116100bb5780634bfd65711461016657806365237abb1461018657806365ac4341146101b2578063715018a6146101c757600080fd5b80631b206b73146100ed5780632e3d5fbf146101245780634281b1fb1461014657600080fd5b366100e857005b600080fd5b3480156100f957600080fd5b506001546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561013057600080fd5b5061014461013f366004610c79565b61029c565b005b34801561015257600080fd5b50600154610107906001600160a01b031681565b34801561017257600080fd5b50610144610181366004610cd6565b610602565b34801561019257600080fd5b506101a46101a1366004610d43565b90565b60405190815260200161011b565b3480156101be57600080fd5b506101a461066b565b3480156101d357600080fd5b50610144610704565b3480156101e857600080fd5b506101076101f7366004610d43565b61076a565b34801561020857600080fd5b506000546001600160a01b0316610107565b610144610228366004610c4f565b610794565b34801561023957600080fd5b506102426107f2565b60405161011b9190610d75565b34801561025b57600080fd5b5061026f61026a366004610d09565b610854565b60405161011b9190610dc2565b34801561028857600080fd5b50610144610297366004610c2d565b61097b565b6000546001600160a01b031633146102fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60006001600160a01b03861615610388576040516370a0823160e01b81523060048201526001600160a01b038716906370a082319060240160206040518083038186803b15801561034b57600080fd5b505afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610d5c565b61038a565b475b9050600084610399578161039b565b855b9050818111156103a85750805b6103b28782610a5d565b826105f95760005b6002548110156105f757600281815481106103d7576103d7610e23565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561042357600080fd5b505afa158015610437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045b9190610d5c565b156105e55760006002828154811061047557610475610e23565b600091825260209091200154600280546001600160a01b039092169163a9059cbb913391869081106104a9576104a9610e23565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156104f557600080fd5b505afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610d5c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561058b57600080fd5b505af115801561059f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c39190610d26565b9050806105e357604051638dc18fdb60e01b815260040160405180910390fd5b505b806105ef81610dfa565b9150506103ba565b505b50505050505050565b6000546001600160a01b0316331461065c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b6106668383610a5d565b505050565b6001546000906001600160a01b0316156106ff576001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fa9190610d5c565b905090565b504790565b6000546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b6107686000610ba9565b565b6002818154811061077a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146107ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b5050565b6060600280548060200260200160405190810160405280929190818152602001828054801561084a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161082c575b5050505050905090565b60025460609060009067ffffffffffffffff81111561087557610875610e39565b60405190808252806020026020018201604052801561089e578160200160208202803683370190505b50905060005b60025481101561097457600281815481106108c1576108c1610e23565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561090d57600080fd5b505afa158015610921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109459190610d5c565b82828151811061095757610957610e23565b60209081029190910101528061096c81610dfa565b9150506108a4565b5092915050565b6000546001600160a01b031633146109d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f2565b6001600160a01b038116610a515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102f2565b610a5a81610ba9565b50565b6001600160a01b038216610aed57604051600090339083908381818185875af1925050503d8060008114610aad576040519150601f19603f3d011682016040523d82523d6000602084013e610ab2565b606091505b5050905080610666576040517f9a98b7a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290526000906001600160a01b0384169063a9059cbb90604401602060405180830381600087803b158015610b5157600080fd5b505af1158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190610d26565b90508061066657604051638dc18fdb60e01b815260040160405180910390fd5b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b0381168114610c2857600080fd5b919050565b600060208284031215610c3f57600080fd5b610c4882610c11565b9392505050565b60008060408385031215610c6257600080fd5b610c6b83610c11565b946020939093013593505050565b600080600080600060a08688031215610c9157600080fd5b610c9a86610c11565b9450602086013593506040860135610cb181610e4f565b9250606086013591506080860135610cc881610e4f565b809150509295509295909350565b600080600060608486031215610ceb57600080fd5b610cf484610c11565b95602085013595506040909401359392505050565b600060208284031215610d1b57600080fd5b8135610c4881610e4f565b600060208284031215610d3857600080fd5b8151610c4881610e4f565b600060208284031215610d5557600080fd5b5035919050565b600060208284031215610d6e57600080fd5b5051919050565b6020808252825182820181905260009190848201906040850190845b81811015610db65783516001600160a01b031683529284019291840191600101610d91565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610db657835183529284019291840191600101610dde565b6000600019821415610e1c57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610a5a57600080fdfea26469706673582212209b667e462467e1379f24c7edc00b0b6341687b4139dc0424f0885a9cbae82f9664736f6c63430008070033