Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
CasineoCrowdSale
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-30 */ // File: @openzeppelin/contracts@5/utils/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _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 making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File: @openzeppelin/contracts@5/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File: @openzeppelin/contracts@5/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts@5/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts@5/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: @openzeppelin/contracts@5/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts@5/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/CasineoCrowdsale.sol pragma solidity ^0.8.20; library BokkyPooBahsDateTimeLibrary { uint constant SECONDS_PER_DAY = 24 * 60 * 60; uint constant SECONDS_PER_HOUR = 60 * 60; uint constant SECONDS_PER_MINUTE = 60; int constant OFFSET19700101 = 2440588; uint constant DOW_MON = 1; uint constant DOW_TUE = 2; uint constant DOW_WED = 3; uint constant DOW_THU = 4; uint constant DOW_FRI = 5; uint constant DOW_SAT = 6; uint constant DOW_SUN = 7; // ------------------------------------------------------------------------ // Calculate the number of days from 1970/01/01 to year/month/day using // the date conversion algorithm from // http://aa.usno.navy.mil/faq/docs/JD_Formula.php // and subtracting the offset 2440588 so that 1970/01/01 is day 0 // // days = day // - 32075 // + 1461 * (year + 4800 + (month - 14) / 12) / 4 // + 367 * (month - 2 - (month - 14) / 12 * 12) / 12 // - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4 // - offset // ------------------------------------------------------------------------ function _daysFromDate( uint year, uint month, uint day ) internal pure returns (uint _days) { require(year >= 1970); int _year = int(year); int _month = int(month); int _day = int(day); int __days = _day - 32075 + (1461 * (_year + 4800 + (_month - 14) / 12)) / 4 + (367 * (_month - 2 - ((_month - 14) / 12) * 12)) / 12 - (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) / 4 - OFFSET19700101; _days = uint(__days); } // ------------------------------------------------------------------------ // Calculate year/month/day from the number of days since 1970/01/01 using // the date conversion algorithm from // http://aa.usno.navy.mil/faq/docs/JD_Formula.php // and adding the offset 2440588 so that 1970/01/01 is day 0 // // int L = days + 68569 + offset // int N = 4 * L / 146097 // L = L - (146097 * N + 3) / 4 // year = 4000 * (L + 1) / 1461001 // L = L - 1461 * year / 4 + 31 // month = 80 * L / 2447 // dd = L - 2447 * month / 80 // L = month / 11 // month = month + 2 - 12 * L // year = 100 * (N - 49) + year + L // ------------------------------------------------------------------------ function _daysToDate( uint _days ) internal pure returns (uint year, uint month, uint day) { int __days = int(_days); int L = __days + 68569 + OFFSET19700101; int N = (4 * L) / 146097; L = L - (146097 * N + 3) / 4; int _year = (4000 * (L + 1)) / 1461001; L = L - (1461 * _year) / 4 + 31; int _month = (80 * L) / 2447; int _day = L - (2447 * _month) / 80; L = _month / 11; _month = _month + 2 - 12 * L; _year = 100 * (N - 49) + _year + L; year = uint(_year); month = uint(_month); day = uint(_day); } function timestampFromDate( uint year, uint month, uint day ) internal pure returns (uint timestamp) { timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY; } function timestampFromDateTime( uint year, uint month, uint day, uint hour, uint minute, uint second ) internal pure returns (uint timestamp) { timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second; } function timestampToDate( uint timestamp ) internal pure returns (uint year, uint month, uint day) { (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); } function timestampToDateTime( uint timestamp ) internal pure returns ( uint year, uint month, uint day, uint hour, uint minute, uint second ) { (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); uint secs = timestamp % SECONDS_PER_DAY; hour = secs / SECONDS_PER_HOUR; secs = secs % SECONDS_PER_HOUR; minute = secs / SECONDS_PER_MINUTE; second = secs % SECONDS_PER_MINUTE; } function isValidDate( uint year, uint month, uint day ) internal pure returns (bool valid) { if (year >= 1970 && month > 0 && month <= 12) { uint daysInMonth = _getDaysInMonth(year, month); if (day > 0 && day <= daysInMonth) { valid = true; } } } function isValidDateTime( uint year, uint month, uint day, uint hour, uint minute, uint second ) internal pure returns (bool valid) { if (isValidDate(year, month, day)) { if (hour < 24 && minute < 60 && second < 60) { valid = true; } } } function isLeapYear(uint timestamp) internal pure returns (bool leapYear) { uint year; uint month; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); leapYear = _isLeapYear(year); } function _isLeapYear(uint year) internal pure returns (bool leapYear) { leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); } function isWeekDay(uint timestamp) internal pure returns (bool weekDay) { weekDay = getDayOfWeek(timestamp) <= DOW_FRI; } function isWeekEnd(uint timestamp) internal pure returns (bool weekEnd) { weekEnd = getDayOfWeek(timestamp) >= DOW_SAT; } function getDaysInMonth( uint timestamp ) internal pure returns (uint daysInMonth) { uint year; uint month; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); daysInMonth = _getDaysInMonth(year, month); } function _getDaysInMonth( uint year, uint month ) internal pure returns (uint daysInMonth) { if ( month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 ) { daysInMonth = 31; } else if (month != 2) { daysInMonth = 30; } else { daysInMonth = _isLeapYear(year) ? 29 : 28; } } // 1 = Monday, 7 = Sunday function getDayOfWeek( uint timestamp ) internal pure returns (uint dayOfWeek) { uint _days = timestamp / SECONDS_PER_DAY; dayOfWeek = ((_days + 3) % 7) + 1; } function getYear(uint timestamp) internal pure returns (uint year) { uint month; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); } function getMonth(uint timestamp) internal pure returns (uint month) { uint year; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); } function getDay(uint timestamp) internal pure returns (uint day) { uint year; uint month; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); } function getHour(uint timestamp) internal pure returns (uint hour) { uint secs = timestamp % SECONDS_PER_DAY; hour = secs / SECONDS_PER_HOUR; } function getMinute(uint timestamp) internal pure returns (uint minute) { uint secs = timestamp % SECONDS_PER_HOUR; minute = secs / SECONDS_PER_MINUTE; } function getSecond(uint timestamp) internal pure returns (uint second) { second = timestamp % SECONDS_PER_MINUTE; } function addYears( uint timestamp, uint _years ) internal pure returns (uint newTimestamp) { uint year; uint month; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); year += _years; uint daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp >= timestamp); } function addMonths( uint timestamp, uint _months ) internal pure returns (uint newTimestamp) { uint year; uint month; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); month += _months; year += (month - 1) / 12; month = ((month - 1) % 12) + 1; uint daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp >= timestamp); } function addDays( uint timestamp, uint _days ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp + _days * SECONDS_PER_DAY; require(newTimestamp >= timestamp); } function addHours( uint timestamp, uint _hours ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp + _hours * SECONDS_PER_HOUR; require(newTimestamp >= timestamp); } function addMinutes( uint timestamp, uint _minutes ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE; require(newTimestamp >= timestamp); } function addSeconds( uint timestamp, uint _seconds ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp + _seconds; require(newTimestamp >= timestamp); } function subYears( uint timestamp, uint _years ) internal pure returns (uint newTimestamp) { uint year; uint month; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); year -= _years; uint daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp <= timestamp); } function subMonths( uint timestamp, uint _months ) internal pure returns (uint newTimestamp) { uint year; uint month; uint day; (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); uint yearMonth = year * 12 + (month - 1) - _months; year = yearMonth / 12; month = (yearMonth % 12) + 1; uint daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp <= timestamp); } function subDays( uint timestamp, uint _days ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp - _days * SECONDS_PER_DAY; require(newTimestamp <= timestamp); } function subHours( uint timestamp, uint _hours ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp - _hours * SECONDS_PER_HOUR; require(newTimestamp <= timestamp); } function subMinutes( uint timestamp, uint _minutes ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE; require(newTimestamp <= timestamp); } function subSeconds( uint timestamp, uint _seconds ) internal pure returns (uint newTimestamp) { newTimestamp = timestamp - _seconds; require(newTimestamp <= timestamp); } function diffYears( uint fromTimestamp, uint toTimestamp ) internal pure returns (uint _years) { require(fromTimestamp <= toTimestamp); uint fromYear; uint fromMonth; uint fromDay; uint toYear; uint toMonth; uint toDay; (fromYear, fromMonth, fromDay) = _daysToDate( fromTimestamp / SECONDS_PER_DAY ); (toYear, toMonth, toDay) = _daysToDate(toTimestamp / SECONDS_PER_DAY); _years = toYear - fromYear; } function diffMonths( uint fromTimestamp, uint toTimestamp ) internal pure returns (uint _months) { require(fromTimestamp <= toTimestamp); uint fromYear; uint fromMonth; uint fromDay; uint toYear; uint toMonth; uint toDay; (fromYear, fromMonth, fromDay) = _daysToDate( fromTimestamp / SECONDS_PER_DAY ); (toYear, toMonth, toDay) = _daysToDate(toTimestamp / SECONDS_PER_DAY); _months = toYear * 12 + toMonth - fromYear * 12 - fromMonth; } function diffDays( uint fromTimestamp, uint toTimestamp ) internal pure returns (uint _days) { require(fromTimestamp <= toTimestamp); _days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY; } function diffHours( uint fromTimestamp, uint toTimestamp ) internal pure returns (uint _hours) { require(fromTimestamp <= toTimestamp); _hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR; } function diffMinutes( uint fromTimestamp, uint toTimestamp ) internal pure returns (uint _minutes) { require(fromTimestamp <= toTimestamp); _minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE; } function diffSeconds( uint fromTimestamp, uint toTimestamp ) internal pure returns (uint _seconds) { require(fromTimestamp <= toTimestamp); _seconds = toTimestamp - fromTimestamp; } } contract CasineoCrowdSale is Ownable,ReentrancyGuard{ using BokkyPooBahsDateTimeLibrary for uint; using SafeERC20 for IERC20; IERC20 public paymentToken; IERC20 public preToken; uint256 public currentRound = 2; uint256 public constant totalRounds = 15; uint256 public purchaseLimitPerUser; //Tokens purchased by user mapping(address => uint256) public purchasedAmount; //Round Mappings RoundID => Data mapping(uint256 => uint256) public roundStartTime; mapping(uint256 => uint256) public roundEndTime; mapping(uint256 => uint256) public roundTokenPrice; mapping(uint256 => uint256) public roundFundingCap; mapping(uint256 => uint256) public roundTotalRaised; mapping(uint256 => bool) public roundCompleted; // Events event RoundSet( uint256 indexed round, uint256 startTime, uint256 endTime, uint256 tokenPrice, uint256 fundingCap ); event TokensPurchased(address indexed buyer, uint256 amount); event USDTWithdrawn(uint256 amount); event GlobalPurchaseLimitUpdated(uint256 newLimit); event myTokenWithdrawn(uint256 amount); modifier validRoundNumber(uint256 round) { require(round != 0, "Invalid Round Numnber"); require( round <= totalRounds, "Invalid round Number, exceeds totalRounds" ); _; } modifier buyTokensCheck(uint256 amount){ require(!roundCompleted[currentRound], "Round is completed and closed"); require(block.timestamp >= roundStartTime[currentRound] && block.timestamp <= roundEndTime[currentRound], "Round duration has expired"); require((roundTotalRaised[currentRound] + amount) < roundFundingCap[currentRound],"Exceeds Round FundCap"); uint256 purchasingAmount = getTokenAmount(amount); require((purchasingAmount + purchasedAmount[msg.sender] <= purchaseLimitPerUser), "Purchase Limit per user exceeds"); require(paymentToken.allowance(msg.sender, address(this)) >= amount, "Not enough Approved tokens"); _; } constructor( address _paymentToken, address _preToken, uint256 _purchaseLimitPerUser ) Ownable(msg.sender) { paymentToken = IERC20(_paymentToken); preToken = IERC20(_preToken); purchaseLimitPerUser = _purchaseLimitPerUser; } function getTokenAmount(uint256 _usdcAmount) internal view returns (uint256){ return (_usdcAmount /roundTokenPrice[currentRound]) * 1 ether; } function getTokensPerUsdc(uint256 _usdc ) public view returns (uint256){ return (_usdc /roundTokenPrice[currentRound]) * 1 ether; } function getTimeStamp(uint256 _year, uint256 _month, uint256 _day, uint256 _hour) external pure returns(uint256){ uint256 timestamp = BokkyPooBahsDateTimeLibrary.timestampFromDate( _year, _month, _day ) + _hour * 1 hours; return timestamp; } function createOrSetRound( uint256 round, uint256 startTime, uint256 endTime, uint256 tokenPrice, uint256 fundingCap ) external onlyOwner validRoundNumber(round){ require(endTime > startTime, "End time must be after start time"); roundStartTime[round] = startTime; roundEndTime[round] = endTime; roundTokenPrice[round] = tokenPrice; roundFundingCap[round] = fundingCap; currentRound = round; emit RoundSet(round, startTime, endTime, tokenPrice, fundingCap); } function completeRound(uint256 round, bool _state) external validRoundNumber(round) onlyOwner{ roundCompleted[round] = _state; } function setActiveRound(uint256 round) external onlyOwner validRoundNumber(round) { currentRound = round; } function updateUserPurchaseLimit(uint256 _val) external onlyOwner { purchaseLimitPerUser = _val; emit GlobalPurchaseLimitUpdated(_val); } function buyTokens(uint256 _usdcAmount) external buyTokensCheck(_usdcAmount) nonReentrant { roundTotalRaised[currentRound] += _usdcAmount; uint256 purchasingamount = getTokenAmount(_usdcAmount); purchasedAmount[msg.sender] += purchasingamount; paymentToken.safeTransferFrom(msg.sender, address(this), _usdcAmount); preToken.safeTransfer(msg.sender,purchasingamount); emit TokensPurchased(msg.sender, purchasingamount); } function withdrawUSDC(uint256 amount) external onlyOwner { paymentToken.safeTransfer(msg.sender, amount); emit USDTWithdrawn(amount); } function withdrawPreToken(uint256 amount) external onlyOwner { preToken.safeTransfer(msg.sender, amount); emit myTokenWithdrawn(amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"address","name":"_preToken","type":"address"},{"internalType":"uint256","name":"_purchaseLimitPerUser","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"GlobalPurchaseLimitUpdated","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":"uint256","name":"round","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fundingCap","type":"uint256"}],"name":"RoundSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"USDTWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"myTokenWithdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"_usdcAmount","type":"uint256"}],"name":"buyTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"round","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"completeRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"round","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"fundingCap","type":"uint256"}],"name":"createOrSetRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_year","type":"uint256"},{"internalType":"uint256","name":"_month","type":"uint256"},{"internalType":"uint256","name":"_day","type":"uint256"},{"internalType":"uint256","name":"_hour","type":"uint256"}],"name":"getTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_usdc","type":"uint256"}],"name":"getTokensPerUsdc","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":"paymentToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchaseLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchasedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundCompleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundFundingCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roundTotalRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"round","type":"uint256"}],"name":"setActiveRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalRounds","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":"_val","type":"uint256"}],"name":"updateUserPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPreToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526002600455348015610014575f80fd5b50604051620012c1380380620012c18339810160408190526100359161010a565b338061005a57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610063816100a0565b5060018055600280546001600160a01b039485166001600160a01b0319918216179091556003805493909416921691909117909155600555610143565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114610105575f80fd5b919050565b5f805f6060848603121561011c575f80fd5b610125846100ef565b9250610133602085016100ef565b9150604084015190509250925092565b61117080620001515f395ff3fe608060405234801561000f575f80fd5b5060043610610153575f3560e01c80638da5cb5b116100bf578063c137a60f11610079578063c137a60f146102e9578063cd53dedc14610308578063db81f99b1461031b578063f22d2ee61461032e578063f2fde38b14610360578063f8c9637d14610373575f80fd5b80638da5cb5b14610262578063a4ee8b6314610272578063a5fee8c914610291578063a900adcf146102a4578063b6096a81146102b7578063bd679f1b146102d6575f80fd5b806367f17e761161011057806367f17e761461021a5780636ffea7bd1461022d578063715018a6146102405780637d387720146102485780638a19c8bc146102515780638a5682991461025a575f80fd5b8063144bdd4d146101575780633013ce291461016c5780633610724e1461019c57806341511a66146101af57806344c4dcc1146101dc57806345f1c476146101fb575b5f80fd5b61016a610165366004610e79565b610386565b005b60025461017f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61016a6101aa366004610eb0565b6104b7565b6101ce6101bd366004610eb0565b600a6020525f908152604090205481565b604051908152602001610193565b6101ce6101ea366004610ec7565b60066020525f908152604090205481565b6101ce610209366004610eb0565b600b6020525f908152604090205481565b6101ce610228366004610eb0565b61080c565b60035461017f906001600160a01b031681565b61016a61083f565b6101ce60055481565b6101ce60045481565b6101ce600f81565b5f546001600160a01b031661017f565b6101ce610280366004610eb0565b60086020525f908152604090205481565b61016a61029f366004610eb0565b610852565b61016a6102b2366004610efa565b6108a8565b6101ce6102c5366004610eb0565b60096020525f908152604090205481565b6101ce6102e4366004610f28565b610911565b6101ce6102f7366004610eb0565b60076020525f908152604090205481565b61016a610316366004610eb0565b61093e565b61016a610329366004610eb0565b61097b565b61035061033c366004610eb0565b600c6020525f908152604090205460ff1681565b6040519015158152602001610193565b61016a61036e366004610ec7565b6109ca565b61016a610381366004610eb0565b610a07565b61038e610a56565b84805f036103b75760405162461bcd60e51b81526004016103ae90610f57565b60405180910390fd5b600f8111156103d85760405162461bcd60e51b81526004016103ae90610f86565b8484116104315760405162461bcd60e51b815260206004820152602160248201527f456e642074696d65206d7573742062652061667465722073746172742074696d6044820152606560f81b60648201526084016103ae565b5f8681526007602090815260408083208890556008825280832087905560098252808320869055600a825291829020849055600488905581518781529081018690529081018490526060810183905286907f35381f5c914bda88ca9ff05360c3b87d3e3f791ce86c8136706c7d0d824259419060800160405180910390a2505050505050565b6004545f908152600c6020526040902054819060ff161561051a5760405162461bcd60e51b815260206004820152601d60248201527f526f756e6420697320636f6d706c6574656420616e6420636c6f73656400000060448201526064016103ae565b6004545f90815260076020526040902054421080159061054a57506004545f908152600860205260409020544211155b6105965760405162461bcd60e51b815260206004820152601a60248201527f526f756e64206475726174696f6e20686173206578706972656400000000000060448201526064016103ae565b6004545f908152600a6020908152604080832054600b909252909120546105be908390610fe3565b106106035760405162461bcd60e51b815260206004820152601560248201527404578636565647320526f756e642046756e6443617605c1b60448201526064016103ae565b5f61060d8261080c565b600554335f908152600660205260409020549192509061062d9083610fe3565b111561067b5760405162461bcd60e51b815260206004820152601f60248201527f5075726368617365204c696d697420706572207573657220657863656564730060448201526064016103ae565b600254604051636eb1769f60e11b815233600482015230602482015283916001600160a01b03169063dd62ed3e90604401602060405180830381865afa1580156106c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106eb9190610ff6565b10156107395760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820417070726f76656420746f6b656e7300000000000060448201526064016103ae565b610741610a82565b6004545f908152600b602052604081208054859290610761908490610fe3565b909155505f90506107718461080c565b335f90815260066020526040812080549293508392909190610794908490610fe3565b90915550506002546107b1906001600160a01b0316333087610aac565b6003546107c8906001600160a01b03163383610b19565b60405181815233907f8f28852646c20cc973d3a8218f7eefed58c25c909f78f0265af4818c3d4dc2719060200160405180910390a25061080760018055565b505050565b6004545f908152600960205260408120546108279083611021565b61083990670de0b6b3a7640000611034565b92915050565b610847610a56565b6108505f610b4a565b565b61085a610a56565b600354610871906001600160a01b03163383610b19565b6040518181527f1c647730c586b6474035a573d1a6f40e1de75653098f1ac7e4909f4462334b68906020015b60405180910390a150565b81805f036108c85760405162461bcd60e51b81526004016103ae90610f57565b600f8111156108e95760405162461bcd60e51b81526004016103ae90610f86565b6108f1610a56565b505f918252600c6020526040909120805460ff1916911515919091179055565b5f8061091f83610e10611034565b61092a878787610b99565b6109349190610fe3565b9695505050505050565b610946610a56565b60058190556040518181527f9cae9f123aa12df9d12baf1969766d73a5ecea0ba88d0ec65ddff4bdc0b599de9060200161089d565b610983610a56565b60025461099a906001600160a01b03163383610b19565b6040518181527f7fca92c9929b53120be04d990950b67da0dc00465c2b07a3a9c7d7c7f4d7d26a9060200161089d565b6109d2610a56565b6001600160a01b0381166109fb57604051631e4fbdf760e01b81525f60048201526024016103ae565b610a0481610b4a565b50565b610a0f610a56565b80805f03610a2f5760405162461bcd60e51b81526004016103ae90610f57565b600f811115610a505760405162461bcd60e51b81526004016103ae90610f86565b50600455565b5f546001600160a01b031633146108505760405163118cdaa760e01b81523360048201526024016103ae565b600260015403610aa557604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6040516001600160a01b038481166024830152838116604483015260648201839052610b139186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610bbb565b50505050565b6040516001600160a01b0383811660248301526044820183905261080791859182169063a9059cbb90606401610ae1565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f62015180610ba9858585610c1c565b610bb39190611034565b949350505050565b5f610bcf6001600160a01b03841683610d56565b905080515f14158015610bf3575080806020019051810190610bf1919061104b565b155b1561080757604051635274afe760e01b81526001600160a01b03841660048201526024016103ae565b5f6107b2841015610c2b575f80fd5b8383835f62253d8c60046064600c610c44600e88611066565b610c4e919061108c565b610c5a886113246110b8565b610c6491906110b8565b610c6e919061108c565b610c799060036110df565b610c83919061108c565b600c80610c91600e88611066565b610c9b919061108c565b610ca690600c6110df565b610cb1600288611066565b610cbb9190611066565b610cc79061016f6110df565b610cd1919061108c565b6004600c610ce0600e89611066565b610cea919061108c565b610cf6896112c06110b8565b610d0091906110b8565b610d0c906105b56110df565b610d16919061108c565b610d22617d4b87611066565b610d2c91906110b8565b610d3691906110b8565b610d409190611066565b610d4a9190611066565b98975050505050505050565b6060610d6383835f610d6a565b9392505050565b606081471015610d8f5760405163cd78605960e01b81523060048201526024016103ae565b5f80856001600160a01b03168486604051610daa919061110e565b5f6040518083038185875af1925050503d805f8114610de4576040519150601f19603f3d011682016040523d82523d5f602084013e610de9565b606091505b5091509150610934868383606082610e0957610e0482610e50565b610d63565b8151158015610e2057506001600160a01b0384163b155b15610e4957604051639996b31560e01b81526001600160a01b03851660048201526024016103ae565b5080610d63565b805115610e605780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f805f805f60a08688031215610e8d575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215610ec0575f80fd5b5035919050565b5f60208284031215610ed7575f80fd5b81356001600160a01b0381168114610d63575f80fd5b8015158114610a04575f80fd5b5f8060408385031215610f0b575f80fd5b823591506020830135610f1d81610eed565b809150509250929050565b5f805f8060808587031215610f3b575f80fd5b5050823594602084013594506040840135936060013592509050565b60208082526015908201527424b73b30b634b2102937bab73210273ab6b73132b960591b604082015260600190565b60208082526029908201527f496e76616c696420726f756e64204e756d6265722c206578636565647320746f60408201526874616c526f756e647360b81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561083957610839610fcf565b5f60208284031215611006575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261102f5761102f61100d565b500490565b808202811582820484141761083957610839610fcf565b5f6020828403121561105b575f80fd5b8151610d6381610eed565b8181035f83128015838313168383128216171561108557611085610fcf565b5092915050565b5f8261109a5761109a61100d565b600160ff1b82145f19841416156110b3576110b3610fcf565b500590565b8082018281125f8312801582168215821617156110d7576110d7610fcf565b505092915050565b8082025f8212600160ff1b841416156110fa576110fa610fcf565b818105831482151761083957610839610fcf565b5f82515f5b8181101561112d5760208186018101518583015201611113565b505f92019182525091905056fea2646970667358221220ba6166996bd94ef0eed39249e0a8b5c357766959d88e8e1297ef31d42278bc7f64736f6c63430008180033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000003d6bc3c7e9436f9f2ee5b3f567d24cdaa44953fd000000000000000000000000000000000000000000295be96e64066972000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610153575f3560e01c80638da5cb5b116100bf578063c137a60f11610079578063c137a60f146102e9578063cd53dedc14610308578063db81f99b1461031b578063f22d2ee61461032e578063f2fde38b14610360578063f8c9637d14610373575f80fd5b80638da5cb5b14610262578063a4ee8b6314610272578063a5fee8c914610291578063a900adcf146102a4578063b6096a81146102b7578063bd679f1b146102d6575f80fd5b806367f17e761161011057806367f17e761461021a5780636ffea7bd1461022d578063715018a6146102405780637d387720146102485780638a19c8bc146102515780638a5682991461025a575f80fd5b8063144bdd4d146101575780633013ce291461016c5780633610724e1461019c57806341511a66146101af57806344c4dcc1146101dc57806345f1c476146101fb575b5f80fd5b61016a610165366004610e79565b610386565b005b60025461017f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61016a6101aa366004610eb0565b6104b7565b6101ce6101bd366004610eb0565b600a6020525f908152604090205481565b604051908152602001610193565b6101ce6101ea366004610ec7565b60066020525f908152604090205481565b6101ce610209366004610eb0565b600b6020525f908152604090205481565b6101ce610228366004610eb0565b61080c565b60035461017f906001600160a01b031681565b61016a61083f565b6101ce60055481565b6101ce60045481565b6101ce600f81565b5f546001600160a01b031661017f565b6101ce610280366004610eb0565b60086020525f908152604090205481565b61016a61029f366004610eb0565b610852565b61016a6102b2366004610efa565b6108a8565b6101ce6102c5366004610eb0565b60096020525f908152604090205481565b6101ce6102e4366004610f28565b610911565b6101ce6102f7366004610eb0565b60076020525f908152604090205481565b61016a610316366004610eb0565b61093e565b61016a610329366004610eb0565b61097b565b61035061033c366004610eb0565b600c6020525f908152604090205460ff1681565b6040519015158152602001610193565b61016a61036e366004610ec7565b6109ca565b61016a610381366004610eb0565b610a07565b61038e610a56565b84805f036103b75760405162461bcd60e51b81526004016103ae90610f57565b60405180910390fd5b600f8111156103d85760405162461bcd60e51b81526004016103ae90610f86565b8484116104315760405162461bcd60e51b815260206004820152602160248201527f456e642074696d65206d7573742062652061667465722073746172742074696d6044820152606560f81b60648201526084016103ae565b5f8681526007602090815260408083208890556008825280832087905560098252808320869055600a825291829020849055600488905581518781529081018690529081018490526060810183905286907f35381f5c914bda88ca9ff05360c3b87d3e3f791ce86c8136706c7d0d824259419060800160405180910390a2505050505050565b6004545f908152600c6020526040902054819060ff161561051a5760405162461bcd60e51b815260206004820152601d60248201527f526f756e6420697320636f6d706c6574656420616e6420636c6f73656400000060448201526064016103ae565b6004545f90815260076020526040902054421080159061054a57506004545f908152600860205260409020544211155b6105965760405162461bcd60e51b815260206004820152601a60248201527f526f756e64206475726174696f6e20686173206578706972656400000000000060448201526064016103ae565b6004545f908152600a6020908152604080832054600b909252909120546105be908390610fe3565b106106035760405162461bcd60e51b815260206004820152601560248201527404578636565647320526f756e642046756e6443617605c1b60448201526064016103ae565b5f61060d8261080c565b600554335f908152600660205260409020549192509061062d9083610fe3565b111561067b5760405162461bcd60e51b815260206004820152601f60248201527f5075726368617365204c696d697420706572207573657220657863656564730060448201526064016103ae565b600254604051636eb1769f60e11b815233600482015230602482015283916001600160a01b03169063dd62ed3e90604401602060405180830381865afa1580156106c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106eb9190610ff6565b10156107395760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820417070726f76656420746f6b656e7300000000000060448201526064016103ae565b610741610a82565b6004545f908152600b602052604081208054859290610761908490610fe3565b909155505f90506107718461080c565b335f90815260066020526040812080549293508392909190610794908490610fe3565b90915550506002546107b1906001600160a01b0316333087610aac565b6003546107c8906001600160a01b03163383610b19565b60405181815233907f8f28852646c20cc973d3a8218f7eefed58c25c909f78f0265af4818c3d4dc2719060200160405180910390a25061080760018055565b505050565b6004545f908152600960205260408120546108279083611021565b61083990670de0b6b3a7640000611034565b92915050565b610847610a56565b6108505f610b4a565b565b61085a610a56565b600354610871906001600160a01b03163383610b19565b6040518181527f1c647730c586b6474035a573d1a6f40e1de75653098f1ac7e4909f4462334b68906020015b60405180910390a150565b81805f036108c85760405162461bcd60e51b81526004016103ae90610f57565b600f8111156108e95760405162461bcd60e51b81526004016103ae90610f86565b6108f1610a56565b505f918252600c6020526040909120805460ff1916911515919091179055565b5f8061091f83610e10611034565b61092a878787610b99565b6109349190610fe3565b9695505050505050565b610946610a56565b60058190556040518181527f9cae9f123aa12df9d12baf1969766d73a5ecea0ba88d0ec65ddff4bdc0b599de9060200161089d565b610983610a56565b60025461099a906001600160a01b03163383610b19565b6040518181527f7fca92c9929b53120be04d990950b67da0dc00465c2b07a3a9c7d7c7f4d7d26a9060200161089d565b6109d2610a56565b6001600160a01b0381166109fb57604051631e4fbdf760e01b81525f60048201526024016103ae565b610a0481610b4a565b50565b610a0f610a56565b80805f03610a2f5760405162461bcd60e51b81526004016103ae90610f57565b600f811115610a505760405162461bcd60e51b81526004016103ae90610f86565b50600455565b5f546001600160a01b031633146108505760405163118cdaa760e01b81523360048201526024016103ae565b600260015403610aa557604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6040516001600160a01b038481166024830152838116604483015260648201839052610b139186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610bbb565b50505050565b6040516001600160a01b0383811660248301526044820183905261080791859182169063a9059cbb90606401610ae1565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f62015180610ba9858585610c1c565b610bb39190611034565b949350505050565b5f610bcf6001600160a01b03841683610d56565b905080515f14158015610bf3575080806020019051810190610bf1919061104b565b155b1561080757604051635274afe760e01b81526001600160a01b03841660048201526024016103ae565b5f6107b2841015610c2b575f80fd5b8383835f62253d8c60046064600c610c44600e88611066565b610c4e919061108c565b610c5a886113246110b8565b610c6491906110b8565b610c6e919061108c565b610c799060036110df565b610c83919061108c565b600c80610c91600e88611066565b610c9b919061108c565b610ca690600c6110df565b610cb1600288611066565b610cbb9190611066565b610cc79061016f6110df565b610cd1919061108c565b6004600c610ce0600e89611066565b610cea919061108c565b610cf6896112c06110b8565b610d0091906110b8565b610d0c906105b56110df565b610d16919061108c565b610d22617d4b87611066565b610d2c91906110b8565b610d3691906110b8565b610d409190611066565b610d4a9190611066565b98975050505050505050565b6060610d6383835f610d6a565b9392505050565b606081471015610d8f5760405163cd78605960e01b81523060048201526024016103ae565b5f80856001600160a01b03168486604051610daa919061110e565b5f6040518083038185875af1925050503d805f8114610de4576040519150601f19603f3d011682016040523d82523d5f602084013e610de9565b606091505b5091509150610934868383606082610e0957610e0482610e50565b610d63565b8151158015610e2057506001600160a01b0384163b155b15610e4957604051639996b31560e01b81526001600160a01b03851660048201526024016103ae565b5080610d63565b805115610e605780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f805f805f60a08688031215610e8d575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215610ec0575f80fd5b5035919050565b5f60208284031215610ed7575f80fd5b81356001600160a01b0381168114610d63575f80fd5b8015158114610a04575f80fd5b5f8060408385031215610f0b575f80fd5b823591506020830135610f1d81610eed565b809150509250929050565b5f805f8060808587031215610f3b575f80fd5b5050823594602084013594506040840135936060013592509050565b60208082526015908201527424b73b30b634b2102937bab73210273ab6b73132b960591b604082015260600190565b60208082526029908201527f496e76616c696420726f756e64204e756d6265722c206578636565647320746f60408201526874616c526f756e647360b81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561083957610839610fcf565b5f60208284031215611006575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261102f5761102f61100d565b500490565b808202811582820484141761083957610839610fcf565b5f6020828403121561105b575f80fd5b8151610d6381610eed565b8181035f83128015838313168383128216171561108557611085610fcf565b5092915050565b5f8261109a5761109a61100d565b600160ff1b82145f19841416156110b3576110b3610fcf565b500590565b8082018281125f8312801582168215821617156110d7576110d7610fcf565b505092915050565b8082025f8212600160ff1b841416156110fa576110fa610fcf565b818105831482151761083957610839610fcf565b5f82515f5b8181101561112d5760208186018101518583015201611113565b505f92019182525091905056fea2646970667358221220ba6166996bd94ef0eed39249e0a8b5c357766959d88e8e1297ef31d42278bc7f64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000003d6bc3c7e9436f9f2ee5b3f567d24cdaa44953fd000000000000000000000000000000000000000000295be96e64066972000000
-----Decoded View---------------
Arg [0] : _paymentToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [1] : _preToken (address): 0x3d6bc3c7E9436f9f2Ee5B3F567d24cDaa44953FD
Arg [2] : _purchaseLimitPerUser (uint256): 50000000000000000000000000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [1] : 0000000000000000000000003d6bc3c7e9436f9f2ee5b3f567d24cdaa44953fd
Arg [2] : 000000000000000000000000000000000000000000295be96e64066972000000
Deployed Bytecode Sourcemap
41557:4967:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44651:589;;;;;;:::i;:::-;;:::i;:::-;;41700:26;;;;;-1:-1:-1;;;;;41700:26:0;;;;;;-1:-1:-1;;;;;651:32:1;;;633:51;;621:2;606:18;41700:26:0;;;;;;;;45699:481;;;;;;:::i;:::-;;:::i;42190:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1026:25:1;;;1014:2;999:18;42190:50:0;880:177:1;41925:50:0;;;;;;:::i;:::-;;;;;;;;;;;;;;42247:51;;;;;;:::i;:::-;;;;;;;;;;;;;;44173:148;;;;;;:::i;:::-;;:::i;41733:22::-;;;;;-1:-1:-1;;;;;41733:22:0;;;25783:103;;;:::i;41849:35::-;;;;;;41764:31;;;;;;41802:40;;41840:2;41802:40;;25108:87;25154:7;25181:6;-1:-1:-1;;;;;25181:6:0;25108:87;;42079:47;;;;;;:::i;:::-;;;;;;;;;;;;;;46358:161;;;;;;:::i;:::-;;:::i;45248:142::-;;;;;;:::i;:::-;;:::i;42133:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;44329:314;;;;;;:::i;:::-;;:::i;42023:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;45530:161;;;;;;:::i;:::-;;:::i;46192:158::-;;;;;;:::i;:::-;;:::i;42305:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2553:14:1;;2546:22;2528:41;;2516:2;2501:18;42305:46:0;2388:187:1;26041:220:0;;;;;;:::i;:::-;;:::i;45400:122::-;;;;;;:::i;:::-;;:::i;44651:589::-;24994:13;:11;:13::i;:::-;44857:5:::1;42820;42829:1;42820:10:::0;42812:44:::1;;;;-1:-1:-1::0;;;42812:44:0::1;;;;;;;:::i;:::-;;;;;;;;;41840:2;42889:5;:20;;42867:111;;;;-1:-1:-1::0;;;42867:111:0::1;;;;;;;:::i;:::-;44900:9:::2;44890:7;:19;44882:65;;;::::0;-1:-1:-1;;;44882:65:0;;3542:2:1;44882:65:0::2;::::0;::::2;3524:21:1::0;3581:2;3561:18;;;3554:30;3620:34;3600:18;;;3593:62;-1:-1:-1;;;3671:18:1;;;3664:31;3712:19;;44882:65:0::2;3340:397:1::0;44882:65:0::2;44960:21;::::0;;;:14:::2;:21;::::0;;;;;;;:33;;;45004:12:::2;:19:::0;;;;;:29;;;45044:15:::2;:22:::0;;;;;:35;;;45090:15:::2;:22:::0;;;;;;:35;;;45136:12:::2;:21:::0;;;45173:59;;3973:25:1;;;4014:18;;;4007:34;;;4057:18;;;4050:34;;;4115:2;4100:18;;4093:34;;;44960:21:0;;45173:59:::2;::::0;3960:3:1;3945:19;45173:59:0::2;;;;;;;25018:1:::1;44651:589:::0;;;;;:::o;45699:481::-;43080:12;;43065:28;;;;:14;:28;;;;;;45763:11;;43065:28;;43064:29;43056:71;;;;-1:-1:-1;;;43056:71:0;;4340:2:1;43056:71:0;;;4322:21:1;4379:2;4359:18;;;4352:30;4418:31;4398:18;;;4391:59;4467:18;;43056:71:0;4138:353:1;43056:71:0;43180:12;;43165:28;;;;:14;:28;;;;;;43146:15;:47;;;;:96;;-1:-1:-1;43229:12:0;;43216:26;;;;:12;:26;;;;;;43197:15;:45;;43146:96;43138:135;;;;-1:-1:-1;;;43138:135:0;;4698:2:1;43138:135:0;;;4680:21:1;4737:2;4717:18;;;4710:30;4776:28;4756:18;;;4749:56;4822:18;;43138:135:0;4496:350:1;43138:135:0;43352:12;;43336:29;;;;:15;:29;;;;;;;;;43293:16;:30;;;;;;;:39;;43326:6;;43293:39;:::i;:::-;43292:73;43284:106;;;;-1:-1:-1;;;43284:106:0;;5315:2:1;43284:106:0;;;5297:21:1;5354:2;5334:18;;;5327:30;-1:-1:-1;;;5373:18:1;;;5366:51;5434:18;;43284:106:0;5113:345:1;43284:106:0;43401:24;43428:22;43443:6;43428:14;:22::i;:::-;43520:20;;43505:10;43489:27;;;;:15;:27;;;;;;43401:49;;-1:-1:-1;43520:20:0;43470:46;;43401:49;43470:46;:::i;:::-;:70;;43461:116;;;;-1:-1:-1;;;43461:116:0;;5665:2:1;43461:116:0;;;5647:21:1;5704:2;5684:18;;;5677:30;5743:33;5723:18;;;5716:61;5794:18;;43461:116:0;5463:355:1;43461:116:0;43596:12;;:49;;-1:-1:-1;;;43596:49:0;;43619:10;43596:49;;;6035:34:1;43639:4:0;6085:18:1;;;6078:43;43649:6:0;;-1:-1:-1;;;;;43596:12:0;;:22;;5970:18:1;;43596:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;43588:98;;;;-1:-1:-1;;;43588:98:0;;6523:2:1;43588:98:0;;;6505:21:1;6562:2;6542:18;;;6535:30;6601:28;6581:18;;;6574:56;6647:18;;43588:98:0;6321:350:1;43588:98:0;2444:21:::1;:19;:21::i;:::-;45817:12:::2;::::0;45800:30:::2;::::0;;;:16:::2;:30;::::0;;;;:45;;45834:11;;45800:30;:45:::2;::::0;45834:11;;45800:45:::2;:::i;:::-;::::0;;;-1:-1:-1;45856:25:0::2;::::0;-1:-1:-1;45885:27:0::2;45900:11:::0;45885:14:::2;:27::i;:::-;45939:10;45923:27;::::0;;;:15:::2;:27;::::0;;;;:47;;45856:56;;-1:-1:-1;45856:56:0;;45923:27;;;:47:::2;::::0;45856:56;;45923:47:::2;:::i;:::-;::::0;;;-1:-1:-1;;45981:12:0::2;::::0;:69:::2;::::0;-1:-1:-1;;;;;45981:12:0::2;46011:10;46031:4;46038:11:::0;45981:29:::2;:69::i;:::-;46061:8;::::0;:50:::2;::::0;-1:-1:-1;;;;;46061:8:0::2;46083:10;46094:16:::0;46061:21:::2;:50::i;:::-;46127:45;::::0;1026:25:1;;;46143:10:0::2;::::0;46127:45:::2;::::0;1014:2:1;999:18;46127:45:0::2;;;;;;;45789:391;2488:20:::1;1779:1:::0;3030:21;;2847:212;2488:20:::1;43045:661:::0;45699:481;;:::o;44173:148::-;44289:12;;44236:7;44273:29;;;:15;:29;;;;;;44266:36;;:5;:36;:::i;:::-;44265:48;;44306:7;44265:48;:::i;:::-;44257:56;44173:148;-1:-1:-1;;44173:148:0:o;25783:103::-;24994:13;:11;:13::i;:::-;25848:30:::1;25875:1;25848:18;:30::i;:::-;25783:103::o:0;46358:161::-;24994:13;:11;:13::i;:::-;46430:8:::1;::::0;:41:::1;::::0;-1:-1:-1;;;;;46430:8:0::1;46452:10;46464:6:::0;46430:21:::1;:41::i;:::-;46487:24;::::0;1026:25:1;;;46487:24:0::1;::::0;1014:2:1;999:18;46487:24:0::1;;;;;;;;46358:161:::0;:::o;45248:142::-;45325:5;42820;42829:1;42820:10;42812:44;;;;-1:-1:-1;;;42812:44:0;;;;;;;:::i;:::-;41840:2;42889:5;:20;;42867:111;;;;-1:-1:-1;;;42867:111:0;;;;;;;:::i;:::-;24994:13:::1;:11;:13::i;:::-;-1:-1:-1::0;45352:21:0::2;::::0;;;:14:::2;:21;::::0;;;;;:30;;-1:-1:-1;;45352:30:0::2;::::0;::::2;;::::0;;;::::2;::::0;;45248:142::o;44329:314::-;44434:7;;44593:15;:5;44601:7;44593:15;:::i;:::-;44474:116;44534:5;44554:6;44575:4;44474:45;:116::i;:::-;:134;;;;:::i;:::-;44454:154;44329:314;-1:-1:-1;;;;;;44329:314:0:o;45530:161::-;24994:13;:11;:13::i;:::-;45607:20:::1;:27:::0;;;45651:32:::1;::::0;1026:25:1;;;45651:32:0::1;::::0;1014:2:1;999:18;45651:32:0::1;880:177:1::0;46192:158:0;24994:13;:11;:13::i;:::-;46260:12:::1;::::0;:45:::1;::::0;-1:-1:-1;;;;;46260:12:0::1;46286:10;46298:6:::0;46260:25:::1;:45::i;:::-;46321:21;::::0;1026:25:1;;;46321:21:0::1;::::0;1014:2:1;999:18;46321:21:0::1;880:177:1::0;26041:220:0;24994:13;:11;:13::i;:::-;-1:-1:-1;;;;;26126:22:0;::::1;26122:93;;26172:31;::::0;-1:-1:-1;;;26172:31:0;;26200:1:::1;26172:31;::::0;::::1;633:51:1::0;606:18;;26172:31:0::1;473:217:1::0;26122:93:0::1;26225:28;26244:8;26225:18;:28::i;:::-;26041:220:::0;:::o;45400:122::-;24994:13;:11;:13::i;:::-;45476:5:::1;42820;42829:1;42820:10:::0;42812:44:::1;;;;-1:-1:-1::0;;;42812:44:0::1;;;;;;;:::i;:::-;41840:2;42889:5;:20;;42867:111;;;;-1:-1:-1::0;;;42867:111:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;45494:12:0::2;:20:::0;45400:122::o;25273:166::-;25154:7;25181:6;-1:-1:-1;;;;;25181:6:0;23195:10;25333:23;25329:103;;25380:40;;-1:-1:-1;;;25380:40:0;;23195:10;25380:40;;;633:51:1;606:18;;25380:40:0;473:217:1;2524:315:0;1822:1;2653:7;;:18;2649:88;;2695:30;;-1:-1:-1;;;2695:30:0;;;;;;;;;;;2649:88;1822:1;2814:7;:17;2524:315::o;18273:190::-;18401:53;;-1:-1:-1;;;;;7364:15:1;;;18401:53:0;;;7346:34:1;7416:15;;;7396:18;;;7389:43;7448:18;;;7441:34;;;18374:81:0;;18394:5;;18416:18;;;;;7281::1;;18401:53:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18401:53:0;;;;;;;;;;;18374:19;:81::i;:::-;18273:190;;;;:::o;17866:162::-;17976:43;;-1:-1:-1;;;;;7678:32:1;;;17976:43:0;;;7660:51:1;7727:18;;;7720:34;;;17949:71:0;;17969:5;;17991:14;;;;;7633:18:1;;17976:43:0;7486:274:1;26421:191:0;26495:16;26514:6;;-1:-1:-1;;;;;26531:17:0;;;-1:-1:-1;;;;;;26531:17:0;;;;;;26564:40;;26514:6;;;;;;;26564:40;;26495:16;26564:40;26484:128;26421:191;:::o;29870:213::-;29987:14;26775:12;30026:31;30040:4;30046:5;30053:3;30026:13;:31::i;:::-;:49;;;;:::i;:::-;30014:61;29870:213;-1:-1:-1;;;;29870:213:0:o;20677:638::-;21101:23;21127:33;-1:-1:-1;;;;;21127:27:0;;21155:4;21127:27;:33::i;:::-;21101:59;;21175:10;:17;21196:1;21175:22;;:57;;;;;21213:10;21202:30;;;;;;;;;;;;:::i;:::-;21201:31;21175:57;21171:137;;;21256:40;;-1:-1:-1;;;21256:40:0;;-1:-1:-1;;;;;651:32:1;;21256:40:0;;;633:51:1;606:18;;21256:40:0;473:217:1;27826:616:0;27939:10;27978:4;27970;:12;;27962:21;;;;;;28010:4;28043:5;28075:3;27994:9;26915:7;28370:1;28349:3;28343:2;28328:11;28337:2;28043:5;28328:11;:::i;:::-;28327:18;;;;:::i;:::-;28312:12;:5;28320:4;28312:12;:::i;:::-;:33;;;;:::i;:::-;28311:41;;;;:::i;:::-;28306:47;;:1;:47;:::i;:::-;28305:66;;;;:::i;:::-;28287:2;;28246:11;28255:2;28246:6;:11;:::i;:::-;28245:18;;;;:::i;:::-;28244:25;;28267:2;28244:25;:::i;:::-;28231:10;28240:1;28231:6;:10;:::i;:::-;:38;;;;:::i;:::-;28224:46;;:3;:46;:::i;:::-;28223:66;;;;:::i;:::-;28206:1;28186:2;28171:11;28180:2;28171:6;:11;:::i;:::-;28170:18;;;;:::i;:::-;28155:12;:5;28163:4;28155:12;:::i;:::-;:33;;;;:::i;:::-;28147:42;;:4;:42;:::i;:::-;28146:61;;;;:::i;:::-;28105:25;28125:5;28105:4;:25;:::i;:::-;:102;;;;:::i;:::-;:184;;;;:::i;:::-;:266;;;;:::i;:::-;:296;;;;:::i;:::-;28092:309;27826:616;-1:-1:-1;;;;;;;;27826:616:0:o;6158:153::-;6233:12;6265:38;6287:6;6295:4;6301:1;6265:21;:38::i;:::-;6258:45;6158:153;-1:-1:-1;;;6158:153:0:o;6646:398::-;6745:12;6798:5;6774:21;:29;6770:110;;;6827:41;;-1:-1:-1;;;6827:41:0;;6862:4;6827:41;;;633:51:1;606:18;;6827:41:0;473:217:1;6770:110:0;6891:12;6905:23;6932:6;-1:-1:-1;;;;;6932:11:0;6951:5;6958:4;6932:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6890:73;;;;6981:55;7008:6;7016:7;7025:10;8270:12;8300:7;8295:417;;8324:19;8332:10;8324:7;:19::i;:::-;8295:417;;;8552:17;;:22;:49;;;;-1:-1:-1;;;;;;8578:18:0;;;:23;8552:49;8548:121;;;8629:24;;-1:-1:-1;;;8629:24:0;;-1:-1:-1;;;;;651:32:1;;8629:24:0;;;633:51:1;606:18;;8629:24:0;473:217:1;8548:121:0;-1:-1:-1;8690:10:0;8683:17;;9272:528;9405:17;;:21;9401:392;;9637:10;9631:17;9694:15;9681:10;9677:2;9673:19;9666:44;9401:392;9764:17;;-1:-1:-1;;;9764:17:0;;;;;;;;;;;14:454:1;109:6;117;125;133;141;194:3;182:9;173:7;169:23;165:33;162:53;;;211:1;208;201:12;162:53;-1:-1:-1;;234:23:1;;;304:2;289:18;;276:32;;-1:-1:-1;355:2:1;340:18;;327:32;;406:2;391:18;;378:32;;-1:-1:-1;457:3:1;442:19;429:33;;-1:-1:-1;14:454:1;-1:-1:-1;14:454:1:o;695:180::-;754:6;807:2;795:9;786:7;782:23;778:32;775:52;;;823:1;820;813:12;775:52;-1:-1:-1;846:23:1;;695:180;-1:-1:-1;695:180:1:o;1062:286::-;1121:6;1174:2;1162:9;1153:7;1149:23;1145:32;1142:52;;;1190:1;1187;1180:12;1142:52;1216:23;;-1:-1:-1;;;;;1268:31:1;;1258:42;;1248:70;;1314:1;1311;1304:12;1561:118;1647:5;1640:13;1633:21;1626:5;1623:32;1613:60;;1669:1;1666;1659:12;1684:309;1749:6;1757;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;1862:9;1849:23;1839:33;;1922:2;1911:9;1907:18;1894:32;1935:28;1957:5;1935:28;:::i;:::-;1982:5;1972:15;;;1684:309;;;;;:::o;1998:385::-;2084:6;2092;2100;2108;2161:3;2149:9;2140:7;2136:23;2132:33;2129:53;;;2178:1;2175;2168:12;2129:53;-1:-1:-1;;2201:23:1;;;2271:2;2256:18;;2243:32;;-1:-1:-1;2322:2:1;2307:18;;2294:32;;2373:2;2358:18;2345:32;;-1:-1:-1;1998:385:1;-1:-1:-1;1998:385:1:o;2580:345::-;2782:2;2764:21;;;2821:2;2801:18;;;2794:30;-1:-1:-1;;;2855:2:1;2840:18;;2833:51;2916:2;2901:18;;2580:345::o;2930:405::-;3132:2;3114:21;;;3171:2;3151:18;;;3144:30;3210:34;3205:2;3190:18;;3183:62;-1:-1:-1;;;3276:2:1;3261:18;;3254:39;3325:3;3310:19;;2930:405::o;4851:127::-;4912:10;4907:3;4903:20;4900:1;4893:31;4943:4;4940:1;4933:15;4967:4;4964:1;4957:15;4983:125;5048:9;;;5069:10;;;5066:36;;;5082:18;;:::i;6132:184::-;6202:6;6255:2;6243:9;6234:7;6230:23;6226:32;6223:52;;;6271:1;6268;6261:12;6223:52;-1:-1:-1;6294:16:1;;6132:184;-1:-1:-1;6132:184:1:o;6676:127::-;6737:10;6732:3;6728:20;6725:1;6718:31;6768:4;6765:1;6758:15;6792:4;6789:1;6782:15;6808:120;6848:1;6874;6864:35;;6879:18;;:::i;:::-;-1:-1:-1;6913:9:1;;6808:120::o;6933:168::-;7006:9;;;7037;;7054:15;;;7048:22;;7034:37;7024:71;;7075:18;;:::i;7765:245::-;7832:6;7885:2;7873:9;7864:7;7860:23;7856:32;7853:52;;;7901:1;7898;7891:12;7853:52;7933:9;7927:16;7952:28;7974:5;7952:28;:::i;8015:200::-;8081:9;;;8054:4;8109:9;;8137:10;;8149:12;;;8133:29;8172:12;;;8164:21;;8130:56;8127:82;;;8189:18;;:::i;:::-;8127:82;8015:200;;;;:::o;8220:193::-;8259:1;8285;8275:35;;8290:18;;:::i;:::-;-1:-1:-1;;;8326:18:1;;-1:-1:-1;;8346:13:1;;8322:38;8319:64;;;8363:18;;:::i;:::-;-1:-1:-1;8397:10:1;;8220:193::o;8418:216::-;8482:9;;;8510:11;;;8457:3;8540:9;;8568:10;;8564:19;;8593:10;;8585:19;;8561:44;8558:70;;;8608:18;;:::i;:::-;8558:70;;8418:216;;;;:::o;8639:237::-;8711:9;;;8678:7;8736:9;;-1:-1:-1;;;8747:18:1;;8732:34;8729:60;;;8769:18;;:::i;:::-;8842:1;8833:7;8828:16;8825:1;8822:23;8818:1;8811:9;8808:38;8798:72;;8850:18;;:::i;8881:412::-;9010:3;9048:6;9042:13;9073:1;9083:129;9097:6;9094:1;9091:13;9083:129;;;9195:4;9179:14;;;9175:25;;9169:32;9156:11;;;9149:53;9112:12;9083:129;;;-1:-1:-1;9267:1:1;9231:16;;9256:13;;;-1:-1:-1;9231:16:1;8881:412;-1:-1:-1;8881:412:1:o
Swarm Source
ipfs://ba6166996bd94ef0eed39249e0a8b5c357766959d88e8e1297ef31d42278bc7f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $0.999853 | 0.7 | $0.6998 |
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.