Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,458 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw ERC1155 | 16809206 | 668 days ago | IN | 0 ETH | 0.00323391 | ||||
Withdraw ERC1155 | 16561857 | 702 days ago | IN | 0 ETH | 0.00278206 | ||||
Withdraw Pool Al... | 16495641 | 712 days ago | IN | 0 ETH | 0.00150149 | ||||
Withdraw ERC1155 | 16017578 | 778 days ago | IN | 0 ETH | 0.00162045 | ||||
Withdraw ERC1155 | 15204551 | 898 days ago | IN | 0 ETH | 0.0007652 | ||||
Withdraw ERC1155 | 15204546 | 898 days ago | IN | 0 ETH | 0.00076103 | ||||
Withdraw ERC1155 | 15204544 | 898 days ago | IN | 0 ETH | 0.00073877 | ||||
Withdraw ERC1155 | 15204543 | 898 days ago | IN | 0 ETH | 0.00074237 | ||||
Withdraw ERC1155 | 15204541 | 898 days ago | IN | 0 ETH | 0.00059208 | ||||
Withdraw ERC1155 | 15204537 | 898 days ago | IN | 0 ETH | 0.00088472 | ||||
Withdraw ERC1155 | 15204536 | 898 days ago | IN | 0 ETH | 0.00083154 | ||||
Withdraw ERC1155 | 15204532 | 898 days ago | IN | 0 ETH | 0.00070416 | ||||
Withdraw ERC1155 | 15204529 | 898 days ago | IN | 0 ETH | 0.00094118 | ||||
Withdraw ERC1155 | 15204528 | 898 days ago | IN | 0 ETH | 0.00092903 | ||||
Withdraw ERC1155 | 15204527 | 898 days ago | IN | 0 ETH | 0.00100609 | ||||
Withdraw ERC1155 | 15204525 | 898 days ago | IN | 0 ETH | 0.00112328 | ||||
Withdraw ERC1155 | 15204522 | 898 days ago | IN | 0 ETH | 0.00132687 | ||||
Withdraw ERC1155 | 15204509 | 898 days ago | IN | 0 ETH | 0.00106942 | ||||
Withdraw ERC1155 | 15204482 | 898 days ago | IN | 0 ETH | 0.00170862 | ||||
Withdraw ERC1155 | 15204479 | 898 days ago | IN | 0 ETH | 0.00164838 | ||||
Withdraw ERC1155 | 15204249 | 898 days ago | IN | 0 ETH | 0.00182865 | ||||
Withdraw ERC1155 | 15202807 | 899 days ago | IN | 0 ETH | 0.00063438 | ||||
Withdraw ERC1155 | 15202807 | 899 days ago | IN | 0 ETH | 0.00072777 | ||||
Withdraw ERC1155 | 15202807 | 899 days ago | IN | 0 ETH | 0.00087358 | ||||
Withdraw ERC1155 | 15202806 | 899 days ago | IN | 0 ETH | 0.00057566 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingYao
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-31 */ pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } contract TimeUtil { uint256 private constant blockPerSecNumerator = 1; uint256 private constant blockPerSecDenominator = 13; using SafeMath for uint256; function blocksFromCurrent(uint256 targetTime) public view returns (uint256) { return toBlocks(targetTime.sub(block.timestamp)); } function blocksFromBegin(uint256 targetTime) public view returns (uint256) { return blocksFromCurrent(targetTime).add(block.number); } function toBlocks(uint256 diffTime) public pure returns (uint256) { return diffTime.mul(blockPerSecNumerator).div(blockPerSecDenominator); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } abstract contract AdminAccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; EnumerableSet.AddressSet private _adminSet; constructor() internal { _adminSet.add(_msgSender()); } function getAdministrators() public view returns (address[] memory addresses) { addresses = new address[](_adminSet.length()); for (uint256 index = 0; index < addresses.length; ++index) addresses[index] = _adminSet.at(index); } function addAdministrator(address account) public onlyAdmin { require(_adminSet.add(account), "AccessControl: account already an administrator."); } function clearAdministrator(address account) public onlyAdmin { require(_adminSet.length() > 1, "AccessControl: cannot remove last administrator."); require(_adminSet.remove(account), "AccessControl: account not an administrator."); } modifier onlyAdmin() { require(_adminSet.contains(_msgSender()), "AccessControl: require administrator account"); _; } } contract StakingBase is ReentrancyGuard, AdminAccessControl { using SafeMath for uint256; using SafeERC20 for IERC20; struct UserInfo { uint256 amount; // deposited amount uint256 rewardDebt; // reward debt for pending calculation uint256 exChanged; // total claimed token } // Info of each pool. struct PoolInfo { address tokenAddress; // address of sataking token uint256 poolPledged; // total pledged token per pool uint256 allocPoint; // How many allocation points assigned to this pool. uint256 lastRewardBlock; // Last block number that token distribution occurs. uint256 accTokenPerShare; // Accumulated token per share, times 1e12. } struct PeriodeReleases { uint256 blockOffset; // number of block from mining begin uint256 tokenPerBlock; // number of tokens release per block } // How many allocation points assigned in total. uint256 public totalAllocPoint; // periodes PeriodeReleases[] public periodes; // Tokens that will be released uint256 public miningTotal; // the beginning block of mining uint256 public miningBeginBlock; // yao token IERC20 private _yao; bool public isEmergency; // abstraction pools, which might be an ERC1155 pool, an ERC20 pool, even a CFX pool // depens on inherition PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; event Withdraw(address indexed user, uint256 indexed pId, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pId, uint256 amount); constructor(IERC20 yao_) public { _yao = yao_; isEmergency = false; } function setEmergency(bool isEmergency_) public onlyAdmin { isEmergency = isEmergency_; } /** * @dev add new pool, with alloc point * any inherited contract should call this function to create the pool */ function _add(uint256 _allocPoint, address tokenAddress) internal onlyAdmin returns (uint256) { _updateAllPools(); uint256 pid = poolInfo.length; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({tokenAddress: tokenAddress, poolPledged: 0, allocPoint: _allocPoint, lastRewardBlock: miningBeginBlock, accTokenPerShare: 0})); return pid; } /** * @dev modify an pool's alloc point. * in order to minimize inaccuracy, it should call before the pool opens or as soon as a periode is advanced */ function setAllocPoint(uint256 pId, uint256 _allocPoint) public virtual onlyAdmin { _updateAllPools(); PoolInfo storage pool = poolInfo[pId]; totalAllocPoint = totalAllocPoint.sub(pool.allocPoint).add(_allocPoint); pool.allocPoint = _allocPoint; } /** * @dev get the balance of owner's periode token */ function pendingToken(uint256 pId, address _user) external view returns (uint256) { PoolInfo memory pool = poolInfo[pId]; UserInfo memory user = userInfo[pId][_user]; uint256 accTokenPerShare = pool.accTokenPerShare; if (block.number > pool.lastRewardBlock && pool.poolPledged > 0) { uint256 yaoReward = getPoolReward(pool.lastRewardBlock, pool.allocPoint); accTokenPerShare = accTokenPerShare.add(yaoReward.mul(1e12).div(pool.poolPledged)); } return user.amount.mul(accTokenPerShare).div(1e12).sub(user.rewardDebt); } /** * @dev refresh all pool infomation, should be called before modification is maked for any pools */ function _updateAllPools() internal virtual { for (uint256 idxPool = 0; idxPool < poolInfo.length; ++idxPool) _updatePool(poolInfo[idxPool]); } /** * @dev Update reward variables of the given pool to be up-to-date. */ function _updatePool(PoolInfo storage pool) internal virtual { // if the mining is not started there is no needs to update if (block.number <= pool.lastRewardBlock) { return; } // if there is nothing in this pool if (pool.poolPledged == 0) { pool.lastRewardBlock = block.number; return; } // get reward uint256 yaoReward = getPoolReward(pool.lastRewardBlock, pool.allocPoint); // calcult accumulate token per share pool.accTokenPerShare = pool.accTokenPerShare.add(yaoReward.mul(1e12).div(pool.poolPledged)); // update pool last reward block pool.lastRewardBlock = block.number; } /** * @dev deposit token into pool * any inherited contract should call this function to make a deposit */ function _deposit(uint256 pId, uint256 _amount) internal nonReentrant returns (uint256) { PoolInfo storage pool = poolInfo[pId]; UserInfo storage user = userInfo[pId][_msgSender()]; _withdrawPool(pId, user); user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accTokenPerShare).div(1e12); pool.poolPledged = pool.poolPledged.add(_amount); return user.amount; } /** * @dev withdraw staking token from pool * any inherited contract should call this function to make a withdraw */ function _withdraw(uint256 pId, uint256 _amount) internal nonReentrant returns (uint256) { PoolInfo storage pool = poolInfo[pId]; UserInfo storage user = userInfo[pId][_msgSender()]; require(user.amount >= _amount, "StakingBase: _withdraw needs amount > user.amount"); _withdrawPool(pId, user); user.amount = user.amount.sub(_amount); user.rewardDebt = user.amount.mul(pool.accTokenPerShare).div(1e12); pool.poolPledged = pool.poolPledged.sub(_amount); return user.amount; } /** * @dev withdraw without tokens, emergency only * any inherited contract should call this function to make a emergencyWithdraw */ function _emergencyWithdraw(uint256 pId) internal nonReentrant onEmergency returns (uint256) { PoolInfo storage pool = poolInfo[pId]; UserInfo storage user = userInfo[pId][_msgSender()]; if (user.amount > 0) { user.amount = 0; user.rewardDebt = 0; pool.poolPledged = pool.poolPledged.sub(user.amount); } } /** * @dev withdraw periode token from pool(in this case is Yao) */ function withdrawPool(uint256 pId) public nonReentrant { _withdrawPool(pId, userInfo[pId][_msgSender()]); } /** * @dev withdraw periode token from every pool(in this case is Yao) */ function withdrawPoolAll() public nonReentrant { for (uint256 index = 0; index < poolInfo.length; ++index) { UserInfo storage user = userInfo[index][_msgSender()]; if (user.amount > 0) _withdrawPool(index, user); } } /** * @dev implemtation of withdraw pending tokens */ function _withdrawPool(uint256 pId, UserInfo storage user) private { PoolInfo storage pool = poolInfo[pId]; // update pool for new accTokenPerShare _updatePool(pool); // calculate pending tokens uint256 pending = user.amount.mul(pool.accTokenPerShare).div(1e12).sub(user.rewardDebt); // if has pending token, then send if (pending > 0) { safeTransferYAO(_msgSender(), pending); user.exChanged = user.exChanged.add(pending); emit Withdraw(_msgSender(), pId, pending); } // update user reward debut user.rewardDebt = user.amount.mul(pool.accTokenPerShare).div(1e12); } // Safe Yao transfer function, just in case if rounding error causes pool to not have enough tokens. function safeTransferYAO(address to, uint256 amount) internal { if (amount > 0) { uint256 acgBal = _yao.balanceOf(address(this)); if (amount > acgBal) { _yao.transfer(to, acgBal); } else { _yao.transfer(to, amount); } } } /** * @dev get pool reward */ function getPoolReward(uint256 _poolLastRewardBlock, uint256 _poolAllocPoint) internal view returns (uint256) { return getPoolReward(_poolLastRewardBlock, _poolAllocPoint, block.number); } /** * @dev get pool reward */ function getPoolReward( uint256 _poolLastRewardBlock, uint256 _poolAllocPoint, uint256 _blockNumber ) internal view returns (uint256) { if (_blockNumber < miningBeginBlock) return 0; // get offset of current block from beginning uint256 currentOffset = _blockNumber.sub(miningBeginBlock); // get offset of last reward block from beginning uint256 lasRewardBlockOffset = _poolLastRewardBlock.sub(miningBeginBlock); uint256 poolRewards = 0; // from last periode to first periode for (uint256 idx = periodes.length - 1; ; --idx) { // if last reward is later that current periode, // so we sure that lasRewardBlockOffset to currentOffset is in the same periode, // accumulate rewards then stop iterate. // if not, that lasRewardBlockOffset and currentOffset is in the different periode, // accumulate rewards and move currentOffset to the beginning of current periode, contiune to iterate PeriodeReleases memory onePeriode = periodes[idx]; if (lasRewardBlockOffset >= onePeriode.blockOffset) { poolRewards = poolRewards.add(onePeriode.tokenPerBlock * currentOffset.sub(lasRewardBlockOffset)); break; } else if (currentOffset > onePeriode.blockOffset) { poolRewards = poolRewards.add(onePeriode.tokenPerBlock * (currentOffset.sub(onePeriode.blockOffset))); currentOffset = onePeriode.blockOffset; } } // apply allocation percentage to pool reward return poolRewards.mul(_poolAllocPoint).div(totalAllocPoint); } function getBlockInfo() public view returns (uint256, uint256) { return (block.timestamp, block.number); } function estimateRewards( uint256 pId, uint256 amount, uint256 blockOffset ) public view returns (uint256 rewards) { PoolInfo memory pool = poolInfo[pId]; uint256 yaoReward = getPoolReward(block.number, pool.allocPoint, block.number.add(blockOffset)); return yaoReward.mul(amount).div(pool.poolPledged.add(amount)); } function totalReleased() public view returns (uint256) { if (block.number < miningBeginBlock) return 0; // get offset of current block from beginning uint256 currentOffset = block.number.sub(miningBeginBlock); uint256 sum = 0; for (uint256 idx = periodes.length - 1; ; --idx) { PeriodeReleases memory onePeriode = periodes[idx]; if (currentOffset > onePeriode.blockOffset) { sum = sum.add(onePeriode.tokenPerBlock * (currentOffset.sub(onePeriode.blockOffset))); currentOffset = onePeriode.blockOffset; if (idx == 0) break; } } return sum; } modifier onEmergency() { require(isEmergency, "StakingBase: not in emergency"); _; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } /** * _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { constructor() internal { _registerInterface( ERC1155Receiver(address(0)).onERC1155Received.selector ^ ERC1155Receiver(address(0)).onERC1155BatchReceived.selector ); } } /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToUintMap; * * // Declare a set state variable * EnumerableMap.UintToUintMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> uint256` (`UintToUintMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256Touint256Map) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping(bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({_key: key, _value: value})); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToUintMap struct UintToUintMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToUintMap storage map, uint256 key, uint256 value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToUintMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToUintMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), uint256(value)); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, uint256(value)); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) { return uint256(_get(map._inner, bytes32(key))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToUintMap storage map, uint256 key, string memory errorMessage ) internal view returns (uint256) { return uint256(_get(map._inner, bytes32(key), errorMessage)); } } contract StakingERC1155Receiver is ERC1155Receiver { event OnERC1155Received(address operator, address from, uint256 id, uint256 value, bytes data); event OnERC1155BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data); /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) public virtual override returns (bytes4) { //return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")); emit OnERC1155Received(operator, from, id, value, data); return this.onERC1155Received.selector; } /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) public virtual override returns (bytes4) { //return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")); emit OnERC1155BatchReceived(operator, from, ids, values, data); return this.onERC1155BatchReceived.selector; } } abstract contract StakingERC1155 is StakingBase, StakingERC1155Receiver { using SafeMath for uint256; using EnumerableMap for EnumerableMap.UintToUintMap; using EnumerableSet for EnumerableSet.UintSet; uint256 constant ERC1155StakingMax = 5; mapping(uint256 => mapping(address => EnumerableMap.UintToUintMap)) private _erc1155Pools; EnumerableSet.UintSet private _erc1155PoolIdSet; event DepositERC1155(address indexed user, uint256 indexed pid, uint256[] erc1155Id, uint256[] amount); event WithdrawERC1155(address indexed user, uint256 indexed pid, uint256[] erc1155Id, uint256[] amount); constructor() internal {} /** * @dev add a erc1155 pool */ function addERC1155Pool(uint256 _allocPoint, address _1155TokenAddr) public onlyAdmin { uint256 pId = _add(_allocPoint, _1155TokenAddr); _erc1155PoolIdSet.add(pId); } /** * @dev deposit erc1155 token to pool */ function depositERC1155( uint256 pId, uint256[] calldata erc1155Ids, uint256[] calldata amounts ) public validAsERC1155PId(pId) { require(erc1155Ids.length == amounts.length, "StakingERC1155: _ids and amounts length mismatch"); uint256 amountSum = 0; EnumerableMap.UintToUintMap storage erc1155Entities = _erc1155Pools[pId][_msgSender()]; for (uint256 index = 0; index < erc1155Ids.length; ++index) { (, uint256 count) = erc1155Entities.tryGet(erc1155Ids[index]); erc1155Entities.set(erc1155Ids[index], count.add(amounts[index])); amountSum = amountSum.add(amounts[index]); } require(_deposit(pId, amountSum) <= ERC1155StakingMax, "StakingERC1155: NFT staking count exceed its maximun"); IERC1155 tokenProdiver = IERC1155(poolInfo[pId].tokenAddress); // get token provider by id tokenProdiver.safeBatchTransferFrom(_msgSender(), address(this), erc1155Ids, amounts, ""); emit DepositERC1155(_msgSender(), pId, erc1155Ids, amounts); } /** * @dev withdraw erc1155 token from pool */ function withdrawERC1155( uint256 pId, uint256[] calldata erc1155Ids, uint256[] calldata amounts ) public validAsERC1155PId(pId) { require(erc1155Ids.length == amounts.length, "StakingERC1155: _ids and amounts length mismatch"); uint256 amountSum = 0; EnumerableMap.UintToUintMap storage erc1155Entities = _erc1155Pools[pId][_msgSender()]; for (uint256 index = 0; index < erc1155Ids.length; ++index) { uint256 id = erc1155Ids[index]; uint256 amount = amounts[index]; uint256 count = erc1155Entities.get(id); uint256 rest = count.sub(amount); if (rest > 0) erc1155Entities.set(id, rest); else erc1155Entities.remove(id); amountSum = amountSum.add(amount); } _withdraw(pId, amountSum); IERC1155 tokenProdiver = IERC1155(poolInfo[pId].tokenAddress); // get token provider by id tokenProdiver.safeBatchTransferFrom(address(this), _msgSender(), erc1155Ids, amounts, ""); emit WithdrawERC1155(_msgSender(), pId, erc1155Ids, amounts); } /** * @dev withdraw all staked erc1155 tokens in emergency, without tansfer pending tokens */ function emergencyWithdrawERC1155(uint256 pId) public onEmergency validAsERC1155PId(pId) { (uint256[] memory erc1155Ids, uint256[] memory amounts) = pledgedERC1155(pId, _msgSender()); _emergencyWithdraw(pId); IERC1155 tokenProdiver = IERC1155(poolInfo[pId].tokenAddress); // get token provider by id tokenProdiver.safeBatchTransferFrom(address(this), _msgSender(), erc1155Ids, amounts, ""); } /** * @dev get user pledgedERC1155 tokens for all pools */ function pledgedERC1155(uint256 pId, address user) public view validAsERC1155PId(pId) returns (uint256[] memory erc1155Ids, uint256[] memory amounts) { EnumerableMap.UintToUintMap storage erc1155Entities = _erc1155Pools[pId][user]; uint256 count = erc1155Entities.length(); erc1155Ids = new uint256[](count); amounts = new uint256[](count); for (uint256 index = 0; index < count; ++index) (erc1155Ids[index], amounts[index]) = erc1155Entities.at(index); } /** * @dev get all ERC1155 token pool ids */ function listERC1155PoolIds() public view returns (uint256[] memory poolIds) { poolIds = new uint256[](_erc1155PoolIdSet.length()); for (uint256 index = 0; index < poolIds.length; ++index) poolIds[index] = _erc1155PoolIdSet.at(index); } /** * @dev valid a pool id is belonged to erc 20 pool */ modifier validAsERC1155PId(uint256 pId) { require(_erc1155PoolIdSet.contains(pId), "StakingERC1155: pool id not belong to defi ERC1155"); _; } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract StakingERC721Receiver is ERC165, IERC721Receiver { constructor() internal { _registerInterface(StakingERC721Receiver(address(0)).onERC721Received.selector); } /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } abstract contract StakingERC721 is StakingBase, StakingERC721Receiver { using SafeMath for uint256; using EnumerableSet for EnumerableSet.UintSet; uint256 constant ERC721StakingMax = 5; mapping(uint256 => mapping(address => EnumerableSet.UintSet)) private erc721Pools; EnumerableSet.UintSet private erc721PoolIdSet; event DepositERC721(address indexed user, uint256 indexed pid, uint256 indexed erc721Id); event WithdrawERC721(address indexed user, uint256 indexed pid, uint256 indexed erc721Id); constructor() internal {} // Add a new erc721 token to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function addERC721Pool(uint256 _allocPoint, address _721TokenAddr) public onlyAdmin { uint256 pId = _add(_allocPoint, _721TokenAddr); erc721PoolIdSet.add(pId); } // Deposit ERC721s to MasterChef for XIAONAN allocation. function depositERC721(uint256 pId, uint256 erc721Id) public validAsERC721PId(pId) { EnumerableSet.UintSet storage erc721Entities = erc721Pools[pId][_msgSender()]; require(erc721Entities.add(erc721Id), "StakingERC721: erc721 token already deposited"); require(_deposit(pId, 1) <= ERC721StakingMax, "StakingERC721: NFT staking count exceed its maximun"); IERC721 tokenProdiver = IERC721(poolInfo[pId].tokenAddress); tokenProdiver.safeTransferFrom(_msgSender(), address(this), erc721Id); emit DepositERC721(_msgSender(), pId, erc721Id); } // Withdraw ERC721s from MasterChef. function withdrawERC721(uint256 pId, uint256 erc721Id) public validAsERC721PId(pId) { EnumerableSet.UintSet storage erc721Entities = erc721Pools[pId][_msgSender()]; require(erc721Entities.remove(erc721Id), "StakingERC721: erc721 token not existe"); _withdraw(pId, 1); IERC721 tokenProdiver = IERC721(poolInfo[pId].tokenAddress); tokenProdiver.safeTransferFrom(address(this), _msgSender(), erc721Id); emit WithdrawERC721(_msgSender(), pId, erc721Id); } /** * @dev withdraw all staked erc1155 tokens in emergency, without tansfer pending tokens */ function emergencyWithdrawERC721(uint256 pId) public onEmergency validAsERC721PId(pId) { uint256[] memory erc721Ids = pledgedERC721(pId, _msgSender()); _emergencyWithdraw(pId); IERC721 tokenProdiver = IERC721(poolInfo[pId].tokenAddress); // get token provider by id for (uint256 index = 0; index < erc721Ids.length; ++index) tokenProdiver.safeTransferFrom(address(this), _msgSender(), erc721Ids[index]); } function pledgedERC721(uint256 pId, address _user) public view validAsERC721PId(pId) returns (uint256[] memory erc721Ids) { EnumerableSet.UintSet storage erc721Entities = erc721Pools[pId][_user]; uint256 count = erc721Entities.length(); erc721Ids = new uint256[](count); for (uint256 index = 0; index < count; ++index) erc721Ids[index] = erc721Entities.at(index); } function listERC721PoolIds() public view returns (uint256[] memory poolIds) { poolIds = new uint256[](erc721PoolIdSet.length()); for (uint256 index = 0; index < poolIds.length; ++index) poolIds[index] = erc721PoolIdSet.at(index); } modifier validAsERC721PId(uint256 pId) { require(erc721PoolIdSet.contains(pId), "StakingERC721: pool id not belong to defi ERC721"); _; } } contract StakingYao is Ownable, StakingBase, StakingERC1155, StakingERC721, TimeUtil { constructor(IERC20 yao_) public StakingBase(yao_) { prodInit(); } function prodInit() private { miningBeginBlock = 12527500; //2021/05/29 13:54:19 periodes.push(PeriodeReleases({blockOffset: toBlocks(0 days), tokenPerBlock: calculeTokenPerBlock(60000 ether, 14 days)})); periodes.push(PeriodeReleases({blockOffset: toBlocks(14 days), tokenPerBlock: calculeTokenPerBlock(25000 ether, 90 days)})); periodes.push(PeriodeReleases({blockOffset: toBlocks(104 days), tokenPerBlock: calculeTokenPerBlock(10000 ether, 90 days)})); periodes.push(PeriodeReleases({blockOffset: toBlocks(194 days), tokenPerBlock: calculeTokenPerBlock(3750 ether, 90 days)})); periodes.push(PeriodeReleases({blockOffset: toBlocks(284 days), tokenPerBlock: calculeTokenPerBlock(1250 ether, 90 days)})); periodes.push(PeriodeReleases({blockOffset: toBlocks(374 days), tokenPerBlock: 0})); updateMiningTotal(); } function updateMiningTotal() private { uint256 sum = 0; for (uint256 index = 1; index < periodes.length; ++index) { sum += (periodes[index].blockOffset - periodes[index - 1].blockOffset) * periodes[index - 1].tokenPerBlock; } miningTotal = sum; } function calculeTokenPerBlock(uint256 amount, uint256 time) private pure returns (uint256) { return amount / toBlocks(time); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"yao_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"erc1155Id","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"DepositERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"erc721Id","type":"uint256"}],"name":"DepositERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"OnERC1155BatchReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"OnERC1155Received","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":"uint256","name":"pId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"erc1155Id","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"WithdrawERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"erc721Id","type":"uint256"}],"name":"WithdrawERC721","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAdministrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_1155TokenAddr","type":"address"}],"name":"addERC1155Pool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_721TokenAddr","type":"address"}],"name":"addERC721Pool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"targetTime","type":"uint256"}],"name":"blocksFromBegin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"targetTime","type":"uint256"}],"name":"blocksFromCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"clearAdministrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"uint256[]","name":"erc1155Ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"depositERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"uint256","name":"erc721Id","type":"uint256"}],"name":"depositERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"}],"name":"emergencyWithdrawERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"}],"name":"emergencyWithdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"blockOffset","type":"uint256"}],"name":"estimateRewards","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdministrators","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEmergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listERC1155PoolIds","outputs":[{"internalType":"uint256[]","name":"poolIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listERC721PoolIds","outputs":[{"internalType":"uint256[]","name":"poolIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningBeginBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"periodes","outputs":[{"internalType":"uint256","name":"blockOffset","type":"uint256"},{"internalType":"uint256","name":"tokenPerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"pledgedERC1155","outputs":[{"internalType":"uint256[]","name":"erc1155Ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pledgedERC721","outputs":[{"internalType":"uint256[]","name":"erc721Ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"poolPledged","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"setAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isEmergency_","type":"bool"}],"name":"setEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"diffTime","type":"uint256"}],"name":"toBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"exChanged","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"uint256[]","name":"erc1155Ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"},{"internalType":"uint256","name":"erc721Id","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pId","type":"uint256"}],"name":"withdrawPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPoolAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200435838038062004358833981810160405260208110156200003757600080fd5b50516001600090815581906200004c6200012d565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000be620000a86200012d565b60026200013160201b6200299f1790919060201c565b50600880546001600160a01b0319166001600160a01b03929092169190911760ff60a01b19169055620000f86301ffc9a760e01b62000151565b6200010a630271189760e51b62000151565b6200011c630a85bd0160e11b62000151565b62000126620001d6565b5062000625565b3390565b600062000148836001600160a01b0384166200041f565b90505b92915050565b6001600160e01b03198082161415620001b1576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600b60205260409020805460ff19166001179055565b62bf278c6007556040805180820190915260059080620001f760006200046e565b815260200162000215690cb49b44ba602d80000062127500620004a5565b905281546001818101845560009384526020938490208351600290930201918255929091015191015560408051808201909152600590806200025a621275006200046e565b81526020016200027869054b40b1f852bda000006276a700620004a5565b90528154600181810184556000938452602093849020835160029093020191825592909101519101556040805180820190915260059080620002bd62891c006200046e565b8152602001620002db69021e19e0c9bab24000006276a700620004a5565b905281546001818101845560009384526020938490208351600290930201918255929091015191015560408051808201909152600590806200032062ffc3006200046e565b81526020016200033d68cb49b44ba602d800006276a700620004a5565b90528154600181810184556000938452602093849020835160029093020191825592909101519101556040805180820190915260059080620003836301766a006200046e565b8152602001620003a06843c33c1937564800006276a700620004a5565b90528154600181810184556000938452602093849020835160029093020191825592909101519101556040805180820190915260059080620003e66301ed11006200046e565b8152600060209182018190528354600181810186559482529082902083516002909202019081559101519101556200041d620004c3565b565b60006200042d83836200054e565b62000465575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200014b565b5060006200014b565b60006200014b600d620004916001856200056660201b620029b41790919060201c565b620005c460201b62002a0d1790919060201c565b6000620004b2826200046e565b8381620004bb57fe5b049392505050565b600060015b600554811015620005485760056001820381548110620004e457fe5b906000526020600020906002020160010154600560018303815481106200050757fe5b906000526020600020906002020160000154600583815481106200052757fe5b600091825260209091206002909102015403029190910190600101620004c8565b50600655565b60009081526001919091016020526040902054151590565b60008262000577575060006200014b565b828202828482816200058557fe5b0414620001485760405162461bcd60e51b8152600401808060200182810382526021815260200180620043376021913960400191505060405180910390fd5b60008082116200061b576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381620004bb57fe5b613d0280620006356000396000f3fe608060405234801561001057600080fd5b50600436106102475760003560e01c806389ffb5251161013b578063d925e8d5116100b8578063e33b7de31161007c578063e33b7de314610a97578063e80d921714610a9f578063e935230714610ac2578063f23a6e6114610aeb578063f2fde38b14610b7e57610247565b8063d925e8d5146109f1578063dcd56a5a14610a0e578063ddd4c23814610a2b578063de8f8d2b14610a57578063e09a060814610a7a57610247565b8063b65fbe4d116100ff578063b65fbe4d146107ab578063b96edadf146107d7578063bc197c81146107df578063bfe3253b14610906578063c9991176146109cb57610247565b806389ffb525146106f25780638da5cb5b1461071857806393f1a40b1461073c578063a7947a0f14610786578063b5d180ba1461078e57610247565b806348e43af4116101c957806361ee4bdf1161018d57806361ee4bdf146105f2578063650a389b146105fa5780636e92f992146106bf578063715018a6146106c75780637646354e146106cf57610247565b806348e43af4146105415780634c034ea91461056d578063543b36931461058a57806355c33a89146105e25780635f9e8f82146105ea57610247565b80631526fe27116102105780631526fe271461046f57806317caf6f1146104c15780631fa838de146104db5780632fe7fb4e146104f8578063489b76e61461051557610247565b80628194391461024c57806301ffc9a71461026d5780630501d556146102a8578063074bcdae146102c9578063150b7a021461038e575b600080fd5b610254610ba4565b6040805192835260208301919091528051918290030190f35b6102946004803603602081101561028357600080fd5b50356001600160e01b031916610baa565b604080519115158252519081900360200190f35b6102c7600480360360208110156102be57600080fd5b50351515610bc9565b005b6102c7600480360360608110156102df57600080fd5b81359190810190604081016020820135600160201b81111561030057600080fd5b82018360208201111561031257600080fd5b803590602001918460208302840111600160201b8311171561033357600080fd5b919390929091602081019035600160201b81111561035057600080fd5b82018360208201111561036257600080fd5b803590602001918460208302840111600160201b8311171561038357600080fd5b509092509050610c35565b610452600480360360808110156103a457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156103de57600080fd5b8201836020820111156103f057600080fd5b803590602001918460018302840111600160201b8311171561041157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fb4945050505050565b604080516001600160e01b03199092168252519081900360200190f35b61048c6004803603602081101561048557600080fd5b5035610fc4565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b6104c961100c565b60408051918252519081900360200190f35b6102c7600480360360208110156104f157600080fd5b5035611012565b6102546004803603602081101561050e57600080fd5b50356111b6565b6102c76004803603604081101561052b57600080fd5b50803590602001356001600160a01b03166111e1565b6104c96004803603604081101561055757600080fd5b50803590602001356001600160a01b0316611246565b6102c76004803603602081101561058357600080fd5b50356113a9565b61059261143e565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105ce5781810151838201526020016105b6565b505050509050019250505060405180910390f35b6105926114d4565b610294611559565b6104c9611569565b6106266004803603604081101561061057600080fd5b50803590602001356001600160a01b031661156f565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561066a578181015183820152602001610652565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106a9578181015183820152602001610691565b5050505090500194505050505060405180910390f35b6105926116c5565b6102c761174a565b6102c7600480360360408110156106e557600080fd5b5080359060200135611808565b6102c76004803603602081101561070857600080fd5b50356001600160a01b03166119c1565b610720611a98565b604080516001600160a01b039092168252519081900360200190f35b6107686004803603604081101561075257600080fd5b50803590602001356001600160a01b0316611aa8565b60408051938452602084019290925282820152519081900360600190f35b6102c7611ad4565b6104c9600480360360208110156107a457600080fd5b5035611b79565b610592600480360360408110156107c157600080fd5b50803590602001356001600160a01b0316611b8d565b6104c9611c86565b610452600480360360a08110156107f557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b919390929091602081019035600160201b81111561087857600080fd5b82018360208201111561088a57600080fd5b803590602001918460208302840111600160201b831117156108ab57600080fd5b919390929091602081019035600160201b8111156108c857600080fd5b8201836020820111156108da57600080fd5b803590602001918460018302840111600160201b831117156108fb57600080fd5b509092509050611c8c565b6102c76004803603606081101561091c57600080fd5b81359190810190604081016020820135600160201b81111561093d57600080fd5b82018360208201111561094f57600080fd5b803590602001918460208302840111600160201b8311171561097057600080fd5b919390929091602081019035600160201b81111561098d57600080fd5b82018360208201111561099f57600080fd5b803590602001918460208302840111600160201b831117156109c057600080fd5b509092509050611d84565b6102c7600480360360208110156109e157600080fd5b50356001600160a01b03166120b8565b6104c960048036036020811015610a0757600080fd5b5035612144565b6102c760048036036020811015610a2457600080fd5b5035612159565b6102c760048036036040811015610a4157600080fd5b50803590602001356001600160a01b0316612368565b6102c760048036036040811015610a6d57600080fd5b50803590602001356123c7565b6104c960048036036020811015610a9057600080fd5b50356125be565b6104c96125d0565b6102c760048036036040811015610ab557600080fd5b5080359060200135612699565b6104c960048036036060811015610ad857600080fd5b508035906020810135906040013561272d565b610452600480360360a0811015610b0157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460018302840111600160201b83111715610b7357600080fd5b5090925090506127e3565b6102c760048036036020811015610b9457600080fd5b50356001600160a01b031661288a565b42439091565b6001600160e01b0319166000908152600b602052604090205460ff1690565b610bdc610bd4612a74565b600290612a78565b610c175760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b60088054911515600160a01b0260ff60a01b19909216919091179055565b84610c41600d82612a8d565b610c7c5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b838214610cba5760405162461bcd60e51b81526004018080602001828103825260308152602001806139ed6030913960400191505060405180910390fd5b6000868152600c60205260408120819081610cd3612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020905060005b86811015610d9e576000610d27898984818110610d1157fe5b9050602002013584612a9990919063ffffffff16565b915050610d6d898984818110610d3957fe5b90506020020135610d65898986818110610d4f57fe5b9050602002013584612ab790919063ffffffff16565b859190612b11565b50610d93878784818110610d7d57fe5b9050602002013585612ab790919063ffffffff16565b935050600101610cf8565b506005610dab8984612b26565b1115610de85760405162461bcd60e51b8152600401808060200182810382526034815260200180613b446034913960400191505060405180910390fd5b600060098981548110610df757fe5b60009182526020909120600590910201546001600160a01b0316905080632eb2c2d6610e21612a74565b308b8b8b8b6040518763ffffffff1660e01b815260040180876001600160a01b03168152602001866001600160a01b031681526020018060200180602001806020018481038452888882818152602001925060200280828437600083820152601f01601f19169091018581038452868152602090810191508790870280828437600081840152601f19601f8201169050808301925050508481038252600081526020016020019950505050505050505050600060405180830381600087803b158015610eec57600080fd5b505af1158015610f00573d6000803e3d6000fd5b5050505088610f0d612a74565b6001600160a01b03167f53e5c2d672f4dc9eb32be58b840a3ae422d22b206c994f01d917716d21a39e288a8a8a8a6040518080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039850909650505050505050a3505050505050505050565b630a85bd0160e11b949350505050565b60098181548110610fd157fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60045481565b600854600160a01b900460ff16611070576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e67426173653a206e6f7420696e20656d657267656e6379000000604482015290519081900360640190fd5b8061107c601082612a8d565b6110b75760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b60606110ca836110c5612a74565b611b8d565b90506110d583612c29565b506000600984815481106110e557fe5b600091825260208220600590910201546001600160a01b031691505b82518110156111af57816001600160a01b03166342842e0e30611122612a74565b86858151811061112e57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561118c57600080fd5b505af11580156111a0573d6000803e3d6000fd5b50505050806001019050611101565b5050505050565b600581815481106111c357fe5b60009182526020909120600290910201805460019091015490915082565b6111ec610bd4612a74565b6112275760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b60006112338383612d58565b9050611240600d82612edd565b50505050565b6000611250613979565b6009848154811061125d57fe5b60009182526020918290206040805160a081018252600590930290910180546001600160a01b0316835260018101549383019390935260028301549082015260038201546060820152600490910154608082015290506112bb6139b1565b506000848152600a602090815260408083206001600160a01b0387168452825291829020825160608082018552825482526001830154938201939093526002909101549281019290925260808301519083015143118015611320575060008360200151115b1561136f57600061133984606001518560400151612ee9565b905061136b611364856020015161135e64e8d4a51000856129b490919063ffffffff16565b90612a0d565b8390612ab7565b9150505b61139d826020015161139764e8d4a5100061135e8587600001516129b490919063ffffffff16565b90612ef6565b93505050505b92915050565b600260005414156113ef576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b60026000908155818152600a6020526040812061143691839190611411612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020612f53565b506001600055565b606061144a6002613049565b67ffffffffffffffff8111801561146057600080fd5b5060405190808252806020026020018201604052801561148a578160200160208202803683370190505b50905060005b81518110156114d0576114a4600282613054565b8282815181106114b057fe5b6001600160a01b0390921660209283029190910190910152600101611490565b5090565b60606114e0600d613049565b67ffffffffffffffff811180156114f657600080fd5b50604051908082528060200260200182016040528015611520578160200160208202803683370190505b50905060005b81518110156114d05761153a600d82613054565b82828151811061154657fe5b6020908102919091010152600101611526565b600854600160a01b900460ff1681565b60075481565b6060808361157e600d82612a8d565b6115b95760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b6000858152600c602090815260408083206001600160a01b03881684529091528120906115e582613049565b90508067ffffffffffffffff811180156115fe57600080fd5b50604051908082528060200260200182016040528015611628578160200160208202803683370190505b5094508067ffffffffffffffff8111801561164257600080fd5b5060405190808252806020026020018201604052801561166c578160200160208202803683370190505b50935060005b818110156116ba576116848382613060565b87838151811061169057fe5b602002602001018784815181106116a357fe5b602090810291909101019190915252600101611672565b505050509250929050565b60606116d16010613049565b67ffffffffffffffff811180156116e757600080fd5b50604051908082528060200260200182016040528015611711578160200160208202803683370190505b50905060005b81518110156114d05761172b601082613054565b82828151811061173757fe5b6020908102919091010152600101611717565b611752612a74565b6001600160a01b0316611763611a98565b6001600160a01b0316146117be576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b81611814601082612a8d565b61184f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b6000838152600f6020526040812081611866612a74565b6001600160a01b031681526020810191909152604001600020905061188b818461306f565b6118c65760405162461bcd60e51b8152600401808060200182810382526026815260200180613c186026913960400191505060405180910390fd5b6118d184600161307b565b506000600985815481106118e157fe5b60009182526020909120600590910201546001600160a01b03169050806342842e0e3061190c612a74565b876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561196357600080fd5b505af1158015611977573d6000803e3d6000fd5b505050508385611985612a74565b6001600160a01b03167f3bef01a072a1ecbad87afff2d6e4629df7a37805ddc4572aad8f62c7c2ad52f360405160405180910390a45050505050565b6119cc610bd4612a74565b611a075760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b6001611a136002613049565b11611a4f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613c3e6030913960400191505060405180910390fd5b611a5a6002826131ad565b611a955760405162461bcd60e51b815260040180806020018281038252602c815260200180613ca1602c913960400191505060405180910390fd5b50565b6001546001600160a01b03165b90565b600a60209081526000928352604080842090915290825290208054600182015460029092015490919083565b60026000541415611b1a576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b600260009081555b600954811015611436576000818152600a6020526040812081611b43612a74565b6001600160a01b031681526020810191909152604001600020805490915015611b7057611b708282612f53565b50600101611b22565b60006113a3611b888342612ef6565b6125be565b606082611b9b601082612a8d565b611bd65760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b6000848152600f602090815260408083206001600160a01b0387168452909152812090611c0282613049565b90508067ffffffffffffffff81118015611c1b57600080fd5b50604051908082528060200260200182016040528015611c45578160200160208202803683370190505b50935060005b81811015611c7c57611c5d8382613054565b858281518110611c6957fe5b6020908102919091010152600101611c4b565b5050505092915050565b60065481565b60007fa95787898028339dbd3724f68a0fe67d2aa08e417ea89cbd0b391eed874510ae898989898989898960405180896001600160a01b03168152602001886001600160a01b0316815260200180602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f01601f19169091018581038452888152602090810191508990890280828437600083820152601f01601f191690910185810383528681526020019050868680828437600083820152604051601f909101601f19169092018290039d50909b505050505050505050505050a15063bc197c8160e01b98975050505050505050565b84611d90600d82612a8d565b611dcb5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b838214611e095760405162461bcd60e51b81526004018080602001828103825260308152602001806139ed6030913960400191505060405180910390fd5b6000868152600c60205260408120819081611e22612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020905060005b86811015611ee0576000888883818110611e5d57fe5b9050602002013590506000878784818110611e7457fe5b9050602002013590506000611e9283866131c290919063ffffffff16565b90506000611ea08284612ef6565b90508015611eb957611eb3868583612b11565b50611ec5565b611ec386856131ce565b505b611ecf8784612ab7565b965050505050806001019050611e47565b50611eeb888361307b565b50600060098981548110611efb57fe5b60009182526020909120600590910201546001600160a01b0316905080632eb2c2d630611f26612a74565b8b8b8b8b6040518763ffffffff1660e01b815260040180876001600160a01b03168152602001866001600160a01b031681526020018060200180602001806020018481038452888882818152602001925060200280828437600083820152601f01601f19169091018581038452868152602090810191508790870280828437600081840152601f19601f8201169050808301925050508481038252600081526020016020019950505050505050505050600060405180830381600087803b158015611ff057600080fd5b505af1158015612004573d6000803e3d6000fd5b5050505088612011612a74565b6001600160a01b03167f56dd705f3ee56863e341773c7e3fa0d872b7565671d4b4a2c1cc2aa449edc9608a8a8a8a6040518080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039850909650505050505050a3505050505050505050565b6120c3610bd4612a74565b6120fe5760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b61210960028261299f565b611a955760405162461bcd60e51b8152600401808060200182810382526030815260200180613a5f6030913960400191505060405180910390fd5b60006113a34361215384611b79565b90612ab7565b600854600160a01b900460ff166121b7576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e67426173653a206e6f7420696e20656d657267656e6379000000604482015290519081900360640190fd5b806121c3600d82612a8d565b6121fe5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b6060806122128461220d612a74565b61156f565b9150915061221f84612c29565b5060006009858154811061222f57fe5b60009182526020909120600590910201546001600160a01b0316905080632eb2c2d63061225a612a74565b86866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b03168152602001806020018060200180602001848103845286818151815260200191508051906020019060200280838360005b838110156122d15781810151838201526020016122b9565b50505050905001848103835285818151815260200191508051906020019060200280838360005b838110156123105781810151838201526020016122f8565b50505050905001848103825260008152602001602001975050505050505050600060405180830381600087803b15801561234957600080fd5b505af115801561235d573d6000803e3d6000fd5b505050505050505050565b612373610bd4612a74565b6123ae5760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b60006123ba8383612d58565b9050611240601082612edd565b816123d3601082612a8d565b61240e5760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b6000838152600f6020526040812081612425612a74565b6001600160a01b031681526020810191909152604001600020905061244a8184612edd565b6124855760405162461bcd60e51b815260040180806020018281038252602d815260200180613beb602d913960400191505060405180910390fd5b6005612492856001612b26565b11156124cf5760405162461bcd60e51b8152600401808060200182810382526033815260200180613c6e6033913960400191505060405180910390fd5b6000600985815481106124de57fe5b60009182526020909120600590910201546001600160a01b03169050806342842e0e612508612a74565b30876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561256057600080fd5b505af1158015612574573d6000803e3d6000fd5b505050508385612582612a74565b6001600160a01b03167f62664f742cc1a00f450f78762925f50d0fdc6ded2493b4513468e9961385582360405160405180910390a45050505050565b60006113a3600d61135e8460016129b4565b60006007544310156125e457506000611aa5565b60006125fb60075443612ef690919063ffffffff16565b600554909150600090600019015b6126116139d2565b6005828154811061261e57fe5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905080600001518411156126885780516126779061266a908690612ef6565b6020830151859102612ab7565b815194509250816126885750612692565b5060001901612609565b5091505090565b6126a4610bd4612a74565b6126df5760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b6126e76131da565b6000600983815481106126f657fe5b90600052602060002090600502019050612723826121538360020154600454612ef690919063ffffffff16565b6004556002015550565b6000612737613979565b6009858154811061274457fe5b600091825260208083206040805160a081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083018190526003820154606084015260049091015460808301529092506127b19043906127ac8288612ab7565b613212565b90506127d76127cd868460200151612ab790919063ffffffff16565b61135e83886129b4565b925050505b9392505050565b60007f0901a3ed9ae64cf4d597435958a8b218a4ecf389645495b545bed5403e4383ab87878787878760405180876001600160a01b03168152602001866001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003995090975050505050505050a15063f23a6e6160e01b9695505050505050565b612892612a74565b6001600160a01b03166128a3611a98565b6001600160a01b0316146128fe576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166129435760405162461bcd60e51b8152600401808060200182810382526026815260200180613aed6026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006127dc836001600160a01b038416613310565b6000826129c3575060006113a3565b828202828482816129d057fe5b04146127dc5760405162461bcd60e51b8152600401808060200182810382526021815260200180613bca6021913960400191505060405180910390fd5b6000808211612a63576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a6c57fe5b049392505050565b3390565b60006127dc836001600160a01b03841661335a565b60006127dc838361335a565b6000808080612aa88686613372565b909450925050505b9250929050565b6000828201838110156127dc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612b1e8484846133c9565b949350505050565b600060026000541415612b6e576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b600260009081556009805485908110612b8357fe5b60009182526020808320878452600a90915260408320600590920201925081612baa612a74565b6001600160a01b03166001600160a01b031681526020019081526020016000209050612bd68582612f53565b8054612be29085612ab7565b8082556004830154612bff9164e8d4a510009161135e91906129b4565b600180830191909155820154612c159085612ab7565b600192830155546000919091559392505050565b600060026000541415612c71576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b6002600055600854600160a01b900460ff16612cd4576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e67426173653a206e6f7420696e20656d657267656e6379000000604482015290519081900360640190fd5b600060098381548110612ce357fe5b60009182526020808320868452600a90915260408320600590920201925081612d0a612a74565b6001600160a01b031681526020810191909152604001600020805490915015612d4c5760008082556001808301829055830154612d4691612ef6565b60018301555b50506001600055919050565b6000612d65610bd4612a74565b612da05760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b612da86131da565b600954600454612db89085612ab7565b6004556040805160a0810182526001600160a01b039485168152600060208201818152928201968752600754606083019081526080830182815260098054600181018255935292517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af600590930292830180546001600160a01b031916919098161790965591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b083015594517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b182015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b284015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b3909201919091555090565b60006127dc8383613310565b60006127dc838343613212565b600082821115612f4d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600060098381548110612f6257fe5b90600052602060002090600502019050612f7b81613460565b6000612fa9836001015461139764e8d4a5100061135e866004015488600001546129b490919063ffffffff16565b9050801561302057612fc2612fbc612a74565b826134d7565b6002830154612fd19082612ab7565b600284015583612fdf612a74565b6001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568836040518082815260200191505060405180910390a35b6004820154835461303b9164e8d4a510009161135e916129b4565b836001018190555050505050565b60006113a38261366c565b60006127dc8383613670565b6000808080612aa886866136d4565b60006127dc838361374f565b6000600260005414156130c3576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b6002600090815560098054859081106130d857fe5b60009182526020808320878452600a909152604083206005909202019250816130ff612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020905083816000015410156131645760405162461bcd60e51b8152600401808060200182810382526031815260200180613b136031913960400191505060405180910390fd5b61316e8582612f53565b805461317a9085612ef6565b80825560048301546131979164e8d4a510009161135e91906129b4565b600180830191909155820154612c159085612ef6565b60006127dc836001600160a01b03841661374f565b60006127dc8383613815565b60006127dc83836138a5565b60005b600954811015611a955761320a600982815481106131f757fe5b9060005260206000209060050201613460565b6001016131dd565b6000600754821015613226575060006127dc565b600061323d60075484612ef690919063ffffffff16565b9050600061325660075487612ef690919063ffffffff16565b600554909150600090600019015b61326c6139d2565b6005828154811061327957fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050806000015184106132c8576132c061266a8686612ef6565b9250506132f3565b80518511156132e95780516132e29061266a908790612ef6565b8151955092505b5060001901613264565b506004546133059061135e83896129b4565b979650505050505050565b600061331c838361335a565b613352575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556113a3565b5060006113a3565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054819080613397575060009150819050612ab0565b60018560000160018303815481106133ab57fe5b90600052602060002090600202016001015492509250509250929050565b60008281526001840160205260408120548061342e5750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556127dc565b8285600001600183038154811061344157fe5b90600052602060002090600202016001018190555060009150506127dc565b8060030154431161347057611a95565b600181015461348457436003820155611a95565b600061349882600301548360020154612ee9565b90506134c86134bd836001015461135e64e8d4a51000856129b490919063ffffffff16565b600484015490612ab7565b60048301555043600382015550565b801561366857600854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561352857600080fd5b505afa15801561353c573d6000803e3d6000fd5b505050506040513d602081101561355257600080fd5b50519050808211156135e6576008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156135b457600080fd5b505af11580156135c8573d6000803e3d6000fd5b505050506040513d60208110156135de57600080fd5b506136669050565b6008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561363c57600080fd5b505af1158015613650573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b505b5050565b5490565b815460009082106136b25760405162461bcd60e51b8152600401808060200182810382526022815260200180613a1d6022913960400191505060405180910390fd5b8260000182815481106136c157fe5b9060005260206000200154905092915050565b8154600090819083106137185760405162461bcd60e51b8152600401808060200182810382526022815260200180613b786022913960400191505060405180910390fd5b600084600001848154811061372957fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000818152600183016020526040812054801561380b578354600019808301919081019060009087908390811061378257fe5b906000526020600020015490508087600001848154811061379f57fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806137cf57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506113a3565b60009150506113a3565b600081815260018301602052604081205480613878576040805162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015290519081900360640190fd5b83600001600182038154811061388a57fe5b90600052602060002090600202016001015491505092915050565b6000818152600183016020526040812054801561380b57835460001980830191908101906000908790839081106138d857fe5b90600052602060002090600202019050808760000184815481106138f857fe5b60009182526020808320845460029093020191825560019384015491840191909155835482528983019052604090209084019055865487908061393757fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506113a39350505050565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b60405180604001604052806000815260200160008152509056fe5374616b696e67455243313135353a205f69647320616e6420616d6f756e7473206c656e677468206d69736d61746368456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64735265656e7472616e637947756172643a207265656e7472616e742063616c6c00416363657373436f6e74726f6c3a206163636f756e7420616c726561647920616e2061646d696e6973747261746f722e5374616b696e67455243313135353a20706f6f6c206964206e6f742062656c6f6e6720746f20646566692045524331313535416363657373436f6e74726f6c3a20726571756972652061646d696e6973747261746f72206163636f756e744f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67426173653a205f7769746864726177206e6565647320616d6f756e74203e20757365722e616d6f756e745374616b696e67455243313135353a204e4654207374616b696e6720636f756e742065786365656420697473206d6178696d756e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64735374616b696e674552433732313a20706f6f6c206964206e6f742062656c6f6e6720746f206465666920455243373231536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e674552433732313a2065726337323120746f6b656e20616c7265616479206465706f73697465645374616b696e674552433732313a2065726337323120746f6b656e206e6f7420657869737465416363657373436f6e74726f6c3a2063616e6e6f742072656d6f7665206c6173742061646d696e6973747261746f722e5374616b696e674552433732313a204e4654207374616b696e6720636f756e742065786365656420697473206d6178696d756e416363657373436f6e74726f6c3a206163636f756e74206e6f7420616e2061646d696e6973747261746f722ea264697066735822122010485f3d0de5014989abf966fb0eeb07b4c847f10193f4b1d54a544ee0fcbe4e64736f6c634300060c0033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f770000000000000000000000008e04dfb7dc6d8f2c9d12392dc6d1fe188701e52e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102475760003560e01c806389ffb5251161013b578063d925e8d5116100b8578063e33b7de31161007c578063e33b7de314610a97578063e80d921714610a9f578063e935230714610ac2578063f23a6e6114610aeb578063f2fde38b14610b7e57610247565b8063d925e8d5146109f1578063dcd56a5a14610a0e578063ddd4c23814610a2b578063de8f8d2b14610a57578063e09a060814610a7a57610247565b8063b65fbe4d116100ff578063b65fbe4d146107ab578063b96edadf146107d7578063bc197c81146107df578063bfe3253b14610906578063c9991176146109cb57610247565b806389ffb525146106f25780638da5cb5b1461071857806393f1a40b1461073c578063a7947a0f14610786578063b5d180ba1461078e57610247565b806348e43af4116101c957806361ee4bdf1161018d57806361ee4bdf146105f2578063650a389b146105fa5780636e92f992146106bf578063715018a6146106c75780637646354e146106cf57610247565b806348e43af4146105415780634c034ea91461056d578063543b36931461058a57806355c33a89146105e25780635f9e8f82146105ea57610247565b80631526fe27116102105780631526fe271461046f57806317caf6f1146104c15780631fa838de146104db5780632fe7fb4e146104f8578063489b76e61461051557610247565b80628194391461024c57806301ffc9a71461026d5780630501d556146102a8578063074bcdae146102c9578063150b7a021461038e575b600080fd5b610254610ba4565b6040805192835260208301919091528051918290030190f35b6102946004803603602081101561028357600080fd5b50356001600160e01b031916610baa565b604080519115158252519081900360200190f35b6102c7600480360360208110156102be57600080fd5b50351515610bc9565b005b6102c7600480360360608110156102df57600080fd5b81359190810190604081016020820135600160201b81111561030057600080fd5b82018360208201111561031257600080fd5b803590602001918460208302840111600160201b8311171561033357600080fd5b919390929091602081019035600160201b81111561035057600080fd5b82018360208201111561036257600080fd5b803590602001918460208302840111600160201b8311171561038357600080fd5b509092509050610c35565b610452600480360360808110156103a457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156103de57600080fd5b8201836020820111156103f057600080fd5b803590602001918460018302840111600160201b8311171561041157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fb4945050505050565b604080516001600160e01b03199092168252519081900360200190f35b61048c6004803603602081101561048557600080fd5b5035610fc4565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b6104c961100c565b60408051918252519081900360200190f35b6102c7600480360360208110156104f157600080fd5b5035611012565b6102546004803603602081101561050e57600080fd5b50356111b6565b6102c76004803603604081101561052b57600080fd5b50803590602001356001600160a01b03166111e1565b6104c96004803603604081101561055757600080fd5b50803590602001356001600160a01b0316611246565b6102c76004803603602081101561058357600080fd5b50356113a9565b61059261143e565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105ce5781810151838201526020016105b6565b505050509050019250505060405180910390f35b6105926114d4565b610294611559565b6104c9611569565b6106266004803603604081101561061057600080fd5b50803590602001356001600160a01b031661156f565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561066a578181015183820152602001610652565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106a9578181015183820152602001610691565b5050505090500194505050505060405180910390f35b6105926116c5565b6102c761174a565b6102c7600480360360408110156106e557600080fd5b5080359060200135611808565b6102c76004803603602081101561070857600080fd5b50356001600160a01b03166119c1565b610720611a98565b604080516001600160a01b039092168252519081900360200190f35b6107686004803603604081101561075257600080fd5b50803590602001356001600160a01b0316611aa8565b60408051938452602084019290925282820152519081900360600190f35b6102c7611ad4565b6104c9600480360360208110156107a457600080fd5b5035611b79565b610592600480360360408110156107c157600080fd5b50803590602001356001600160a01b0316611b8d565b6104c9611c86565b610452600480360360a08110156107f557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b919390929091602081019035600160201b81111561087857600080fd5b82018360208201111561088a57600080fd5b803590602001918460208302840111600160201b831117156108ab57600080fd5b919390929091602081019035600160201b8111156108c857600080fd5b8201836020820111156108da57600080fd5b803590602001918460018302840111600160201b831117156108fb57600080fd5b509092509050611c8c565b6102c76004803603606081101561091c57600080fd5b81359190810190604081016020820135600160201b81111561093d57600080fd5b82018360208201111561094f57600080fd5b803590602001918460208302840111600160201b8311171561097057600080fd5b919390929091602081019035600160201b81111561098d57600080fd5b82018360208201111561099f57600080fd5b803590602001918460208302840111600160201b831117156109c057600080fd5b509092509050611d84565b6102c7600480360360208110156109e157600080fd5b50356001600160a01b03166120b8565b6104c960048036036020811015610a0757600080fd5b5035612144565b6102c760048036036020811015610a2457600080fd5b5035612159565b6102c760048036036040811015610a4157600080fd5b50803590602001356001600160a01b0316612368565b6102c760048036036040811015610a6d57600080fd5b50803590602001356123c7565b6104c960048036036020811015610a9057600080fd5b50356125be565b6104c96125d0565b6102c760048036036040811015610ab557600080fd5b5080359060200135612699565b6104c960048036036060811015610ad857600080fd5b508035906020810135906040013561272d565b610452600480360360a0811015610b0157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460018302840111600160201b83111715610b7357600080fd5b5090925090506127e3565b6102c760048036036020811015610b9457600080fd5b50356001600160a01b031661288a565b42439091565b6001600160e01b0319166000908152600b602052604090205460ff1690565b610bdc610bd4612a74565b600290612a78565b610c175760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b60088054911515600160a01b0260ff60a01b19909216919091179055565b84610c41600d82612a8d565b610c7c5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b838214610cba5760405162461bcd60e51b81526004018080602001828103825260308152602001806139ed6030913960400191505060405180910390fd5b6000868152600c60205260408120819081610cd3612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020905060005b86811015610d9e576000610d27898984818110610d1157fe5b9050602002013584612a9990919063ffffffff16565b915050610d6d898984818110610d3957fe5b90506020020135610d65898986818110610d4f57fe5b9050602002013584612ab790919063ffffffff16565b859190612b11565b50610d93878784818110610d7d57fe5b9050602002013585612ab790919063ffffffff16565b935050600101610cf8565b506005610dab8984612b26565b1115610de85760405162461bcd60e51b8152600401808060200182810382526034815260200180613b446034913960400191505060405180910390fd5b600060098981548110610df757fe5b60009182526020909120600590910201546001600160a01b0316905080632eb2c2d6610e21612a74565b308b8b8b8b6040518763ffffffff1660e01b815260040180876001600160a01b03168152602001866001600160a01b031681526020018060200180602001806020018481038452888882818152602001925060200280828437600083820152601f01601f19169091018581038452868152602090810191508790870280828437600081840152601f19601f8201169050808301925050508481038252600081526020016020019950505050505050505050600060405180830381600087803b158015610eec57600080fd5b505af1158015610f00573d6000803e3d6000fd5b5050505088610f0d612a74565b6001600160a01b03167f53e5c2d672f4dc9eb32be58b840a3ae422d22b206c994f01d917716d21a39e288a8a8a8a6040518080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039850909650505050505050a3505050505050505050565b630a85bd0160e11b949350505050565b60098181548110610fd157fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60045481565b600854600160a01b900460ff16611070576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e67426173653a206e6f7420696e20656d657267656e6379000000604482015290519081900360640190fd5b8061107c601082612a8d565b6110b75760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b60606110ca836110c5612a74565b611b8d565b90506110d583612c29565b506000600984815481106110e557fe5b600091825260208220600590910201546001600160a01b031691505b82518110156111af57816001600160a01b03166342842e0e30611122612a74565b86858151811061112e57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561118c57600080fd5b505af11580156111a0573d6000803e3d6000fd5b50505050806001019050611101565b5050505050565b600581815481106111c357fe5b60009182526020909120600290910201805460019091015490915082565b6111ec610bd4612a74565b6112275760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b60006112338383612d58565b9050611240600d82612edd565b50505050565b6000611250613979565b6009848154811061125d57fe5b60009182526020918290206040805160a081018252600590930290910180546001600160a01b0316835260018101549383019390935260028301549082015260038201546060820152600490910154608082015290506112bb6139b1565b506000848152600a602090815260408083206001600160a01b0387168452825291829020825160608082018552825482526001830154938201939093526002909101549281019290925260808301519083015143118015611320575060008360200151115b1561136f57600061133984606001518560400151612ee9565b905061136b611364856020015161135e64e8d4a51000856129b490919063ffffffff16565b90612a0d565b8390612ab7565b9150505b61139d826020015161139764e8d4a5100061135e8587600001516129b490919063ffffffff16565b90612ef6565b93505050505b92915050565b600260005414156113ef576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b60026000908155818152600a6020526040812061143691839190611411612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020612f53565b506001600055565b606061144a6002613049565b67ffffffffffffffff8111801561146057600080fd5b5060405190808252806020026020018201604052801561148a578160200160208202803683370190505b50905060005b81518110156114d0576114a4600282613054565b8282815181106114b057fe5b6001600160a01b0390921660209283029190910190910152600101611490565b5090565b60606114e0600d613049565b67ffffffffffffffff811180156114f657600080fd5b50604051908082528060200260200182016040528015611520578160200160208202803683370190505b50905060005b81518110156114d05761153a600d82613054565b82828151811061154657fe5b6020908102919091010152600101611526565b600854600160a01b900460ff1681565b60075481565b6060808361157e600d82612a8d565b6115b95760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b6000858152600c602090815260408083206001600160a01b03881684529091528120906115e582613049565b90508067ffffffffffffffff811180156115fe57600080fd5b50604051908082528060200260200182016040528015611628578160200160208202803683370190505b5094508067ffffffffffffffff8111801561164257600080fd5b5060405190808252806020026020018201604052801561166c578160200160208202803683370190505b50935060005b818110156116ba576116848382613060565b87838151811061169057fe5b602002602001018784815181106116a357fe5b602090810291909101019190915252600101611672565b505050509250929050565b60606116d16010613049565b67ffffffffffffffff811180156116e757600080fd5b50604051908082528060200260200182016040528015611711578160200160208202803683370190505b50905060005b81518110156114d05761172b601082613054565b82828151811061173757fe5b6020908102919091010152600101611717565b611752612a74565b6001600160a01b0316611763611a98565b6001600160a01b0316146117be576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b81611814601082612a8d565b61184f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b6000838152600f6020526040812081611866612a74565b6001600160a01b031681526020810191909152604001600020905061188b818461306f565b6118c65760405162461bcd60e51b8152600401808060200182810382526026815260200180613c186026913960400191505060405180910390fd5b6118d184600161307b565b506000600985815481106118e157fe5b60009182526020909120600590910201546001600160a01b03169050806342842e0e3061190c612a74565b876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561196357600080fd5b505af1158015611977573d6000803e3d6000fd5b505050508385611985612a74565b6001600160a01b03167f3bef01a072a1ecbad87afff2d6e4629df7a37805ddc4572aad8f62c7c2ad52f360405160405180910390a45050505050565b6119cc610bd4612a74565b611a075760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b6001611a136002613049565b11611a4f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613c3e6030913960400191505060405180910390fd5b611a5a6002826131ad565b611a955760405162461bcd60e51b815260040180806020018281038252602c815260200180613ca1602c913960400191505060405180910390fd5b50565b6001546001600160a01b03165b90565b600a60209081526000928352604080842090915290825290208054600182015460029092015490919083565b60026000541415611b1a576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b600260009081555b600954811015611436576000818152600a6020526040812081611b43612a74565b6001600160a01b031681526020810191909152604001600020805490915015611b7057611b708282612f53565b50600101611b22565b60006113a3611b888342612ef6565b6125be565b606082611b9b601082612a8d565b611bd65760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b6000848152600f602090815260408083206001600160a01b0387168452909152812090611c0282613049565b90508067ffffffffffffffff81118015611c1b57600080fd5b50604051908082528060200260200182016040528015611c45578160200160208202803683370190505b50935060005b81811015611c7c57611c5d8382613054565b858281518110611c6957fe5b6020908102919091010152600101611c4b565b5050505092915050565b60065481565b60007fa95787898028339dbd3724f68a0fe67d2aa08e417ea89cbd0b391eed874510ae898989898989898960405180896001600160a01b03168152602001886001600160a01b0316815260200180602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f01601f19169091018581038452888152602090810191508990890280828437600083820152601f01601f191690910185810383528681526020019050868680828437600083820152604051601f909101601f19169092018290039d50909b505050505050505050505050a15063bc197c8160e01b98975050505050505050565b84611d90600d82612a8d565b611dcb5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b838214611e095760405162461bcd60e51b81526004018080602001828103825260308152602001806139ed6030913960400191505060405180910390fd5b6000868152600c60205260408120819081611e22612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020905060005b86811015611ee0576000888883818110611e5d57fe5b9050602002013590506000878784818110611e7457fe5b9050602002013590506000611e9283866131c290919063ffffffff16565b90506000611ea08284612ef6565b90508015611eb957611eb3868583612b11565b50611ec5565b611ec386856131ce565b505b611ecf8784612ab7565b965050505050806001019050611e47565b50611eeb888361307b565b50600060098981548110611efb57fe5b60009182526020909120600590910201546001600160a01b0316905080632eb2c2d630611f26612a74565b8b8b8b8b6040518763ffffffff1660e01b815260040180876001600160a01b03168152602001866001600160a01b031681526020018060200180602001806020018481038452888882818152602001925060200280828437600083820152601f01601f19169091018581038452868152602090810191508790870280828437600081840152601f19601f8201169050808301925050508481038252600081526020016020019950505050505050505050600060405180830381600087803b158015611ff057600080fd5b505af1158015612004573d6000803e3d6000fd5b5050505088612011612a74565b6001600160a01b03167f56dd705f3ee56863e341773c7e3fa0d872b7565671d4b4a2c1cc2aa449edc9608a8a8a8a6040518080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039850909650505050505050a3505050505050505050565b6120c3610bd4612a74565b6120fe5760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b61210960028261299f565b611a955760405162461bcd60e51b8152600401808060200182810382526030815260200180613a5f6030913960400191505060405180910390fd5b60006113a34361215384611b79565b90612ab7565b600854600160a01b900460ff166121b7576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e67426173653a206e6f7420696e20656d657267656e6379000000604482015290519081900360640190fd5b806121c3600d82612a8d565b6121fe5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a8f6032913960400191505060405180910390fd5b6060806122128461220d612a74565b61156f565b9150915061221f84612c29565b5060006009858154811061222f57fe5b60009182526020909120600590910201546001600160a01b0316905080632eb2c2d63061225a612a74565b86866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b03168152602001806020018060200180602001848103845286818151815260200191508051906020019060200280838360005b838110156122d15781810151838201526020016122b9565b50505050905001848103835285818151815260200191508051906020019060200280838360005b838110156123105781810151838201526020016122f8565b50505050905001848103825260008152602001602001975050505050505050600060405180830381600087803b15801561234957600080fd5b505af115801561235d573d6000803e3d6000fd5b505050505050505050565b612373610bd4612a74565b6123ae5760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b60006123ba8383612d58565b9050611240601082612edd565b816123d3601082612a8d565b61240e5760405162461bcd60e51b8152600401808060200182810382526030815260200180613b9a6030913960400191505060405180910390fd5b6000838152600f6020526040812081612425612a74565b6001600160a01b031681526020810191909152604001600020905061244a8184612edd565b6124855760405162461bcd60e51b815260040180806020018281038252602d815260200180613beb602d913960400191505060405180910390fd5b6005612492856001612b26565b11156124cf5760405162461bcd60e51b8152600401808060200182810382526033815260200180613c6e6033913960400191505060405180910390fd5b6000600985815481106124de57fe5b60009182526020909120600590910201546001600160a01b03169050806342842e0e612508612a74565b30876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561256057600080fd5b505af1158015612574573d6000803e3d6000fd5b505050508385612582612a74565b6001600160a01b03167f62664f742cc1a00f450f78762925f50d0fdc6ded2493b4513468e9961385582360405160405180910390a45050505050565b60006113a3600d61135e8460016129b4565b60006007544310156125e457506000611aa5565b60006125fb60075443612ef690919063ffffffff16565b600554909150600090600019015b6126116139d2565b6005828154811061261e57fe5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905080600001518411156126885780516126779061266a908690612ef6565b6020830151859102612ab7565b815194509250816126885750612692565b5060001901612609565b5091505090565b6126a4610bd4612a74565b6126df5760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b6126e76131da565b6000600983815481106126f657fe5b90600052602060002090600502019050612723826121538360020154600454612ef690919063ffffffff16565b6004556002015550565b6000612737613979565b6009858154811061274457fe5b600091825260208083206040805160a081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083018190526003820154606084015260049091015460808301529092506127b19043906127ac8288612ab7565b613212565b90506127d76127cd868460200151612ab790919063ffffffff16565b61135e83886129b4565b925050505b9392505050565b60007f0901a3ed9ae64cf4d597435958a8b218a4ecf389645495b545bed5403e4383ab87878787878760405180876001600160a01b03168152602001866001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003995090975050505050505050a15063f23a6e6160e01b9695505050505050565b612892612a74565b6001600160a01b03166128a3611a98565b6001600160a01b0316146128fe576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166129435760405162461bcd60e51b8152600401808060200182810382526026815260200180613aed6026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006127dc836001600160a01b038416613310565b6000826129c3575060006113a3565b828202828482816129d057fe5b04146127dc5760405162461bcd60e51b8152600401808060200182810382526021815260200180613bca6021913960400191505060405180910390fd5b6000808211612a63576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a6c57fe5b049392505050565b3390565b60006127dc836001600160a01b03841661335a565b60006127dc838361335a565b6000808080612aa88686613372565b909450925050505b9250929050565b6000828201838110156127dc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612b1e8484846133c9565b949350505050565b600060026000541415612b6e576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b600260009081556009805485908110612b8357fe5b60009182526020808320878452600a90915260408320600590920201925081612baa612a74565b6001600160a01b03166001600160a01b031681526020019081526020016000209050612bd68582612f53565b8054612be29085612ab7565b8082556004830154612bff9164e8d4a510009161135e91906129b4565b600180830191909155820154612c159085612ab7565b600192830155546000919091559392505050565b600060026000541415612c71576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b6002600055600854600160a01b900460ff16612cd4576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e67426173653a206e6f7420696e20656d657267656e6379000000604482015290519081900360640190fd5b600060098381548110612ce357fe5b60009182526020808320868452600a90915260408320600590920201925081612d0a612a74565b6001600160a01b031681526020810191909152604001600020805490915015612d4c5760008082556001808301829055830154612d4691612ef6565b60018301555b50506001600055919050565b6000612d65610bd4612a74565b612da05760405162461bcd60e51b815260040180806020018281038252602c815260200180613ac1602c913960400191505060405180910390fd5b612da86131da565b600954600454612db89085612ab7565b6004556040805160a0810182526001600160a01b039485168152600060208201818152928201968752600754606083019081526080830182815260098054600181018255935292517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af600590930292830180546001600160a01b031916919098161790965591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b083015594517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b182015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b284015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b3909201919091555090565b60006127dc8383613310565b60006127dc838343613212565b600082821115612f4d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600060098381548110612f6257fe5b90600052602060002090600502019050612f7b81613460565b6000612fa9836001015461139764e8d4a5100061135e866004015488600001546129b490919063ffffffff16565b9050801561302057612fc2612fbc612a74565b826134d7565b6002830154612fd19082612ab7565b600284015583612fdf612a74565b6001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568836040518082815260200191505060405180910390a35b6004820154835461303b9164e8d4a510009161135e916129b4565b836001018190555050505050565b60006113a38261366c565b60006127dc8383613670565b6000808080612aa886866136d4565b60006127dc838361374f565b6000600260005414156130c3576040805162461bcd60e51b815260206004820152601f6024820152600080516020613a3f833981519152604482015290519081900360640190fd5b6002600090815560098054859081106130d857fe5b60009182526020808320878452600a909152604083206005909202019250816130ff612a74565b6001600160a01b03166001600160a01b03168152602001908152602001600020905083816000015410156131645760405162461bcd60e51b8152600401808060200182810382526031815260200180613b136031913960400191505060405180910390fd5b61316e8582612f53565b805461317a9085612ef6565b80825560048301546131979164e8d4a510009161135e91906129b4565b600180830191909155820154612c159085612ef6565b60006127dc836001600160a01b03841661374f565b60006127dc8383613815565b60006127dc83836138a5565b60005b600954811015611a955761320a600982815481106131f757fe5b9060005260206000209060050201613460565b6001016131dd565b6000600754821015613226575060006127dc565b600061323d60075484612ef690919063ffffffff16565b9050600061325660075487612ef690919063ffffffff16565b600554909150600090600019015b61326c6139d2565b6005828154811061327957fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050806000015184106132c8576132c061266a8686612ef6565b9250506132f3565b80518511156132e95780516132e29061266a908790612ef6565b8151955092505b5060001901613264565b506004546133059061135e83896129b4565b979650505050505050565b600061331c838361335a565b613352575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556113a3565b5060006113a3565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054819080613397575060009150819050612ab0565b60018560000160018303815481106133ab57fe5b90600052602060002090600202016001015492509250509250929050565b60008281526001840160205260408120548061342e5750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556127dc565b8285600001600183038154811061344157fe5b90600052602060002090600202016001018190555060009150506127dc565b8060030154431161347057611a95565b600181015461348457436003820155611a95565b600061349882600301548360020154612ee9565b90506134c86134bd836001015461135e64e8d4a51000856129b490919063ffffffff16565b600484015490612ab7565b60048301555043600382015550565b801561366857600854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561352857600080fd5b505afa15801561353c573d6000803e3d6000fd5b505050506040513d602081101561355257600080fd5b50519050808211156135e6576008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156135b457600080fd5b505af11580156135c8573d6000803e3d6000fd5b505050506040513d60208110156135de57600080fd5b506136669050565b6008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561363c57600080fd5b505af1158015613650573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b505b5050565b5490565b815460009082106136b25760405162461bcd60e51b8152600401808060200182810382526022815260200180613a1d6022913960400191505060405180910390fd5b8260000182815481106136c157fe5b9060005260206000200154905092915050565b8154600090819083106137185760405162461bcd60e51b8152600401808060200182810382526022815260200180613b786022913960400191505060405180910390fd5b600084600001848154811061372957fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000818152600183016020526040812054801561380b578354600019808301919081019060009087908390811061378257fe5b906000526020600020015490508087600001848154811061379f57fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806137cf57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506113a3565b60009150506113a3565b600081815260018301602052604081205480613878576040805162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015290519081900360640190fd5b83600001600182038154811061388a57fe5b90600052602060002090600202016001015491505092915050565b6000818152600183016020526040812054801561380b57835460001980830191908101906000908790839081106138d857fe5b90600052602060002090600202019050808760000184815481106138f857fe5b60009182526020808320845460029093020191825560019384015491840191909155835482528983019052604090209084019055865487908061393757fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506113a39350505050565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b60405180604001604052806000815260200160008152509056fe5374616b696e67455243313135353a205f69647320616e6420616d6f756e7473206c656e677468206d69736d61746368456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64735265656e7472616e637947756172643a207265656e7472616e742063616c6c00416363657373436f6e74726f6c3a206163636f756e7420616c726561647920616e2061646d696e6973747261746f722e5374616b696e67455243313135353a20706f6f6c206964206e6f742062656c6f6e6720746f20646566692045524331313535416363657373436f6e74726f6c3a20726571756972652061646d696e6973747261746f72206163636f756e744f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67426173653a205f7769746864726177206e6565647320616d6f756e74203e20757365722e616d6f756e745374616b696e67455243313135353a204e4654207374616b696e6720636f756e742065786365656420697473206d6178696d756e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64735374616b696e674552433732313a20706f6f6c206964206e6f742062656c6f6e6720746f206465666920455243373231536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e674552433732313a2065726337323120746f6b656e20616c7265616479206465706f73697465645374616b696e674552433732313a2065726337323120746f6b656e206e6f7420657869737465416363657373436f6e74726f6c3a2063616e6e6f742072656d6f7665206c6173742061646d696e6973747261746f722e5374616b696e674552433732313a204e4654207374616b696e6720636f756e742065786365656420697473206d6178696d756e416363657373436f6e74726f6c3a206163636f756e74206e6f7420616e2061646d696e6973747261746f722ea264697066735822122010485f3d0de5014989abf966fb0eeb07b4c847f10193f4b1d54a544ee0fcbe4e64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008e04dfb7dc6d8f2c9d12392dc6d1fe188701e52e
-----Decoded View---------------
Arg [0] : yao_ (address): 0x8e04Dfb7dC6D8F2C9d12392dC6D1FE188701e52E
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008e04dfb7dc6d8f2c9d12392dc6d1fe188701e52e
Deployed Bytecode Sourcemap
87410:1531:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49280:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58469:150;;;;;;;;;;;;;;;;-1:-1:-1;58469:150:0;-1:-1:-1;;;;;;58469:150:0;;:::i;:::-;;;;;;;;;;;;;;;;;;40645:103;;;;;;;;;;;;;;;;-1:-1:-1;40645:103:0;;;;:::i;:::-;;73549:1093;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73549:1093:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73549:1093:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73549:1093:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73549:1093:0;;;;;;;;;;-1:-1:-1;73549:1093:0;;-1:-1:-1;73549:1093:0;-1:-1:-1;73549:1093:0;:::i;83604:207::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83604:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;83604:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;83604:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83604:207:0;;-1:-1:-1;83604:207:0;;-1:-1:-1;;;;;83604:207:0:i;:::-;;;;-1:-1:-1;;;;;;83604:207:0;;;;;;;;;;;;;;40217:26;;;;;;;;;;;;;;;;-1:-1:-1;40217:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;40217:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39769:30;;;:::i;:::-;;;;;;;;;;;;;;;;86098:459;;;;;;;;;;;;;;;;-1:-1:-1;86098:459:0;;:::i;39825:33::-;;;;;;;;;;;;;;;;-1:-1:-1;39825:33:0;;:::i;73291:189::-;;;;;;;;;;;;;;;;-1:-1:-1;73291:189:0;;;;;;-1:-1:-1;;;;;73291:189:0;;:::i;41864:603::-;;;;;;;;;;;;;;;;-1:-1:-1;41864:603:0;;;;;;-1:-1:-1;;;;;41864:603:0;;:::i;45521:121::-;;;;;;;;;;;;;;;;-1:-1:-1;45521:121:0;;:::i;37935:250::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77069:259;;;:::i;40066:23::-;;;:::i;39977:31::-;;;:::i;76494:505::-;;;;;;;;;;;;;;;;-1:-1:-1;76494:505:0;;;;;;-1:-1:-1;;;;;76494:505:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86979:254;;;:::i;5319:148::-;;;:::i;85468:510::-;;;;;;;;;;;;;;;;-1:-1:-1;85468:510:0;;;;;;;:::i;38363:257::-;;;;;;;;;;;;;;;;-1:-1:-1;38363:257:0;-1:-1:-1;;;;;38363:257:0;;:::i;4668:87::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4668:87:0;;;;;;;;;;;;;;40301:64;;;;;;;;;;;;;;;;-1:-1:-1;40301:64:0;;;;;;-1:-1:-1;;;;;40301:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;45741:265;;;:::i;13423:144::-;;;;;;;;;;;;;;;;-1:-1:-1;13423:144:0;;:::i;86565:406::-;;;;;;;;;;;;;;;;-1:-1:-1;86565:406:0;;;;;;-1:-1:-1;;;;;86565:406:0;;:::i;39904:26::-;;;:::i;72085:470::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72085:470:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72085:470:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72085:470:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72085:470:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72085:470:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72085:470:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72085:470:0;;;;;;;;;;-1:-1:-1;72085:470:0;;-1:-1:-1;72085:470:0;-1:-1:-1;72085:470:0;:::i;74714:1144::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;74714:1144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;74714:1144:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;74714:1144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;74714:1144:0;;;;;;;;;;-1:-1:-1;74714:1144:0;;-1:-1:-1;74714:1144:0;-1:-1:-1;74714:1144:0;:::i;38193:162::-;;;;;;;;;;;;;;;;-1:-1:-1;38193:162:0;-1:-1:-1;;;;;38193:162:0;;:::i;13575:148::-;;;;;;;;;;;;;;;;-1:-1:-1;13575:148:0;;:::i;75977:433::-;;;;;;;;;;;;;;;;-1:-1:-1;75977:433:0;;:::i;84569:184::-;;;;;;;;;;;;;;;;-1:-1:-1;84569:184:0;;;;;;-1:-1:-1;;;;;84569:184:0;;:::i;84823:595::-;;;;;;;;;;;;;;;;-1:-1:-1;84823:595:0;;;;;;;:::i;13731:154::-;;;;;;;;;;;;;;;;-1:-1:-1;13731:154:0;;:::i;49797:698::-;;;:::i;41496:288::-;;;;;;;;;;;;;;;;-1:-1:-1;41496:288:0;;;;;;;:::i;49408:381::-;;;;;;;;;;;;;;;;-1:-1:-1;49408:381:0;;;;;;;;;;;;:::i;70662:420::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70662:420:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70662:420:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70662:420:0;;;;;;;;;;-1:-1:-1;70662:420:0;;-1:-1:-1;70662:420:0;-1:-1:-1;70662:420:0;:::i;5622:244::-;;;;;;;;;;;;;;;;-1:-1:-1;5622:244:0;-1:-1:-1;;;;;5622:244:0;;:::i;49280:120::-;49362:15;49379:12;49280:120;;:::o;58469:150::-;-1:-1:-1;;;;;;58578:33:0;58554:4;58578:33;;;:20;:33;;;;;;;;;58469:150::o;40645:103::-;38668:32;38687:12;:10;:12::i;:::-;38668:9;;:18;:32::i;:::-;38660:89;;;;-1:-1:-1;;;38660:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40714:11:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;40714:26:0::1;-1:-1:-1::0;;;;40714:26:0;;::::1;::::0;;;::::1;::::0;;40645:103::o;73549:1093::-;73704:3;77469:31;:17;73704:3;77469:26;:31::i;:::-;77461:94;;;;-1:-1:-1;;;77461:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73728:35;;::::1;73720:96;;;;-1:-1:-1::0;;;73720:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73827:17;73913:18:::0;;;:13:::1;:18;::::0;;;;73827:17;;;73932:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;73913:32:0::1;-1:-1:-1::0;;;;;73913:32:0::1;;;;;;;;;;;;73859:86;;73963:13;73958:284;73982:25:::0;;::::1;73958:284;;;74036:13;74053:41;74076:10;;74087:5;74076:17;;;;;;;;;;;;;74053:15;:22;;:41;;;;:::i;:::-;74033:61;;;74109:65;74129:10;;74140:5;74129:17;;;;;;;;;;;;;74148:25;74158:7;;74166:5;74158:14;;;;;;;;;;;;;74148:5;:9;;:25;;;;:::i;:::-;74109:15:::0;;:65;:19:::1;:65::i;:::-;;74201:29;74215:7;;74223:5;74215:14;;;;;;;;;;;;;74201:9;:13;;:29;;;;:::i;:::-;74189:41:::0;-1:-1:-1;;74009:7:0::1;;73958:284;;;;72825:1;74262:24;74271:3;74276:9;74262:8;:24::i;:::-;:45;;74254:110;;;;-1:-1:-1::0;;;74254:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74375:22;74409:8;74418:3;74409:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:26:::0;-1:-1:-1;;;;;74409:26:0::1;::::0;-1:-1:-1;74409:26:0;74475:35:::1;74511:12;:10;:12::i;:::-;74533:4;74540:10;;74552:7;;74475:89;;;;;;;;;;;;;-1:-1:-1::0;;;;;74475:89:0::1;;;;;;-1:-1:-1::0;;;;;74475:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;74475:89:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;74475:89:0;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;74609:3;74595:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;74580:54:0::1;;74614:10;;74626:7;;74580:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;74580:54:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;74580:54:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;74580:54:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;74580:54:0;;-1:-1:-1;;;;;;;74580:54:0::1;77566:1;;;73549:1093:::0;;;;;;:::o;83604:207::-;-1:-1:-1;;;83604:207:0;;;;;;:::o;40217:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40217:26:0;;;;-1:-1:-1;40217:26:0;;;;;:::o;39769:30::-;;;;:::o;86098:459::-;50545:11;;-1:-1:-1;;;50545:11:0;;;;50537:53;;;;;-1:-1:-1;;;50537:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;86180:3;87299:29:::1;:15;86180:3:::0;87299:24:::1;:29::i;:::-;87291:90;;;;-1:-1:-1::0;;;87291:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86196:26:::2;86225:32;86239:3;86244:12;:10;:12::i;:::-;86225:13;:32::i;:::-;86196:61;;86268:23;86287:3;86268:18;:23::i;:::-;;86302:21;86334:8;86343:3;86334:13;;;;;;;;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:26:::0;-1:-1:-1;;;;;86334:26:0::2;::::0;-1:-1:-1;86400:149:0::2;86432:9;:16;86424:5;:24;86400:149;;;86472:13;-1:-1:-1::0;;;;;86472:30:0::2;;86511:4;86518:12;:10;:12::i;:::-;86532:9;86542:5;86532:16;;;;;;;;;;;;;;86472:77;;;;;;;;;;;;;-1:-1:-1::0;;;;;86472:77:0::2;;;;;;-1:-1:-1::0;;;;;86472:77:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;86450:7;;;;;86400:149;;;;87392:1;;50601::::1;86098:459:::0;:::o;39825:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39825:33:0;:::o;73291:189::-;38668:32;38687:12;:10;:12::i;38668:32::-;38660:89;;;;-1:-1:-1;;;38660:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73388:11:::1;73402:33;73407:11;73420:14;73402:4;:33::i;:::-;73388:47:::0;-1:-1:-1;73446:26:0::1;:17;73388:47:::0;73446:21:::1;:26::i;:::-;;38760:1;73291:189:::0;;:::o;41864:603::-;41937:7;41957:20;;:::i;:::-;41980:8;41989:3;41980:13;;;;;;;;;;;;;;;;;41957:36;;;;;;;;41980:13;;;;;;;41957:36;;-1:-1:-1;;;;;41957:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42004:20:0;;:::i;:::-;-1:-1:-1;42027:13:0;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;42027:20:0;;;;;;;;;;42004:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42085:21;;;;42136:20;;;;42121:12;:35;:59;;;;;42179:1;42160:4;:16;;;:20;42121:59;42117:261;;;42197:17;42217:52;42231:4;:20;;;42253:4;:15;;;42217:13;:52::i;:::-;42197:72;;42303:63;42324:41;42348:4;:16;;;42324:19;42338:4;42324:9;:13;;:19;;;;:::i;:::-;:23;;:41::i;:::-;42303:16;;:20;:63::i;:::-;42284:82;;42117:261;;42395:64;42443:4;:15;;;42395:43;42433:4;42395:33;42411:16;42395:4;:11;;;:15;;:33;;;;:::i;:43::-;:47;;:64::i;:::-;42388:71;;;;;41864:603;;;;;:::o;45521:121::-;36740:1;37346:7;;:19;;37338:63;;;;;-1:-1:-1;;;37338:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37338:63:0;;;;;;;;;;;;;;;36740:1;37479:7;:18;;;45606:13;;;:8:::1;:13;::::0;;;;45587:47:::1;::::0;45601:3;;45606:13;45620:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;45606:27:0::1;-1:-1:-1::0;;;;;45606:27:0::1;;;;;;;;;;;;45587:13;:47::i;:::-;-1:-1:-1::0;36696:1:0;37658:7;:22;45521:121::o;37935:250::-;37985:26;38050:18;:9;:16;:18::i;:::-;38036:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38036:33:0;;38024:45;;38085:13;38080:97;38112:9;:16;38104:5;:24;38080:97;;;38158:19;:9;38171:5;38158:12;:19::i;:::-;38139:9;38149:5;38139:16;;;;;;;;-1:-1:-1;;;;;38139:38:0;;;:16;;;;;;;;;;;:38;38130:7;;38080:97;;;;37935:250;:::o;77069:259::-;77120:24;77181:26;:17;:24;:26::i;:::-;77167:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77167:41:0;;77157:51;;77224:13;77219:101;77251:7;:14;77243:5;:22;77219:101;;;77293:27;:17;77314:5;77293:20;:27::i;:::-;77276:7;77284:5;77276:14;;;;;;;;;;;;;;;;;:44;77267:7;;77219:101;;40066:23;;;-1:-1:-1;;;40066:23:0;;;;;:::o;39977:31::-;;;;:::o;76494:505::-;76589:27;;76575:3;77469:31;:17;76575:3;77469:26;:31::i;:::-;77461:94;;;;-1:-1:-1;;;77461:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76655:51:::1;76709:18:::0;;;:13:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;76709:24:0;::::1;::::0;;;;;;;;76760::::1;76709::::0;76760:22:::1;:24::i;:::-;76744:40;;76822:5;76808:20;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;76808:20:0::1;;76795:33;;76863:5;76849:20;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;76849:20:0::1;;76839:30;;76885:13;76880:111;76912:5;76904;:13;76880:111;;;76966:25;:15:::0;76985:5;76966:18:::1;:25::i;:::-;76929:10;76940:5;76929:17;;;;;;;;;;;;;76948:7;76956:5;76948:14;;;;;;;;;::::0;;::::1;::::0;;;;;76928:63;;;;;76919:7:::1;;76880:111;;;;77566:1;;76494:505:::0;;;;;;:::o;86979:254::-;87029:24;87090;:15;:22;:24::i;:::-;87076:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87076:39:0;;87066:49;;87131:13;87126:99;87158:7;:14;87150:5;:22;87126:99;;;87200:25;:15;87219:5;87200:18;:25::i;:::-;87183:7;87191:5;87183:14;;;;;;;;;;;;;;;;;:42;87174:7;;87126:99;;5319:148;4899:12;:10;:12::i;:::-;-1:-1:-1;;;;;4888:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4888:23:0;;4880:68;;;;;-1:-1:-1;;;4880:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5410:6:::1;::::0;5389:40:::1;::::0;5426:1:::1;::::0;-1:-1:-1;;;;;5410:6:0::1;::::0;5389:40:::1;::::0;5426:1;;5389:40:::1;5440:6;:19:::0;;-1:-1:-1;;;;;;5440:19:0::1;::::0;;5319:148::o;85468:510::-;85547:3;87299:29;:15;85547:3;87299:24;:29::i;:::-;87291:90;;;;-1:-1:-1;;;87291:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85563:44:::1;85610:16:::0;;;:11:::1;:16;::::0;;;;85563:44;85627:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;85610:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;85610:30:0;;-1:-1:-1;85659:31:0::1;85610:30:::0;85681:8;85659:21:::1;:31::i;:::-;85651:82;;;;-1:-1:-1::0;;;85651:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85744:17;85754:3;85759:1;85744:9;:17::i;:::-;;85772:21;85804:8;85813:3;85804:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:26:::0;-1:-1:-1;;;;;85804:26:0::1;::::0;-1:-1:-1;85804:26:0;85842:30:::1;85881:4;85888:12;:10;:12::i;:::-;85902:8;85842:69;;;;;;;;;;;;;-1:-1:-1::0;;;;;85842:69:0::1;;;;;;-1:-1:-1::0;;;;;85842:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;85961:8;85956:3;85942:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;85927:43:0::1;;;;;;;;;;;87392:1;;85468:510:::0;;;:::o;38363:257::-;38668:32;38687:12;:10;:12::i;38668:32::-;38660:89;;;;-1:-1:-1;;;38660:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38465:1:::1;38444:18;:9;:16;:18::i;:::-;:22;38436:83;;;;-1:-1:-1::0;;;38436:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38538:25;:9;38555:7:::0;38538:16:::1;:25::i;:::-;38530:82;;;;-1:-1:-1::0;;;38530:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38363:257:::0;:::o;4668:87::-;4741:6;;-1:-1:-1;;;;;4741:6:0;4668:87;;:::o;40301:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45741:265::-;36740:1;37346:7;;:19;;37338:63;;;;;-1:-1:-1;;;37338:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37338:63:0;;;;;;;;;;;;;;;36740:1;37479:7;:18;;;45799:200:::1;45831:8;:15:::0;45823:23;::::1;45799:200;;;45872:21;45896:15:::0;;;:8:::1;:15;::::0;;;;45872:21;45912:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;45896:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;45896:29:0;45944:11;;45896:29;;-1:-1:-1;45944:15:0;45940:47:::1;;45961:26;45975:5;45982:4;45961:13;:26::i;:::-;-1:-1:-1::0;45848:7:0::1;;45799:200;;13423:144:::0;13491:7;13518:41;13527:31;:10;13542:15;13527:14;:31::i;:::-;13518:8;:41::i;86565:406::-;86659:26;86645:3;87299:29;:15;86645:3;87299:24;:29::i;:::-;87291:90;;;;-1:-1:-1;;;87291:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86698:44:::1;86745:16:::0;;;:11:::1;:16;::::0;;;;;;;-1:-1:-1;;;;;86745:23:0;::::1;::::0;;;;;;;;86795::::1;86745::::0;86795:21:::1;:23::i;:::-;86779:39;;86855:5;86841:20;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;86841:20:0::1;;86829:32;;86877:13;86872:91;86904:5;86896;:13;86872:91;;;86939:24;:14:::0;86957:5;86939:17:::1;:24::i;:::-;86920:9;86930:5;86920:16;;;;;;;;;::::0;;::::1;::::0;;;;;:43;86911:7:::1;;86872:91;;;;87392:1;;86565:406:::0;;;;;:::o;39904:26::-;;;;:::o;72085:470::-;72306:6;72436:57;72459:8;72469:4;72475:3;;72480:6;;72488:4;;72436:57;;;;-1:-1:-1;;;;;72436:57:0;;;;;;-1:-1:-1;;;;;72436:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72436:57:0;;;;;;;;;;;;;;;;;-1:-1:-1;72436:57:0;;;;;;;;;;;;;;;-1:-1:-1;;72436:57:0;;;;;;;;;;;;;;;-1:-1:-1;72436:57:0;;;;;;;;;;;;;;;;;-1:-1:-1;;72436:57:0;;;;;;;;-1:-1:-1;72436:57:0;;-1:-1:-1;;;;;;;;;;;;72436:57:0;-1:-1:-1;;;;72085:470:0;;;;;;;;;;:::o;74714:1144::-;74870:3;77469:31;:17;74870:3;77469:26;:31::i;:::-;77461:94;;;;-1:-1:-1;;;77461:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74894:35;;::::1;74886:96;;;;-1:-1:-1::0;;;74886:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74993:17;75079:18:::0;;;:13:::1;:18;::::0;;;;74993:17;;;75098:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;75079:32:0::1;-1:-1:-1::0;;;;;75079:32:0::1;;;;;;;;;;;;75025:86;;75129:13;75124:418;75148:25:::0;;::::1;75124:418;;;75199:10;75212;;75223:5;75212:17;;;;;;;;;;;;;75199:30;;75244:14;75261:7;;75269:5;75261:14;;;;;;;;;;;;;75244:31;;75292:13;75308:23;75328:2;75308:15;:19;;:23;;;;:::i;:::-;75292:39:::0;-1:-1:-1;75346:12:0::1;75361:17;75292:39:::0;75371:6;75361:9:::1;:17::i;:::-;75346:32:::0;-1:-1:-1;75397:8:0;;75393:89:::1;;75407:29;:15:::0;75427:2;75431:4;75407:19:::1;:29::i;:::-;;75393:89;;;75456:26;:15:::0;75479:2;75456:22:::1;:26::i;:::-;;75393:89;75509:21;:9:::0;75523:6;75509:13:::1;:21::i;:::-;75497:33;;75124:418;;;;75175:7;;;;;75124:418;;;;75554:25;75564:3;75569:9;75554;:25::i;:::-;;75590:22;75624:8;75633:3;75624:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:26:::0;-1:-1:-1;;;;;75624:26:0::1;::::0;-1:-1:-1;75624:26:0;75690:35:::1;75734:4;75741:12;:10;:12::i;:::-;75755:10;;75767:7;;75690:89;;;;;;;;;;;;;-1:-1:-1::0;;;;;75690:89:0::1;;;;;;-1:-1:-1::0;;;;;75690:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;75690:89:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;75690:89:0;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;75825:3;75811:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;75795:55:0::1;;75830:10;;75842:7;;75795:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;75795:55:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;75795:55:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;75795:55:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;75795:55:0;;-1:-1:-1;;;;;;;75795:55:0::1;77566:1;;;74714:1144:::0;;;;;;:::o;38193:162::-;38668:32;38687:12;:10;:12::i;38668:32::-;38660:89;;;;-1:-1:-1;;;38660:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38272:22:::1;:9;38286:7:::0;38272:13:::1;:22::i;:::-;38264:83;;;;-1:-1:-1::0;;;38264:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13575:148:::0;13641:7;13668:47;13702:12;13668:29;13686:10;13668:17;:29::i;:::-;:33;;:47::i;75977:433::-;50545:11;;-1:-1:-1;;;50545:11:0;;;;50537:53;;;;;-1:-1:-1;;;50537:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76061:3;77469:31:::1;:17;76061:3:::0;77469:26:::1;:31::i;:::-;77461:94;;;;-1:-1:-1::0;;;77461:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76078:27:::2;76107:24:::0;76135:33:::2;76150:3;76155:12;:10;:12::i;:::-;76135:14;:33::i;:::-;76077:91;;;;76179:23;76198:3;76179:18;:23::i;:::-;;76213:22;76247:8;76256:3;76247:13;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:26:::0;-1:-1:-1;;;;;76247:26:0::2;::::0;-1:-1:-1;76247:26:0;76313:35:::2;76357:4;76364:12;:10;:12::i;:::-;76378:10;76390:7;76313:89;;;;;;;;;;;;;-1:-1:-1::0;;;;;76313:89:0::2;;;;;;-1:-1:-1::0;;;;;76313:89:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;77566:1;;;50601::::1;75977:433:::0;:::o;84569:184::-;38668:32;38687:12;:10;:12::i;38668:32::-;38660:89;;;;-1:-1:-1;;;38660:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84664:11:::1;84678:32;84683:11;84696:13;84678:4;:32::i;:::-;84664:46:::0;-1:-1:-1;84721:24:0::1;:15;84664:46:::0;84721:19:::1;:24::i;84823:595::-:0;84901:3;87299:29;:15;84901:3;87299:24;:29::i;:::-;87291:90;;;;-1:-1:-1;;;87291:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84917:44:::1;84964:16:::0;;;:11:::1;:16;::::0;;;;84917:44;84981:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;84964:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;84964:30:0;;-1:-1:-1;85013:28:0::1;84964:30:::0;85032:8;85013:18:::1;:28::i;:::-;85005:86;;;;-1:-1:-1::0;;;85005:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84020:1;85110:16;85119:3;85124:1;85110:8;:16::i;:::-;:36;;85102:100;;;;-1:-1:-1::0;;;85102:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85213:21;85245:8;85254:3;85245:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:26:::0;-1:-1:-1;;;;;85245:26:0::1;::::0;-1:-1:-1;85245:26:0;85283:30:::1;85314:12;:10;:12::i;:::-;85336:4;85343:8;85283:69;;;;;;;;;;;;;-1:-1:-1::0;;;;;85283:69:0::1;;;;;;-1:-1:-1::0;;;;;85283:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;85401:8;85396:3;85382:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;85368:42:0::1;;;;;;;;;;;87392:1;;84823:595:::0;;;:::o;13731:154::-;13788:7;13815:62;13379:2;13815:34;:8;13321:1;13815:12;:34::i;49797:698::-;49843:7;49882:16;;49867:12;:31;49863:45;;;-1:-1:-1;49907:1:0;49900:8;;49863:45;49974:21;49998:34;50015:16;;49998:12;:16;;:34;;;;:::i;:::-;50088:8;:15;49974:58;;-1:-1:-1;50043:11:0;;-1:-1:-1;;50088:19:0;50069:398;50133:33;;:::i;:::-;50169:8;50178:3;50169:13;;;;;;;;;;;;;;;;;;50133:49;;;;;;;;;;;;;;;;;;;;;;;;;;;50217:10;:22;;;50201:13;:38;50197:259;;;50320:22;;50266:79;;50302:41;;:13;;:17;:41::i;:::-;50274:24;;;;50266:3;;50274:70;50266:7;:79::i;:::-;50380:22;;;-1:-1:-1;50260:85:0;-1:-1:-1;50425:8:0;50421:19;;50435:5;;;50421:19;-1:-1:-1;;;50111:5:0;50069:398;;;-1:-1:-1;50484:3:0;-1:-1:-1;;49797:698:0;:::o;41496:288::-;38668:32;38687:12;:10;:12::i;38668:32::-;38660:89;;;;-1:-1:-1;;;38660:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41589:17:::1;:15;:17::i;:::-;41617:21;41641:8;41650:3;41641:13;;;;;;;;;;;;;;;;;;41617:37;;41683:53;41724:11;41683:36;41703:4;:15;;;41683;;:19;;:36;;;;:::i;:53::-;41665:15;:71:::0;41747:15:::1;;:29:::0;-1:-1:-1;41496:288:0:o;49408:381::-;49538:15;49566:20;;:::i;:::-;49589:8;49598:3;49589:13;;;;;;;;;;;;;;;;49566:36;;;;;;;;49589:13;;;;;;;49566:36;;-1:-1:-1;;;;;49566:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49633:75:0;;49647:12;;49678:29;49647:12;49695:11;49678:16;:29::i;:::-;49633:13;:75::i;:::-;49613:95;;49726:55;49752:28;49773:6;49752:4;:16;;;:20;;:28;;;;:::i;:::-;49726:21;:9;49740:6;49726:13;:21::i;:55::-;49719:62;;;;49408:381;;;;;;:::o;70662:420::-;70854:6;70975:50;70993:8;71003:4;71009:2;71013:5;71020:4;;70975:50;;;;-1:-1:-1;;;;;70975:50:0;;;;;;-1:-1:-1;;;;;70975:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70975:50:0;;;;;;;;-1:-1:-1;70975:50:0;;-1:-1:-1;;;;;;;;70975:50:0;-1:-1:-1;;;;70662:420:0;;;;;;;;:::o;5622:244::-;4899:12;:10;:12::i;:::-;-1:-1:-1;;;;;4888:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4888:23:0;;4880:68;;;;;-1:-1:-1;;;4880:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5711:22:0;::::1;5703:73;;;;-1:-1:-1::0;;;5703:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5813:6;::::0;5792:38:::1;::::0;-1:-1:-1;;;;;5792:38:0;;::::1;::::0;5813:6:::1;::::0;5792:38:::1;::::0;5813:6:::1;::::0;5792:38:::1;5841:6;:17:::0;;-1:-1:-1;;;;;;5841:17:0::1;-1:-1:-1::0;;;;;5841:17:0;;;::::1;::::0;;;::::1;::::0;;5622:244::o;32029:152::-;32099:4;32123:50;32128:3;-1:-1:-1;;;;;32148:23:0;;32123:4;:50::i;9458:220::-;9516:7;9540:6;9536:20;;-1:-1:-1;9555:1:0;9548:8;;9536:20;9579:5;;;9583:1;9579;:5;:1;9603:5;;;;;:10;9595:56;;;;-1:-1:-1;;;9595:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10156:153;10214:7;10246:1;10242;:5;10234:44;;;;;-1:-1:-1;;;10234:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10300:1;10296;:5;;;;;;;10156:153;-1:-1:-1;;;10156:153:0:o;3295:106::-;3383:10;3295:106;:::o;32601:167::-;32681:4;32705:55;32715:3;-1:-1:-1;;;;;32735:23:0;;32705:9;:55::i;34253:146::-;34330:4;34354:37;34364:3;34384:5;34354:9;:37::i;68500:221::-;68579:4;;;;68637:33;68645:3;68665;68637:7;:33::i;:::-;68605:65;;-1:-1:-1;68605:65:0;-1:-1:-1;;;68500:221:0;;;;;;:::o;8579:179::-;8637:7;8669:5;;;8693:6;;;;8685:46;;;;;-1:-1:-1;;;8685:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;66806:198;66926:4;66950:46;66955:3;66975;66989:5;66950:4;:46::i;:::-;66943:53;66806:198;-1:-1:-1;;;;66806:198:0:o;43725:455::-;43804:7;36740:1;37346:7;;:19;;37338:63;;;;;-1:-1:-1;;;37338:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37338:63:0;;;;;;;;;;;;;;;36740:1;37479:7;:18;;;43848:8:::1;:13:::0;;43857:3;;43848:13;::::1;;;;;;::::0;;;::::1;::::0;;;43896;;;:8:::1;:13:::0;;;;;;43848::::1;::::0;;::::1;;::::0;-1:-1:-1;43848:13:0;43910:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;43896:27:0::1;-1:-1:-1::0;;;;;43896:27:0::1;;;;;;;;;;;;43872:51;;43934:24;43948:3;43953:4;43934:13;:24::i;:::-;43983:11:::0;;:24:::1;::::0;43999:7;43983:15:::1;:24::i;:::-;43969:38:::0;;;44052:21:::1;::::0;::::1;::::0;44036:48:::1;::::0;44079:4:::1;::::0;44036:38:::1;::::0;43969;44036:15:::1;:38::i;:48::-;44018:15;::::0;;::::1;:66:::0;;;;44114:16;::::1;::::0;:29:::1;::::0;44135:7;44114:20:::1;:29::i;:::-;44095:16;::::0;;::::1;:48:::0;44161:11;37658:7;:22;;;;44161:11;43725:455;-1:-1:-1;;;43725:455:0:o;45043:385::-;45127:7;36740:1;37346:7;;:19;;37338:63;;;;;-1:-1:-1;;;37338:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37338:63:0;;;;;;;;;;;;;;;36740:1;37479:7;:18;50545:11:::1;::::0;-1:-1:-1;;;50545:11:0;::::1;;;50537:53;;;::::0;;-1:-1:-1;;;50537:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;45147:21:::2;45171:8;45180:3;45171:13;;;;;;;;;::::0;;;::::2;::::0;;;45219;;;:8:::2;:13:::0;;;;;;45171::::2;::::0;;::::2;;::::0;-1:-1:-1;45171:13:0;45233:12:::2;:10;:12::i;:::-;-1:-1:-1::0;;;;;45219:27:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;45219:27:0;45261:11;;45219:27;;-1:-1:-1;45261:15:0;45257:164:::2;;45307:1;45293:15:::0;;;45323::::2;::::0;;::::2;:19:::0;;;45376:16;::::2;::::0;:33:::2;::::0;:20:::2;:33::i;:::-;45357:16;::::0;::::2;:52:::0;45257:164:::2;-1:-1:-1::0;;36696:1:0;37658:7;:22;45043:385;;-1:-1:-1;45043:385:0:o;40900:413::-;40985:7;38668:32;38687:12;:10;:12::i;38668:32::-;38660:89;;;;-1:-1:-1;;;38660:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41005:17:::1;:15;:17::i;:::-;41047:8;:15:::0;41091::::1;::::0;:32:::1;::::0;41111:11;41091:19:::1;:32::i;:::-;41073:15;:50:::0;41148:135:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;41148:135:0;;::::1;::::0;;-1:-1:-1;41148:135:0::1;::::0;::::1;::::0;;;;;;;;;41244:16:::1;::::0;41148:135;;;;;;;;;;;;41134:8:::1;:150:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;41134:150:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41302:3:0;40900:413::o;33723:131::-;33790:4;33814:32;33819:3;33839:5;33814:4;:32::i;47287:202::-;47388:7;47415:66;47429:20;47451:15;47468:12;47415:13;:66::i;9041:158::-;9099:7;9132:1;9127;:6;;9119:49;;;;;-1:-1:-1;;;9119:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9186:5:0;;;9041:158::o;46085:700::-;46163:21;46187:8;46196:3;46187:13;;;;;;;;;;;;;;;;;;46163:37;;46260:17;46272:4;46260:11;:17::i;:::-;46325:15;46343:69;46396:4;:15;;;46343:48;46386:4;46343:38;46359:4;:21;;;46343:4;:11;;;:15;;:38;;;;:::i;:69::-;46325:87;-1:-1:-1;46471:11:0;;46467:197;;46499:38;46515:12;:10;:12::i;:::-;46529:7;46499:15;:38::i;:::-;46569:14;;;;:27;;46588:7;46569:18;:27::i;:::-;46552:14;;;:44;46639:3;46625:12;:10;:12::i;:::-;-1:-1:-1;;;;;46616:36:0;;46644:7;46616:36;;;;;;;;;;;;;;;;;;46467:197;46745:21;;;;46729:11;;:48;;46772:4;;46729:38;;:15;:38::i;:48::-;46711:4;:15;;:66;;;;46085:700;;;;:::o;32854:117::-;32917:7;32944:19;32952:3;32944:7;:19::i;33315:158::-;33389:7;33440:22;33444:3;33456:5;33440:3;:22::i;68097:215::-;68174:7;;;;68234:22;68238:3;68250:5;68234:3;:22::i;34030:137::-;34100:4;34124:35;34132:3;34152:5;34124:7;:35::i;44328:551::-;44408:7;36740:1;37346:7;;:19;;37338:63;;;;;-1:-1:-1;;;37338:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37338:63:0;;;;;;;;;;;;;;;36740:1;37479:7;:18;;;44452:8:::1;:13:::0;;44461:3;;44452:13;::::1;;;;;;::::0;;;::::1;::::0;;;44500;;;:8:::1;:13:::0;;;;;;44452::::1;::::0;;::::1;;::::0;-1:-1:-1;44452:13:0;44514:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;44500:27:0::1;-1:-1:-1::0;;;;;44500:27:0::1;;;;;;;;;;;;44476:51;;44561:7;44546:4;:11;;;:22;;44538:84;;;;-1:-1:-1::0;;;44538:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44633:24;44647:3;44652:4;44633:13;:24::i;:::-;44682:11:::0;;:24:::1;::::0;44698:7;44682:15:::1;:24::i;:::-;44668:38:::0;;;44751:21:::1;::::0;::::1;::::0;44735:48:::1;::::0;44778:4:::1;::::0;44735:38:::1;::::0;44668;44735:15:::1;:38::i;:48::-;44717:15;::::0;;::::1;:66:::0;;;;44813:16;::::1;::::0;:29:::1;::::0;44834:7;44813:20:::1;:29::i;32357:158::-:0;32430:4;32454:53;32462:3;-1:-1:-1;;;;;32482:23:0;;32454:7;:53::i;68882:150::-;68958:7;68993:30;68998:3;69018;68993:4;:30::i;67170:139::-;67244:4;67268:33;67276:3;67296;67268:7;:33::i;42595:157::-;42655:15;42650:94;42686:8;:15;42676:25;;42650:94;;;42714:30;42726:8;42735:7;42726:17;;;;;;;;;;;;;;;;;;42714:11;:30::i;:::-;42703:9;;42650:94;;47544:1728;47701:7;47740:16;;47725:12;:31;47721:45;;;-1:-1:-1;47765:1:0;47758:8;;47721:45;47834:21;47858:34;47875:16;;47858:12;:16;;:34;;;;:::i;:::-;47834:58;;47962:28;47993:42;48018:16;;47993:20;:24;;:42;;;;:::i;:::-;48146:8;:15;47962:73;;-1:-1:-1;48046:19:0;;-1:-1:-1;;48146:19:0;48127:1012;48613:33;;:::i;:::-;48649:8;48658:3;48649:13;;;;;;;;;;;;;;;;;;48613:49;;;;;;;;;;;;;;;;;;;;;;;;;;;48705:10;:22;;;48681:20;:46;48677:451;;48762:83;48805:39;:13;48823:20;48805:17;:39::i;48762:83::-;48748:97;;48864:5;;;48677:451;48911:22;;48895:38;;48891:237;;;49030:22;;48968:87;;49012:41;;:13;;:17;:41::i;48968:87::-;49090:22;;;-1:-1:-1;48954:101:0;-1:-1:-1;48891:237:0;-1:-1:-1;;;48169:5:0;48127:1012;;;-1:-1:-1;49248:15:0;;49211:53;;:32;:11;49227:15;49211;:32::i;:53::-;49204:60;47544:1728;-1:-1:-1;;;;;;;47544:1728:0:o;27093:414::-;27156:4;27178:21;27188:3;27193:5;27178:9;:21::i;:::-;27173:327;;-1:-1:-1;27216:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;27399:18;;27377:19;;;:12;;;:19;;;;;;:40;;;;27432:11;;27173:327;-1:-1:-1;27483:5:0;27476:12;;29313:129;29386:4;29410:19;;;:12;;;;;:19;;;;;;:24;;;29313:129::o;65065:308::-;65134:4;65179:17;;;:12;;;:17;;;;;;65134:4;;65211:13;65207:36;;-1:-1:-1;65234:5:0;;-1:-1:-1;65234:5:0;;-1:-1:-1;65226:17:0;;65207:36;65298:4;65304:3;:12;;65328:1;65317:8;:12;65304:26;;;;;;;;;;;;;;;;;;:33;;;65290:48;;;;;65065:308;;;;;:::o;61385:737::-;61495:4;61630:17;;;:12;;;:17;;;;;;61664:13;61660:455;;-1:-1:-1;;61762:36:0;;;;;;;;;;;;;;;;;;61744:55;;;;;;;;:12;:55;;;;;;;;;;;;;;;;;;;;;;;;61957:19;;61937:17;;;:12;;;:17;;;;;;;:39;61991:11;;61660:455;62071:5;62035:3;:12;;62059:1;62048:8;:12;62035:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;62098:5;62091:12;;;;;42853:734;43014:4;:20;;;42998:12;:36;42994:75;;43051:7;;42994:75;43128:16;;;;43124:110;;43189:12;43166:20;;;:35;43216:7;;43124:110;43267:17;43287:52;43301:4;:20;;;43323:4;:15;;;43287:13;:52::i;:::-;43267:72;;43421:68;43447:41;43471:4;:16;;;43447:19;43461:4;43447:9;:13;;:19;;;;:::i;:41::-;43421:21;;;;;:25;:68::i;:::-;43397:21;;;:92;-1:-1:-1;43565:12:0;43542:20;;;:35;42853:734;:::o;46902:330::-;46979:10;;46975:250;;47023:4;;:29;;;-1:-1:-1;;;47023:29:0;;47046:4;47023:29;;;;;;47006:14;;-1:-1:-1;;;;;47023:4:0;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47023:29:0;;-1:-1:-1;47071:15:0;;;47067:147;;;47107:4;;:25;;;-1:-1:-1;;;47107:25:0;;-1:-1:-1;;;;;47107:25:0;;;;;;;;;;;;;;;:4;;;;;:13;;:25;;;;;;;;;;;;;;:4;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47067:147:0;;-1:-1:-1;47067:147:0;;47173:4;;:25;;;-1:-1:-1;;;47173:25:0;;-1:-1:-1;;;;;47173:25:0;;;;;;;;;;;;;;;:4;;;;;:13;;:25;;;;;;;;;;;;;;:4;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47067:147;46975:250;;46902:330;;:::o;29528:109::-;29611:18;;29528:109::o;29981:204::-;30076:18;;30048:7;;30076:26;-1:-1:-1;30068:73:0;;;;-1:-1:-1;;;30068:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30159:3;:11;;30171:5;30159:18;;;;;;;;;;;;;;;;30152:25;;29981:204;;;;:::o;64638:279::-;64742:19;;64705:7;;;;64742:27;-1:-1:-1;64734:74:0;;;;-1:-1:-1;;;64734:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64821:22;64846:3;:12;;64859:5;64846:19;;;;;;;;;;;;;;;;;;64821:44;;64884:5;:10;;;64896:5;:12;;;64876:33;;;;;64638:279;;;;;:::o;27683:1544::-;27749:4;27888:19;;;:12;;;:19;;;;;;27924:15;;27920:1300;;28359:18;;-1:-1:-1;;28310:14:0;;;;28359:22;;;;28286:21;;28359:3;;:22;;28646;;;;;;;;;;;;;;28626:42;;28792:9;28763:3;:11;;28775:13;28763:26;;;;;;;;;;;;;;;;;;;:38;;;;28869:23;;;28911:1;28869:12;;;:23;;;;;;28895:17;;;28869:43;;29021:17;;28869:3;;29021:17;;;;;;;;;;;;;;;;;;;;;;29116:3;:12;;:19;29129:5;29116:19;;;;;;;;;;;29109:26;;;29159:4;29152:11;;;;;;;;27920:1300;29203:5;29196:12;;;;;65534:311;65600:7;65639:17;;;:12;;;:17;;;;;;65675:13;65667:56;;;;;-1:-1:-1;;;65667:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65777:3;:12;;65801:1;65790:8;:12;65777:26;;;;;;;;;;;;;;;;;;:33;;;65770:40;;;65534:311;;;;:::o;62297:1562::-;62361:4;62496:17;;;:12;;;:17;;;;;;62530:13;;62526:1326;;62975:19;;-1:-1:-1;;62928:12:0;;;;62975:23;;;;62904:21;;62975:3;;:23;;63272;;;;;;;;;;;;;;;;63243:52;;63420:9;63390:3;:12;;63403:13;63390:27;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;;;;63510:14;;63497:28;;:12;;;:28;;;;;63528:17;;;63497:48;;63654:18;;63497:3;;63654:18;;;;;;;;;;;;;;-1:-1:-1;;63654:18:0;;;;;;;;;;;;;;;;;;;;;63750:17;;;:12;;;:17;;;;;;63743:24;;;;63654:18;-1:-1:-1;63784:11:0;;-1:-1:-1;;;;63784:11:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://10485f3d0de5014989abf966fb0eeb07b4c847f10193f4b1d54a544ee0fcbe4e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.