More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,797 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Get Reward | 20522800 | 20 days ago | IN | 0 ETH | 0.00091929 | ||||
Get Reward | 20508231 | 22 days ago | IN | 0 ETH | 0.00260938 | ||||
Get Reward | 20429534 | 33 days ago | IN | 0 ETH | 0.00568515 | ||||
Get Reward | 20311681 | 49 days ago | IN | 0 ETH | 0.00397911 | ||||
Get Reward | 20193620 | 66 days ago | IN | 0 ETH | 0.00612371 | ||||
Withdraw | 19699684 | 135 days ago | IN | 0 ETH | 0.00368732 | ||||
Get Reward | 19660710 | 140 days ago | IN | 0 ETH | 0.01262155 | ||||
Get Reward | 19095083 | 219 days ago | IN | 0 ETH | 0.01927006 | ||||
Withdraw Expired... | 18932692 | 242 days ago | IN | 0 ETH | 0.01133285 | ||||
Get Reward | 18912958 | 245 days ago | IN | 0 ETH | 0.01141538 | ||||
Get Reward | 18912952 | 245 days ago | IN | 0 ETH | 0.00625743 | ||||
Withdraw Expired... | 18736790 | 270 days ago | IN | 0 ETH | 0.02054286 | ||||
Get Reward | 18736786 | 270 days ago | IN | 0 ETH | 0.03246338 | ||||
Get Reward | 18736786 | 270 days ago | IN | 0 ETH | 0.04355038 | ||||
Get Reward | 18382347 | 319 days ago | IN | 0 ETH | 0.00375214 | ||||
Get Reward | 18319911 | 328 days ago | IN | 0 ETH | 0.00528233 | ||||
Get Reward | 18319910 | 328 days ago | IN | 0 ETH | 0.00474675 | ||||
Get Reward | 18319908 | 328 days ago | IN | 0 ETH | 0.0056413 | ||||
Get Reward | 18319892 | 328 days ago | IN | 0 ETH | 0.00312447 | ||||
Get Reward | 18284251 | 333 days ago | IN | 0 ETH | 0.01352571 | ||||
Get Reward | 18244750 | 339 days ago | IN | 0 ETH | 0.02164493 | ||||
Get Reward | 18224255 | 341 days ago | IN | 0 ETH | 0.00380335 | ||||
Get Reward | 18224255 | 341 days ago | IN | 0 ETH | 0.00405159 | ||||
Get Reward | 18216668 | 343 days ago | IN | 0 ETH | 0.0022685 | ||||
Get Reward | 18216654 | 343 days ago | IN | 0 ETH | 0.00242307 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MultiFeeDistribution
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-19 */ // Sources flattened with hardhat v2.10.1 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @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 a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/interfaces/IStakingRewards.sol pragma solidity ^0.8.0; interface IStakingRewards { function lock(address who, uint _amount) external; function withdraw(address who, uint _amount) external; } // File contracts/interfaces/IMultiFeeDistribution.sol pragma solidity ^0.8.0; interface IMultiFeeDistribution { function mint(address user, uint256 amount) external; } // File contracts/interfaces/IChefIncentivesController.sol pragma solidity ^0.8.0; interface IChefIncentivesController { function handleAction(address user, uint256 userBalance, uint256 totalSupply) external; function addPool(address _token, uint256 _allocPoint) external; function claim(address _user, address[] calldata _tokens) external; function setClaimReceiver(address _user, address _receiver) external; } // File contracts/MultiFeeDistribution.sol pragma solidity ^0.8.0; contract MultiFeeDistribution is IMultiFeeDistribution, Ownable { using SafeMath for uint; using SafeERC20 for IERC20; event Locked(address indexed user, uint amount); event WithdrawnExpiredLocks(address indexed user, uint amount); event Minted(address indexed user, uint amount); event ExitedEarly(address indexed user, uint amount, uint penaltyAmount); event Withdrawn(address indexed user, uint amount); event RewardPaid(address indexed user, address indexed rewardsToken, uint reward); struct Reward { uint periodFinish; uint rewardRate; uint lastUpdateTime; uint rewardPerTokenStored; uint balance; } struct Balances { uint locked; // balance lock tokens uint earned; // balance reward tokens earned } struct LockedBalance { uint amount; uint unlockTime; } struct RewardData { address token; uint amount; } uint public constant rewardsDuration = 86400 * 7; // reward interval 7 days; uint public constant rewardLookback = 86400; uint public constant lockDuration = rewardsDuration * 8; // 56 days uint public constant vestingDuration = rewardsDuration * 4; // 28 days // Addresses approved to call mint mapping(address => bool) public minters; bool public mintersAreSet; // user -> reward token -> amount mapping(address => mapping(address => uint)) public userRewardPerTokenPaid; mapping(address => mapping(address => uint)) public rewards; IChefIncentivesController public incentivesController; IERC20 public immutable stakingToken; IERC20 public immutable rewardToken; address public immutable rewardTokenVault; address public teamRewardVault; uint public teamRewardFee = 2000; // 1% = 100 IStakingRewards public stakingRewards; bool public stakingRewardsAreSet; address[] public rewardTokens; mapping(address => Reward) public rewardData; uint public lockedSupply; // Private mappings for balance data mapping(address => Balances) private balances; mapping(address => LockedBalance[]) private userLocks; // stake UwU-ETH LP tokens mapping(address => LockedBalance[]) private userEarnings; // vesting UwU tokens mapping(address => address) public exitDelegatee; constructor(address _stakingToken, address _rewardToken, address _rewardTokenVault) Ownable() { stakingToken = IERC20(_stakingToken); rewardToken = IERC20(_rewardToken); rewardTokenVault = _rewardTokenVault; rewardTokens.push(_rewardToken); rewardData[_rewardToken].lastUpdateTime = block.timestamp; } function setTeamRewardVault(address vault) external onlyOwner { require(vault != address(0), "address zero"); teamRewardVault = vault; } function setTeamRewardFee(uint fee) external onlyOwner { require(fee <= 10000, "fee too high"); teamRewardFee = fee; } function setStakingRewards(address _stakingRewards) external onlyOwner { require(!stakingRewardsAreSet, 'stakingRewards already set'); stakingRewards = IStakingRewards(_stakingRewards); stakingRewardsAreSet = true; } function setMinters(address[] memory _minters) external onlyOwner { require(!mintersAreSet, 'minter already set'); for (uint i; i < _minters.length; i++) { minters[_minters[i]] = true; } mintersAreSet = true; } function setIncentivesController(IChefIncentivesController _controller) external onlyOwner { incentivesController = _controller; } // Add a new reward token to be distributed to stakers function addReward(address _rewardsToken) external onlyOwner { require(rewardData[_rewardsToken].lastUpdateTime == 0); rewardTokens.push(_rewardsToken); rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardData[_rewardsToken].periodFinish = block.timestamp; } // Information on a user's locked balances function lockedBalances(address user) view external returns ( uint total, uint unlockable, uint locked, LockedBalance[] memory lockData ) { LockedBalance[] storage locks = userLocks[user]; uint idx; for (uint i = 0; i < locks.length; i++) { if (locks[i].unlockTime > block.timestamp) { if (idx == 0) { lockData = new LockedBalance[](locks.length - i); } lockData[idx] = locks[i]; idx++; locked = locked.add(locks[i].amount); } else { unlockable = unlockable.add(locks[i].amount); } } return (balances[user].locked, unlockable, locked, lockData); } // Information on the "earned" balances of a user function earnedBalances(address user) view external returns (uint total, LockedBalance[] memory earningsData) { LockedBalance[] storage earnings = userEarnings[user]; uint idx; for (uint i = 0; i < earnings.length; i++) { if (earnings[i].unlockTime > block.timestamp) { if (idx == 0) { earningsData = new LockedBalance[](earnings.length - i); } earningsData[idx] = earnings[i]; idx++; total = total.add(earnings[i].amount); } } return (total, earningsData); } function withdrawableBalance(address user) view public returns ( uint amount, uint penaltyAmount, uint amountWithoutPenalty ) { Balances storage bal = balances[user]; uint earned = bal.earned; if (earned > 0) { uint length = userEarnings[user].length; for (uint i = 0; i < length; i++) { uint earnedAmount = userEarnings[user][i].amount; if (earnedAmount == 0) continue; if (userEarnings[user][i].unlockTime > block.timestamp) { break; } amountWithoutPenalty = amountWithoutPenalty.add(earnedAmount); } penaltyAmount = earned.sub(amountWithoutPenalty).div(2); } amount = earned.sub(penaltyAmount); // return (amount, penaltyAmount); } // Address and claimable amount of all reward tokens for the given account function claimableRewards(address account) external view returns (RewardData[] memory rewards) { rewards = new RewardData[](rewardTokens.length); for (uint i = 0; i < rewards.length; i++) { rewards[i].token = rewardTokens[i]; rewards[i].amount = _earned(account, rewards[i].token, balances[account].locked, _rewardPerToken(rewardTokens[i], lockedSupply)).div(1e12); } return rewards; } // Lock tokens to receive rewards // Locked tokens cannot be withdrawn for lockDuration and are eligible to receive stakingReward rewards function lock(uint amount, address onBehalfOf) external { require(amount > 0, "amount = 0"); _updateReward(onBehalfOf); Balances storage bal = balances[onBehalfOf]; lockedSupply = lockedSupply.add(amount); bal.locked = bal.locked.add(amount); uint unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(lockDuration); uint idx = userLocks[onBehalfOf].length; if (idx == 0 || userLocks[onBehalfOf][idx-1].unlockTime < unlockTime) { userLocks[onBehalfOf].push(LockedBalance({amount: amount, unlockTime: unlockTime})); } else { userLocks[onBehalfOf][idx-1].amount = userLocks[onBehalfOf][idx-1].amount.add(amount); } stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Locked(onBehalfOf, amount); if (address(stakingRewards) != address(0)) { stakingRewards.lock(onBehalfOf, amount); } } // Withdraw all currently locked tokens where the unlock time has passed function withdrawExpiredLocks() external { _updateReward(msg.sender); LockedBalance[] storage locks = userLocks[msg.sender]; Balances storage bal = balances[msg.sender]; uint amount; uint length = locks.length; if (locks[length-1].unlockTime <= block.timestamp) { amount = bal.locked; delete userLocks[msg.sender]; } else { for (uint i = 0; i < length; i++) { if (locks[i].unlockTime > block.timestamp) break; amount = amount.add(locks[i].amount); delete locks[i]; } } require(amount > 0, 'amount = 0'); bal.locked = bal.locked.sub(amount); lockedSupply = lockedSupply.sub(amount); stakingToken.safeTransfer(msg.sender, amount); emit WithdrawnExpiredLocks(msg.sender, amount); if (address(stakingRewards) != address(0)) { stakingRewards.withdraw(msg.sender, amount); } } function mint(address user, uint amount) external { require(minters[msg.sender], '!minter'); if (amount == 0) return; _updateReward(user); rewardToken.safeTransferFrom(rewardTokenVault, address(this), amount); if (user == address(this)) { // minting to this contract adds the new tokens as incentives for lockers _notifyReward(address(rewardToken), amount); return; } Balances storage bal = balances[user]; bal.earned = bal.earned.add(amount); uint unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(vestingDuration); LockedBalance[] storage earnings = userEarnings[user]; uint idx = earnings.length; if (idx == 0 || earnings[idx-1].unlockTime < unlockTime) { earnings.push(LockedBalance({amount: amount, unlockTime: unlockTime})); } else { earnings[idx-1].amount = earnings[idx-1].amount.add(amount); } emit Minted(user, amount); } // Delegate exit function delegateExit(address delegatee) external { exitDelegatee[msg.sender] = delegatee; } // Withdraw full unlocked balance and optionally claim pending rewards function exitEarly(address onBehalfOf) external { require(onBehalfOf == msg.sender || exitDelegatee[onBehalfOf] == msg.sender); _updateReward(onBehalfOf); (uint amount, uint penaltyAmount,) = withdrawableBalance(onBehalfOf); delete userEarnings[onBehalfOf]; Balances storage bal = balances[onBehalfOf]; bal.earned = 0; rewardToken.safeTransfer(onBehalfOf, amount); if (penaltyAmount > 0) { incentivesController.claim(address(this), new address[](0)); _notifyReward(address(rewardToken), penaltyAmount); } emit ExitedEarly(onBehalfOf, amount, penaltyAmount); } // Withdraw staked tokens function withdraw() public { _updateReward(msg.sender); Balances storage bal = balances[msg.sender]; uint earned = bal.earned; uint amount; if (earned > 0) { uint length = userEarnings[msg.sender].length; for (uint i = 0; i < length; i++) { uint earnedAmount = userEarnings[msg.sender][i].amount; if (earnedAmount == 0) continue; if (userEarnings[msg.sender][i].unlockTime > block.timestamp) { break; } amount = amount.add(earnedAmount); delete userEarnings[msg.sender][i]; } if (userEarnings[msg.sender].length == 0) { delete userEarnings[msg.sender]; } } if (amount > 0) { rewardToken.safeTransfer(msg.sender, amount); emit Withdrawn(msg.sender, amount); } } // Transfer rewards to wallet function getReward(address[] memory _rewardTokens) public { _updateReward(msg.sender); _getReward(_rewardTokens); } function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint) { uint periodFinish = rewardData[_rewardsToken].periodFinish; return block.timestamp < periodFinish ? block.timestamp : periodFinish; } function _getReward(address[] memory _rewardTokens) internal { uint length = _rewardTokens.length; for (uint i; i < length; i++) { address token = _rewardTokens[i]; uint reward = rewards[msg.sender][token].div(1e12); if (token != address(rewardToken)) { // for rewards other than rewardToken, every 24 hours we check if new // rewards were sent to the contract or accrued via uToken interest Reward storage r = rewardData[token]; uint periodFinish = r.periodFinish; require(periodFinish > 0, "Unknown reward token"); uint balance = r.balance; if (periodFinish < block.timestamp.add(rewardsDuration - rewardLookback)) { uint unseen = IERC20(token).balanceOf(address(this)).sub(balance); if (unseen > 0) { _notifyReward(token, unseen); balance = balance.add(unseen); } } r.balance = balance.sub(reward); } if (reward == 0) continue; rewards[msg.sender][token] = 0; IERC20(token).safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, token, reward); } } function _rewardPerToken(address _rewardsToken, uint _supply) internal view returns (uint) { if (_supply == 0) { return rewardData[_rewardsToken].rewardPerTokenStored; } return rewardData[_rewardsToken].rewardPerTokenStored.add( lastTimeRewardApplicable(_rewardsToken) .sub(rewardData[_rewardsToken].lastUpdateTime) .mul(rewardData[_rewardsToken].rewardRate) .mul(1e18).div(_supply) ); } function _earned( address _user, address _rewardsToken, uint _balance, uint _currentRewardPerToken ) internal view returns (uint) { return _balance.mul( _currentRewardPerToken.sub(userRewardPerTokenPaid[_user][_rewardsToken]) ).div(1e18).add(rewards[_user][_rewardsToken]); } function _notifyReward(address _rewardsToken, uint _reward) internal { uint reward = _adjustReward(_rewardsToken, _reward); Reward storage r = rewardData[_rewardsToken]; if (block.timestamp >= r.periodFinish) { r.rewardRate = reward.mul(1e12).div(rewardsDuration); } else { uint remaining = r.periodFinish.sub(block.timestamp); uint leftover = remaining.mul(r.rewardRate).div(1e12); r.rewardRate = reward.add(leftover).mul(1e12).div(rewardsDuration); } r.lastUpdateTime = block.timestamp; r.periodFinish = block.timestamp.add(rewardsDuration); } function _updateReward(address account) internal { uint length = rewardTokens.length; for (uint i = 0; i < length; i++) { address token = rewardTokens[i]; Reward storage r = rewardData[token]; uint rpt = _rewardPerToken(token, lockedSupply); r.rewardPerTokenStored = rpt; r.lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(this)) { rewards[account][token] = _earned(account, token, balances[account].locked, rpt); userRewardPerTokenPaid[account][token] = rpt; } } } function _adjustReward(address _rewardsToken, uint reward) internal returns (uint adjustedAmount) { if (reward > 0 && teamRewardVault != address(0) && _rewardsToken != address(rewardToken)) { uint fee = reward.div(10000).mul(teamRewardFee); adjustedAmount = reward.sub(fee); IERC20(_rewardsToken).safeTransfer(teamRewardVault, fee); } else { adjustedAmount = reward; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_rewardTokenVault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"name":"ExitedEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawnExpiredLocks","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimableRewards","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiFeeDistribution.RewardData[]","name":"rewards","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegateExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"earnedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct MultiFeeDistribution.LockedBalance[]","name":"earningsData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exitDelegatee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"exitEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardTokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"incentivesController","outputs":[{"internalType":"contract IChefIncentivesController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lockedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"unlockable","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct MultiFeeDistribution.LockedBalance[]","name":"lockData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintersAreSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardLookback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChefIncentivesController","name":"_controller","type":"address"}],"name":"setIncentivesController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_minters","type":"address[]"}],"name":"setMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingRewards","type":"address"}],"name":"setStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTeamRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"setTeamRewardVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewards","outputs":[{"internalType":"contract IStakingRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingRewardsAreSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamRewardVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawExpiredLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"withdrawableBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"},{"internalType":"uint256","name":"amountWithoutPenalty","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040526107d06007553480156200001757600080fd5b5060405162002c2438038062002c248339810160408190526200003a9162000125565b6200004533620000b8565b6001600160a01b0392831660805290821660a0819052911660c05260098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916821790556000908152600a60205260409020426002909101556200016f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200012057600080fd5b919050565b6000806000606084860312156200013b57600080fd5b620001468462000108565b9250620001566020850162000108565b9150620001666040850162000108565b90509250925092565b60805160a05160c051612a3f620001e5600039600081816103230152610c4d01526000818161066e01528181610b6101528181610c2b01528181610c89015281816119e901528181611aa801528181611f5b015261235f0152600081816104880152818161111d01526115710152612a3f6000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80637bb7bed111610146578063af1df255116100c3578063e33b724211610087578063e33b7242146105e2578063e655dbd8146105f5578063e70b9e2714610608578063f2fde38b14610633578063f46eccc414610646578063f7c618c11461066957600080fd5b8063af1df25514610572578063ca5c7b9114610585578063d300b3321461058e578063dc01f60d146105a1578063df379876146105c157600080fd5b80638fd9f2ca1161010a5780638fd9f2ca1461052e578063904fdee01461053b5780639c9b2e211461054e578063a01c77bc14610561578063a1d61aa31461056957600080fd5b80637bb7bed1146104aa5780637fd7d062146104bd578063811d38d1146104d05780638bf39416146104f45780638da5cb5b1461051d57600080fd5b806340c10f19116101d457806366dfbfb41161019857806366dfbfb41461042a5780636fb83a571461043d5780637035ab9814610450578063715018a61461047b57806372f702f31461048357600080fd5b806340c10f191461037957806348e5d9f81461038c578063547d0096146103f1578063638634ee1461040457806364b87a701461041757600080fd5b80631514617e1161021b5780631514617e14610316578063296c0f721461031e578063386a95251461035d5780633b1837d9146103675780633ccfd60b1461037157600080fd5b806302b62938146102585780630408ae221461028b57806304554443146102ca5780630483a7f6146102e05780630ee2248f14610303575b600080fd5b61026b6102663660046125bf565b610690565b604080519384526020840192909252908201526060015b60405180910390f35b6102c86102993660046125bf565b336000908152600f6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b005b6102d26107c1565b604051908152602001610282565b6102f36102ee3660046125bf565b6107d2565b6040516102829493929190612622565b6102c8610311366004612651565b6109a0565b6102d26109f3565b6103457f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610282565b6102d262093a8081565b6102d26201518081565b6102c8610a01565b6102c861038736600461266a565b610bc3565b6103c961039a3660046125bf565b600a60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610282565b6102c86103ff3660046126ac565b610e57565b6102d26104123660046125bf565b610f1f565b600854610345906001600160a01b031681565b6102c8610438366004612771565b610f4e565b6102c861044b3660046125bf565b611207565b6102d261045e3660046127a1565b600360209081526000928352604080842090915290825290205481565b6102c8611290565b6103457f000000000000000000000000000000000000000000000000000000000000000081565b6103456104b8366004612651565b6112a4565b6102c86104cb3660046126ac565b6112ce565b6008546104e490600160a01b900460ff1681565b6040519015158152602001610282565b6103456105023660046125bf565b600f602052600090815260409020546001600160a01b031681565b6000546001600160a01b0316610345565b6002546104e49060ff1681565b6102c86105493660046125bf565b6112e3565b6102c861055c3660046125bf565b611352565b6102c86113e4565b6102d260075481565b600554610345906001600160a01b031681565b6102d2600b5481565b600654610345906001600160a01b031681565b6105b46105af3660046125bf565b611649565b60405161028291906127cf565b6105d46105cf3660046125bf565b6117e9565b604051610282929190612827565b6102c86105f03660046125bf565b61194a565b6102c86106033660046125bf565b611b17565b6102d26106163660046127a1565b600460209081526000928352604080842090915290825290205481565b6102c86106413660046125bf565b611b41565b6104e46106543660046125bf565b60016020526000908152604090205460ff1681565b6103457f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0381166000908152600c6020526040812060018101548291829180156107ac576001600160a01b0386166000908152600e6020526040812054905b81811015610792576001600160a01b0388166000908152600e6020526040812080548390811061070457610704612840565b906000526020600020906002020160000154905080600014156107275750610780565b6001600160a01b0389166000908152600e6020526040902080544291908490811061075457610754612840565b90600052602060002090600202016001015411156107725750610792565b61077c8682611bb7565b9550505b8061078a8161286c565b9150506106d2565b506107a860026107a28487611bcc565b90611bd8565b9450505b6107b68185611bcc565b945050509193909250565b6107cf62093a806008612887565b81565b6001600160a01b0381166000908152600d602052604081208190819060609082805b825481101561097b574283828154811061081057610810612840565b9060005260206000209060020201600101541115610939578161089b57825461083a9082906128a6565b67ffffffffffffffff81111561085257610852612696565b60405190808252806020026020018201604052801561089757816020015b60408051808201909152600080825260208201528152602001906001900390816108705790505b5093505b8281815481106108ad576108ad612840565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508483815181106108ec576108ec612840565b602002602001018190525081806109029061286c565b92505061093283828154811061091a5761091a612840565b60009182526020909120600290910201548690611bb7565b9450610969565b61096683828154811061094e5761094e612840565b60009182526020909120600290910201548790611bb7565b95505b806109738161286c565b9150506107f4565b5050506001600160a01b0385166000908152600c602052604090205493509193509193565b6109a8611be4565b6127108111156109ee5760405162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b60448201526064015b60405180910390fd5b600755565b6107cf62093a806004612887565b610a0a33611c3e565b336000908152600c60205260408120600181015490918115610b4e57336000908152600e6020526040812054905b81811015610b1f57336000908152600e60205260408120805483908110610a6157610a61612840565b90600052602060002090600202016000015490508060001415610a845750610b0d565b336000908152600e60205260409020805442919084908110610aa857610aa8612840565b9060005260206000209060020201600101541115610ac65750610b1f565b610ad08482611bb7565b336000908152600e6020526040902080549195509083908110610af557610af5612840565b60009182526020822060029091020181815560010155505b80610b178161286c565b915050610a38565b50336000908152600e6020526040902054610b4c57336000908152600e60205260408120610b4c9161255f565b505b8015610bbe57610b886001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611d3c565b60405181815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a25b505050565b3360009081526001602052604090205460ff16610c0c5760405162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b60448201526064016109e5565b80610c15575050565b610c1e82611c3e565b610c736001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000003084611d9f565b6001600160a01b038216301415610cb257610cae7f000000000000000000000000000000000000000000000000000000000000000082611dd7565b5050565b6001600160a01b0382166000908152600c602052604090206001810154610cd99083611bb7565b60018201556000610d0e610cf162093a806004612887565b610d0862093a80610d024282611bd8565b90611e9a565b90611bb7565b6001600160a01b0385166000908152600e60205260409020805491925090801580610d6557508282610d416001846128a6565b81548110610d5157610d51612840565b906000526020600020906002020160010154105b15610da7576040805180820190915285815260208082018581528454600181810187556000878152939093209351600290910290930192835551910155610e0c565b610dde8583610db76001856128a6565b81548110610dc757610dc7612840565b600091825260209091206002909102015490611bb7565b82610dea6001846128a6565b81548110610dfa57610dfa612840565b60009182526020909120600290910201555b856001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe86604051610e4791815260200190565b60405180910390a2505050505050565b610e5f611be4565b60025460ff1615610ea75760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d195c88185b1c9958591e481cd95d60721b60448201526064016109e5565b60005b8151811015610f0e576001806000848481518110610eca57610eca612840565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f068161286c565b915050610eaa565b50506002805460ff19166001179055565b6001600160a01b0381166000908152600a6020526040812054428111610f455780610f47565b425b9392505050565b60008211610f8b5760405162461bcd60e51b815260206004820152600a6024820152690616d6f756e74203d20360b41b60448201526064016109e5565b610f9481611c3e565b6001600160a01b0381166000908152600c60205260409020600b54610fb99084611bb7565b600b558054610fc89084611bb7565b81556000610fdd610cf162093a806008612887565b6001600160a01b0384166000908152600d602052604090205490915080158061104a57506001600160a01b0384166000908152600d6020526040902082906110266001846128a6565b8154811061103657611036612840565b906000526020600020906002020160010154105b156110a2576001600160a01b0384166000908152600d60209081526040808320815180830190925288825281830186815281546001818101845592865293909420915160029093029091019182559151910155611110565b6001600160a01b0384166000908152600d602052604090206110cb908690610db76001856128a6565b6001600160a01b0385166000908152600d602052604090206110ee6001846128a6565b815481106110fe576110fe612840565b60009182526020909120600290910201555b6111456001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088611d9f565b836001600160a01b03167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600088660405161118091815260200190565b60405180910390a26008546001600160a01b0316156112005760085460405163282d3fdf60e01b81526001600160a01b038681166004830152602482018890529091169063282d3fdf90604401600060405180830381600087803b1580156111e757600080fd5b505af11580156111fb573d6000803e3d6000fd5b505050505b5050505050565b61120f611be4565b600854600160a01b900460ff16156112695760405162461bcd60e51b815260206004820152601a60248201527f7374616b696e675265776172647320616c72656164792073657400000000000060448201526064016109e5565b600880546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611298611be4565b6112a26000611ea6565b565b600981815481106112b457600080fd5b6000918252602090912001546001600160a01b0316905081565b6112d733611c3e565b6112e081611ef6565b50565b6112eb611be4565b6001600160a01b0381166113305760405162461bcd60e51b815260206004820152600c60248201526b61646472657373207a65726f60a01b60448201526064016109e5565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61135a611be4565b6001600160a01b0381166000908152600a60205260409020600201541561138057600080fd5b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b039092166001600160a01b0319909216821790556000908152600a6020526040902042600282018190559055565b6113ed33611c3e565b336000908152600d60209081526040808320600c909252822081549192909142846114196001846128a6565b8154811061142957611429612840565b90600052602060002090600202016001015411611463578254336000908152600d6020526040812091935061145e919061255f565b611509565b60005b81811015611507574285828154811061148157611481612840565b906000526020600020906002020160010154111561149e57611507565b6114cb8582815481106114b3576114b3612840565b60009182526020909120600290910201548490611bb7565b92508481815481106114df576114df612840565b60009182526020822060029091020181815560010155806114ff8161286c565b915050611466565b505b600082116115465760405162461bcd60e51b815260206004820152600a6024820152690616d6f756e74203d20360b41b60448201526064016109e5565b82546115529083611bcc565b8355600b546115619083611bcc565b600b556115986001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163384611d3c565b60405182815233907f401321eacd32d0779a1de4ef7e54230af5e1a657bb38a39afb7f3916aecc357a9060200160405180910390a26008546001600160a01b0316156116435760085460405163f3fef3a360e01b8152336004820152602481018490526001600160a01b039091169063f3fef3a390604401600060405180830381600087803b15801561162a57600080fd5b505af115801561163e573d6000803e3d6000fd5b505050505b50505050565b60095460609067ffffffffffffffff81111561166757611667612696565b6040519080825280602002602001820160405280156116ac57816020015b60408051808201909152600080825260208201528152602001906001900390816116855790505b50905060005b81518110156117e357600981815481106116ce576116ce612840565b9060005260206000200160009054906101000a90046001600160a01b03168282815181106116fe576116fe612840565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506117b164e8d4a510006107a28585858151811061174157611741612840565b602002602001015160000151600c6000896001600160a01b03166001600160a01b03168152602001908152602001600020600001546117ac6009888154811061178c5761178c612840565b600091825260209091200154600b546001600160a01b0390911690612165565b6121fa565b8282815181106117c3576117c3612840565b6020908102919091018101510152806117db8161286c565b9150506116b2565b50919050565b6001600160a01b0381166000908152600e6020526040812060609082805b8254811015611942574283828154811061182357611823612840565b906000526020600020906002020160010154111561193057816118ae57825461184d9082906128a6565b67ffffffffffffffff81111561186557611865612696565b6040519080825280602002602001820160405280156118aa57816020015b60408051808201909152600080825260208201528152602001906001900390816118835790505b5093505b8281815481106118c0576118c0612840565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508483815181106118ff576118ff612840565b602002602001018190525081806119159061286c565b92505061192d83828154811061091a5761091a612840565b94505b8061193a8161286c565b915050611807565b505050915091565b6001600160a01b03811633148061197a57506001600160a01b038181166000908152600f60205260409020541633145b61198357600080fd5b61198c81611c3e565b60008061199883610690565b506001600160a01b0385166000908152600e602052604081209294509092506119c1919061255f565b6001600160a01b038084166000908152600c60205260408120600181019190915590611a10907f0000000000000000000000000000000000000000000000000000000000000000168585611d3c565b8115611acd576005546001600160a01b0316638e2eba09306000604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401611a719291906128bd565b600060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b50505050611acd7f000000000000000000000000000000000000000000000000000000000000000083611dd7565b60408051848152602081018490526001600160a01b038616917fb9d085d37935f9d1625432939418832c1862e03b445447a6c4bcbb4e40de2d55910160405180910390a250505050565b611b1f611be4565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611b49611be4565b6001600160a01b038116611bae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e5565b6112e081611ea6565b6000611bc38284612919565b90505b92915050565b6000611bc382846128a6565b6000611bc38284612931565b6000546001600160a01b031633146112a25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e5565b60095460005b81811015610bbe57600060098281548110611c6157611c61612840565b60009182526020808320909101546001600160a01b0316808352600a90915260408220600b549193509190611c97908490612165565b600383018190559050611ca983610f1f565b60028301556001600160a01b0386163014611d26576001600160a01b0386166000908152600c6020526040902054611ce59087908590846121fa565b6001600160a01b0380881660008181526004602090815260408083209489168084529482528083209590955591815260038252838120928152919052208190555b5050508080611d349061286c565b915050611c44565b6040516001600160a01b038316602482015260448101829052610bbe90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612269565b6040516001600160a01b03808516602483015283166044820152606481018290526116439085906323b872dd60e01b90608401611d68565b6000611de3838361233b565b6001600160a01b0384166000908152600a602052604090208054919250904210611e2757611e1d62093a806107a28464e8d4a51000611e9a565b6001820155611e7e565b8054600090611e369042611bcc565b90506000611e5a64e8d4a510006107a2856001015485611e9a90919063ffffffff16565b9050611e7662093a806107a264e8d4a51000610d028886611bb7565b600184015550505b4260028201819055611e939062093a80611bb7565b9055505050565b6000611bc38284612887565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805160005b81811015610bbe576000838281518110611f1757611f17612840565b6020908102919091018101513360009081526004835260408082206001600160a01b038416835290935291822054909250611f579064e8d4a51000611bd8565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316146120d3576001600160a01b0382166000908152600a60205260409020805480611ff05760405162461bcd60e51b81526020600482015260146024820152732ab735b737bbb7103932bbb0b932103a37b5b2b760611b60448201526064016109e5565b600482015461200f6120086201518062093a806128a6565b4290611bb7565b8210156120bd576040516370a0823160e01b815230600482015260009061209c9083906001600160a01b038916906370a082319060240160206040518083038186803b15801561205e57600080fd5b505afa158015612072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120969190612953565b90611bcc565b905080156120bb576120ae8682611dd7565b6120b88282611bb7565b91505b505b6120c78185611bcc565b83600401819055505050505b806120df575050612153565b3360008181526004602090815260408083206001600160a01b03871680855292528220919091556121109183611d3c565b6040518181526001600160a01b0383169033907f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9060200160405180910390a350505b8061215d8161286c565b915050611efb565b60008161218e57506001600160a01b0382166000908152600a6020526040902060030154611bc6565b6001600160a01b0383166000908152600a602052604090206001810154600290910154611bc3916121d89185916107a291670de0b6b3a764000091610d029182906120968c610f1f565b6001600160a01b0385166000908152600a602052604090206003015490611bb7565b6001600160a01b0380851660008181526004602090815260408083209488168084529482528083205493835260038252808320948352939052918220546122609190610d0890670de0b6b3a7640000906107a290612259908890611bcc565b8890611e9a565b95945050505050565b60006122be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123de9092919063ffffffff16565b805190915015610bbe57808060200190518101906122dc919061296c565b610bbe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109e5565b6000808211801561235657506006546001600160a01b031615155b801561239457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b156117e3576007546000906123af90610d0285612710611bd8565b90506123bb8382611bcc565b6006549092506123d8906001600160a01b03868116911683611d3c565b50611bc6565b60606123ed84846000856123f5565b949350505050565b6060824710156124565760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109e5565b6001600160a01b0385163b6124ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e5565b600080866001600160a01b031685876040516124c991906129ba565b60006040518083038185875af1925050503d8060008114612506576040519150601f19603f3d011682016040523d82523d6000602084013e61250b565b606091505b509150915061251b828286612526565b979650505050505050565b60608315612535575081610f47565b8251156125455782518084602001fd5b8160405162461bcd60e51b81526004016109e591906129d6565b50805460008255600202906000526020600020908101906112e091905b80821115612596576000808255600182015560020161257c565b5090565b6001600160a01b03811681146112e057600080fd5b80356125ba8161259a565b919050565b6000602082840312156125d157600080fd5b8135610f478161259a565b600081518084526020808501945080840160005b838110156126175781518051885283015183880152604090960195908201906001016125f0565b509495945050505050565b84815283602082015282604082015260806060820152600061264760808301846125dc565b9695505050505050565b60006020828403121561266357600080fd5b5035919050565b6000806040838503121561267d57600080fd5b82356126888161259a565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156126bf57600080fd5b823567ffffffffffffffff808211156126d757600080fd5b818501915085601f8301126126eb57600080fd5b8135818111156126fd576126fd612696565b8060051b604051601f19603f8301168101818110858211171561272257612722612696565b60405291825284820192508381018501918883111561274057600080fd5b938501935b8285101561276557612756856125af565b84529385019392850192612745565b98975050505050505050565b6000806040838503121561278457600080fd5b8235915060208301356127968161259a565b809150509250929050565b600080604083850312156127b457600080fd5b82356127bf8161259a565b915060208301356127968161259a565b602080825282518282018190526000919060409081850190868401855b8281101561281a57815180516001600160a01b031685528601518685015292840192908501906001016127ec565b5091979650505050505050565b8281526040602082015260006123ed60408301846125dc565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561288057612880612856565b5060010190565b60008160001904831182151516156128a1576128a1612856565b500290565b6000828210156128b8576128b8612856565b500390565b6001600160a01b038381168252604060208084018290528451918401829052600092858201929091906060860190855b8181101561290b5785518516835294830194918301916001016128ed565b509098975050505050505050565b6000821982111561292c5761292c612856565b500190565b60008261294e57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561296557600080fd5b5051919050565b60006020828403121561297e57600080fd5b81518015158114610f4757600080fd5b60005b838110156129a9578181015183820152602001612991565b838111156116435750506000910152565b600082516129cc81846020870161298e565b9190910192915050565b60208152600082518060208401526129f581604085016020870161298e565b601f01601f1916919091016040019291505056fea2646970667358221220ead35373d42eaff7b63748aaf12843128d4c945aff1cae0710cc81eb332fd7a664736f6c634300080900330000000000000000000000003e04863dba602713bb5d0edbf7db7c3a9a2b602700000000000000000000000055c08ca52497e2f1534b59e2917bf524d47652570000000000000000000000005776f9bf6568f252ce5fa85f8fee3c0d8de914d8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80637bb7bed111610146578063af1df255116100c3578063e33b724211610087578063e33b7242146105e2578063e655dbd8146105f5578063e70b9e2714610608578063f2fde38b14610633578063f46eccc414610646578063f7c618c11461066957600080fd5b8063af1df25514610572578063ca5c7b9114610585578063d300b3321461058e578063dc01f60d146105a1578063df379876146105c157600080fd5b80638fd9f2ca1161010a5780638fd9f2ca1461052e578063904fdee01461053b5780639c9b2e211461054e578063a01c77bc14610561578063a1d61aa31461056957600080fd5b80637bb7bed1146104aa5780637fd7d062146104bd578063811d38d1146104d05780638bf39416146104f45780638da5cb5b1461051d57600080fd5b806340c10f19116101d457806366dfbfb41161019857806366dfbfb41461042a5780636fb83a571461043d5780637035ab9814610450578063715018a61461047b57806372f702f31461048357600080fd5b806340c10f191461037957806348e5d9f81461038c578063547d0096146103f1578063638634ee1461040457806364b87a701461041757600080fd5b80631514617e1161021b5780631514617e14610316578063296c0f721461031e578063386a95251461035d5780633b1837d9146103675780633ccfd60b1461037157600080fd5b806302b62938146102585780630408ae221461028b57806304554443146102ca5780630483a7f6146102e05780630ee2248f14610303575b600080fd5b61026b6102663660046125bf565b610690565b604080519384526020840192909252908201526060015b60405180910390f35b6102c86102993660046125bf565b336000908152600f6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b005b6102d26107c1565b604051908152602001610282565b6102f36102ee3660046125bf565b6107d2565b6040516102829493929190612622565b6102c8610311366004612651565b6109a0565b6102d26109f3565b6103457f0000000000000000000000005776f9bf6568f252ce5fa85f8fee3c0d8de914d881565b6040516001600160a01b039091168152602001610282565b6102d262093a8081565b6102d26201518081565b6102c8610a01565b6102c861038736600461266a565b610bc3565b6103c961039a3660046125bf565b600a60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610282565b6102c86103ff3660046126ac565b610e57565b6102d26104123660046125bf565b610f1f565b600854610345906001600160a01b031681565b6102c8610438366004612771565b610f4e565b6102c861044b3660046125bf565b611207565b6102d261045e3660046127a1565b600360209081526000928352604080842090915290825290205481565b6102c8611290565b6103457f0000000000000000000000003e04863dba602713bb5d0edbf7db7c3a9a2b602781565b6103456104b8366004612651565b6112a4565b6102c86104cb3660046126ac565b6112ce565b6008546104e490600160a01b900460ff1681565b6040519015158152602001610282565b6103456105023660046125bf565b600f602052600090815260409020546001600160a01b031681565b6000546001600160a01b0316610345565b6002546104e49060ff1681565b6102c86105493660046125bf565b6112e3565b6102c861055c3660046125bf565b611352565b6102c86113e4565b6102d260075481565b600554610345906001600160a01b031681565b6102d2600b5481565b600654610345906001600160a01b031681565b6105b46105af3660046125bf565b611649565b60405161028291906127cf565b6105d46105cf3660046125bf565b6117e9565b604051610282929190612827565b6102c86105f03660046125bf565b61194a565b6102c86106033660046125bf565b611b17565b6102d26106163660046127a1565b600460209081526000928352604080842090915290825290205481565b6102c86106413660046125bf565b611b41565b6104e46106543660046125bf565b60016020526000908152604090205460ff1681565b6103457f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d476525781565b6001600160a01b0381166000908152600c6020526040812060018101548291829180156107ac576001600160a01b0386166000908152600e6020526040812054905b81811015610792576001600160a01b0388166000908152600e6020526040812080548390811061070457610704612840565b906000526020600020906002020160000154905080600014156107275750610780565b6001600160a01b0389166000908152600e6020526040902080544291908490811061075457610754612840565b90600052602060002090600202016001015411156107725750610792565b61077c8682611bb7565b9550505b8061078a8161286c565b9150506106d2565b506107a860026107a28487611bcc565b90611bd8565b9450505b6107b68185611bcc565b945050509193909250565b6107cf62093a806008612887565b81565b6001600160a01b0381166000908152600d602052604081208190819060609082805b825481101561097b574283828154811061081057610810612840565b9060005260206000209060020201600101541115610939578161089b57825461083a9082906128a6565b67ffffffffffffffff81111561085257610852612696565b60405190808252806020026020018201604052801561089757816020015b60408051808201909152600080825260208201528152602001906001900390816108705790505b5093505b8281815481106108ad576108ad612840565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508483815181106108ec576108ec612840565b602002602001018190525081806109029061286c565b92505061093283828154811061091a5761091a612840565b60009182526020909120600290910201548690611bb7565b9450610969565b61096683828154811061094e5761094e612840565b60009182526020909120600290910201548790611bb7565b95505b806109738161286c565b9150506107f4565b5050506001600160a01b0385166000908152600c602052604090205493509193509193565b6109a8611be4565b6127108111156109ee5760405162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b60448201526064015b60405180910390fd5b600755565b6107cf62093a806004612887565b610a0a33611c3e565b336000908152600c60205260408120600181015490918115610b4e57336000908152600e6020526040812054905b81811015610b1f57336000908152600e60205260408120805483908110610a6157610a61612840565b90600052602060002090600202016000015490508060001415610a845750610b0d565b336000908152600e60205260409020805442919084908110610aa857610aa8612840565b9060005260206000209060020201600101541115610ac65750610b1f565b610ad08482611bb7565b336000908152600e6020526040902080549195509083908110610af557610af5612840565b60009182526020822060029091020181815560010155505b80610b178161286c565b915050610a38565b50336000908152600e6020526040902054610b4c57336000908152600e60205260408120610b4c9161255f565b505b8015610bbe57610b886001600160a01b037f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257163383611d3c565b60405181815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a25b505050565b3360009081526001602052604090205460ff16610c0c5760405162461bcd60e51b815260206004820152600760248201526610b6b4b73a32b960c91b60448201526064016109e5565b80610c15575050565b610c1e82611c3e565b610c736001600160a01b037f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257167f0000000000000000000000005776f9bf6568f252ce5fa85f8fee3c0d8de914d83084611d9f565b6001600160a01b038216301415610cb257610cae7f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d476525782611dd7565b5050565b6001600160a01b0382166000908152600c602052604090206001810154610cd99083611bb7565b60018201556000610d0e610cf162093a806004612887565b610d0862093a80610d024282611bd8565b90611e9a565b90611bb7565b6001600160a01b0385166000908152600e60205260409020805491925090801580610d6557508282610d416001846128a6565b81548110610d5157610d51612840565b906000526020600020906002020160010154105b15610da7576040805180820190915285815260208082018581528454600181810187556000878152939093209351600290910290930192835551910155610e0c565b610dde8583610db76001856128a6565b81548110610dc757610dc7612840565b600091825260209091206002909102015490611bb7565b82610dea6001846128a6565b81548110610dfa57610dfa612840565b60009182526020909120600290910201555b856001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe86604051610e4791815260200190565b60405180910390a2505050505050565b610e5f611be4565b60025460ff1615610ea75760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d195c88185b1c9958591e481cd95d60721b60448201526064016109e5565b60005b8151811015610f0e576001806000848481518110610eca57610eca612840565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f068161286c565b915050610eaa565b50506002805460ff19166001179055565b6001600160a01b0381166000908152600a6020526040812054428111610f455780610f47565b425b9392505050565b60008211610f8b5760405162461bcd60e51b815260206004820152600a6024820152690616d6f756e74203d20360b41b60448201526064016109e5565b610f9481611c3e565b6001600160a01b0381166000908152600c60205260409020600b54610fb99084611bb7565b600b558054610fc89084611bb7565b81556000610fdd610cf162093a806008612887565b6001600160a01b0384166000908152600d602052604090205490915080158061104a57506001600160a01b0384166000908152600d6020526040902082906110266001846128a6565b8154811061103657611036612840565b906000526020600020906002020160010154105b156110a2576001600160a01b0384166000908152600d60209081526040808320815180830190925288825281830186815281546001818101845592865293909420915160029093029091019182559151910155611110565b6001600160a01b0384166000908152600d602052604090206110cb908690610db76001856128a6565b6001600160a01b0385166000908152600d602052604090206110ee6001846128a6565b815481106110fe576110fe612840565b60009182526020909120600290910201555b6111456001600160a01b037f0000000000000000000000003e04863dba602713bb5d0edbf7db7c3a9a2b602716333088611d9f565b836001600160a01b03167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600088660405161118091815260200190565b60405180910390a26008546001600160a01b0316156112005760085460405163282d3fdf60e01b81526001600160a01b038681166004830152602482018890529091169063282d3fdf90604401600060405180830381600087803b1580156111e757600080fd5b505af11580156111fb573d6000803e3d6000fd5b505050505b5050505050565b61120f611be4565b600854600160a01b900460ff16156112695760405162461bcd60e51b815260206004820152601a60248201527f7374616b696e675265776172647320616c72656164792073657400000000000060448201526064016109e5565b600880546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611298611be4565b6112a26000611ea6565b565b600981815481106112b457600080fd5b6000918252602090912001546001600160a01b0316905081565b6112d733611c3e565b6112e081611ef6565b50565b6112eb611be4565b6001600160a01b0381166113305760405162461bcd60e51b815260206004820152600c60248201526b61646472657373207a65726f60a01b60448201526064016109e5565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61135a611be4565b6001600160a01b0381166000908152600a60205260409020600201541561138057600080fd5b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b039092166001600160a01b0319909216821790556000908152600a6020526040902042600282018190559055565b6113ed33611c3e565b336000908152600d60209081526040808320600c909252822081549192909142846114196001846128a6565b8154811061142957611429612840565b90600052602060002090600202016001015411611463578254336000908152600d6020526040812091935061145e919061255f565b611509565b60005b81811015611507574285828154811061148157611481612840565b906000526020600020906002020160010154111561149e57611507565b6114cb8582815481106114b3576114b3612840565b60009182526020909120600290910201548490611bb7565b92508481815481106114df576114df612840565b60009182526020822060029091020181815560010155806114ff8161286c565b915050611466565b505b600082116115465760405162461bcd60e51b815260206004820152600a6024820152690616d6f756e74203d20360b41b60448201526064016109e5565b82546115529083611bcc565b8355600b546115619083611bcc565b600b556115986001600160a01b037f0000000000000000000000003e04863dba602713bb5d0edbf7db7c3a9a2b6027163384611d3c565b60405182815233907f401321eacd32d0779a1de4ef7e54230af5e1a657bb38a39afb7f3916aecc357a9060200160405180910390a26008546001600160a01b0316156116435760085460405163f3fef3a360e01b8152336004820152602481018490526001600160a01b039091169063f3fef3a390604401600060405180830381600087803b15801561162a57600080fd5b505af115801561163e573d6000803e3d6000fd5b505050505b50505050565b60095460609067ffffffffffffffff81111561166757611667612696565b6040519080825280602002602001820160405280156116ac57816020015b60408051808201909152600080825260208201528152602001906001900390816116855790505b50905060005b81518110156117e357600981815481106116ce576116ce612840565b9060005260206000200160009054906101000a90046001600160a01b03168282815181106116fe576116fe612840565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506117b164e8d4a510006107a28585858151811061174157611741612840565b602002602001015160000151600c6000896001600160a01b03166001600160a01b03168152602001908152602001600020600001546117ac6009888154811061178c5761178c612840565b600091825260209091200154600b546001600160a01b0390911690612165565b6121fa565b8282815181106117c3576117c3612840565b6020908102919091018101510152806117db8161286c565b9150506116b2565b50919050565b6001600160a01b0381166000908152600e6020526040812060609082805b8254811015611942574283828154811061182357611823612840565b906000526020600020906002020160010154111561193057816118ae57825461184d9082906128a6565b67ffffffffffffffff81111561186557611865612696565b6040519080825280602002602001820160405280156118aa57816020015b60408051808201909152600080825260208201528152602001906001900390816118835790505b5093505b8281815481106118c0576118c0612840565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508483815181106118ff576118ff612840565b602002602001018190525081806119159061286c565b92505061192d83828154811061091a5761091a612840565b94505b8061193a8161286c565b915050611807565b505050915091565b6001600160a01b03811633148061197a57506001600160a01b038181166000908152600f60205260409020541633145b61198357600080fd5b61198c81611c3e565b60008061199883610690565b506001600160a01b0385166000908152600e602052604081209294509092506119c1919061255f565b6001600160a01b038084166000908152600c60205260408120600181019190915590611a10907f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257168585611d3c565b8115611acd576005546001600160a01b0316638e2eba09306000604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401611a719291906128bd565b600060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b50505050611acd7f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d476525783611dd7565b60408051848152602081018490526001600160a01b038616917fb9d085d37935f9d1625432939418832c1862e03b445447a6c4bcbb4e40de2d55910160405180910390a250505050565b611b1f611be4565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611b49611be4565b6001600160a01b038116611bae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e5565b6112e081611ea6565b6000611bc38284612919565b90505b92915050565b6000611bc382846128a6565b6000611bc38284612931565b6000546001600160a01b031633146112a25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e5565b60095460005b81811015610bbe57600060098281548110611c6157611c61612840565b60009182526020808320909101546001600160a01b0316808352600a90915260408220600b549193509190611c97908490612165565b600383018190559050611ca983610f1f565b60028301556001600160a01b0386163014611d26576001600160a01b0386166000908152600c6020526040902054611ce59087908590846121fa565b6001600160a01b0380881660008181526004602090815260408083209489168084529482528083209590955591815260038252838120928152919052208190555b5050508080611d349061286c565b915050611c44565b6040516001600160a01b038316602482015260448101829052610bbe90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612269565b6040516001600160a01b03808516602483015283166044820152606481018290526116439085906323b872dd60e01b90608401611d68565b6000611de3838361233b565b6001600160a01b0384166000908152600a602052604090208054919250904210611e2757611e1d62093a806107a28464e8d4a51000611e9a565b6001820155611e7e565b8054600090611e369042611bcc565b90506000611e5a64e8d4a510006107a2856001015485611e9a90919063ffffffff16565b9050611e7662093a806107a264e8d4a51000610d028886611bb7565b600184015550505b4260028201819055611e939062093a80611bb7565b9055505050565b6000611bc38284612887565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805160005b81811015610bbe576000838281518110611f1757611f17612840565b6020908102919091018101513360009081526004835260408082206001600160a01b038416835290935291822054909250611f579064e8d4a51000611bd8565b90507f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d47652576001600160a01b0316826001600160a01b0316146120d3576001600160a01b0382166000908152600a60205260409020805480611ff05760405162461bcd60e51b81526020600482015260146024820152732ab735b737bbb7103932bbb0b932103a37b5b2b760611b60448201526064016109e5565b600482015461200f6120086201518062093a806128a6565b4290611bb7565b8210156120bd576040516370a0823160e01b815230600482015260009061209c9083906001600160a01b038916906370a082319060240160206040518083038186803b15801561205e57600080fd5b505afa158015612072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120969190612953565b90611bcc565b905080156120bb576120ae8682611dd7565b6120b88282611bb7565b91505b505b6120c78185611bcc565b83600401819055505050505b806120df575050612153565b3360008181526004602090815260408083206001600160a01b03871680855292528220919091556121109183611d3c565b6040518181526001600160a01b0383169033907f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9060200160405180910390a350505b8061215d8161286c565b915050611efb565b60008161218e57506001600160a01b0382166000908152600a6020526040902060030154611bc6565b6001600160a01b0383166000908152600a602052604090206001810154600290910154611bc3916121d89185916107a291670de0b6b3a764000091610d029182906120968c610f1f565b6001600160a01b0385166000908152600a602052604090206003015490611bb7565b6001600160a01b0380851660008181526004602090815260408083209488168084529482528083205493835260038252808320948352939052918220546122609190610d0890670de0b6b3a7640000906107a290612259908890611bcc565b8890611e9a565b95945050505050565b60006122be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123de9092919063ffffffff16565b805190915015610bbe57808060200190518101906122dc919061296c565b610bbe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109e5565b6000808211801561235657506006546001600160a01b031615155b801561239457507f00000000000000000000000055c08ca52497e2f1534b59e2917bf524d47652576001600160a01b0316836001600160a01b031614155b156117e3576007546000906123af90610d0285612710611bd8565b90506123bb8382611bcc565b6006549092506123d8906001600160a01b03868116911683611d3c565b50611bc6565b60606123ed84846000856123f5565b949350505050565b6060824710156124565760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109e5565b6001600160a01b0385163b6124ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e5565b600080866001600160a01b031685876040516124c991906129ba565b60006040518083038185875af1925050503d8060008114612506576040519150601f19603f3d011682016040523d82523d6000602084013e61250b565b606091505b509150915061251b828286612526565b979650505050505050565b60608315612535575081610f47565b8251156125455782518084602001fd5b8160405162461bcd60e51b81526004016109e591906129d6565b50805460008255600202906000526020600020908101906112e091905b80821115612596576000808255600182015560020161257c565b5090565b6001600160a01b03811681146112e057600080fd5b80356125ba8161259a565b919050565b6000602082840312156125d157600080fd5b8135610f478161259a565b600081518084526020808501945080840160005b838110156126175781518051885283015183880152604090960195908201906001016125f0565b509495945050505050565b84815283602082015282604082015260806060820152600061264760808301846125dc565b9695505050505050565b60006020828403121561266357600080fd5b5035919050565b6000806040838503121561267d57600080fd5b82356126888161259a565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156126bf57600080fd5b823567ffffffffffffffff808211156126d757600080fd5b818501915085601f8301126126eb57600080fd5b8135818111156126fd576126fd612696565b8060051b604051601f19603f8301168101818110858211171561272257612722612696565b60405291825284820192508381018501918883111561274057600080fd5b938501935b8285101561276557612756856125af565b84529385019392850192612745565b98975050505050505050565b6000806040838503121561278457600080fd5b8235915060208301356127968161259a565b809150509250929050565b600080604083850312156127b457600080fd5b82356127bf8161259a565b915060208301356127968161259a565b602080825282518282018190526000919060409081850190868401855b8281101561281a57815180516001600160a01b031685528601518685015292840192908501906001016127ec565b5091979650505050505050565b8281526040602082015260006123ed60408301846125dc565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561288057612880612856565b5060010190565b60008160001904831182151516156128a1576128a1612856565b500290565b6000828210156128b8576128b8612856565b500390565b6001600160a01b038381168252604060208084018290528451918401829052600092858201929091906060860190855b8181101561290b5785518516835294830194918301916001016128ed565b509098975050505050505050565b6000821982111561292c5761292c612856565b500190565b60008261294e57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561296557600080fd5b5051919050565b60006020828403121561297e57600080fd5b81518015158114610f4757600080fd5b60005b838110156129a9578181015183820152602001612991565b838111156116435750506000910152565b600082516129cc81846020870161298e565b9190910192915050565b60208152600082518060208401526129f581604085016020870161298e565b601f01601f1916919091016040019291505056fea2646970667358221220ead35373d42eaff7b63748aaf12843128d4c945aff1cae0710cc81eb332fd7a664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003e04863dba602713bb5d0edbf7db7c3a9a2b602700000000000000000000000055c08ca52497e2f1534b59e2917bf524d47652570000000000000000000000005776f9bf6568f252ce5fa85f8fee3c0d8de914d8
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x3E04863DBa602713Bb5d0edbf7DB7C3A9A2B6027
Arg [1] : _rewardToken (address): 0x55C08ca52497e2f1534B59E2917BF524D4765257
Arg [2] : _rewardTokenVault (address): 0x5776F9bf6568f252cE5Fa85F8fEe3c0d8dE914D8
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003e04863dba602713bb5d0edbf7db7c3a9a2b6027
Arg [1] : 00000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257
Arg [2] : 0000000000000000000000005776f9bf6568f252ce5fa85f8fee3c0d8de914d8
Deployed Bytecode Sourcemap
30022:15224:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35265:769;;;;;;:::i;:::-;;:::i;:::-;;;;743:25:1;;;799:2;784:18;;777:34;;;;827:18;;;820:34;731:2;716:18;35265:769:0;;;;;;;;39599:100;;;;;;:::i;:::-;39670:10;39656:25;;;;:13;:25;;;;;:37;;-1:-1:-1;;;;;;39656:37:0;-1:-1:-1;;;;;39656:37:0;;;;;;;;;;39599:100;;;31074:55;;;:::i;:::-;;;1011:25:1;;;999:2;984:18;31074:55:0;865:177:1;33959:684:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;32786:131::-;;;;;;:::i;:::-;;:::i;31145:58::-;;;:::i;31656:41::-;;;;;;;;-1:-1:-1;;;;;2492:32:1;;;2474:51;;2462:2;2447:18;31656:41:0;2328:203:1;30946:48:0;;30985:9;30946:48;;31026:43;;31064:5;31026:43;;40440:826;;;:::i;38604:969::-;;;;;;:::i;:::-;;:::i;31899:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3115:25:1;;;3171:2;3156:18;;3149:34;;;;3199:18;;;3192:34;;;;3257:2;3242:18;;3235:34;3300:3;3285:19;;3278:35;3102:3;3087:19;31899:44:0;2856:463:1;33163:240:0;;;;;;:::i;:::-;;:::i;41439:232::-;;;;;;:::i;:::-;;:::i;31786:37::-;;;;;-1:-1:-1;;;;;31786:37:0;;;36690:916;;;;;;:::i;:::-;;:::i;32923:234::-;;;;;;:::i;:::-;;:::i;31372:74::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;28264:103;;;:::i;31575:36::-;;;;;31865:29;;;;;;:::i;:::-;;:::i;41305:128::-;;;;;;:::i;:::-;;:::i;31828:32::-;;;;;-1:-1:-1;;;31828:32:0;;;;;;;;;5913:14:1;;5906:22;5888:41;;5876:2;5861:18;31828:32:0;5748:187:1;32241:48:0;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;32241:48:0;;;27616:87;27662:7;27689:6;-1:-1:-1;;;;;27689:6:0;27616:87;;31303:25;;;;;;;;;32631:149;;;;;;:::i;:::-;;:::i;33612:295::-;;;;;;:::i;:::-;;:::i;37688:910::-;;;:::i;31737:32::-;;;;;;31517:53;;;;;-1:-1:-1;;;;;31517:53:0;;;31950:24;;;;;;31702:30;;;;;-1:-1:-1;;;;;31702:30:0;;;36118:422;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34702:557::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;39779:626::-;;;;;;:::i;:::-;;:::i;33409:138::-;;;;;;:::i;:::-;;:::i;31451:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;28522:201;;;;;;:::i;:::-;;:::i;31259:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31616:35;;;;;35265:769;-1:-1:-1;;;;;35439:14:0;;35335:11;35439:14;;;:8;:14;;;;;35474:10;;;;35335:11;;;;35495:10;;35491:457;;-1:-1:-1;;;;;35530:18:0;;35516:11;35530:18;;;:12;:18;;;;;:25;;35564:313;35585:6;35581:1;:10;35564:313;;;-1:-1:-1;;;;;35629:18:0;;35609:17;35629:18;;;:12;:18;;;;;:21;;35648:1;;35629:21;;;;;;:::i;:::-;;;;;;;;;;;:28;;;35609:48;;35672:12;35688:1;35672:17;35668:31;;;35691:8;;;35668:31;-1:-1:-1;;;;;35714:18:0;;;;;;:12;:18;;;;;:21;;35749:15;;35714:18;35733:1;;35714:21;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:50;35710:86;;;35779:5;;;35710:86;35829:38;:20;35854:12;35829:24;:38::i;:::-;35806:61;;35598:279;35564:313;35593:3;;;;:::i;:::-;;;;35564:313;;;-1:-1:-1;35901:39:0;35938:1;35901:32;:6;35912:20;35901:10;:32::i;:::-;:36;;:39::i;:::-;35885:55;;35507:441;35491:457;35963:25;:6;35974:13;35963:10;:25::i;:::-;35954:34;;35409:625;;35265:769;;;;;:::o;31074:55::-;31110:19;30985:9;31128:1;31110:19;:::i;:::-;31074:55;:::o;33959:684::-;-1:-1:-1;;;;;34159:15:0;;34026:10;34159:15;;;:9;:15;;;;;34026:10;;;;34083:31;;34026:10;;34196:375;34217:12;;34213:16;;34196:375;;;34271:15;34249:5;34255:1;34249:8;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:37;34245:319;;;34303:8;34299:87;;34357:12;;:16;;34372:1;;34357:16;:::i;:::-;34337:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;34337:37:0;;;;;;;;;;;;;;;;34326:48;;34299:87;34412:5;34418:1;34412:8;;;;;;;;:::i;:::-;;;;;;;;;;;34396:24;;;;;;;;;;;;;;;;;;;;;;;;;:8;34405:3;34396:13;;;;;;;;:::i;:::-;;;;;;:24;;;;34431:5;;;;;:::i;:::-;;;;34456:27;34467:5;34473:1;34467:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:15;34456:6;;:10;:27::i;:::-;34447:36;;34245:319;;;34523:31;34538:5;34544:1;34538:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:15;34523:10;;:14;:31::i;:::-;34510:44;;34245:319;34231:3;;;;:::i;:::-;;;;34196:375;;;-1:-1:-1;;;;;;;;34585:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;33959:684:0;;;;;:::o;32786:131::-;27502:13;:11;:13::i;:::-;32863:5:::1;32856:3;:12;;32848:37;;;::::0;-1:-1:-1;;;32848:37:0;;8614:2:1;32848:37:0::1;::::0;::::1;8596:21:1::0;8653:2;8633:18;;;8626:30;-1:-1:-1;;;8672:18:1;;;8665:42;8724:18;;32848:37:0::1;;;;;;;;;32892:13;:19:::0;32786:131::o;31145:58::-;31184:19;30985:9;31202:1;31184:19;:::i;40440:826::-;40474:25;40488:10;40474:13;:25::i;:::-;40538:10;40506:20;40529;;;:8;:20;;;;;40570:10;;;;40529:20;;40609:10;;40605:530;;40657:10;40630:11;40644:24;;;:12;:24;;;;;:31;;40684:342;40705:6;40701:1;:10;40684:342;;;40762:10;40729:17;40749:24;;;:12;:24;;;;;:27;;40774:1;;40749:27;;;;;;:::i;:::-;;;;;;;;;;;:34;;;40729:54;;40798:12;40814:1;40798:17;40794:31;;;40817:8;;;40794:31;40853:10;40840:24;;;;:12;:24;;;;;:27;;40881:15;;40840:24;40865:1;;40840:27;;;;;;:::i;:::-;;;;;;;;;;;:38;;;:56;40836:92;;;40911:5;;;40836:92;40947:24;:6;40958:12;40947:10;:24::i;:::-;41002:10;40989:24;;;;:12;:24;;;;;:27;;40938:33;;-1:-1:-1;40989:24:0;41014:1;;40989:27;;;;;;:::i;:::-;;;;;;;;;;;;;40982:34;;;;;;-1:-1:-1;40684:342:0;40713:3;;;;:::i;:::-;;;;40684:342;;;-1:-1:-1;41051:10:0;41038:24;;;;:12;:24;;;;;:31;41034:94;;41107:10;41094:24;;;;:12;:24;;;;;41087:31;;;:::i;:::-;40621:514;40605:530;41145:10;;41141:120;;41166:44;-1:-1:-1;;;;;41166:11:0;:24;41191:10;41203:6;41166:24;:44::i;:::-;41224:29;;1011:25:1;;;41234:10:0;;41224:29;;999:2:1;984:18;41224:29:0;;;;;;;41141:120;40467:799;;;40440:826::o;38604:969::-;38677:10;38669:19;;;;:7;:19;;;;;;;;38661:39;;;;-1:-1:-1;;;38661:39:0;;8955:2:1;38661:39:0;;;8937:21:1;8994:1;8974:18;;;8967:29;-1:-1:-1;;;9012:18:1;;;9005:37;9059:18;;38661:39:0;8753:330:1;38661:39:0;38711:11;38707:24;;38604:969;;:::o;38707:24::-;38737:19;38751:4;38737:13;:19::i;:::-;38763:69;-1:-1:-1;;;;;38763:11:0;:28;38792:16;38818:4;38825:6;38763:28;:69::i;:::-;-1:-1:-1;;;;;38843:21:0;;38859:4;38843:21;38839:183;;;38956:43;38978:11;38992:6;38956:13;:43::i;:::-;38604:969;;:::o;38839:183::-;-1:-1:-1;;;;;39051:14:0;;39028:20;39051:14;;;:8;:14;;;;;39085:10;;;;:22;;39100:6;39085:14;:22::i;:::-;39072:10;;;:35;39114:15;39132:78;31184:19;30985:9;31202:1;31184:19;:::i;:::-;39132:57;30985:9;39132:36;:15;30985:9;39132:19;:36::i;:::-;:40;;:57::i;:::-;:61;;:78::i;:::-;-1:-1:-1;;;;;39252:18:0;;39217:32;39252:18;;;:12;:18;;;;;39288:15;;39114:96;;-1:-1:-1;39252:18:0;39314:8;;;:51;;-1:-1:-1;39355:10:0;39326:8;39335:5;39339:1;39335:3;:5;:::i;:::-;39326:15;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;:39;39314:51;39310:226;;;39390:55;;;;;;;;;;;;;;;;;;;39376:70;;;;;;;;-1:-1:-1;39376:70:0;;;;;;;;;;;;;;;;;;;;;;;39310:226;;;39494:34;39521:6;39494:8;39503:5;39507:1;39503:3;:5;:::i;:::-;39494:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:22;;:26;:34::i;:::-;39469:8;39478:5;39482:1;39478:3;:5;:::i;:::-;39469:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:59;39310:226;39554:4;-1:-1:-1;;;;;39547:20:0;;39560:6;39547:20;;;;1011:25:1;;999:2;984:18;;865:177;39547:20:0;;;;;;;;38654:919;;;;38604:969;;:::o;33163:240::-;27502:13;:11;:13::i;:::-;33245::::1;::::0;::::1;;33244:14;33236:45;;;::::0;-1:-1:-1;;;33236:45:0;;9290:2:1;33236:45:0::1;::::0;::::1;9272:21:1::0;9329:2;9309:18;;;9302:30;-1:-1:-1;;;9348:18:1;;;9341:48;9406:18;;33236:45:0::1;9088:342:1::0;33236:45:0::1;33293:6;33288:83;33305:8;:15;33301:1;:19;33288:83;;;33359:4;33336:7:::0;:20:::1;33344:8;33353:1;33344:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;33336:20:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;33336:20:0;:27;;-1:-1:-1;;33336:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33322:3;::::1;::::0;::::1;:::i;:::-;;;;33288:83;;;-1:-1:-1::0;;33377:13:0::1;:20:::0;;-1:-1:-1;;33377:20:0::1;33393:4;33377:20;::::0;;33163:240::o;41439:232::-;-1:-1:-1;;;;;41550:25:0;;41517:4;41550:25;;;:10;:25;;;;;:38;41602:15;:30;-1:-1:-1;41602:63:0;;41653:12;41602:63;;;41635:15;41602:63;41595:70;41439:232;-1:-1:-1;;;41439:232:0:o;36690:916::-;36770:1;36761:6;:10;36753:33;;;;-1:-1:-1;;;36753:33:0;;9637:2:1;36753:33:0;;;9619:21:1;9676:2;9656:18;;;9649:30;-1:-1:-1;;;9695:18:1;;;9688:40;9745:18;;36753:33:0;9435:334:1;36753:33:0;36793:25;36807:10;36793:13;:25::i;:::-;-1:-1:-1;;;;;36848:20:0;;36825;36848;;;:8;:20;;;;;36890:12;;:24;;36907:6;36890:16;:24::i;:::-;36875:12;:39;36934:10;;:22;;36949:6;36934:14;:22::i;:::-;36921:35;;:10;36981:75;31110:19;30985:9;31128:1;31110:19;:::i;36981:75::-;-1:-1:-1;;;;;37074:21:0;;37063:8;37074:21;;;:9;:21;;;;;:28;36963:93;;-1:-1:-1;37113:8:0;;;:64;;-1:-1:-1;;;;;;37125:21:0;;;;;;:9;:21;;;;;37167:10;;37147:5;37151:1;37147:3;:5;:::i;:::-;37125:28;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:52;37113:64;37109:278;;;-1:-1:-1;;;;;37188:21:0;;;;;;:9;:21;;;;;;;;37215:55;;;;;;;;;;;;;;;;;37188:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37109:278;;;-1:-1:-1;;;;;37332:21:0;;;;;;:9;:21;;;;;:47;;37372:6;;37354:5;37358:1;37354:3;:5;:::i;37332:47::-;-1:-1:-1;;;;;37294:21:0;;;;;;:9;:21;;;;;37316:5;37320:1;37316:3;:5;:::i;:::-;37294:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:85;37109:278;37393:64;-1:-1:-1;;;;;37393:12:0;:29;37423:10;37443:4;37450:6;37393:29;:64::i;:::-;37476:10;-1:-1:-1;;;;;37469:26:0;;37488:6;37469:26;;;;1011:25:1;;999:2;984:18;;865:177;37469:26:0;;;;;;;;37514:14;;-1:-1:-1;;;;;37514:14:0;37506:37;37502:99;;37554:14;;:39;;-1:-1:-1;;;37554:39:0;;-1:-1:-1;;;;;9966:32:1;;;37554:39:0;;;9948:51:1;10015:18;;;10008:34;;;37554:14:0;;;;:19;;9921:18:1;;37554:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37502:99;36746:860;;;36690:916;;:::o;32923:234::-;27502:13;:11;:13::i;:::-;33010:20:::1;::::0;-1:-1:-1;;;33010:20:0;::::1;;;33009:21;33001:60;;;::::0;-1:-1:-1;;;33001:60:0;;10255:2:1;33001:60:0::1;::::0;::::1;10237:21:1::0;10294:2;10274:18;;;10267:30;10333:28;10313:18;;;10306:56;10379:18;;33001:60:0::1;10053:350:1::0;33001:60:0::1;33068:14;:49:::0;;-1:-1:-1;;;;;;33124:27:0;-1:-1:-1;;;;;33068:49:0;;::::1;33124:27:::0;;;;-1:-1:-1;;;33124:27:0::1;::::0;;32923:234::o;28264:103::-;27502:13;:11;:13::i;:::-;28329:30:::1;28356:1;28329:18;:30::i;:::-;28264:103::o:0;31865:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31865:29:0;;-1:-1:-1;31865:29:0;:::o;41305:128::-;41370:25;41384:10;41370:13;:25::i;:::-;41402;41413:13;41402:10;:25::i;:::-;41305:128;:::o;32631:149::-;27502:13;:11;:13::i;:::-;-1:-1:-1;;;;;32708:19:0;::::1;32700:44;;;::::0;-1:-1:-1;;;32700:44:0;;10610:2:1;32700:44:0::1;::::0;::::1;10592:21:1::0;10649:2;10629:18;;;10622:30;-1:-1:-1;;;10668:18:1;;;10661:42;10720:18;;32700:44:0::1;10408:336:1::0;32700:44:0::1;32751:15;:23:::0;;-1:-1:-1;;;;;;32751:23:0::1;-1:-1:-1::0;;;;;32751:23:0;;;::::1;::::0;;;::::1;::::0;;32631:149::o;33612:295::-;27502:13;:11;:13::i;:::-;-1:-1:-1;;;;;33688:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:40:::1;;::::0;:45;33680:54:::1;;;::::0;::::1;;33741:12;:32:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;33741:32:0;;::::1;-1:-1:-1::0;;;;;;33741:32:0;;::::1;::::0;::::1;::::0;;-1:-1:-1;33780:25:0;;;:10:::1;33741:32;33780:25:::0;;;;33823:15:::1;33780:40;::::0;::::1;:58:::0;;;33845:56;;33612:295::o;37688:910::-;37736:25;37750:10;37736:13;:25::i;:::-;37810:10;37768:29;37800:21;;;:9;:21;;;;;;;;37851:8;:20;;;;;37910:12;;37800:21;;37851:20;;37963:15;37800:21;37939:8;37946:1;37910:12;37939:8;:::i;:::-;37933:15;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;:45;37929:322;;37998:10;;38034;37998;38024:21;;;:9;:21;;;;;37998:10;;-1:-1:-1;38017:28:0;;38024:21;38017:28;:::i;:::-;37929:322;;;38073:6;38068:176;38089:6;38085:1;:10;38068:176;;;38139:15;38117:5;38123:1;38117:8;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:37;38113:48;;;38156:5;;38113:48;38181:27;38192:5;38198:1;38192:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:15;38181:6;;:10;:27::i;:::-;38172:36;;38226:5;38232:1;38226:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;38219:15;;;;;;38097:3;;;;:::i;:::-;;;;38068:176;;;;37929:322;38274:1;38265:6;:10;38257:33;;;;-1:-1:-1;;;38257:33:0;;9637:2:1;38257:33:0;;;9619:21:1;9676:2;9656:18;;;9649:30;-1:-1:-1;;;9695:18:1;;;9688:40;9745:18;;38257:33:0;9435:334:1;38257:33:0;38310:10;;:22;;38325:6;38310:14;:22::i;:::-;38297:35;;38354:12;;:24;;38371:6;38354:16;:24::i;:::-;38339:12;:39;38385:45;-1:-1:-1;;;;;38385:12:0;:25;38411:10;38423:6;38385:25;:45::i;:::-;38442:41;;1011:25:1;;;38464:10:0;;38442:41;;999:2:1;984:18;38442:41:0;;;;;;;38502:14;;-1:-1:-1;;;;;38502:14:0;38494:37;38490:103;;38542:14;;:43;;-1:-1:-1;;;38542:43:0;;38566:10;38542:43;;;9948:51:1;10015:18;;;10008:34;;;-1:-1:-1;;;;;38542:14:0;;;;:23;;9921:18:1;;38542:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38490:103;37729:869;;;;37688:910::o;36118:422::-;36247:12;:19;36184:27;;36230:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;36230:37:0;;;;;;;;;;;;;;;;36220:47;;36279:6;36274:240;36295:7;:14;36291:1;:18;36274:240;;;36344:12;36357:1;36344:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36344:15:0;36325:7;36333:1;36325:10;;;;;;;;:::i;:::-;;;;;;;:16;;:34;-1:-1:-1;;;;;36325:34:0;;;-1:-1:-1;;;;;36325:34:0;;;;;36388:118;36501:4;36388:108;36396:7;36405;36413:1;36405:10;;;;;;;;:::i;:::-;;;;;;;:16;;;36423:8;:17;36432:7;-1:-1:-1;;;;;36423:17:0;-1:-1:-1;;;;;36423:17:0;;;;;;;;;;;;:24;;;36449:46;36465:12;36478:1;36465:15;;;;;;;;:::i;:::-;;;;;;;;;;;36482:12;;-1:-1:-1;;;;;36465:15:0;;;;36449;:46::i;:::-;36388:7;:108::i;:118::-;36368:7;36376:1;36368:10;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;:138;36311:3;;;;:::i;:::-;;;;36274:240;;;;36118:422;;;:::o;34702:557::-;-1:-1:-1;;;;;34854:18:0;;34763:10;34854:18;;;:12;:18;;;;;34775:35;;34763:10;;34894:325;34915:15;;34911:19;;34894:325;;;34975:15;34950:8;34959:1;34950:11;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;:40;34946:266;;;35007:8;35003:94;;35065:15;;:19;;35083:1;;35065:19;:::i;:::-;35045:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;35045:40:0;;;;;;;;;;;;;;;;35030:55;;35003:94;35127:8;35136:1;35127:11;;;;;;;;:::i;:::-;;;;;;;;;;;35107:31;;;;;;;;;;;;;;;;;;;;;;;;;:12;35120:3;35107:17;;;;;;;;:::i;:::-;;;;;;:31;;;;35149:5;;;;;:::i;:::-;;;;35173:29;35183:8;35192:1;35183:11;;;;;;;;:::i;35173:29::-;35165:37;;34946:266;34932:3;;;;:::i;:::-;;;;34894:325;;;;35225:28;;34702:557;;;:::o;39779:626::-;-1:-1:-1;;;;;39842:24:0;;39856:10;39842:24;;:67;;-1:-1:-1;;;;;;39870:25:0;;;;;;;:13;:25;;;;;;;39899:10;39870:39;39842:67;39834:76;;;;;;39917:25;39931:10;39917:13;:25::i;:::-;39950:11;39963:18;39986:31;40006:10;39986:19;:31::i;:::-;-1:-1:-1;;;;;;40031:24:0;;;;;;:12;:24;;;;;39949:68;;-1:-1:-1;39949:68:0;;-1:-1:-1;40024:31:0;;40031:24;40024:31;:::i;:::-;-1:-1:-1;;;;;40085:20:0;;;40062;40085;;;:8;:20;;;;;40112:10;;;:14;;;;40085:20;40133:44;;:11;:24;40094:10;40170:6;40133:24;:44::i;:::-;40188:17;;40184:158;;40216:20;;-1:-1:-1;;;;;40216:20:0;:26;40251:4;40216:20;40258:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40258:16:0;;40216:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40284:50;40306:11;40320:13;40284;:50::i;:::-;40353:46;;;11687:25:1;;;11743:2;11728:18;;11721:34;;;-1:-1:-1;;;;;40353:46:0;;;;;11660:18:1;40353:46:0;;;;;;;39827:578;;;39779:626;:::o;33409:138::-;27502:13;:11;:13::i;:::-;33507:20:::1;:34:::0;;-1:-1:-1;;;;;;33507:34:0::1;-1:-1:-1::0;;;;;33507:34:0;;;::::1;::::0;;;::::1;::::0;;33409:138::o;28522:201::-;27502:13;:11;:13::i;:::-;-1:-1:-1;;;;;28611:22:0;::::1;28603:73;;;::::0;-1:-1:-1;;;28603:73:0;;11968:2:1;28603:73:0::1;::::0;::::1;11950:21:1::0;12007:2;11987:18;;;11980:30;12046:34;12026:18;;;12019:62;-1:-1:-1;;;12097:18:1;;;12090:36;12143:19;;28603:73:0::1;11766:402:1::0;28603:73:0::1;28687:28;28706:8;28687:18;:28::i;21309:98::-:0;21367:7;21394:5;21398:1;21394;:5;:::i;:::-;21387:12;;21309:98;;;;;:::o;21690:::-;21748:7;21775:5;21779:1;21775;:5;:::i;22446:98::-;22504:7;22531:5;22535:1;22531;:5;:::i;27781:132::-;27662:7;27689:6;-1:-1:-1;;;;;27689:6:0;26241:10;27845:23;27837:68;;;;-1:-1:-1;;;27837:68:0;;12730:2:1;27837:68:0;;;12712:21:1;;;12749:18;;;12742:30;12808:34;12788:18;;;12781:62;12860:18;;27837:68:0;12528:356:1;44247:574:0;44317:12;:19;44303:11;44343:473;44364:6;44360:1;:10;44343:473;;;44386:13;44402:12;44415:1;44402:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;44402:15:0;44445:17;;;:10;:17;;;;;;44505:12;;44402:15;;-1:-1:-1;44445:17:0;44402:15;44482:36;;44402:15;;44482;:36::i;:::-;44527:22;;;:28;;;44471:47;-1:-1:-1;44583:31:0;44608:5;44583:24;:31::i;:::-;44564:16;;;:50;-1:-1:-1;;;;;44627:24:0;;44646:4;44627:24;44623:186;;-1:-1:-1;;;;;44714:17:0;;;;;;:8;:17;;;;;:24;44690:54;;44698:7;;44707:5;;44740:3;44690:7;:54::i;:::-;-1:-1:-1;;;;;44664:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:80;;;;44755:31;;;:22;:31;;;;;:38;;;;;;;:44;;;44623:186;44377:439;;;44372:3;;;;;:::i;:::-;;;;44343:473;;14635:211;14779:58;;-1:-1:-1;;;;;9966:32:1;;14779:58:0;;;9948:51:1;10015:18;;;10008:34;;;14752:86:0;;14772:5;;-1:-1:-1;;;14802:23:0;9921:18:1;;14779:58:0;;;;-1:-1:-1;;14779:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;14779:58:0;-1:-1:-1;;;;;;14779:58:0;;;;;;;;;;14752:19;:86::i;14854:248::-;15025:68;;-1:-1:-1;;;;;13147:15:1;;;15025:68:0;;;13129:34:1;13199:15;;13179:18;;;13172:43;13231:18;;;13224:34;;;14998:96:0;;15018:5;;-1:-1:-1;;;15048:27:0;13064:18:1;;15025:68:0;12889:375:1;43630:611:0;43706:11;43720:37;43734:13;43749:7;43720:13;:37::i;:::-;-1:-1:-1;;;;;43783:25:0;;43764:16;43783:25;;;:10;:25;;;;;43838:14;;43706:51;;-1:-1:-1;43783:25:0;43819:15;:33;43815:320;;43878:37;30985:9;43878:16;:6;43889:4;43878:10;:16::i;:37::-;43863:12;;;:52;43815:320;;;43955:14;;43938;;43955:35;;43974:15;43955:18;:35::i;:::-;43938:52;;43999:13;44015:37;44047:4;44015:27;44029:1;:12;;;44015:9;:13;;:27;;;;:::i;:37::-;43999:53;-1:-1:-1;44076:51:0;30985:9;44076:30;44101:4;44076:20;:6;43999:53;44076:10;:20::i;:51::-;44061:12;;;:66;-1:-1:-1;;43815:320:0;44160:15;44141:16;;;:34;;;44199:36;;30985:9;44199:19;:36::i;:::-;44182:53;;-1:-1:-1;;;43630:611:0:o;22047:98::-;22105:7;22132:5;22136:1;22132;:5;:::i;28883:191::-;28957:16;28976:6;;-1:-1:-1;;;;;28993:17:0;;;-1:-1:-1;;;;;;28993:17:0;;;;;;29026:40;;28976:6;;;;;;;29026:40;;28957:16;29026:40;28946:128;28883:191;:::o;41677:1172::-;41759:20;;41745:11;41786:1058;41803:6;41799:1;:10;41786:1058;;;41825:13;41841;41855:1;41841:16;;;;;;;;:::i;:::-;;;;;;;;;;;;41888:10;41866:11;41880:19;;;:7;:19;;;;;;-1:-1:-1;;;;;41880:26:0;;;;;;;;;;;41841:16;;-1:-1:-1;41880:36:0;;41911:4;41880:30;:36::i;:::-;41866:50;;41946:11;-1:-1:-1;;;;;41929:29:0;:5;-1:-1:-1;;;;;41929:29:0;;41925:733;;-1:-1:-1;;;;;42146:17:0;;42127:16;42146:17;;;:10;:17;;;;;42194:14;;42227:16;42219:49;;;;-1:-1:-1;;;42219:49:0;;13471:2:1;42219:49:0;;;13453:21:1;13510:2;13490:18;;;13483:30;-1:-1:-1;;;13529:18:1;;;13522:50;13589:18;;42219:49:0;13269:344:1;42219:49:0;42294:9;;;;42333:53;42353:32;31064:5;30985:9;42353:32;:::i;:::-;42333:15;;:19;:53::i;:::-;42318:12;:68;42314:293;;;42415:38;;-1:-1:-1;;;42415:38:0;;42447:4;42415:38;;;2474:51:1;42401:11:0;;42415:51;;42458:7;;-1:-1:-1;;;;;42415:23:0;;;;;2447:18:1;;42415:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;:51::i;:::-;42401:65;-1:-1:-1;42483:10:0;;42479:117;;42510:28;42524:5;42531:6;42510:13;:28::i;:::-;42563:19;:7;42575:6;42563:11;:19::i;:::-;42553:29;;42479:117;42388:219;42314:293;42629:19;:7;42641:6;42629:11;:19::i;:::-;42617:1;:9;;:31;;;;41960:698;;;41925:733;42670:11;42666:25;;42683:8;;;;42666:25;42708:10;42729:1;42700:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;42700:26:0;;;;;;;;;:30;;;;42739:46;;42778:6;42739:26;:46::i;:::-;42799:37;;1011:25:1;;;-1:-1:-1;;;;;42799:37:0;;;42810:10;;42799:37;;999:2:1;984:18;42799:37:0;;;;;;;41816:1028;;41786:1058;41811:3;;;;:::i;:::-;;;;41786:1058;;42855:445;42940:4;42957:12;42953:88;;-1:-1:-1;;;;;;42987:25:0;;;;;;:10;:25;;;;;:46;;;42980:53;;42953:88;-1:-1:-1;;;;;43219:25:0;;;;;;:10;:25;;;;;:36;;;;43165:40;;;;;43054:240;;43113:174;;43279:7;;43113:161;;43269:4;;43113:143;;;;:39;43230:13;43113:24;:39::i;:174::-;-1:-1:-1;;;;;43054:25:0;;;;;;:10;:25;;;;;:46;;;;:50;:240::i;43306:318::-;-1:-1:-1;;;;;43588:14:0;;;43453:4;43588:14;;;:7;:14;;;;;;;;:29;;;;;;;;;;;;;43521;;;:22;:29;;;;;:44;;;;;;;;;;43473:145;;43588:29;43473:110;;43578:4;;43473:100;;43494:72;;:22;;:26;:72::i;:::-;43473:8;;:12;:100::i;:145::-;43466:152;43306:318;-1:-1:-1;;;;;43306:318:0:o;17702:716::-;18126:23;18152:69;18180:4;18152:69;;;;;;;;;;;;;;;;;18160:5;-1:-1:-1;;;;;18152:27:0;;;:69;;;;;:::i;:::-;18236:17;;18126:95;;-1:-1:-1;18236:21:0;18232:179;;18333:10;18322:30;;;;;;;;;;;;:::i;:::-;18314:85;;;;-1:-1:-1;;;18314:85:0;;14291:2:1;18314:85:0;;;14273:21:1;14330:2;14310:18;;;14303:30;14369:34;14349:18;;;14342:62;-1:-1:-1;;;14420:18:1;;;14413:40;14470:19;;18314:85:0;14089:406:1;44827:416:0;44904:19;44945:1;44936:6;:10;:43;;;;-1:-1:-1;44950:15:0;;-1:-1:-1;;;;;44950:15:0;:29;;44936:43;:84;;;;;45008:11;-1:-1:-1;;;;;44983:37:0;:13;-1:-1:-1;;;;;44983:37:0;;;44936:84;44932:306;;;45064:13;;45031:8;;45042:36;;:17;:6;45053:5;45042:10;:17::i;:36::-;45031:47;-1:-1:-1;45104:15:0;:6;45031:47;45104:10;:15::i;:::-;45163;;45087:32;;-1:-1:-1;45128:56:0;;-1:-1:-1;;;;;45128:34:0;;;;45163:15;45180:3;45128:34;:56::i;:::-;45022:170;44932:306;;9340:229;9477:12;9509:52;9531:6;9539:4;9545:1;9548:12;9509:21;:52::i;:::-;9502:59;9340:229;-1:-1:-1;;;;9340:229:0:o;10460:510::-;10630:12;10688:5;10663:21;:30;;10655:81;;;;-1:-1:-1;;;10655:81:0;;14702:2:1;10655:81:0;;;14684:21:1;14741:2;14721:18;;;14714:30;14780:34;14760:18;;;14753:62;-1:-1:-1;;;14831:18:1;;;14824:36;14877:19;;10655:81:0;14500:402:1;10655:81:0;-1:-1:-1;;;;;6890:19:0;;;10747:60;;;;-1:-1:-1;;;10747:60:0;;15109:2:1;10747:60:0;;;15091:21:1;15148:2;15128:18;;;15121:30;15187:31;15167:18;;;15160:59;15236:18;;10747:60:0;14907:353:1;10747:60:0;10821:12;10835:23;10862:6;-1:-1:-1;;;;;10862:11:0;10881:5;10888:4;10862:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10820:73;;;;10911:51;10928:7;10937:10;10949:12;10911:16;:51::i;:::-;10904:58;10460:510;-1:-1:-1;;;;;;;10460:510:0:o;13146:762::-;13296:12;13325:7;13321:580;;;-1:-1:-1;13356:10:0;13349:17;;13321:580;13470:17;;:21;13466:424;;13718:10;13712:17;13779:15;13766:10;13762:2;13758:19;13751:44;13466:424;13861:12;13854:20;;-1:-1:-1;;;13854:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;1047:535::-;1113:3;1151:5;1145:12;1178:6;1173:3;1166:19;1204:4;1233:2;1228:3;1224:12;1217:19;;1270:2;1263:5;1259:14;1291:1;1301:256;1315:6;1312:1;1309:13;1301:256;;;1374:13;;1412:9;;1400:22;;1462:11;;1456:18;1442:12;;;1435:40;1504:4;1495:14;;;;1532:15;;;;1337:1;1330:9;1301:256;;;-1:-1:-1;1573:3:1;;1047:535;-1:-1:-1;;;;;1047:535:1:o;1587:551::-;1912:6;1901:9;1894:25;1955:6;1950:2;1939:9;1935:18;1928:34;1998:6;1993:2;1982:9;1978:18;1971:34;2041:3;2036:2;2025:9;2021:18;2014:31;1875:4;2062:70;2127:3;2116:9;2112:19;2104:6;2062:70;:::i;:::-;2054:78;1587:551;-1:-1:-1;;;;;;1587:551:1:o;2143:180::-;2202:6;2255:2;2243:9;2234:7;2230:23;2226:32;2223:52;;;2271:1;2268;2261:12;2223:52;-1:-1:-1;2294:23:1;;2143:180;-1:-1:-1;2143:180:1:o;2536:315::-;2604:6;2612;2665:2;2653:9;2644:7;2640:23;2636:32;2633:52;;;2681:1;2678;2671:12;2633:52;2720:9;2707:23;2739:31;2764:5;2739:31;:::i;:::-;2789:5;2841:2;2826:18;;;;2813:32;;-1:-1:-1;;;2536:315:1:o;3324:127::-;3385:10;3380:3;3376:20;3373:1;3366:31;3416:4;3413:1;3406:15;3440:4;3437:1;3430:15;3456:1121;3540:6;3571:2;3614;3602:9;3593:7;3589:23;3585:32;3582:52;;;3630:1;3627;3620:12;3582:52;3670:9;3657:23;3699:18;3740:2;3732:6;3729:14;3726:34;;;3756:1;3753;3746:12;3726:34;3794:6;3783:9;3779:22;3769:32;;3839:7;3832:4;3828:2;3824:13;3820:27;3810:55;;3861:1;3858;3851:12;3810:55;3897:2;3884:16;3919:2;3915;3912:10;3909:36;;;3925:18;;:::i;:::-;3971:2;3968:1;3964:10;4003:2;3997:9;4066:2;4062:7;4057:2;4053;4049:11;4045:25;4037:6;4033:38;4121:6;4109:10;4106:22;4101:2;4089:10;4086:18;4083:46;4080:72;;;4132:18;;:::i;:::-;4168:2;4161:22;4218:18;;;4252:15;;;;-1:-1:-1;4294:11:1;;;4290:20;;;4322:19;;;4319:39;;;4354:1;4351;4344:12;4319:39;4378:11;;;;4398:148;4414:6;4409:3;4406:15;4398:148;;;4480:23;4499:3;4480:23;:::i;:::-;4468:36;;4431:12;;;;4524;;;;4398:148;;;4565:6;3456:1121;-1:-1:-1;;;;;;;;3456:1121:1:o;4814:315::-;4882:6;4890;4943:2;4931:9;4922:7;4918:23;4914:32;4911:52;;;4959:1;4956;4949:12;4911:52;4995:9;4982:23;4972:33;;5055:2;5044:9;5040:18;5027:32;5068:31;5093:5;5068:31;:::i;:::-;5118:5;5108:15;;;4814:315;;;;;:::o;5134:388::-;5202:6;5210;5263:2;5251:9;5242:7;5238:23;5234:32;5231:52;;;5279:1;5276;5269:12;5231:52;5318:9;5305:23;5337:31;5362:5;5337:31;:::i;:::-;5387:5;-1:-1:-1;5444:2:1;5429:18;;5416:32;5457:33;5416:32;5457:33;:::i;6182:820::-;6409:2;6461:21;;;6531:13;;6434:18;;;6553:22;;;6380:4;;6409:2;6594;;6612:18;;;;6653:15;;;6380:4;6696:280;6710:6;6707:1;6704:13;6696:280;;;6769:13;;6811:9;;-1:-1:-1;;;;;6807:35:1;6795:48;;6883:11;;6877:18;6863:12;;;6856:40;6916:12;;;;6951:15;;;;6839:1;6725:9;6696:280;;;-1:-1:-1;6993:3:1;;6182:820;-1:-1:-1;;;;;;;6182:820:1:o;7007:407::-;7276:6;7265:9;7258:25;7319:2;7314;7303:9;7299:18;7292:30;7239:4;7339:69;7404:2;7393:9;7389:18;7381:6;7339:69;:::i;7705:127::-;7766:10;7761:3;7757:20;7754:1;7747:31;7797:4;7794:1;7787:15;7821:4;7818:1;7811:15;7837:127;7898:10;7893:3;7889:20;7886:1;7879:31;7929:4;7926:1;7919:15;7953:4;7950:1;7943:15;7969:135;8008:3;-1:-1:-1;;8029:17:1;;8026:43;;;8049:18;;:::i;:::-;-1:-1:-1;8096:1:1;8085:13;;7969:135::o;8109:168::-;8149:7;8215:1;8211;8207:6;8203:14;8200:1;8197:21;8192:1;8185:9;8178:17;8174:45;8171:71;;;8222:18;;:::i;:::-;-1:-1:-1;8262:9:1;;8109:168::o;8282:125::-;8322:4;8350:1;8347;8344:8;8341:34;;;8355:18;;:::i;:::-;-1:-1:-1;8392:9:1;;8282:125::o;10749:759::-;-1:-1:-1;;;;;11035:15:1;;;11017:34;;10967:2;11070;11088:18;;;11081:30;;;11160:13;;10952:18;;;11182:22;;;10919:4;;11261:15;;;;10989:19;;11070:2;11235;11220:18;;;10919:4;11304:178;11318:6;11315:1;11312:13;11304:178;;;11383:13;;11379:22;;11367:35;;11457:15;;;;11422:12;;;;11340:1;11333:9;11304:178;;;-1:-1:-1;11499:3:1;;10749:759;-1:-1:-1;;;;;;;;10749:759:1:o;12173:128::-;12213:3;12244:1;12240:6;12237:1;12234:13;12231:39;;;12250:18;;:::i;:::-;-1:-1:-1;12286:9:1;;12173:128::o;12306:217::-;12346:1;12372;12362:132;;12416:10;12411:3;12407:20;12404:1;12397:31;12451:4;12448:1;12441:15;12479:4;12476:1;12469:15;12362:132;-1:-1:-1;12508:9:1;;12306:217::o;13618:184::-;13688:6;13741:2;13729:9;13720:7;13716:23;13712:32;13709:52;;;13757:1;13754;13747:12;13709:52;-1:-1:-1;13780:16:1;;13618:184;-1:-1:-1;13618:184:1:o;13807:277::-;13874:6;13927:2;13915:9;13906:7;13902:23;13898:32;13895:52;;;13943:1;13940;13933:12;13895:52;13975:9;13969:16;14028:5;14021:13;14014:21;14007:5;14004:32;13994:60;;14050:1;14047;14040:12;15265:258;15337:1;15347:113;15361:6;15358:1;15355:13;15347:113;;;15437:11;;;15431:18;15418:11;;;15411:39;15383:2;15376:10;15347:113;;;15478:6;15475:1;15472:13;15469:48;;;-1:-1:-1;;15513:1:1;15495:16;;15488:27;15265:258::o;15528:274::-;15657:3;15695:6;15689:13;15711:53;15757:6;15752:3;15745:4;15737:6;15733:17;15711:53;:::i;:::-;15780:16;;;;;15528:274;-1:-1:-1;;15528:274:1:o;15807:383::-;15956:2;15945:9;15938:21;15919:4;15988:6;15982:13;16031:6;16026:2;16015:9;16011:18;16004:34;16047:66;16106:6;16101:2;16090:9;16086:18;16081:2;16073:6;16069:15;16047:66;:::i;:::-;16174:2;16153:15;-1:-1:-1;;16149:29:1;16134:45;;;;16181:2;16130:54;;15807:383;-1:-1:-1;;15807:383:1:o
Swarm Source
ipfs://ead35373d42eaff7b63748aaf12843128d4c945aff1cae0710cc81eb332fd7a6
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.