More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
6 addresses found via
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14974617 | 351 days 3 hrs ago | IN | Create: CurveVoterProxy | 0 ETH | 0.29949361 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CurveVoterProxy
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-16 */ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; // Sources flattened with hardhat v2.9.6 https://hardhat.org // File contracts/Common/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/Math/SafeMath.sol /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/Utils/Address.sol /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory __name, string memory __symbol) public { _name = __name; _symbol = __symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address.approve(address spender, uint256 amount) */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for `accounts`'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal virtual { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of `from`'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of `from`'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:using-hooks.adoc[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File contracts/ERC20/SafeERC20.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 SafeMath for uint256; 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' // solhint-disable-next-line max-line-length 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).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/Staking/Owned.sol // https://docs.synthetix.io/contracts/Owned contract Owned { address public owner; address public nominatedOwner; constructor (address _owner) public { require(_owner != address(0), "Owner address cannot be 0"); owner = _owner; emit OwnerChanged(address(0), _owner); } function nominateNewOwner(address _owner) external onlyOwner { nominatedOwner = _owner; emit OwnerNominated(_owner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } modifier onlyOwner { require(msg.sender == owner, "Only the contract owner may perform this action"); _; } event OwnerNominated(address newOwner); event OwnerChanged(address oldOwner, address newOwner); } // File contracts/Curve/CurveInterfaces.sol interface ICurveGauge { function deposit(uint256) external; function balanceOf(address) external view returns (uint256); function withdraw(uint256) external; function claim_rewards() external; function reward_tokens(uint256) external view returns(address);//v2 function rewarded_token() external view returns(address);//v1 function lp_token() external view returns(address); } interface ICurveVoteEscrow { function create_lock(uint256, uint256) external; function increase_amount(uint256) external; function increase_unlock_time(uint256) external; function withdraw() external; function smart_wallet_checker() external view returns (address); } interface IWalletChecker { function check(address) external view returns (bool); } interface IVoting{ function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory); function vote_for_gauge_weights(address,uint256) external; } interface IMinter{ function mint(address) external; } interface IRegistry{ function get_registry() external view returns(address); function get_address(uint256 _id) external view returns(address); function gauge_controller() external view returns(address); function get_lp_token(address) external view returns(address); function get_gauges(address) external view returns(address[10] memory,uint128[10] memory); } interface IStaker{ function deposit(address, address) external; function withdraw(address) external; function withdraw(address, address, uint256) external; function withdrawAll(address, address) external; function createLock(uint256, uint256) external; function increaseAmount(uint256) external; function increaseTime(uint256) external; function release() external; function claimCrv(address) external returns (uint256); function claimRewards(address) external; function claimFees(address,address) external; function setStashAccess(address, bool) external; function vote(uint256,address,bool) external; function voteGaugeWeight(address,uint256) external; function balanceOfPool(address) external view returns (uint256); function operator() external view returns (address); function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory); } interface IRewards{ function stake(address, uint256) external; function stakeFor(address, uint256) external; function withdraw(address, uint256) external; function exit(address) external; function getReward(address) external; function queueNewRewards(uint256) external; function notifyRewardAmount(uint256) external; function addExtraReward(address) external; function stakingToken() external view returns (address); function rewardToken() external view returns(address); function earned(address account) external view returns (uint256); } interface IStash{ function stashRewards() external returns (bool); function processStash() external returns (bool); function claimRewards() external returns (bool); function initialize(uint256 _pid, address _operator, address _staker, address _gauge, address _rewardFactory) external; } interface IFeeDistro{ function checkpoint_token() external; function ve_for_at(address _user, uint256 _timestamp) external view returns(uint256); function checkpoint_total_supply() external; function claim() external returns(uint256); function claim(address _addr) external returns(uint256); function claim_many(address[20] memory _receivers) external returns(bool); function burn(address _coin) external returns(bool); function commit_admin(address _addr) external; function apply_admin() external; function toggle_allow_checkpoint_token() external; function kill_me() external; function recover_balance(address _coin) external returns(bool); function start_time() external view returns(uint256); function time_cursor() external view returns(uint256); function time_cursor_of(address arg0) external view returns(uint256); function user_epoch_of(address arg0) external view returns(uint256); function last_token_time() external view returns(uint256); function tokens_per_week(uint256 arg0) external view returns(uint256); function voting_escrow() external view returns(address); function token() external view returns(address); function total_received() external view returns(uint256); function token_last_balance() external view returns(uint256); function ve_supply(uint256 arg0) external view returns(uint256); function admin() external view returns(address); function future_admin() external view returns(address); function can_checkpoint_token() external view returns(bool); function emergency_return() external view returns(address); function is_killed() external view returns(bool); } interface ITokenMinter{ function mint(address,uint256) external; function burn(address,uint256) external; } interface IDeposit{ function isShutdown() external view returns(bool); function balanceOf(address _account) external view returns(uint256); function totalSupply() external view returns(uint256); function poolInfo(uint256) external view returns(address,address,address,address,address, bool); function rewardClaimed(uint256,address,uint256) external; function withdrawTo(uint256,uint256,address) external; function claimRewards(uint256,address) external returns(bool); function rewardArbitrator() external returns(address); function setGaugeRedirect(uint256 _pid) external returns(bool); function owner() external returns(address); } interface ICrvDeposit{ function deposit(uint256, bool) external; function lockIncentive() external view returns(uint256); } interface IRewardFactory{ function setAccess(address,bool) external; function CreateCrvRewards(uint256,address) external returns(address); function CreateTokenRewards(address,address,address) external returns(address); function activeRewardCount(address) external view returns(uint256); function addActiveReward(address,uint256) external returns(bool); function removeActiveReward(address,uint256) external returns(bool); } interface IStashFactory{ function CreateStash(uint256,address,address,uint256) external returns(address); } interface ITokenFactory{ function CreateDepositToken(address) external returns(address); } interface IPools{ function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool); function forceAddPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool); function shutdownPool(uint256 _pid) external returns(bool); function poolInfo(uint256) external view returns(address,address,address,address,address,bool); function poolLength() external view returns (uint256); function gaugeMap(address) external view returns(bool); function setPoolManager(address _poolM) external; } interface IVestedEscrow{ function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool); } // File contracts/Uniswap/TransferHelper.sol // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File contracts/Curve/CurveVoterProxy.sol // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ========================== CurveVoterProxy ========================= // ==================================================================== // Locks CRV, then uses it for gauge voting, depositing, rewards collection, etc // Graciously stolen from Convex, then modified // https://github.com/convex-eth/platform/blob/main/contracts/contracts/VoterProxy.sol // Frax Finance: https://github.com/FraxFinance // Frax Primary Forker(s) / Modifier(s) // Travis Moore: https://github.com/FortisFortuna // Reviewer(s) / Contributor(s) // C2tP: https://github.com/C2tP-C2tP contract CurveVoterProxy is Owned { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; address public constant mintr = address(0xd061D61a4d941c39E5453435B6345Dc261C2fcE0); address public constant crv = address(0xD533a949740bb3306d119CC777fa900bA034cd52); address public constant escrow = address(0x5f3b5DfEb7B28CDbD7FAba78963EE202a494e2A2); address public constant gaugeController = address(0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB); IFeeDistro public feeDistroDefault = IFeeDistro(0xA464e6DCda8AC41e03616F95f4BC98a13b8922Dc); address public operator; address public depositor; /* ========== CONSTRUCTOR ========== */ constructor( address _owner, address _operator, address _depositor ) Owned(_owner) { operator = _operator; depositor = _depositor; } /* ========== MODIFIERS ========== */ modifier onlyOperator() { require(msg.sender == operator, "Not operator"); _; } modifier onlyDepositor() { require(msg.sender == depositor, "Not depositor"); _; } /* ========== VIEWS ========== */ function getName() external pure returns (string memory) { return "CurveVoterProxy"; } function balanceOfPool(address _gauge) public view returns (uint256) { return ICurveGauge(_gauge).balanceOf(address(this)); } /* ========== INTERNAL FUNCTIONS ========== */ function _withdrawSome(address _gauge, uint256 _amount) internal returns (uint256) { ICurveGauge(_gauge).withdraw(_amount); return _amount; } /* ========== OWNER ONLY ========== */ function setOperator(address _operator) external onlyOwner { operator = _operator; } function setDepositor(address _depositor) external onlyOwner { depositor = _depositor; } function setFeeDistroDefault(address _fee_distro_default) external onlyOwner { feeDistroDefault = IFeeDistro(_fee_distro_default); } /* ========== OPERATOR ONLY ========== */ function deposit(address _token, address _gauge) external onlyOperator returns (bool) { uint256 balance = IERC20(_token).balanceOf(address(this)); if (balance > 0) { IERC20(_token).safeApprove(_gauge, 0); IERC20(_token).safeApprove(_gauge, balance); ICurveGauge(_gauge).deposit(balance); } return true; } // Withdraw partial funds function withdraw(address _token, address _gauge, uint256 _amount) public onlyOperator returns (bool) { uint256 _balance = IERC20(_token).balanceOf(address(this)); if (_balance < _amount) { _amount = _withdrawSome(_gauge, _amount.sub(_balance)); _amount = _amount.add(_balance); } IERC20(_token).safeTransfer(msg.sender, _amount); return true; } function withdrawAll(address _token, address _gauge) external onlyOperator returns (bool) { uint256 amount = balanceOfPool(_gauge).add(IERC20(_token).balanceOf(address(this))); withdraw(_token, _gauge, amount); return true; } function vote(uint256 _voteId, address _votingAddress, bool _support) external onlyOperator returns (bool) { IVoting(_votingAddress).vote(_voteId, _support, false); return true; } function voteGaugeWeight(address _gauge, uint256 _weight) public onlyOperator returns (bool) { IVoting(gaugeController).vote_for_gauge_weights(_gauge, _weight); return true; } function voteGaugeWeightMany(address[] memory _gauges, uint256[] memory _weights) external onlyOperator returns (bool) { for (uint256 i = 0; i < _gauges.length; i++){ voteGaugeWeight(_gauges[i], _weights[i]); } return true; } function claimCrv(address _gauge) public onlyOperator returns (uint256) { uint256 _balance = 0; try IMinter(mintr).mint(_gauge){ _balance = IERC20(crv).balanceOf(address(this)); } catch { } return _balance; } function claimCrvMany(address[] memory _gauges) external onlyOperator returns (uint256[] memory balances) { for (uint256 i = 0; i < _gauges.length; i++){ balances[i] = claimCrv(_gauges[i]); } } function claimRewards(address _gauge) public onlyOperator returns (bool) { ICurveGauge(_gauge).claim_rewards(); return true; } function claimRewardsMany(address[] memory _gauges) external onlyOperator returns (bool) { for (uint256 i = 0; i < _gauges.length; i++){ claimRewards(_gauges[i]); } return true; } function claimEverything(address[] memory _gauges) external onlyOperator returns (bool) { // CRV fee distributor address p = address(this); feeDistroDefault.claim_many([p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p]); // Gauge specific rewards for (uint256 i = 0; i < _gauges.length; i++){ claimCrv(_gauges[i]); claimRewards(_gauges[i]); } return true; } function claimFees(address _distroContract, address _token, uint256 arr_length) public onlyOperator returns (uint256) { address p = address(this); IFeeDistro(_distroContract).claim_many([p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p]); uint256 _balance = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(operator, _balance); return _balance; } function recoverManyERC20s(address[] memory tokenAddresses, uint256[] memory tokenAmounts, bool withdraw_entire_balance) external onlyOperator { for (uint256 i = 0; i < tokenAddresses.length; i++){ uint256 balance_to_use = withdraw_entire_balance ? IERC20(tokenAddresses[i]).balanceOf(address(this)) : tokenAmounts[i]; IERC20(tokenAddresses[i]).safeTransfer(operator, balance_to_use); } } function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOperator { TransferHelper.safeTransfer(address(tokenAddress), msg.sender, tokenAmount); } function recoverERC20All(address tokenAddress) external onlyOperator { uint256 tkn_bal = ERC20(tokenAddress).balanceOf(address(this)); TransferHelper.safeTransfer(address(tokenAddress), msg.sender, tkn_bal); } // Generic proxy function execute( address _to, uint256 _value, bytes calldata _data ) external onlyOperator returns (bool, bytes memory) { (bool success, bytes memory result) = _to.call{value:_value}(_data); return (success, result); } /* ========== DEPOSITOR ONLY ========== */ function createLock(uint256 _value, uint256 _unlockTime) external onlyDepositor returns (bool) { IERC20(crv).safeApprove(escrow, 0); IERC20(crv).safeApprove(escrow, _value); ICurveVoteEscrow(escrow).create_lock(_value, _unlockTime); return true; } function increaseAmount(uint256 _value) external onlyDepositor returns (bool) { IERC20(crv).safeApprove(escrow, 0); IERC20(crv).safeApprove(escrow, _value); ICurveVoteEscrow(escrow).increase_amount(_value); return true; } function increaseTime(uint256 _value) external onlyDepositor returns (bool) { ICurveVoteEscrow(escrow).increase_unlock_time(_value); return true; } function release() external onlyDepositor returns (bool) { ICurveVoteEscrow(escrow).withdraw(); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_depositor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"claimCrv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"claimCrvMany","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"claimEverything","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distroContract","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"arr_length","type":"uint256"}],"name":"claimFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"claimRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"claimRewardsMany","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"name":"createLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDistroDefault","outputs":[{"internalType":"contract IFeeDistro","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverERC20All","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"internalType":"bool","name":"withdraw_entire_balance","type":"bool"}],"name":"recoverManyERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"release","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"setDepositor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fee_distro_default","type":"address"}],"name":"setFeeDistroDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_voteId","type":"uint256"},{"internalType":"address","name":"_votingAddress","type":"address"},{"internalType":"bool","name":"_support","type":"bool"}],"name":"vote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_weight","type":"uint256"}],"name":"voteGaugeWeight","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"voteGaugeWeightMany","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"withdrawAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600280546001600160a01b03191673a464e6dcda8ac41e03616f95f4bc98a13b8922dc1790553480156200003757600080fd5b5060405162003631380380620036318339810160408190526200005a916200015e565b826001600160a01b038116620000b65760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a150600380546001600160a01b039384166001600160a01b0319918216179091556004805492909316911617905550620001a8565b80516001600160a01b03811681146200015957600080fd5b919050565b6000806000606084860312156200017457600080fd5b6200017f8462000141565b92506200018f6020850162000141565b91506200019f6040850162000141565b90509250925092565b61347980620001b86000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063b0f6379411610145578063d9caed12116100bd578063f29026571161008c578063f412661f11610071578063f412661f146105b0578063f488028f146105c3578063f9609f08146105d657600080fd5b8063f29026571461057d578063f2c098b71461059d57600080fd5b8063d9caed1214610529578063e2cdd42a1461053c578063e2fdcc171461054f578063ef5cfb8c1461056a57600080fd5b8063b61d27f611610114578063ceca23f1116100f9578063ceca23f1146104e8578063d180d771146104fb578063d1e61dcb1461050e57600080fd5b8063b61d27f6146104a7578063c7c4ff46146104c857600080fd5b8063b0f637941461044e578063b3ab15fb14610461578063b4b3bc6314610474578063b52c05fe1461049457600080fd5b80636a4874a1116101d857806386d1a69f116101a75780638da5cb5b1161018c5780638da5cb5b14610400578063965686431461042057806399eecb3b1461043357600080fd5b806386d1a69f146103e55780638980f11f146103ed57600080fd5b80636a4874a11461039c5780636e8553fa146103b757806376e9ede1146103ca57806379ba5097146103dd57600080fd5b80633c9a2a1a1161022f57806353a47bb71161021457806353a47bb714610324578063570ca735146103695780635d7e9bcb1461038957600080fd5b80633c9a2a1a146102f05780633fe9bc061461030357600080fd5b806309cae2c81461026157806315456eba146102895780631627540c1461029c57806317d7de7c146102b1575b600080fd5b61027461026f366004612db0565b6105e9565b60405190151581526020015b60405180910390f35b610274610297366004612de3565b61072e565b6102af6102aa366004612dfc565b6108a2565b005b604080518082018252600f81527f4375727665566f74657250726f78790000000000000000000000000000000000602082015290516102809190612e8d565b6102746102fe366004612de3565b6109c2565b610316610311366004612dfc565b610a97565b604051908152602001610280565b6001546103449073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610280565b6003546103449073ffffffffffffffffffffffffffffffffffffffff1681565b610274610397366004612ea0565b610c44565b61034473d533a949740bb3306d119cc777fa900ba034cd5281565b6102746103c5366004612fde565b610d6c565b6102746103d836600461306e565b610f94565b6102af611073565b6102746111be565b6102af6103fb366004612ea0565b6112bd565b6000546103449073ffffffffffffffffffffffffffffffffffffffff1681565b61027461042e366004612fde565b61134d565b610344732f50d538606fa9edd2b11e2446beb18c9d5846bb81565b61031661045c366004612dfc565b61140e565b6102af61046f366004612dfc565b61149f565b610487610482366004612fde565b61158d565b60405161028091906130d2565b6102746104a2366004613116565b611667565b6104ba6104b5366004613138565b6117aa565b6040516102809291906131bf565b6004546103449073ffffffffffffffffffffffffffffffffffffffff1681565b6103166104f63660046131da565b6118ae565b6102af610509366004613227565b611b2b565b61034473d061d61a4d941c39e5453435b6345dc261c2fce081565b6102746105373660046131da565b611d0b565b61027461054a36600461329f565b611e6d565b610344735f3b5dfeb7b28cdbd7faba78963ee202a494e2a281565b610274610578366004612dfc565b611f8a565b6002546103449073ffffffffffffffffffffffffffffffffffffffff1681565b6102af6105ab366004612dfc565b612056565b6102af6105be366004612dfc565b612144565b6102af6105d1366004612dfc565b612232565b6102746105e4366004612db0565b612351565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f72000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906107169073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa1580156106e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070791906132d4565b6107108561140e565b9061253b565b9050610723848483611d0b565b506001949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1633146107b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74206465706f7369746f72000000000000000000000000000000000000006044820152606401610669565b6107e673d533a949740bb3306d119cc777fa900ba034cd52735f3b5dfeb7b28cdbd7faba78963ee202a494e2a260006125b4565b61081973d533a949740bb3306d119cc777fa900ba034cd52735f3b5dfeb7b28cdbd7faba78963ee202a494e2a2846125b4565b6040517f4957677c00000000000000000000000000000000000000000000000000000000815260048101839052735f3b5dfeb7b28cdbd7faba78963ee202a494e2a290634957677c906024015b600060405180830381600087803b15801561088057600080fd5b505af1158015610894573d6000803e3d6000fd5b50505050600190505b919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152608401610669565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b60045460009073ffffffffffffffffffffffffffffffffffffffff163314610a46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74206465706f7369746f72000000000000000000000000000000000000006044820152606401610669565b6040517feff7a61200000000000000000000000000000000000000000000000000000000815260048101839052735f3b5dfeb7b28cdbd7faba78963ee202a494e2a29063eff7a61290602401610866565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314610b1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260009073d061d61a4d941c39e5453435b6345dc261c2fce090636a62784290602401600060405180830381600087803b158015610b9957600080fd5b505af1925050508015610baa575060015b15610c3e576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273d533a949740bb3306d119cc777fa900ba034cd52906370a0823190602401602060405180830381865afa158015610c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3b91906132d4565b90505b92915050565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314610cc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6040517fd713632800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052732f50d538606fa9edd2b11e2446beb18c9d5846bb9063d7136328906044015b600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b5060019695505050505050565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314610df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b60025460408051610280810182523080825260208201819052818301819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905291517f7b935a23000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff1691637b935a2391610ee2916004016132ed565b6020604051808303816000875af1158015610f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f259190613335565b5060005b8351811015610f8a57610f54848281518110610f4757610f47613352565b6020026020010151610a97565b50610f77848281518110610f6a57610f6a613352565b6020026020010151611f8a565b5080610f82816133b0565b915050610f29565b5060019392505050565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b60005b8351811015610f8a5761106084828151811061103957611039613352565b602002602001015184838151811061105357611053613352565b6020026020010151610c44565b508061106b816133b0565b91505061101b565b60015473ffffffffffffffffffffffffffffffffffffffff16331461111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610669565b6000546001546040805173ffffffffffffffffffffffffffffffffffffffff93841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60045460009073ffffffffffffffffffffffffffffffffffffffff163314611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74206465706f7369746f72000000000000000000000000000000000000006044820152606401610669565b735f3b5dfeb7b28cdbd7faba78963ee202a494e2a273ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561129e57600080fd5b505af11580156112b2573d6000803e3d6000fd5b505050506001905090565b60035473ffffffffffffffffffffffffffffffffffffffff16331461133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6113498233836127b9565b5050565b60035460009073ffffffffffffffffffffffffffffffffffffffff1633146113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b60005b8251811015611405576113f2838281518110610f6a57610f6a613352565b50806113fd816133b0565b9150506113d4565b50600192915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561147b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3e91906132d4565b60005473ffffffffffffffffffffffffffffffffffffffff163314611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152608401610669565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60035460609073ffffffffffffffffffffffffffffffffffffffff163314611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b60005b825181101561166157611632838281518110610f4757610f47613352565b82828151811061164457611644613352565b602090810291909101015280611659816133b0565b915050611614565b50919050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1633146116eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74206465706f7369746f72000000000000000000000000000000000000006044820152606401610669565b61171f73d533a949740bb3306d119cc777fa900ba034cd52735f3b5dfeb7b28cdbd7faba78963ee202a494e2a260006125b4565b61175273d533a949740bb3306d119cc777fa900ba034cd52735f3b5dfeb7b28cdbd7faba78963ee202a494e2a2856125b4565b6040517f65fc38730000000000000000000000000000000000000000000000000000000081526004810184905260248101839052735f3b5dfeb7b28cdbd7faba78963ee202a494e2a2906365fc387390604401610d31565b60035460009060609073ffffffffffffffffffffffffffffffffffffffff163314611831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6000808773ffffffffffffffffffffffffffffffffffffffff1687878760405161185c9291906133e8565b60006040518083038185875af1925050503d8060008114611899576040519150601f19603f3d011682016040523d82523d6000602084013e61189e565b606091505b5090999098509650505050505050565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314611932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b60408051610280810182523080825260208201819052818301819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905291517f7b935a2300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871691637b935a2391611a2191906004016132ed565b6020604051808303816000875af1158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a649190613335565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa158015611ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af691906132d4565b600354909150611b209073ffffffffffffffffffffffffffffffffffffffff878116911683612929565b9150505b9392505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314611bac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b60005b8351811015611d0557600082611bde57838281518110611bd157611bd1613352565b6020026020010151611c8a565b848281518110611bf057611bf0613352565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8a91906132d4565b9050611cf2600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682878581518110611cc557611cc5613352565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166129299092919063ffffffff16565b5080611cfd816133b0565b915050611baf565b50505050565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314611d8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa158015611dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2091906132d4565b905082811015611e4c57611e3d84611e38858461297f565b6129c1565b9250611e49838261253b565b92505b61072373ffffffffffffffffffffffffffffffffffffffff86163385612929565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314611ef1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6040517fdf133bca0000000000000000000000000000000000000000000000000000000081526004810185905282151560248201526000604482015273ffffffffffffffffffffffffffffffffffffffff84169063df133bca90606401600060405180830381600087803b158015611f6857600080fd5b505af1158015611f7c573d6000803e3d6000fd5b506001979650505050505050565b60035460009073ffffffffffffffffffffffffffffffffffffffff16331461200e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b8173ffffffffffffffffffffffffffffffffffffffff1663e6f1daf26040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561088057600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146120fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152608401610669565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152608401610669565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60035473ffffffffffffffffffffffffffffffffffffffff1633146122b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234491906132d4565b90506113498233836127b9565b60035460009073ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610669565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015612442573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246691906132d4565b90508015610f8a5761249073ffffffffffffffffffffffffffffffffffffffff85168460006125b4565b6124b173ffffffffffffffffffffffffffffffffffffffff851684836125b4565b6040517fb6b55f250000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff84169063b6b55f2590602401600060405180830381600087803b15801561251957600080fd5b505af115801561252d573d6000803e3d6000fd5b505050505060019392505050565b60008061254883856133f8565b905083811015611b24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610669565b80158061265457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561262e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265291906132d4565b155b6126e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610669565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127b49084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a4b565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916128509190613410565b6000604051808303816000865af19150503d806000811461288d576040519150601f19603f3d011682016040523d82523d6000602084013e612892565b606091505b50915091508180156128bc5750805115806128bc5750808060200190518101906128bc9190613335565b612922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610669565b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127b49084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612732565b6000611b2483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b57565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905260009073ffffffffffffffffffffffffffffffffffffffff841690632e1a7d4d90602401600060405180830381600087803b158015612a2c57600080fd5b505af1158015612a40573d6000803e3d6000fd5b509395945050505050565b6000612aad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ba29092919063ffffffff16565b8051909150156127b45780806020019051810190612acb9190613335565b6127b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610669565b60008184841115612b95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106699190612e8d565b506000611b20848661342c565b6060612bb18484600085612bb9565b949350505050565b606082471015612c4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610669565b843b612cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610669565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cdc9190613410565b60006040518083038185875af1925050503d8060008114612d19576040519150601f19603f3d011682016040523d82523d6000602084013e612d1e565b606091505b5091509150612d2e828286612d39565b979650505050505050565b60608315612d48575081611b24565b825115612d585782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106699190612e8d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461089d57600080fd5b60008060408385031215612dc357600080fd5b612dcc83612d8c565b9150612dda60208401612d8c565b90509250929050565b600060208284031215612df557600080fd5b5035919050565b600060208284031215612e0e57600080fd5b611b2482612d8c565b60005b83811015612e32578181015183820152602001612e1a565b83811115611d055750506000910152565b60008151808452612e5b816020860160208601612e17565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b246020830184612e43565b60008060408385031215612eb357600080fd5b612ebc83612d8c565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f4057612f40612eca565b604052919050565b600067ffffffffffffffff821115612f6257612f62612eca565b5060051b60200190565b600082601f830112612f7d57600080fd5b81356020612f92612f8d83612f48565b612ef9565b82815260059290921b84018101918181019086841115612fb157600080fd5b8286015b84811015612fd357612fc681612d8c565b8352918301918301612fb5565b509695505050505050565b600060208284031215612ff057600080fd5b813567ffffffffffffffff81111561300757600080fd5b612bb184828501612f6c565b600082601f83011261302457600080fd5b81356020613034612f8d83612f48565b82815260059290921b8401810191818101908684111561305357600080fd5b8286015b84811015612fd35780358352918301918301613057565b6000806040838503121561308157600080fd5b823567ffffffffffffffff8082111561309957600080fd5b6130a586838701612f6c565b935060208501359150808211156130bb57600080fd5b506130c885828601613013565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561310a578351835292840192918401916001016130ee565b50909695505050505050565b6000806040838503121561312957600080fd5b50508035926020909101359150565b6000806000806060858703121561314e57600080fd5b61315785612d8c565b935060208501359250604085013567ffffffffffffffff8082111561317b57600080fd5b818701915087601f83011261318f57600080fd5b81358181111561319e57600080fd5b8860208285010111156131b057600080fd5b95989497505060200194505050565b8215158152604060208201526000612bb16040830184612e43565b6000806000606084860312156131ef57600080fd5b6131f884612d8c565b925061320660208501612d8c565b9150604084013590509250925092565b801515811461322457600080fd5b50565b60008060006060848603121561323c57600080fd5b833567ffffffffffffffff8082111561325457600080fd5b61326087838801612f6c565b9450602086013591508082111561327657600080fd5b5061328386828701613013565b925050604084013561329481613216565b809150509250925092565b6000806000606084860312156132b457600080fd5b833592506132c460208501612d8c565b9150604084013561329481613216565b6000602082840312156132e657600080fd5b5051919050565b6102808101818360005b601481101561332c57815173ffffffffffffffffffffffffffffffffffffffff168352602092830192909101906001016132f7565b50505092915050565b60006020828403121561334757600080fd5b8151611b2481613216565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133e1576133e1613381565b5060010190565b8183823760009101908152919050565b6000821982111561340b5761340b613381565b500190565b60008251613422818460208701612e17565b9190910192915050565b60008282101561343e5761343e613381565b50039056fea2646970667358221220fc6b36cfc0615049777bee4222135d9c24443d6be83892ddf856f05e9a75be2b64736f6c634300080d0033000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27
-----Decoded View---------------
Arg [0] : _owner (address): 0xB1748C79709f4Ba2Dd82834B8c82D4a505003f27
Arg [1] : _operator (address): 0xB1748C79709f4Ba2Dd82834B8c82D4a505003f27
Arg [2] : _depositor (address): 0xB1748C79709f4Ba2Dd82834B8c82D4a505003f27
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27
Arg [1] : 000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27
Arg [2] : 000000000000000000000000b1748c79709f4ba2dd82834b8c82d4a505003f27
Deployed ByteCode Sourcemap
44157:7922:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47187:257;;;;;;:::i;:::-;;:::i;:::-;;;645:14:1;;638:22;620:41;;608:2;593:18;47187:257:0;;;;;;;;51495:262;;;;;;:::i;:::-;;:::i;33199:141::-;;;;;;:::i;:::-;;:::i;:::-;;45389:100;45457:24;;;;;;;;;;;;;;;;45389:100;;;;45457:24;45389:100;:::i;51765:170::-;;;;;;:::i;:::-;;:::i;48156:275::-;;;;;;:::i;:::-;;:::i;:::-;;;2004:25:1;;;1992:2;1977:18;48156:275:0;1858:177:1;32967:29:0;;;;;;;;;;;;2216:42:1;2204:55;;;2186:74;;2174:2;2159:18;32967:29:0;2040:226:1;44773:23:0;;;;;;;;;47662:198;;;;;;:::i;:::-;;:::i;44388:81::-;;44426:42;44388:81;;49063:461;;;;;;:::i;:::-;;:::i;47868:280::-;;;;;;:::i;:::-;;:::i;33348:271::-;;;:::i;51943:133::-;;;:::i;50414:181::-;;;;;;:::i;:::-;;:::i;32940:20::-;;;;;;;;;48832:223;;;;;;:::i;:::-;;:::i;44569:93::-;;44619:42;44569:93;;45497:139;;;;;;:::i;:::-;;:::i;45916:98::-;;;;;;:::i;:::-;;:::i;48439:228::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51199:288::-;;;;;;:::i;:::-;;:::i;50865:276::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;44803:24::-;;;;;;;;;49532:426;;;;;;:::i;:::-;;:::i;49968:438::-;;;;;;:::i;:::-;;:::i;44298:83::-;;44338:42;44298:83;;46758:421;;;;;;:::i;:::-;;:::i;47452:202::-;;;;;;:::i;:::-;;:::i;44478:84::-;;44519:42;44478:84;;48675:149;;;;;;:::i;:::-;;:::i;44669:91::-;;;;;;;;;46022:102;;;;;;:::i;:::-;;:::i;46132:146::-;;;;;;:::i;:::-;;:::i;50603:232::-;;;;;;:::i;:::-;;:::i;46335:384::-;;;;;;:::i;:::-;;:::i;47187:257::-;45182:8;;47271:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;;;;;;;;;47331:39:::1;::::0;;;;47364:4:::1;47331:39;::::0;::::1;2186:74:1::0;47288:14:0::1;::::0;47305:66:::1;::::0;47331:24:::1;::::0;::::1;::::0;::::1;::::0;2159:18:1;;47331:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47305:21;47319:6;47305:13;:21::i;:::-;:25:::0;::::1;:66::i;:::-;47288:83;;47382:32;47391:6;47399;47407;47382:8;:32::i;:::-;-1:-1:-1::0;47432:4:0::1;::::0;47187:257;-1:-1:-1;;;;47187:257:0:o;51495:262::-;45293:9;;51567:4;;45293:9;;45279:10;:23;45271:49;;;;;;;10026:2:1;45271:49:0;;;10008:21:1;10065:2;10045:18;;;10038:30;10104:15;10084:18;;;10077:43;10137:18;;45271:49:0;9824:337:1;45271:49:0;51584:34:::1;44426:42;44519;51616:1;51584:23;:34::i;:::-;51629:39;44426:42;44519;51661:6:::0;51629:23:::1;:39::i;:::-;51679:48;::::0;;;;::::1;::::0;::::1;2004:25:1::0;;;44519:42:0::1;::::0;51679:40:::1;::::0;1977:18:1;;51679:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51745:4;51738:11;;45331:1;51495:262:::0;;;:::o;33199:141::-;33679:5;;;;33665:10;:19;33657:79;;;;;;;10368:2:1;33657:79:0;;;10350:21:1;10407:2;10387:18;;;10380:30;10446:34;10426:18;;;10419:62;10517:17;10497:18;;;10490:45;10552:19;;33657:79:0;10166:411:1;33657:79:0;33271:14:::1;:23:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;33310:22:::1;::::0;2186:74:1;;;33310:22:0::1;::::0;2174:2:1;2159:18;33310:22:0::1;;;;;;;33199:141:::0;:::o;51765:170::-;45293:9;;51835:4;;45293:9;;45279:10;:23;45271:49;;;;;;;10026:2:1;45271:49:0;;;10008:21:1;10065:2;10045:18;;;10038:30;10104:15;10084:18;;;10077:43;10137:18;;45271:49:0;9824:337:1;45271:49:0;51852:53:::1;::::0;;;;::::1;::::0;::::1;2004:25:1::0;;;44519:42:0::1;::::0;51852:45:::1;::::0;1977:18:1;;51852:53:0::1;1858:177:1::0;48156:275:0;45182:8;;48219:7;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;48274:27:::1;::::0;;;;2216:42:1;2204:55;;48274:27:0::1;::::0;::::1;2186:74:1::0;48239:16:0::1;::::0;44338:42:::1;::::0;48274:19:::1;::::0;2159:18:1;;48274:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;48270:126:::0;::::1;;48327:36;::::0;;;;48357:4:::1;48327:36;::::0;::::1;2186:74:1::0;44426:42:0::1;::::0;48327:21:::1;::::0;2159:18:1;;48327:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48316:47;;48270:126;48415:8:::0;48156:275;-1:-1:-1;;48156:275:0:o;47662:198::-;45182:8;;47749:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;47766:64:::1;::::0;;;;10786:42:1;10774:55;;47766:64:0::1;::::0;::::1;10756:74:1::0;10846:18;;;10839:34;;;44619:42:0::1;::::0;47766:47:::1;::::0;10729:18:1;;47766:64:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;47848:4:0::1;::::0;47662:198;-1:-1:-1;;;;;;47662:198:0:o;49063:461::-;45182:8;;49145:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;49230:16:::1;::::0;:89:::1;::::0;;::::1;::::0;::::1;::::0;;49214:4:::1;49230:89:::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16:::1;:89:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49214:4;;49230:16:::1;;::::0;:27:::1;::::0;:89:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49372:9;49367:128;49391:7;:14;49387:1;:18;49367:128;;;49425:20;49434:7;49442:1;49434:10;;;;;;;;:::i;:::-;;;;;;;49425:8;:20::i;:::-;;49459:24;49472:7;49480:1;49472:10;;;;;;;;:::i;:::-;;;;;;;49459:12;:24::i;:::-;-1:-1:-1::0;49407:3:0;::::1;::::0;::::1;:::i;:::-;;;;49367:128;;;-1:-1:-1::0;49512:4:0::1;::::0;49063:461;-1:-1:-1;;;49063:461:0:o;47868:280::-;45182:8;;47981:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;48003:9:::1;47998:111;48022:7;:14;48018:1;:18;47998:111;;;48057:40;48073:7;48081:1;48073:10;;;;;;;;:::i;:::-;;;;;;;48085:8;48094:1;48085:11;;;;;;;;:::i;:::-;;;;;;;48057:15;:40::i;:::-;-1:-1:-1::0;48038:3:0;::::1;::::0;::::1;:::i;:::-;;;;47998:111;;33348:271:::0;33417:14;;;;33403:10;:28;33395:94;;;;;;;12465:2:1;33395:94:0;;;12447:21:1;12504:2;12484:18;;;12477:30;12543:34;12523:18;;;12516:62;12614:23;12594:18;;;12587:51;12655:19;;33395:94:0;12263:417:1;33395:94:0;33518:5;;;33525:14;33505:35;;;33518:5;;;;12920:34:1;;33525:14:0;;;;12985:2:1;12970:18;;12963:43;33505:35:0;;12832:18:1;33505:35:0;;;;;;;33559:14;;;;33551:22;;;;;;33559:14;;;33551:22;;;;33584:27;;;33348:271::o;51943:133::-;45293:9;;51994:4;;45293:9;;45279:10;:23;45271:49;;;;;;;10026:2:1;45271:49:0;;;10008:21:1;10065:2;10045:18;;;10038:30;10104:15;10084:18;;;10077:43;10137:18;;45271:49:0;9824:337:1;45271:49:0;44519:42:::1;52011:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52064:4;52057:11;;51943:133:::0;:::o;50414:181::-;45182:8;;;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;50512:75:::1;50548:12;50563:10;50575:11;50512:27;:75::i;:::-;50414:181:::0;;:::o;48832:223::-;45182:8;;48915:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;48937:9:::1;48932:94;48956:7;:14;48952:1;:18;48932:94;;;48990:24;49003:7;49011:1;49003:10;;;;;;;;:::i;48990:24::-;-1:-1:-1::0;48972:3:0;::::1;::::0;::::1;:::i;:::-;;;;48932:94;;;-1:-1:-1::0;49043:4:0::1;::::0;48832:223;-1:-1:-1;;48832:223:0:o;45497:139::-;45584:44;;;;;45622:4;45584:44;;;2186:74:1;45557:7:0;;45584:29;;;;;;2159:18:1;;45584:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45916:98::-;33679:5;;;;33665:10;:19;33657:79;;;;;;;10368:2:1;33657:79:0;;;10350:21:1;10407:2;10387:18;;;10380:30;10446:34;10426:18;;;10419:62;10517:17;10497:18;;;10490:45;10552:19;;33657:79:0;10166:411:1;33657:79:0;45986:8:::1;:20:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;45916:98::o;48439:228::-;45182:8;;48518:25;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;48561:9:::1;48556:104;48580:7;:14;48576:1;:18;48556:104;;;48628:20;48637:7;48645:1;48637:10;;;;;;;;:::i;48628:20::-;48614:8;48623:1;48614:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:34;48596:3;::::1;::::0;::::1;:::i;:::-;;;;48556:104;;;;48439:228:::0;;;:::o;51199:288::-;45293:9;;51288:4;;45293:9;;45279:10;:23;45271:49;;;;;;;10026:2:1;45271:49:0;;;10008:21:1;10065:2;10045:18;;;10038:30;10104:15;10084:18;;;10077:43;10137:18;;45271:49:0;9824:337:1;45271:49:0;51305:34:::1;44426:42;44519;51337:1;51305:23;:34::i;:::-;51350:39;44426:42;44519;51382:6:::0;51350:23:::1;:39::i;:::-;51400:57;::::0;;;;::::1;::::0;::::1;13191:25:1::0;;;13232:18;;;13225:34;;;44519:42:0::1;::::0;51400:36:::1;::::0;13164:18:1;;51400:57:0::1;13017:248:1::0;50865:276:0;45182:8;;50998:4;;51004:12;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;51030:12:::1;51044:19:::0;51067:3:::1;:8;;51082:6;51090:5;;51067:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;51029:67:0;;;;-1:-1:-1;50865:276:0;-1:-1:-1;;;;;;;50865:276:0:o;49532:426::-;45182:8;;49641:7;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;49697:100:::1;::::0;;::::1;::::0;::::1;::::0;;49681:4:::1;49697:100:::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:38:::1;::::0;::::1;::::0;::::1;::::0;:100:::1;::::0;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;49827:39:0::1;::::0;;;;49860:4:::1;49827:39;::::0;::::1;2186:74:1::0;49808:16:0::1;::::0;49827:24:::1;::::0;::::1;::::0;::::1;::::0;2159:18:1;;49827:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49905:8;::::0;49808:58;;-1:-1:-1;49877:47:0::1;::::0;49905:8:::1;49877:27:::0;;::::1;::::0;49905:8:::1;49808:58:::0;49877:27:::1;:47::i;:::-;49942:8:::0;-1:-1:-1;;45218:1:0::1;49532:426:::0;;;;;:::o;49968:438::-;45182:8;;;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;50128:9:::1;50123:276;50147:14;:21;50143:1;:25;50123:276;;;50189:22;50214:23;:94;;50293:12;50306:1;50293:15;;;;;;;;:::i;:::-;;;;;;;50214:94;;;50247:14;50262:1;50247:17;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;50240:50:::1;::::0;;;;50284:4:::1;50240:50;::::0;::::1;2186:74:1::0;50240:35:0::1;::::0;;::::1;::::0;::::1;::::0;2159:18:1;;50240:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50189:119;;50323:64;50362:8;;;;;;;;;;;50372:14;50330;50345:1;50330:17;;;;;;;;:::i;:::-;;;;;;;50323:38;;;;:64;;;;;:::i;:::-;-1:-1:-1::0;50170:3:0;::::1;::::0;::::1;:::i;:::-;;;;50123:276;;;;49968:438:::0;;;:::o;46758:421::-;45182:8;;46854:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;46890:39:::1;::::0;;;;46923:4:::1;46890:39;::::0;::::1;2186:74:1::0;46871:16:0::1;::::0;46890:24:::1;::::0;::::1;::::0;::::1;::::0;2159:18:1;;46890:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46871:58;;46955:7;46944:8;:18;46940:151;;;46989:44;47003:6:::0;47011:21:::1;:7:::0;47023:8;47011:11:::1;:21::i;:::-;46989:13;:44::i;:::-;46979:54:::0;-1:-1:-1;47058:21:0::1;46979:54:::0;47070:8;47058:11:::1;:21::i;:::-;47048:31;;46940:151;47101:48;:27;::::0;::::1;47129:10;47141:7:::0;47101:27:::1;:48::i;47452:202::-:0;45182:8;;47553:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;47570:54:::1;::::0;;;;::::1;::::0;::::1;13736:25:1::0;;;13804:14;;13797:22;13777:18;;;13770:50;47618:5:0::1;13836:18:1::0;;;13829:50;47570:28:0::1;::::0;::::1;::::0;::::1;::::0;13709:18:1;;47570:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;47642:4:0::1;::::0;47452:202;-1:-1:-1;;;;;;;47452:202:0:o;48675:149::-;45182:8;;48742:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;48771:6:::1;48759:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;46022:102:::0;33679:5;;;;33665:10;:19;33657:79;;;;;;;10368:2:1;33657:79:0;;;10350:21:1;10407:2;10387:18;;;10380:30;10446:34;10426:18;;;10419:62;10517:17;10497:18;;;10490:45;10552:19;;33657:79:0;10166:411:1;33657:79:0;46094:9:::1;:22:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;46022:102::o;46132:146::-;33679:5;;;;33665:10;:19;33657:79;;;;;;;10368:2:1;33657:79:0;;;10350:21:1;10407:2;10387:18;;;10380:30;10446:34;10426:18;;;10419:62;10517:17;10497:18;;;10490:45;10552:19;;33657:79:0;10166:411:1;33657:79:0;46220:16:::1;:50:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;46132:146::o;50603:232::-;45182:8;;;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;50701:44:::1;::::0;;;;50739:4:::1;50701:44;::::0;::::1;2186:74:1::0;50683:15:0::1;::::0;50701:29:::1;::::0;::::1;::::0;::::1;::::0;2159:18:1;;50701:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50683:62;;50756:71;50792:12;50807:10;50819:7;50756:27;:71::i;46335:384::-:0;45182:8;;46415:4;;45182:8;;45168:10;:22;45160:47;;;;;;;9496:2:1;45160:47:0;;;9478:21:1;9535:2;9515:18;;;9508:30;9574:14;9554:18;;;9547:42;9606:18;;45160:47:0;9294:336:1;45160:47:0;46450:39:::1;::::0;;;;46483:4:::1;46450:39;::::0;::::1;2186:74:1::0;46432:15:0::1;::::0;46450:24:::1;::::0;::::1;::::0;::::1;::::0;2159:18:1;;46450:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46432:57:::0;-1:-1:-1;46504:11:0;;46500:190:::1;;46532:37;:26;::::0;::::1;46559:6:::0;46567:1:::1;46532:26;:37::i;:::-;46584:43;:26;::::0;::::1;46611:6:::0;46619:7;46584:26:::1;:43::i;:::-;46642:36;::::0;;;;::::1;::::0;::::1;2004:25:1::0;;;46642:27:0::1;::::0;::::1;::::0;::::1;::::0;1977:18:1;;46642:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;-1:-1:-1::0;46707:4:0::1;::::0;46335:384;-1:-1:-1;;;46335:384:0:o;1961:181::-;2019:7;;2051:5;2055:1;2051;:5;:::i;:::-;2039:17;;2080:1;2075;:6;;2067:46;;;;;;;14225:2:1;2067:46:0;;;14207:21:1;14264:2;14244:18;;;14237:30;14303:29;14283:18;;;14276:57;14350:18;;2067:46:0;14023:351:1;30415:622:0;30785:10;;;30784:62;;-1:-1:-1;30801:39:0;;;;;30825:4;30801:39;;;12920:34:1;30801:15:0;12990::1;;;12970:18;;;12963:43;30801:15:0;;;;;12832:18:1;;30801:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;30784:62;30776:152;;;;;;;14581:2:1;30776:152:0;;;14563:21:1;14620:2;14600:18;;;14593:30;14659:34;14639:18;;;14632:62;14730:24;14710:18;;;14703:52;14772:19;;30776:152:0;14379:418:1;30776:152:0;30966:62;;10786:42:1;10774:55;;30966:62:0;;;10756:74:1;10846:18;;;10839:34;;;30939:90:0;;30959:5;;30989:22;;10729:18:1;;30966:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30939:19;:90::i;:::-;30415:622;;;:::o;41940:361::-;42135:45;;;42124:10;10774:55:1;;;42135:45:0;;;10756:74:1;10846:18;;;;10839:34;;;42135:45:0;;;;;;;;;;10729:18:1;;;;42135:45:0;;;;;;;;;;;;;42124:57;;-1:-1:-1;;;;42124:10:0;;;;:57;;42135:45;42124:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42088:93;;;;42200:7;:57;;;;-1:-1:-1;42212:11:0;;:16;;:44;;;42243:4;42232:24;;;;;;;;;;;;:::i;:::-;42192:101;;;;;;;15283:2:1;42192:101:0;;;15265:21:1;15322:2;15302:18;;;15295:30;15361:33;15341:18;;;15334:61;15412:18;;42192:101:0;15081:355:1;42192:101:0;42010:291;;41940:361;;;:::o;29756:177::-;29866:58;;10786:42:1;10774:55;;29866:58:0;;;10756:74:1;10846:18;;;10839:34;;;29839:86:0;;29859:5;;29889:23;;10729:18:1;;29866:58:0;10582:297:1;2417:136:0;2475:7;2502:43;2506:1;2509;2502:43;;;;;;;;;;;;;;;;;:3;:43::i;45698:164::-;45792:37;;;;;;;;2004:25:1;;;45772:7:0;;45792:28;;;;;;1977:18:1;;45792:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45847:7:0;;45698:164;-1:-1:-1;;;;;45698:164:0:o;32061:761::-;32485:23;32511:69;32539:4;32511:69;;;;;;;;;;;;;;;;;32519:5;32511:27;;;;:69;;;;;:::i;:::-;32595:17;;32485:95;;-1:-1:-1;32595:21:0;32591:224;;32737:10;32726:30;;;;;;;;;;;;:::i;:::-;32718:85;;;;;;;15643:2:1;32718:85:0;;;15625:21:1;15682:2;15662:18;;;15655:30;15721:34;15701:18;;;15694:62;15792:12;15772:18;;;15765:40;15822:19;;32718:85:0;15441:406:1;2890:192:0;2976:7;3012:12;3004:6;;;;2996:29;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3036:9:0;3048:5;3052:1;3048;:5;:::i;13038:195::-;13141:12;13173:52;13195:6;13203:4;13209:1;13212:12;13173:21;:52::i;:::-;13166:59;13038:195;-1:-1:-1;;;;13038:195:0:o;14090:530::-;14217:12;14275:5;14250:21;:30;;14242:81;;;;;;;16184:2:1;14242:81:0;;;16166:21:1;16223:2;16203:18;;;16196:30;16262:34;16242:18;;;16235:62;16333:8;16313:18;;;16306:36;16359:19;;14242:81:0;15982:402:1;14242:81:0;10487:20;;14334:60;;;;;;;16591:2:1;14334:60:0;;;16573:21:1;16630:2;16610:18;;;16603:30;16669:31;16649:18;;;16642:59;16718:18;;14334:60:0;16389:353:1;14334:60:0;14468:12;14482:23;14509:6;:11;;14529:5;14537:4;14509:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14467:75;;;;14560:52;14578:7;14587:10;14599:12;14560:17;:52::i;:::-;14553:59;14090:530;-1:-1:-1;;;;;;;14090:530:0:o;16630:742::-;16745:12;16774:7;16770:595;;;-1:-1:-1;16805:10:0;16798:17;;16770:595;16919:17;;:21;16915:439;;17182:10;17176:17;17243:15;17230:10;17226:2;17222:19;17215:44;16915:439;17325:12;17318:20;;;;;;;;;;;:::i;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;215:260;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;;431:38;465:2;454:9;450:18;431:38;:::i;:::-;421:48;;215:260;;;;;:::o;672:180::-;731:6;784:2;772:9;763:7;759:23;755:32;752:52;;;800:1;797;790:12;752:52;-1:-1:-1;823:23:1;;672:180;-1:-1:-1;672:180:1:o;857:186::-;916:6;969:2;957:9;948:7;944:23;940:32;937:52;;;985:1;982;975:12;937:52;1008:29;1027:9;1008:29;:::i;1048:258::-;1120:1;1130:113;1144:6;1141:1;1138:13;1130:113;;;1220:11;;;1214:18;1201:11;;;1194:39;1166:2;1159:10;1130:113;;;1261:6;1258:1;1255:13;1252:48;;;-1:-1:-1;;1296:1:1;1278:16;;1271:27;1048:258::o;1311:317::-;1353:3;1391:5;1385:12;1418:6;1413:3;1406:19;1434:63;1490:6;1483:4;1478:3;1474:14;1467:4;1460:5;1456:16;1434:63;:::i;:::-;1542:2;1530:15;1547:66;1526:88;1517:98;;;;1617:4;1513:109;;1311:317;-1:-1:-1;;1311:317:1:o;1633:220::-;1782:2;1771:9;1764:21;1745:4;1802:45;1843:2;1832:9;1828:18;1820:6;1802:45;:::i;2271:254::-;2339:6;2347;2400:2;2388:9;2379:7;2375:23;2371:32;2368:52;;;2416:1;2413;2406:12;2368:52;2439:29;2458:9;2439:29;:::i;:::-;2429:39;2515:2;2500:18;;;;2487:32;;-1:-1:-1;;;2271:254:1:o;2530:184::-;2582:77;2579:1;2572:88;2679:4;2676:1;2669:15;2703:4;2700:1;2693:15;2719:334;2790:2;2784:9;2846:2;2836:13;;2851:66;2832:86;2820:99;;2949:18;2934:34;;2970:22;;;2931:62;2928:88;;;2996:18;;:::i;:::-;3032:2;3025:22;2719:334;;-1:-1:-1;2719:334:1:o;3058:183::-;3118:4;3151:18;3143:6;3140:30;3137:56;;;3173:18;;:::i;:::-;-1:-1:-1;3218:1:1;3214:14;3230:4;3210:25;;3058:183::o;3246:668::-;3300:5;3353:3;3346:4;3338:6;3334:17;3330:27;3320:55;;3371:1;3368;3361:12;3320:55;3407:6;3394:20;3433:4;3457:60;3473:43;3513:2;3473:43;:::i;:::-;3457:60;:::i;:::-;3551:15;;;3637:1;3633:10;;;;3621:23;;3617:32;;;3582:12;;;;3661:15;;;3658:35;;;3689:1;3686;3679:12;3658:35;3725:2;3717:6;3713:15;3737:148;3753:6;3748:3;3745:15;3737:148;;;3819:23;3838:3;3819:23;:::i;:::-;3807:36;;3863:12;;;;3770;;3737:148;;;-1:-1:-1;3903:5:1;3246:668;-1:-1:-1;;;;;;3246:668:1:o;3919:348::-;4003:6;4056:2;4044:9;4035:7;4031:23;4027:32;4024:52;;;4072:1;4069;4062:12;4024:52;4112:9;4099:23;4145:18;4137:6;4134:30;4131:50;;;4177:1;4174;4167:12;4131:50;4200:61;4253:7;4244:6;4233:9;4229:22;4200:61;:::i;4272:662::-;4326:5;4379:3;4372:4;4364:6;4360:17;4356:27;4346:55;;4397:1;4394;4387:12;4346:55;4433:6;4420:20;4459:4;4483:60;4499:43;4539:2;4499:43;:::i;4483:60::-;4577:15;;;4663:1;4659:10;;;;4647:23;;4643:32;;;4608:12;;;;4687:15;;;4684:35;;;4715:1;4712;4705:12;4684:35;4751:2;4743:6;4739:15;4763:142;4779:6;4774:3;4771:15;4763:142;;;4845:17;;4833:30;;4883:12;;;;4796;;4763:142;;4939:595;5057:6;5065;5118:2;5106:9;5097:7;5093:23;5089:32;5086:52;;;5134:1;5131;5124:12;5086:52;5174:9;5161:23;5203:18;5244:2;5236:6;5233:14;5230:34;;;5260:1;5257;5250:12;5230:34;5283:61;5336:7;5327:6;5316:9;5312:22;5283:61;:::i;:::-;5273:71;;5397:2;5386:9;5382:18;5369:32;5353:48;;5426:2;5416:8;5413:16;5410:36;;;5442:1;5439;5432:12;5410:36;;5465:63;5520:7;5509:8;5498:9;5494:24;5465:63;:::i;:::-;5455:73;;;4939:595;;;;;:::o;5539:632::-;5710:2;5762:21;;;5832:13;;5735:18;;;5854:22;;;5681:4;;5710:2;5933:15;;;;5907:2;5892:18;;;5681:4;5976:169;5990:6;5987:1;5984:13;5976:169;;;6051:13;;6039:26;;6120:15;;;;6085:12;;;;6012:1;6005:9;5976:169;;;-1:-1:-1;6162:3:1;;5539:632;-1:-1:-1;;;;;;5539:632:1:o;6176:248::-;6244:6;6252;6305:2;6293:9;6284:7;6280:23;6276:32;6273:52;;;6321:1;6318;6311:12;6273:52;-1:-1:-1;;6344:23:1;;;6414:2;6399:18;;;6386:32;;-1:-1:-1;6176:248:1:o;6429:733::-;6517:6;6525;6533;6541;6594:2;6582:9;6573:7;6569:23;6565:32;6562:52;;;6610:1;6607;6600:12;6562:52;6633:29;6652:9;6633:29;:::i;:::-;6623:39;;6709:2;6698:9;6694:18;6681:32;6671:42;;6764:2;6753:9;6749:18;6736:32;6787:18;6828:2;6820:6;6817:14;6814:34;;;6844:1;6841;6834:12;6814:34;6882:6;6871:9;6867:22;6857:32;;6927:7;6920:4;6916:2;6912:13;6908:27;6898:55;;6949:1;6946;6939:12;6898:55;6989:2;6976:16;7015:2;7007:6;7004:14;7001:34;;;7031:1;7028;7021:12;7001:34;7076:7;7071:2;7062:6;7058:2;7054:15;7050:24;7047:37;7044:57;;;7097:1;7094;7087:12;7044:57;6429:733;;;;-1:-1:-1;;7128:2:1;7120:11;;-1:-1:-1;;;6429:733:1:o;7167:299::-;7350:6;7343:14;7336:22;7325:9;7318:41;7395:2;7390;7379:9;7375:18;7368:30;7299:4;7415:45;7456:2;7445:9;7441:18;7433:6;7415:45;:::i;7471:328::-;7548:6;7556;7564;7617:2;7605:9;7596:7;7592:23;7588:32;7585:52;;;7633:1;7630;7623:12;7585:52;7656:29;7675:9;7656:29;:::i;:::-;7646:39;;7704:38;7738:2;7727:9;7723:18;7704:38;:::i;:::-;7694:48;;7789:2;7778:9;7774:18;7761:32;7751:42;;7471:328;;;;;:::o;7804:118::-;7890:5;7883:13;7876:21;7869:5;7866:32;7856:60;;7912:1;7909;7902:12;7856:60;7804:118;:::o;7927:724::-;8051:6;8059;8067;8120:2;8108:9;8099:7;8095:23;8091:32;8088:52;;;8136:1;8133;8126:12;8088:52;8176:9;8163:23;8205:18;8246:2;8238:6;8235:14;8232:34;;;8262:1;8259;8252:12;8232:34;8285:61;8338:7;8329:6;8318:9;8314:22;8285:61;:::i;:::-;8275:71;;8399:2;8388:9;8384:18;8371:32;8355:48;;8428:2;8418:8;8415:16;8412:36;;;8444:1;8441;8434:12;8412:36;;8467:63;8522:7;8511:8;8500:9;8496:24;8467:63;:::i;:::-;8457:73;;;8580:2;8569:9;8565:18;8552:32;8593:28;8615:5;8593:28;:::i;:::-;8640:5;8630:15;;;7927:724;;;;;:::o;8656:383::-;8730:6;8738;8746;8799:2;8787:9;8778:7;8774:23;8770:32;8767:52;;;8815:1;8812;8805:12;8767:52;8851:9;8838:23;8828:33;;8880:38;8914:2;8903:9;8899:18;8880:38;:::i;:::-;8870:48;;8968:2;8957:9;8953:18;8940:32;8981:28;9003:5;8981:28;:::i;9635:184::-;9705:6;9758:2;9746:9;9737:7;9733:23;9729:32;9726:52;;;9774:1;9771;9764:12;9726:52;-1:-1:-1;9797:16:1;;9635:184;-1:-1:-1;9635:184:1:o;10884:546::-;11066:3;11051:19;;11055:9;11147:6;11024:4;11181:243;11195:4;11192:1;11189:11;11181:243;;;11258:13;;11273:42;11254:62;11242:75;;11340:4;11364:12;;;;11399:15;;;;11215:1;11208:9;11181:243;;;11185:3;;;10884:546;;;;:::o;11435:245::-;11502:6;11555:2;11543:9;11534:7;11530:23;11526:32;11523:52;;;11571:1;11568;11561:12;11523:52;11603:9;11597:16;11622:28;11644:5;11622:28;:::i;11685:184::-;11737:77;11734:1;11727:88;11834:4;11831:1;11824:15;11858:4;11855:1;11848:15;11874:184;11926:77;11923:1;11916:88;12023:4;12020:1;12013:15;12047:4;12044:1;12037:15;12063:195;12102:3;12133:66;12126:5;12123:77;12120:103;;12203:18;;:::i;:::-;-1:-1:-1;12250:1:1;12239:13;;12063:195::o;13270:271::-;13453:6;13445;13440:3;13427:33;13409:3;13479:16;;13504:13;;;13479:16;13270:271;-1:-1:-1;13270:271:1:o;13890:128::-;13930:3;13961:1;13957:6;13954:1;13951:13;13948:39;;;13967:18;;:::i;:::-;-1:-1:-1;14003:9:1;;13890:128::o;14802:274::-;14931:3;14969:6;14963:13;14985:53;15031:6;15026:3;15019:4;15011:6;15007:17;14985:53;:::i;:::-;15054:16;;;;;14802:274;-1:-1:-1;;14802:274:1:o;15852:125::-;15892:4;15920:1;15917;15914:8;15911:34;;;15925:18;;:::i;:::-;-1:-1:-1;15962:9:1;;15852:125::o
Swarm Source
ipfs://fc6b36cfc0615049777bee4222135d9c24443d6be83892ddf856f05e9a75be2b
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.