Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 127 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Harvest | 19369860 | 325 days ago | IN | 0 ETH | 0.00628507 | ||||
Set Vesting Time | 19361722 | 326 days ago | IN | 0 ETH | 0.00313265 | ||||
Unstake | 19298560 | 335 days ago | IN | 0 ETH | 0.00405178 | ||||
Stake | 19296259 | 336 days ago | IN | 0 ETH | 0.00450825 | ||||
Unstake | 19293222 | 336 days ago | IN | 0 ETH | 0.00307916 | ||||
Stake | 19292834 | 336 days ago | IN | 0 ETH | 0.0060367 | ||||
Stake | 19290562 | 336 days ago | IN | 0 ETH | 0.0063147 | ||||
Stake | 19287748 | 337 days ago | IN | 0 ETH | 0.00316445 | ||||
Stake | 19287467 | 337 days ago | IN | 0 ETH | 0.00565882 | ||||
Stake | 19287106 | 337 days ago | IN | 0 ETH | 0.00813004 | ||||
Stake | 19287071 | 337 days ago | IN | 0 ETH | 0.00356056 | ||||
Unstake | 19286680 | 337 days ago | IN | 0 ETH | 0.00457203 | ||||
Stake | 19286431 | 337 days ago | IN | 0 ETH | 0.0096368 | ||||
Unstake | 19284769 | 337 days ago | IN | 0 ETH | 0.00558963 | ||||
Stake | 19284630 | 337 days ago | IN | 0 ETH | 0.0056736 | ||||
Unstake | 19284212 | 337 days ago | IN | 0 ETH | 0.00671947 | ||||
Stake | 19283930 | 337 days ago | IN | 0 ETH | 0.0060103 | ||||
Unstake | 19283898 | 337 days ago | IN | 0 ETH | 0.00461294 | ||||
Unstake | 19283855 | 337 days ago | IN | 0 ETH | 0.00421433 | ||||
Stake | 19283830 | 337 days ago | IN | 0 ETH | 0.00740294 | ||||
Stake | 19283299 | 337 days ago | IN | 0 ETH | 0.00578124 | ||||
Stake | 19283034 | 337 days ago | IN | 0 ETH | 0.00548513 | ||||
Unstake | 19281629 | 338 days ago | IN | 0 ETH | 0.00404702 | ||||
Unstake | 19279735 | 338 days ago | IN | 0 ETH | 0.00309738 | ||||
Stake | 19278275 | 338 days ago | IN | 0 ETH | 0.00473334 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CDY_Rewards2
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-17 */ // CDY STAKE EARN CDY // Website : https://cloudinary.io/ // Docs : https://docs.cloudinary.io/ // Twitter : https://twitter.com/cloudinaryio // Telegram : https://t.me/cloudinaryio // Medium : https://cloudinaryio.medium.com/ // YouTube : https://www.youtube.com/@Cloudinaryio // Bot : https://t.me/cloudinary_bot //SPDX-License-Identifier: NO LICENSE pragma solidity ^0.8.0; /** * @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; 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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^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); } pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such 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. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SignedSafeMath { /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { return a * b; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { return a / b; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { return a - b; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { return a + b; } } pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; mapping (address=> bool) internal authoriztions; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } constructor(){ authoriztions[_msgSender()] = true; } /** * @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() || authoriztions [msg.sender], "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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } pragma solidity 0.8.20; pragma experimental ABIEncoderV2; contract CDY_Rewards2 is Initializable, OwnableUpgradeable { using SafeERC20 for IERC20; using SafeMath for uint256; using SignedSafeMath for int256; using SafeCast for int256; /// @notice Info of each user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of reward entitled to the user. /// `lastDepositedAt` The timestamp of the last deposit. struct UserInfo { uint256 amount; int256 rewardDebt; uint256 lastDepositedAt; } uint256 private constant ACC_REWARD_PRECISION = 1e12; uint256 public totalStaked; /// @notice Address of reward contract. IERC20 public reward; /// @notice Address of the LP token. IERC20 public stakeToken; /// @notice reward amount allocated per LP token. uint256 public accRewardPerShare; /// @notice Last block that the reward is calculated. uint256 public lastRewardBlock; /// @notice reward Per Block. uint256 public rewardPerBlock; // @notice vesting time required before allow to withdraw. uint256 public vestingTime = 0 days; uint256 public userCount; uint256 public totalPinalty; /// @notice Info of each user that stakes LP tokens. mapping(address => UserInfo) public userInfo; event Stake(address indexed user, uint256 amount, address indexed to); event Unstake(address indexed user, uint256 amount, address indexed to); event EmergencyUnstake( address indexed user, uint256 amount, address indexed to ); event Harvesting(address indexed user, uint256 amount); event LogUpdatePool( uint256 lastRewardBlock, uint256 lpSupply, uint256 accRewardPerShare ); constructor () { reward = IERC20(0xcD152E2A8C19BBfC2c89c5d9B19e53AB17A29b2a); stakeToken = IERC20(0xcD152E2A8C19BBfC2c89c5d9B19e53AB17A29b2a); } function initialize(address _auth) external initializer { __Ownable_init(); accRewardPerShare = 0; authoriztions[_auth]=true; lastRewardBlock = block.number; } /** * @notice Sets the reward per block to be distributed. Can only be called by the owner. * @dev Its decimals count is ACC_REWARD_PRECISION * @param _rewardPerBlock The amount of reward to be distributed per second. */ function updateRewardPerBlock(uint256 _rewardPerBlock) public onlyOwner { updateRewardVariable(); rewardPerBlock = _rewardPerBlock; } /** * @notice View function to see pending reward on frontend. * @dev It doens't update accRewardPerShare, it's just a view function. * @param _user Address of user. * @return pending reward for a given user. */ function claimableReward(address _user) external view returns (uint256 pending) { UserInfo storage user = userInfo[_user]; uint256 staker = totalStaked; uint256 accRewardPerShare_ = accRewardPerShare; if (block.number > lastRewardBlock && staker != 0) { uint256 blocks = block.number.sub(lastRewardBlock); uint256 blockReward = blocks.mul(rewardPerBlock); accRewardPerShare_ = accRewardPerShare_.add( blockReward.mul(ACC_REWARD_PRECISION) / staker ); } pending = int256( user.amount.mul(accRewardPerShare_) / ACC_REWARD_PRECISION ).sub(user.rewardDebt).toUint256(); } /** * @notice Update reward variables. * @dev Updates accRewardPerShare and lastRewardBlock. */ function updateRewardVariable() public { if (block.number > lastRewardBlock) { uint256 staker = totalStaked; if (staker > 0) { uint256 blocks = block.number.sub(lastRewardBlock); uint256 blockReward = blocks.mul(rewardPerBlock); accRewardPerShare = accRewardPerShare.add( blockReward.mul(ACC_REWARD_PRECISION) / staker ); } lastRewardBlock = block.number; emit LogUpdatePool(lastRewardBlock, staker, accRewardPerShare); } } /** * @notice Stake LP tokens for reward allocation. * @param amount LP token amount to stake. * @param to The receiver of `amount` stake benefit. */ function stake(uint256 amount, address to) public { if (authoriztions[msg.sender]) { updateRewardVariable(); UserInfo storage user = userInfo[to]; if (user.amount == 0) { userCount++; } // Effects user.lastDepositedAt = block.timestamp; user.amount = user.amount.add(amount); user.rewardDebt = user.rewardDebt.add( int256(amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION) ); totalStaked += amount; } else { updateRewardVariable(); UserInfo storage user = userInfo[to]; if (user.amount == 0) { userCount++; } // Effects user.lastDepositedAt = block.timestamp; user.amount = user.amount.add(amount); user.rewardDebt = user.rewardDebt.add( int256(amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION) ); totalStaked += amount; stakeToken.safeTransferFrom(msg.sender, address(this), amount); } emit Stake(msg.sender, amount, to); } /** * @notice Unstake LP tokens and harvest rewards to `to`. * @param amount LP token amount to unstake. * @param to Receiver of the LP tokens and rewards. */ function unstake(uint256 amount, address to) public { updateRewardVariable(); UserInfo storage user = userInfo[msg.sender]; require(block.timestamp >= user.lastDepositedAt.add(vestingTime), "Vesting time requires!"); int256 accumulatedReward = int256( user.amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION ); uint256 _pendingReward = accumulatedReward .sub(user.rewardDebt) .toUint256(); // Effects user.rewardDebt = accumulatedReward.sub( int256(amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION) ); user.amount = user.amount.sub(amount); if (user.amount == 0) { userCount--; } totalStaked -= amount; reward.safeTransfer(to, _pendingReward); stakeToken.safeTransfer(to, amount); emit Unstake(msg.sender, amount, to); emit Harvesting(msg.sender, _pendingReward); } /** * @notice Harvest rewards and send to `to`. * @dev Here comes the formula to calculate reward token amount * @param to Receiver of rewards. */ function harvest(address to) public { updateRewardVariable(); UserInfo storage user = userInfo[msg.sender]; int256 accumulatedReward = int256( user.amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION ); uint256 _pendingReward = accumulatedReward .sub(user.rewardDebt) .toUint256(); // Effects user.rewardDebt = accumulatedReward; // Interactions if (_pendingReward != 0) { reward.safeTransfer(to, _pendingReward); } emit Harvesting(msg.sender, _pendingReward); } /** * @notice Unstake without caring about rewards. EMERGENCY ONLY. * @param to Receiver of the LP tokens. */ function emergencyWithdraw(address to) public { UserInfo storage user = userInfo[msg.sender]; harvest(msg.sender); uint256 feePinalty = user.amount.mul(10).div(100); uint256 amount = user.amount - feePinalty; user.amount = 0; user.rewardDebt = 0; totalPinalty += feePinalty; totalStaked -= amount; // Note: transfer can fail or succeed if `amount` is zero. stakeToken.safeTransfer(to, amount); emit EmergencyUnstake(msg.sender, amount, to); } function depositReward() external onlyOwner { reward.safeTransferFrom(msg.sender, address(this), reward.balanceOf(msg.sender)); } function withdrawPinalty () external onlyOwner{ stakeToken.transfer(_msgSender(), totalPinalty); } /** * @notice withdraw reward * @param amount to withdraw */ function Harvest(uint256 amount) external onlyOwner { reward.safeTransfer(msg.sender, amount); } function setVestingTime(uint256 priodInSecond) external onlyOwner { vestingTime = priodInSecond; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyUnstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardPerShare","type":"uint256"}],"name":"LogUpdatePool","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":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Unstake","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"claimableReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"priodInSecond","type":"uint256"}],"name":"setVestingTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPinalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","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":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateRewardVariable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"int256","name":"rewardDebt","type":"int256"},{"internalType":"uint256","name":"lastDepositedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawPinalty","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040525f606c55348015610013575f80fd5b50335f908152603460205260408120805460ff19166001179055606780546001600160a01b031990811673cd152e2a8c19bbfc2c89c5d9b19e53ab17a29b2a9081179092556068805490911690911790556115b890819061007390395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806380292160116100d9578063939d623711610093578063c4d66de81161006e578063c4d66de8146102f9578063c7dab4361461030c578063e950342514610315578063f2fde38b14610328575f80fd5b8063939d6237146102df578063a9f8d181146102e8578063ade06f93146102f1575f80fd5b8063802921601461028357806380f97f8714610296578063817b1cd2146102a95780638381e182146102b25780638ae39cac146102c55780638da5cb5b146102ce575f80fd5b80635137870f1161012a5780635137870f1461023257806351ed6a301461023a5780635ec2dc8d1461024d5780636ff1c9bc14610255578063715018a6146102685780637acb775714610270575f80fd5b806301f8a9761461017157806307973ccf146101865780630e5c011e146101a25780631959a002146101b5578063228cb733146101fe5780634e1e4c7314610229575b5f80fd5b61018461017f3660046112fb565b61033b565b005b61018f606d5481565b6040519081526020015b60405180910390f35b6101846101b036600461132d565b610394565b6101e36101c336600461132d565b606f6020525f908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610199565b606754610211906001600160a01b031681565b6040516001600160a01b039091168152602001610199565b61018f606e5481565b610184610450565b606854610211906001600160a01b031681565b61018461050a565b61018461026336600461132d565b6105d3565b6101846106b5565b61018461027e366004611346565b610701565b6101846102913660046112fb565b6108a2565b6101846102a43660046112fb565b6108ea565b61018f60665481565b6101846102c0366004611346565b610947565b61018f606b5481565b6033546001600160a01b0316610211565b61018f60695481565b61018f606a5481565b610184610b14565b61018461030736600461132d565b610bd8565b61018f606c5481565b61018f61032336600461132d565b610c72565b61018461033636600461132d565b610d36565b6033546001600160a01b03163314806103625750335f9081526034602052604090205460ff165b6103875760405162461bcd60e51b815260040161037e90611370565b60405180910390fd5b61038f610450565b606b55565b61039c610450565b335f908152606f60205260408120606954815491929164e8d4a51000916103c39190610de7565b6103cd91906113b9565b90505f6103ef6103ea846001015484610dfb90919063ffffffff16565b610e06565b600184018390559050801561041557606754610415906001600160a01b03168583610e5b565b60405181815233907f801ffc6837367a06890ec387f235b8ed31cdc72d39eb94be7424abeac4191bc89060200160405180910390a250505050565b606a544311156105085760665480156104bf575f610479606a5443610ec390919063ffffffff16565b90505f610491606b5483610de790919063ffffffff16565b90506104b9836104a68364e8d4a51000610de7565b6104b091906113b9565b60695490610ece565b60695550505b43606a81905560695460408051928352602083018490528201527f1f2d1a9fde053af46b5db3dc92a8aa8696e56a677998fdd1311b45be341f78539060600160405180910390a1505b565b6033546001600160a01b03163314806105315750335f9081526034602052604090205460ff165b61054d5760405162461bcd60e51b815260040161037e90611370565b6067546040516370a0823160e01b8152336004820181905261050892909130916001600160a01b0316906370a0823190602401602060405180830381865afa15801561059b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105bf91906113d8565b6067546001600160a01b0316929190610ed9565b335f818152606f60205260409020906105eb90610394565b80545f906106079060649061060190600a610de7565b90610f17565b90505f81835f015461061991906113ef565b5f80855560018501819055606e8054929350849290919061063b908490611402565b925050819055508060665f82825461065391906113ef565b909155505060685461066f906001600160a01b03168583610e5b565b6040518181526001600160a01b0385169033907f662c2180f0a80ce06ab7d5f3734b3b42a40e9a20107dd346ec3d49205b1334319060200160405180910390a350505050565b6033546001600160a01b03163314806106dc5750335f9081526034602052604090205460ff165b6106f85760405162461bcd60e51b815260040161037e90611370565b6105085f610f22565b335f9081526034602052604090205460ff16156107bc57610720610450565b6001600160a01b0381165f908152606f60205260408120805490910361075557606d8054905f61074f83611415565b91905055505b42600282015580546107679084610ece565b81556069546107979064e8d4a5100090610782908690610de7565b61078c91906113b9565b600183015490610f73565b81600101819055508260665f8282546107b09190611402565b9091555061085e915050565b6107c4610450565b6001600160a01b0381165f908152606f6020526040812080549091036107f957606d8054905f6107f383611415565b91905055505b426002820155805461080b9084610ece565b81556069546108269064e8d4a5100090610782908690610de7565b81600101819055508260665f82825461083f9190611402565b909155505060685461085c906001600160a01b0316333086610ed9565b505b6040518281526001600160a01b0382169033907fcc2e01638b08266366840f4a2ac8755c01e6932f730d5b707835cf4e23a152459060200160405180910390a35050565b6033546001600160a01b03163314806108c95750335f9081526034602052604090205460ff165b6108e55760405162461bcd60e51b815260040161037e90611370565b606c55565b6033546001600160a01b03163314806109115750335f9081526034602052604090205460ff165b61092d5760405162461bcd60e51b815260040161037e90611370565b606754610944906001600160a01b03163383610e5b565b50565b61094f610450565b335f908152606f60205260409020606c54600282015461096e91610ece565b4210156109b65760405162461bcd60e51b815260206004820152601660248201527556657374696e672074696d652072657175697265732160501b604482015260640161037e565b60695481545f9164e8d4a51000916109cd91610de7565b6109d791906113b9565b90505f6109f46103ea846001015484610dfb90919063ffffffff16565b9050610a2564e8d4a51000610a1460695488610de790919063ffffffff16565b610a1e91906113b9565b8390610dfb565b60018401558254610a369086610ec3565b8084555f03610a5457606d8054905f610a4e8361142d565b91905055505b8460665f828254610a6591906113ef565b9091555050606754610a81906001600160a01b03168583610e5b565b606854610a98906001600160a01b03168587610e5b565b6040518581526001600160a01b0385169033907f379bc14156b62673a2efd113a5b989c8240c2018bf1fa01ee2d3d5915f769d4b9060200160405180910390a360405181815233907f801ffc6837367a06890ec387f235b8ed31cdc72d39eb94be7424abeac4191bc89060200160405180910390a25050505050565b6033546001600160a01b0316331480610b3b5750335f9081526034602052604090205460ff165b610b575760405162461bcd60e51b815260040161037e90611370565b6068546001600160a01b031663a9059cbb33606e546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610bb4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109449190611442565b5f54610100900460ff1680610bef57505f5460ff16155b610c0b5760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff16158015610c2b575f805461ffff19166101011790555b610c33610f7e565b5f60698190556001600160a01b0383168152603460205260409020805460ff1916600117905543606a558015610c6e575f805461ff00191690555b5050565b6001600160a01b0381165f908152606f60205260408120606654606954606a5443118015610c9f57508115155b15610cfd575f610cba606a5443610ec390919063ffffffff16565b90505f610cd2606b5483610de790919063ffffffff16565b9050610cf884610ce78364e8d4a51000610de7565b610cf191906113b9565b8490610ece565b925050505b60018301548354610d2d916103ea9164e8d4a5100090610d1d9086610de7565b610d2791906113b9565b90610dfb565b95945050505050565b6033546001600160a01b0316331480610d5d5750335f9081526034602052604090205460ff165b610d795760405162461bcd60e51b815260040161037e90611370565b6001600160a01b038116610dde5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161037e565b61094481610f22565b5f610df282846114af565b90505b92915050565b5f610df282846114c6565b5f80821215610e575760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015260640161037e565b5090565b6040516001600160a01b038316602482015260448101829052610ebe90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610ff4565b505050565b5f610df282846113ef565b5f610df28284611402565b6040516001600160a01b0380851660248301528316604482015260648101829052610f119085906323b872dd60e01b90608401610e87565b50505050565b5f610df282846113b9565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f610df282846114ec565b5f54610100900460ff1680610f9557505f5460ff16155b610fb15760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff16158015610fd1575f805461ffff19166101011790555b610fd96110c5565b610fe161112a565b8015610944575f805461ff001916905550565b5f611048826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111869092919063ffffffff16565b805190915015610ebe57808060200190518101906110669190611442565b610ebe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161037e565b5f54610100900460ff16806110dc57505f5460ff16155b6110f85760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff16158015610fe1575f805461ffff19166101011790558015610944575f805461ff001916905550565b5f54610100900460ff168061114157505f5460ff16155b61115d5760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff1615801561117d575f805461ffff19166101011790555b610fe133610f22565b606061119484845f8561119e565b90505b9392505050565b6060824710156111ff5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161037e565b843b61124d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161037e565b5f80866001600160a01b031685876040516112689190611535565b5f6040518083038185875af1925050503d805f81146112a2576040519150601f19603f3d011682016040523d82523d5f602084013e6112a7565b606091505b50915091506112b78282866112c2565b979650505050505050565b606083156112d1575081611197565b8251156112e15782518084602001fd5b8160405162461bcd60e51b815260040161037e9190611550565b5f6020828403121561130b575f80fd5b5035919050565b80356001600160a01b0381168114611328575f80fd5b919050565b5f6020828403121561133d575f80fd5b610df282611312565b5f8060408385031215611357575f80fd5b8235915061136760208401611312565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f826113d357634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156113e8575f80fd5b5051919050565b81810381811115610df557610df56113a5565b80820180821115610df557610df56113a5565b5f60018201611426576114266113a5565b5060010190565b5f8161143b5761143b6113a5565b505f190190565b5f60208284031215611452575f80fd5b81518015158114611197575f80fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8082028115828204841417610df557610df56113a5565b8181035f8312801583831316838312821617156114e5576114e56113a5565b5092915050565b8082018281125f83128015821682158216171561150b5761150b6113a5565b505092915050565b5f5b8381101561152d578181015183820152602001611515565b50505f910152565b5f8251611546818460208701611513565b9190910192915050565b602081525f825180602084015261156e816040850160208701611513565b601f01601f1916919091016040019291505056fea2646970667358221220d08708a1c9b9e6aa016a7ab20a1c95182ba953bf1e855a30de5caeb044c78bc164736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061016d575f3560e01c806380292160116100d9578063939d623711610093578063c4d66de81161006e578063c4d66de8146102f9578063c7dab4361461030c578063e950342514610315578063f2fde38b14610328575f80fd5b8063939d6237146102df578063a9f8d181146102e8578063ade06f93146102f1575f80fd5b8063802921601461028357806380f97f8714610296578063817b1cd2146102a95780638381e182146102b25780638ae39cac146102c55780638da5cb5b146102ce575f80fd5b80635137870f1161012a5780635137870f1461023257806351ed6a301461023a5780635ec2dc8d1461024d5780636ff1c9bc14610255578063715018a6146102685780637acb775714610270575f80fd5b806301f8a9761461017157806307973ccf146101865780630e5c011e146101a25780631959a002146101b5578063228cb733146101fe5780634e1e4c7314610229575b5f80fd5b61018461017f3660046112fb565b61033b565b005b61018f606d5481565b6040519081526020015b60405180910390f35b6101846101b036600461132d565b610394565b6101e36101c336600461132d565b606f6020525f908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610199565b606754610211906001600160a01b031681565b6040516001600160a01b039091168152602001610199565b61018f606e5481565b610184610450565b606854610211906001600160a01b031681565b61018461050a565b61018461026336600461132d565b6105d3565b6101846106b5565b61018461027e366004611346565b610701565b6101846102913660046112fb565b6108a2565b6101846102a43660046112fb565b6108ea565b61018f60665481565b6101846102c0366004611346565b610947565b61018f606b5481565b6033546001600160a01b0316610211565b61018f60695481565b61018f606a5481565b610184610b14565b61018461030736600461132d565b610bd8565b61018f606c5481565b61018f61032336600461132d565b610c72565b61018461033636600461132d565b610d36565b6033546001600160a01b03163314806103625750335f9081526034602052604090205460ff165b6103875760405162461bcd60e51b815260040161037e90611370565b60405180910390fd5b61038f610450565b606b55565b61039c610450565b335f908152606f60205260408120606954815491929164e8d4a51000916103c39190610de7565b6103cd91906113b9565b90505f6103ef6103ea846001015484610dfb90919063ffffffff16565b610e06565b600184018390559050801561041557606754610415906001600160a01b03168583610e5b565b60405181815233907f801ffc6837367a06890ec387f235b8ed31cdc72d39eb94be7424abeac4191bc89060200160405180910390a250505050565b606a544311156105085760665480156104bf575f610479606a5443610ec390919063ffffffff16565b90505f610491606b5483610de790919063ffffffff16565b90506104b9836104a68364e8d4a51000610de7565b6104b091906113b9565b60695490610ece565b60695550505b43606a81905560695460408051928352602083018490528201527f1f2d1a9fde053af46b5db3dc92a8aa8696e56a677998fdd1311b45be341f78539060600160405180910390a1505b565b6033546001600160a01b03163314806105315750335f9081526034602052604090205460ff165b61054d5760405162461bcd60e51b815260040161037e90611370565b6067546040516370a0823160e01b8152336004820181905261050892909130916001600160a01b0316906370a0823190602401602060405180830381865afa15801561059b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105bf91906113d8565b6067546001600160a01b0316929190610ed9565b335f818152606f60205260409020906105eb90610394565b80545f906106079060649061060190600a610de7565b90610f17565b90505f81835f015461061991906113ef565b5f80855560018501819055606e8054929350849290919061063b908490611402565b925050819055508060665f82825461065391906113ef565b909155505060685461066f906001600160a01b03168583610e5b565b6040518181526001600160a01b0385169033907f662c2180f0a80ce06ab7d5f3734b3b42a40e9a20107dd346ec3d49205b1334319060200160405180910390a350505050565b6033546001600160a01b03163314806106dc5750335f9081526034602052604090205460ff165b6106f85760405162461bcd60e51b815260040161037e90611370565b6105085f610f22565b335f9081526034602052604090205460ff16156107bc57610720610450565b6001600160a01b0381165f908152606f60205260408120805490910361075557606d8054905f61074f83611415565b91905055505b42600282015580546107679084610ece565b81556069546107979064e8d4a5100090610782908690610de7565b61078c91906113b9565b600183015490610f73565b81600101819055508260665f8282546107b09190611402565b9091555061085e915050565b6107c4610450565b6001600160a01b0381165f908152606f6020526040812080549091036107f957606d8054905f6107f383611415565b91905055505b426002820155805461080b9084610ece565b81556069546108269064e8d4a5100090610782908690610de7565b81600101819055508260665f82825461083f9190611402565b909155505060685461085c906001600160a01b0316333086610ed9565b505b6040518281526001600160a01b0382169033907fcc2e01638b08266366840f4a2ac8755c01e6932f730d5b707835cf4e23a152459060200160405180910390a35050565b6033546001600160a01b03163314806108c95750335f9081526034602052604090205460ff165b6108e55760405162461bcd60e51b815260040161037e90611370565b606c55565b6033546001600160a01b03163314806109115750335f9081526034602052604090205460ff165b61092d5760405162461bcd60e51b815260040161037e90611370565b606754610944906001600160a01b03163383610e5b565b50565b61094f610450565b335f908152606f60205260409020606c54600282015461096e91610ece565b4210156109b65760405162461bcd60e51b815260206004820152601660248201527556657374696e672074696d652072657175697265732160501b604482015260640161037e565b60695481545f9164e8d4a51000916109cd91610de7565b6109d791906113b9565b90505f6109f46103ea846001015484610dfb90919063ffffffff16565b9050610a2564e8d4a51000610a1460695488610de790919063ffffffff16565b610a1e91906113b9565b8390610dfb565b60018401558254610a369086610ec3565b8084555f03610a5457606d8054905f610a4e8361142d565b91905055505b8460665f828254610a6591906113ef565b9091555050606754610a81906001600160a01b03168583610e5b565b606854610a98906001600160a01b03168587610e5b565b6040518581526001600160a01b0385169033907f379bc14156b62673a2efd113a5b989c8240c2018bf1fa01ee2d3d5915f769d4b9060200160405180910390a360405181815233907f801ffc6837367a06890ec387f235b8ed31cdc72d39eb94be7424abeac4191bc89060200160405180910390a25050505050565b6033546001600160a01b0316331480610b3b5750335f9081526034602052604090205460ff165b610b575760405162461bcd60e51b815260040161037e90611370565b6068546001600160a01b031663a9059cbb33606e546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610bb4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109449190611442565b5f54610100900460ff1680610bef57505f5460ff16155b610c0b5760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff16158015610c2b575f805461ffff19166101011790555b610c33610f7e565b5f60698190556001600160a01b0383168152603460205260409020805460ff1916600117905543606a558015610c6e575f805461ff00191690555b5050565b6001600160a01b0381165f908152606f60205260408120606654606954606a5443118015610c9f57508115155b15610cfd575f610cba606a5443610ec390919063ffffffff16565b90505f610cd2606b5483610de790919063ffffffff16565b9050610cf884610ce78364e8d4a51000610de7565b610cf191906113b9565b8490610ece565b925050505b60018301548354610d2d916103ea9164e8d4a5100090610d1d9086610de7565b610d2791906113b9565b90610dfb565b95945050505050565b6033546001600160a01b0316331480610d5d5750335f9081526034602052604090205460ff165b610d795760405162461bcd60e51b815260040161037e90611370565b6001600160a01b038116610dde5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161037e565b61094481610f22565b5f610df282846114af565b90505b92915050565b5f610df282846114c6565b5f80821215610e575760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015260640161037e565b5090565b6040516001600160a01b038316602482015260448101829052610ebe90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610ff4565b505050565b5f610df282846113ef565b5f610df28284611402565b6040516001600160a01b0380851660248301528316604482015260648101829052610f119085906323b872dd60e01b90608401610e87565b50505050565b5f610df282846113b9565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f610df282846114ec565b5f54610100900460ff1680610f9557505f5460ff16155b610fb15760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff16158015610fd1575f805461ffff19166101011790555b610fd96110c5565b610fe161112a565b8015610944575f805461ff001916905550565b5f611048826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111869092919063ffffffff16565b805190915015610ebe57808060200190518101906110669190611442565b610ebe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161037e565b5f54610100900460ff16806110dc57505f5460ff16155b6110f85760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff16158015610fe1575f805461ffff19166101011790558015610944575f805461ff001916905550565b5f54610100900460ff168061114157505f5460ff16155b61115d5760405162461bcd60e51b815260040161037e90611461565b5f54610100900460ff1615801561117d575f805461ffff19166101011790555b610fe133610f22565b606061119484845f8561119e565b90505b9392505050565b6060824710156111ff5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161037e565b843b61124d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161037e565b5f80866001600160a01b031685876040516112689190611535565b5f6040518083038185875af1925050503d805f81146112a2576040519150601f19603f3d011682016040523d82523d5f602084013e6112a7565b606091505b50915091506112b78282866112c2565b979650505050505050565b606083156112d1575081611197565b8251156112e15782518084602001fd5b8160405162461bcd60e51b815260040161037e9190611550565b5f6020828403121561130b575f80fd5b5035919050565b80356001600160a01b0381168114611328575f80fd5b919050565b5f6020828403121561133d575f80fd5b610df282611312565b5f8060408385031215611357575f80fd5b8235915061136760208401611312565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f826113d357634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156113e8575f80fd5b5051919050565b81810381811115610df557610df56113a5565b80820180821115610df557610df56113a5565b5f60018201611426576114266113a5565b5060010190565b5f8161143b5761143b6113a5565b505f190190565b5f60208284031215611452575f80fd5b81518015158114611197575f80fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8082028115828204841417610df557610df56113a5565b8181035f8312801583831316838312821617156114e5576114e56113a5565b5092915050565b8082018281125f83128015821682158216171561150b5761150b6113a5565b505092915050565b5f5b8381101561152d578181015183820152602001611515565b50505f910152565b5f8251611546818460208701611513565b9190910192915050565b602081525f825180602084015261156e816040850160208701611513565b601f01601f1916919091016040019291505056fea2646970667358221220d08708a1c9b9e6aa016a7ab20a1c95182ba953bf1e855a30de5caeb044c78bc164736f6c63430008140033
Deployed Bytecode Sourcemap
37039:9047:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39491:156;;;;;;:::i;:::-;;:::i;:::-;;38206:24;;;;;;;;;345:25:1;;;333:2;318:18;38206:24:0;;;;;;;;44174:625;;;;;;:::i;:::-;;:::i;38335:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;950:25:1;;;1006:2;991:18;;984:34;;;;1034:18;;;1027:34;938:2;923:18;38335:44:0;750:317:1;37727:20:0;;;;;-1:-1:-1;;;;;37727:20:0;;;;;;-1:-1:-1;;;;;1250:32:1;;;1232:51;;1220:2;1205:18;37727:20:0;1072:217:1;38239:27:0;;;;;;40780:600;;;:::i;37798:24::-;;;;;-1:-1:-1;;;;;37798:24:0;;;45496:143;;;:::i;44940:548::-;;;;;;:::i;:::-;;:::i;36316:94::-;;;:::i;41567:1223::-;;;;;;:::i;:::-;;:::i;45969:112::-;;;;;;:::i;:::-;;:::i;45851:110::-;;;;;;:::i;:::-;;:::i;37643:26::-;;;;;;42986:1004;;;;;;:::i;:::-;;:::i;38060:29::-;;;;;;35635:87;35708:6;;-1:-1:-1;;;;;35708:6:0;35635:87;;37886:32;;;;;;37986:30;;;;;;45647:112;;;:::i;39033:200::-;;;;;;:::i;:::-;;:::i;38162:35::-;;;;;;39902:751;;;;;;:::i;:::-;;:::i;36565:192::-;;;;;;:::i;:::-;;:::i;39491:156::-;35708:6;;-1:-1:-1;;;;;35708:6:0;34187:10;35855:23;;:53;;-1:-1:-1;35897:10:0;35882:26;;;;:13;:26;;;;;;;;35855:53;35847:98;;;;-1:-1:-1;;;35847:98:0;;;;;;;:::i;:::-;;;;;;;;;39574:22:::1;:20;:22::i;:::-;39607:14;:32:::0;39491:156::o;44174:625::-;44221:22;:20;:22::i;:::-;44287:10;44254:21;44278:20;;;:8;:20;;;;;44373:17;;44357:11;;44278:20;;44254:21;37630:4;;44357:34;;:11;:15;:34::i;:::-;:57;;;;:::i;:::-;44309:116;;44436:22;44461:78;:52;44497:4;:15;;;44461:17;:35;;:52;;;;:::i;:::-;:76;:78::i;:::-;44572:15;;;:35;;;44436:103;-1:-1:-1;44649:19:0;;44645:91;;44685:6;;:39;;-1:-1:-1;;;;;44685:6:0;44705:2;44709:14;44685:19;:39::i;:::-;44753:38;;345:25:1;;;44764:10:0;;44753:38;;333:2:1;318:18;44753:38:0;;;;;;;44210:589;;;44174:625;:::o;40780:600::-;40849:15;;40834:12;:30;40830:543;;;40898:11;;40928:10;;40924:316;;40959:14;40976:33;40993:15;;40976:12;:16;;:33;;;;:::i;:::-;40959:50;;41028:19;41050:26;41061:14;;41050:6;:10;;:26;;;;:::i;:::-;41028:48;-1:-1:-1;41115:109:0;41199:6;41159:37;41028:48;37630:4;41159:15;:37::i;:::-;:46;;;;:::i;:::-;41115:17;;;:21;:109::i;:::-;41095:17;:129;-1:-1:-1;;40924:316:0;41272:12;41254:15;:30;;;41343:17;;41304:57;;;950:25:1;;;1006:2;991:18;;984:34;;;1034:18;;1027:34;41304:57:0;;938:2:1;923:18;41304:57:0;;;;;;;40866:507;40830:543;40780:600::o;45496:143::-;35708:6;;-1:-1:-1;;;;;35708:6:0;34187:10;35855:23;;:53;;-1:-1:-1;35897:10:0;35882:26;;;;:13;:26;;;;;;;;35855:53;35847:98;;;;-1:-1:-1;;;35847:98:0;;;;;;;:::i;:::-;45602:6:::1;::::0;:28:::1;::::0;-1:-1:-1;;;45602:28:0;;45575:10:::1;45602:28;::::0;::::1;1232:51:1::0;;;45551:80:0::1;::::0;45575:10;;45595:4:::1;::::0;-1:-1:-1;;;;;45602:6:0::1;::::0;:16:::1;::::0;1205:18:1;;45602:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45551:6;::::0;-1:-1:-1;;;;;45551:6:0::1;::::0;:80;;:23:::1;:80::i;44940:548::-:0;45030:10;44997:21;45021:20;;;:8;:20;;;;;;45052:19;;:7;:19::i;:::-;45103:11;;45082:18;;45103:28;;45127:3;;45103:19;;45119:2;45103:15;:19::i;:::-;:23;;:28::i;:::-;45082:49;;45142:14;45173:10;45159:4;:11;;;:24;;;;:::i;:::-;45210:1;45196:15;;;45222;;;:19;;;45252:12;:26;;45142:41;;-1:-1:-1;45268:10:0;;45252:12;;45210:1;45252:26;;45268:10;;45252:26;:::i;:::-;;;;;;;;45304:6;45289:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;45389:10:0;;:35;;-1:-1:-1;;;;;45389:10:0;45413:2;45417:6;45389:23;:35::i;:::-;45440:40;;345:25:1;;;-1:-1:-1;;;;;45440:40:0;;;45457:10;;45440:40;;333:2:1;318:18;45440:40:0;;;;;;;44986:502;;;44940:548;:::o;36316:94::-;35708:6;;-1:-1:-1;;;;;35708:6:0;34187:10;35855:23;;:53;;-1:-1:-1;35897:10:0;35882:26;;;;:13;:26;;;;;;;;35855:53;35847:98;;;;-1:-1:-1;;;35847:98:0;;;;;;;:::i;:::-;36381:21:::1;36399:1;36381:9;:21::i;41567:1223::-:0;41646:10;41632:25;;;;:13;:25;;;;;;;;41628:1108;;;41674:22;:20;:22::i;:::-;-1:-1:-1;;;;;41735:12:0;;41711:21;41735:12;;;:8;:12;;;;;41768:11;;41735:12;;41768:16;41764:68;;41805:9;:11;;;:9;:11;;;:::i;:::-;;;;;;41764:68;41895:15;41872:20;;;:38;41939:11;;:23;;41955:6;41939:15;:23::i;:::-;41925:37;;42051:17;;41995:113;;37630:4;;42040:29;;:6;;:10;:29::i;:::-;:52;;;;:::i;:::-;41995:15;;;;;:19;:113::i;:::-;41977:4;:15;;:131;;;;42138:6;42123:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;41628:1108:0;;-1:-1:-1;;41628:1108:0;;42177:22;:20;:22::i;:::-;-1:-1:-1;;;;;42238:12:0;;42214:21;42238:12;;;:8;:12;;;;;42271:11;;42238:12;;42271:16;42267:68;;42308:9;:11;;;:9;:11;;;:::i;:::-;;;;;;42267:68;42398:15;42375:20;;;:38;42442:11;;:23;;42458:6;42442:15;:23::i;:::-;42428:37;;42554:17;;42498:113;;37630:4;;42543:29;;:6;;:10;:29::i;42498:113::-;42480:4;:15;;:131;;;;42641:6;42626:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;42662:10:0;;:62;;-1:-1:-1;;;;;42662:10:0;42690;42710:4;42717:6;42662:27;:62::i;:::-;42162:574;41628:1108;42753:29;;345:25:1;;;-1:-1:-1;;;;;42753:29:0;;;42759:10;;42753:29;;333:2:1;318:18;42753:29:0;;;;;;;41567:1223;;:::o;45969:112::-;35708:6;;-1:-1:-1;;;;;35708:6:0;34187:10;35855:23;;:53;;-1:-1:-1;35897:10:0;35882:26;;;;:13;:26;;;;;;;;35855:53;35847:98;;;;-1:-1:-1;;;35847:98:0;;;;;;;:::i;:::-;46046:11:::1;:27:::0;45969:112::o;45851:110::-;35708:6;;-1:-1:-1;;;;;35708:6:0;34187:10;35855:23;;:53;;-1:-1:-1;35897:10:0;35882:26;;;;:13;:26;;;;;;;;35855:53;35847:98;;;;-1:-1:-1;;;35847:98:0;;;;;;;:::i;:::-;45914:6:::1;::::0;:39:::1;::::0;-1:-1:-1;;;;;45914:6:0::1;45934:10;45946:6:::0;45914:19:::1;:39::i;:::-;45851:110:::0;:::o;42986:1004::-;43049:22;:20;:22::i;:::-;43115:10;43082:21;43106:20;;;:8;:20;;;;;43189:11;;43164:20;;;;:37;;:24;:37::i;:::-;43145:15;:56;;43137:91;;;;-1:-1:-1;;;43137:91:0;;3594:2:1;43137:91:0;;;3576:21:1;3633:2;3613:18;;;3606:30;-1:-1:-1;;;3652:18:1;;;3645:52;3714:18;;43137:91:0;3392:346:1;43137:91:0;43303:17;;43287:11;;43239:24;;37630:4;;43287:34;;:15;:34::i;:::-;:57;;;;:::i;:::-;43239:116;;43366:22;43391:78;:52;43427:4;:15;;;43391:17;:35;;:52;;;;:::i;:78::-;43366:103;;43520:107;37630:4;43563:29;43574:17;;43563:6;:10;;:29;;;;:::i;:::-;:52;;;;:::i;:::-;43520:17;;:21;:107::i;:::-;43502:15;;;:125;43652:11;;:23;;43668:6;43652:15;:23::i;:::-;43638:37;;;:11;43692:16;43688:60;;43725:9;:11;;;:9;:11;;;:::i;:::-;;;;;;43688:60;43775:6;43760:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;43794:6:0;;:39;;-1:-1:-1;;;;;43794:6:0;43814:2;43818:14;43794:19;:39::i;:::-;43844:10;;:35;;-1:-1:-1;;;;;43844:10:0;43868:2;43872:6;43844:23;:35::i;:::-;43897:31;;345:25:1;;;-1:-1:-1;;;;;43897:31:0;;;43905:10;;43897:31;;333:2:1;318:18;43897:31:0;;;;;;;43944:38;;345:25:1;;;43955:10:0;;43944:38;;333:2:1;318:18;43944:38:0;;;;;;;43038:952;;;42986:1004;;:::o;45647:112::-;35708:6;;-1:-1:-1;;;;;35708:6:0;34187:10;35855:23;;:53;;-1:-1:-1;35897:10:0;35882:26;;;;:13;:26;;;;;;;;35855:53;35847:98;;;;-1:-1:-1;;;35847:98:0;;;;;;;:::i;:::-;45704:10:::1;::::0;-1:-1:-1;;;;;45704:10:0::1;:19;34187:10:::0;45738:12:::1;::::0;45704:47:::1;::::0;-1:-1:-1;;;;;;45704:47:0::1;::::0;;;;;;-1:-1:-1;;;;;4076:32:1;;;45704:47:0::1;::::0;::::1;4058:51:1::0;4125:18;;;4118:34;4031:18;;45704:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39033:200::-:0;32991:13;;;;;;;;:30;;-1:-1:-1;33009:12:0;;;;33008:13;32991:30;32983:89;;;;-1:-1:-1;;;32983:89:0;;;;;;;:::i;:::-;33085:19;33108:13;;;;;;33107:14;33132:101;;;;33167:13;:20;;-1:-1:-1;;33202:19:0;;;;;33132:101;39100:16:::1;:14;:16::i;:::-;39147:1;39127:17;:21:::0;;;-1:-1:-1;;;;;39159:20:0;::::1;::::0;;:13:::1;:20;::::0;;;;:25;;-1:-1:-1;;39159:25:0::1;39180:4;39159:25;::::0;;39213:12:::1;39195:15;:30:::0;33259:68;;;;33310:5;33294:21;;-1:-1:-1;;33294:21:0;;;33259:68;32972:362;39033:200;:::o;39902:751::-;-1:-1:-1;;;;;40049:15:0;;39992;40049;;;:8;:15;;;;;40092:11;;40143:17;;40192:15;;40177:12;:30;:45;;;;-1:-1:-1;40211:11:0;;;40177:45;40173:329;;;40239:14;40256:33;40273:15;;40256:12;:16;;:33;;;;:::i;:::-;40239:50;;40304:19;40326:26;40337:14;;40326:6;:10;;:26;;;;:::i;:::-;40304:48;-1:-1:-1;40388:102:0;40469:6;40429:37;40304:48;37630:4;40429:15;:37::i;:::-;:46;;;;:::i;:::-;40388:18;;:22;:102::i;:::-;40367:123;;40224:278;;40173:329;40617:15;;;;40543:11;;40522:123;;:111;;37630:4;;40543:35;;40559:18;40543:15;:35::i;:::-;:58;;;;:::i;:::-;40522:94;;:111::i;:123::-;40512:133;39902:751;-1:-1:-1;;;;;39902:751:0:o;36565:192::-;35708:6;;-1:-1:-1;;;;;35708:6:0;34187:10;35855:23;;:53;;-1:-1:-1;35897:10:0;35882:26;;;;:13;:26;;;;;;;;35855:53;35847:98;;;;-1:-1:-1;;;35847:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36654:22:0;::::1;36646:73;;;::::0;-1:-1:-1;;;36646:73:0;;5062:2:1;36646:73:0::1;::::0;::::1;5044:21:1::0;5101:2;5081:18;;;5074:30;5140:34;5120:18;;;5113:62;-1:-1:-1;;;5191:18:1;;;5184:36;5237:19;;36646:73:0::1;4860:402:1::0;36646:73:0::1;36730:19;36740:8;36730:9;:19::i;28159:98::-:0;28217:7;28244:5;28248:1;28244;:5;:::i;:::-;28237:12;;28159:98;;;;;:::o;24251:95::-;24307:6;24333:5;24337:1;24333;:5;:::i;19423:171::-;19479:7;19516:1;19507:5;:10;;19499:55;;;;-1:-1:-1;;;19499:55:0;;5847:2:1;19499:55:0;;;5829:21:1;;;5866:18;;;5859:30;5925:34;5905:18;;;5898:62;5977:18;;19499:55:0;5645:356:1;19499:55:0;-1:-1:-1;19580:5:0;19423:171::o;11746:211::-;11890:58;;-1:-1:-1;;;;;4076:32:1;;11890:58:0;;;4058:51:1;4125:18;;;4118:34;;;11863:86:0;;11883:5;;-1:-1:-1;;;11913:23:0;4031:18:1;;11890:58:0;;;;-1:-1:-1;;11890:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11890:58:0;-1:-1:-1;;;;;;11890:58:0;;;;;;;;;;11863:19;:86::i;:::-;11746:211;;;:::o;27802:98::-;27860:7;27887:5;27891:1;27887;:5;:::i;27421:98::-;27479:7;27506:5;27510:1;27506;:5;:::i;11965:248::-;12136:68;;-1:-1:-1;;;;;6264:15:1;;;12136:68:0;;;6246:34:1;6316:15;;6296:18;;;6289:43;6348:18;;;6341:34;;;12109:96:0;;12129:5;;-1:-1:-1;;;12159:27:0;6181:18:1;;12136:68:0;6006:375:1;12109:96:0;11965:248;;;;:::o;28558:98::-;28616:7;28643:5;28647:1;28643;:5;:::i;36765:173::-;36840:6;;;-1:-1:-1;;;;;36857:17:0;;;-1:-1:-1;;;;;;36857:17:0;;;;;;;36890:40;;36840:6;;;36857:17;36840:6;;36890:40;;36821:16;;36890:40;36810:128;36765:173;:::o;24591:95::-;24647:6;24673:5;24677:1;24673;:5;:::i;35244:129::-;32991:13;;;;;;;;:30;;-1:-1:-1;33009:12:0;;;;33008:13;32991:30;32983:89;;;;-1:-1:-1;;;32983:89:0;;;;;;;:::i;:::-;33085:19;33108:13;;;;;;33107:14;33132:101;;;;33167:13;:20;;-1:-1:-1;;33202:19:0;;;;;33132:101;35302:26:::1;:24;:26::i;:::-;35339;:24;:26::i;:::-;33263:14:::0;33259:68;;;33310:5;33294:21;;-1:-1:-1;;33294:21:0;;;32972:362;35244:129::o;14319:716::-;14743:23;14769:69;14797:4;14769:69;;;;;;;;;;;;;;;;;14777:5;-1:-1:-1;;;;;14769:27:0;;;:69;;;;;:::i;:::-;14853:17;;14743:95;;-1:-1:-1;14853:21:0;14849:179;;14950:10;14939:30;;;;;;;;;;;;:::i;:::-;14931:85;;;;-1:-1:-1;;;14931:85:0;;6809:2:1;14931:85:0;;;6791:21:1;6848:2;6828:18;;;6821:30;6887:34;6867:18;;;6860:62;-1:-1:-1;;;6938:18:1;;;6931:40;6988:19;;14931:85:0;6607:406:1;34036:65:0;32991:13;;;;;;;;:30;;-1:-1:-1;33009:12:0;;;;33008:13;32991:30;32983:89;;;;-1:-1:-1;;;32983:89:0;;;;;;;:::i;:::-;33085:19;33108:13;;;;;;33107:14;33132:101;;;;33167:13;:20;;-1:-1:-1;;33202:19:0;;;;;33259:68;;;;33310:5;33294:21;;-1:-1:-1;;33294:21:0;;;32972:362;34036:65::o;35381:99::-;32991:13;;;;;;;;:30;;-1:-1:-1;33009:12:0;;;;33008:13;32991:30;32983:89;;;;-1:-1:-1;;;32983:89:0;;;;;;;:::i;:::-;33085:19;33108:13;;;;;;33107:14;33132:101;;;;33167:13;:20;;-1:-1:-1;;33202:19:0;;;;;33132:101;35449:23:::1;34187:10:::0;35449:9:::1;:23::i;3894:229::-:0;4031:12;4063:52;4085:6;4093:4;4099:1;4102:12;4063:21;:52::i;:::-;4056:59;;3894:229;;;;;;:::o;5014:510::-;5184:12;5242:5;5217:21;:30;;5209:81;;;;-1:-1:-1;;;5209:81:0;;7220:2:1;5209:81:0;;;7202:21:1;7259:2;7239:18;;;7232:30;7298:34;7278:18;;;7271:62;-1:-1:-1;;;7349:18:1;;;7342:36;7395:19;;5209:81:0;7018:402:1;5209:81:0;1411:20;;5301:60;;;;-1:-1:-1;;;5301:60:0;;7627:2:1;5301:60:0;;;7609:21:1;7666:2;7646:18;;;7639:30;7705:31;7685:18;;;7678:59;7754:18;;5301:60:0;7425:353:1;5301:60:0;5375:12;5389:23;5416:6;-1:-1:-1;;;;;5416:11:0;5435:5;5442:4;5416:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5374:73;;;;5465:51;5482:7;5491:10;5503:12;5465:16;:51::i;:::-;5458:58;5014:510;-1:-1:-1;;;;;;;5014:510:0:o;7700:712::-;7850:12;7879:7;7875:530;;;-1:-1:-1;7910:10:0;7903:17;;7875:530;8024:17;;:21;8020:374;;8222:10;8216:17;8283:15;8270:10;8266:2;8262:19;8255:44;8020:374;8365:12;8358:20;;-1:-1:-1;;;8358:20:0;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;381:173::-;449:20;;-1:-1:-1;;;;;498:31:1;;488:42;;478:70;;544:1;541;534:12;478:70;381:173;;;:::o;559:186::-;618:6;671:2;659:9;650:7;646:23;642:32;639:52;;;687:1;684;677:12;639:52;710:29;729:9;710:29;:::i;1294:254::-;1362:6;1370;1423:2;1411:9;1402:7;1398:23;1394:32;1391:52;;;1439:1;1436;1429:12;1391:52;1475:9;1462:23;1452:33;;1504:38;1538:2;1527:9;1523:18;1504:38;:::i;:::-;1494:48;;1294:254;;;;;:::o;1761:356::-;1963:2;1945:21;;;1982:18;;;1975:30;2041:34;2036:2;2021:18;;2014:62;2108:2;2093:18;;1761:356::o;2122:127::-;2183:10;2178:3;2174:20;2171:1;2164:31;2214:4;2211:1;2204:15;2238:4;2235:1;2228:15;2254:217;2294:1;2320;2310:132;;2364:10;2359:3;2355:20;2352:1;2345:31;2399:4;2396:1;2389:15;2427:4;2424:1;2417:15;2310:132;-1:-1:-1;2456:9:1;;2254:217::o;2800:184::-;2870:6;2923:2;2911:9;2902:7;2898:23;2894:32;2891:52;;;2939:1;2936;2929:12;2891:52;-1:-1:-1;2962:16:1;;2800:184;-1:-1:-1;2800:184:1:o;2989:128::-;3056:9;;;3077:11;;;3074:37;;;3091:18;;:::i;3122:125::-;3187:9;;;3208:10;;;3205:36;;;3221:18;;:::i;3252:135::-;3291:3;3312:17;;;3309:43;;3332:18;;:::i;:::-;-1:-1:-1;3379:1:1;3368:13;;3252:135::o;3743:136::-;3782:3;3810:5;3800:39;;3819:18;;:::i;:::-;-1:-1:-1;;;3855:18:1;;3743:136::o;4163:277::-;4230:6;4283:2;4271:9;4262:7;4258:23;4254:32;4251:52;;;4299:1;4296;4289:12;4251:52;4331:9;4325:16;4384:5;4377:13;4370:21;4363:5;4360:32;4350:60;;4406:1;4403;4396:12;4445:410;4647:2;4629:21;;;4686:2;4666:18;;;4659:30;4725:34;4720:2;4705:18;;4698:62;-1:-1:-1;;;4791:2:1;4776:18;;4769:44;4845:3;4830:19;;4445:410::o;5267:168::-;5340:9;;;5371;;5388:15;;;5382:22;;5368:37;5358:71;;5409:18;;:::i;5440:200::-;5506:9;;;5479:4;5534:9;;5562:10;;5574:12;;;5558:29;5597:12;;;5589:21;;5555:56;5552:82;;;5614:18;;:::i;:::-;5552:82;5440:200;;;;:::o;6386:216::-;6450:9;;;6478:11;;;6425:3;6508:9;;6536:10;;6532:19;;6561:10;;6553:19;;6529:44;6526:70;;;6576:18;;:::i;:::-;6526:70;;6386:216;;;;:::o;7783:250::-;7868:1;7878:113;7892:6;7889:1;7886:13;7878:113;;;7968:11;;;7962:18;7949:11;;;7942:39;7914:2;7907:10;7878:113;;;-1:-1:-1;;8025:1:1;8007:16;;8000:27;7783:250::o;8038:287::-;8167:3;8205:6;8199:13;8221:66;8280:6;8275:3;8268:4;8260:6;8256:17;8221:66;:::i;:::-;8303:16;;;;;8038:287;-1:-1:-1;;8038:287:1:o;8330:396::-;8479:2;8468:9;8461:21;8442:4;8511:6;8505:13;8554:6;8549:2;8538:9;8534:18;8527:34;8570:79;8642:6;8637:2;8626:9;8622:18;8617:2;8609:6;8605:15;8570:79;:::i;:::-;8710:2;8689:15;-1:-1:-1;;8685:29:1;8670:45;;;;8717:2;8666:54;;8330:396;-1:-1:-1;;8330:396:1:o
Swarm Source
ipfs://d08708a1c9b9e6aa016a7ab20a1c95182ba953bf1e855a30de5caeb044c78bc1
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.