More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,724 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 13271649 | 1165 days ago | IN | 2.1 ETH | 0.01866033 | ||||
Deposit | 13271639 | 1165 days ago | IN | 4.2 ETH | 0.02186677 | ||||
Deposit | 13271639 | 1165 days ago | IN | 4.2 ETH | 0.02186677 | ||||
Deposit | 13271634 | 1165 days ago | IN | 1.2 ETH | 0.01148588 | ||||
Deposit | 13271633 | 1165 days ago | IN | 4.2 ETH | 0.02207313 | ||||
Deposit | 13271630 | 1165 days ago | IN | 3.07 ETH | 0.00788465 | ||||
Deposit | 13271385 | 1165 days ago | IN | 1 ETH | 0.01404467 | ||||
Deposit | 13271383 | 1165 days ago | IN | 4.2 ETH | 0.01282092 | ||||
Deposit | 13271382 | 1165 days ago | IN | 4.2 ETH | 0.01344461 | ||||
Deposit | 13271382 | 1165 days ago | IN | 4 ETH | 0.01420925 | ||||
Deposit | 13271380 | 1165 days ago | IN | 1 ETH | 0.01493178 | ||||
Deposit | 13271380 | 1165 days ago | IN | 3 ETH | 0.01495948 | ||||
Deposit | 13271377 | 1165 days ago | IN | 1.45 ETH | 0.00649114 | ||||
Deposit | 13271371 | 1165 days ago | IN | 4.2 ETH | 0.01379901 | ||||
Deposit | 13271368 | 1165 days ago | IN | 4.2 ETH | 0.01671875 | ||||
Deposit | 13271367 | 1165 days ago | IN | 2.08 ETH | 0.01742676 | ||||
Deposit | 13271359 | 1165 days ago | IN | 4.2 ETH | 0.01438135 | ||||
Deposit | 13271356 | 1165 days ago | IN | 3.5 ETH | 0.00709693 | ||||
Deposit | 13271356 | 1165 days ago | IN | 4.2 ETH | 0.01532107 | ||||
Deposit | 13271351 | 1165 days ago | IN | 1 ETH | 0.01778095 | ||||
Deposit | 13271348 | 1165 days ago | IN | 4.2 ETH | 0.01563918 | ||||
Deposit | 13271346 | 1165 days ago | IN | 4.2 ETH | 0.01825637 | ||||
Deposit | 13271344 | 1165 days ago | IN | 1.3 ETH | 0.0158985 | ||||
Deposit | 13271342 | 1165 days ago | IN | 4.2 ETH | 0.01660618 | ||||
Deposit | 13271341 | 1165 days ago | IN | 1 ETH | 0.01623534 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15493503 | 814 days ago | 21.42070595 ETH | ||||
15372885 | 833 days ago | 0.07619047 ETH | ||||
15372864 | 833 days ago | 0.07619047 ETH | ||||
14857470 | 917 days ago | 0.0167619 ETH | ||||
14582461 | 960 days ago | 0.59047619 ETH | ||||
14396988 | 989 days ago | 0.03809523 ETH | ||||
14325521 | 1001 days ago | 0.10617809 ETH | ||||
14197279 | 1020 days ago | 0.02590476 ETH | ||||
14041851 | 1044 days ago | 0.07619047 ETH | ||||
13939524 | 1060 days ago | 0.22095238 ETH | ||||
13861451 | 1072 days ago | 3.19999999 ETH | ||||
13847754 | 1074 days ago | 0.01531644 ETH | ||||
13790305 | 1083 days ago | 0.01227183 ETH | ||||
13790085 | 1083 days ago | 0.02438095 ETH | ||||
13777211 | 1085 days ago | 0.02666666 ETH | ||||
13715460 | 1095 days ago | 3.19999999 ETH | ||||
13714250 | 1095 days ago | 0.07619047 ETH | ||||
13654380 | 1105 days ago | 0.04640777 ETH | ||||
13612102 | 1112 days ago | 0.02285714 ETH | ||||
13598552 | 1114 days ago | 0.02483166 ETH | ||||
13570662 | 1118 days ago | 0.68571428 ETH | ||||
13565638 | 1119 days ago | 3.19999999 ETH | ||||
13565637 | 1119 days ago | 3.19999999 ETH | ||||
13565498 | 1119 days ago | 3.19999999 ETH | ||||
13481543 | 1132 days ago | 0.10666666 ETH |
Loading...
Loading
Contract Name:
TGE
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./Signature.sol"; contract TGE is Ownable, Signature { using SafeERC20 for IERC20; /** @dev Terms and conditions as a keccak256 hash */ string public constant termsAndConditions = "By signing this message I agree to the $FOREX TOKEN - TERMS AND CONDITIONS identified by the hash: 0x1b42a1c6369d3efbf3b65d757e3f5e804bc26935b45dda1eaf0d90ef297289b4"; /** @dev ERC-191 encoded Terms and Conditions for signature validation */ bytes32 private constant termsAndConditionsERC191 = keccak256( abi.encodePacked( bytes1(0x19), bytes1("E"), bytes("thereum Signed Message:\n165"), abi.encodePacked(termsAndConditions) ) ); /** @dev Error message for claiming before allowed period */ string private constant notClaimable = "Funds not yet claimable"; /** @dev The amount of FOREX to be generated */ uint256 public constant forexAmount = 20_760_000 ether; /** @dev The address of this contract's deployed instance */ address private immutable self; /** @dev Canonical FOREX token address */ address public immutable FOREX; /** @dev Per-user deposit cap */ uint256 public immutable userCap; /** @dev Minimum token price in ETH (soft cap parameter) */ uint256 public minTokenPrice; /** @dev Maximum token price in ETH (if hard cap is met) */ uint256 public maxTokenPrice; /** @dev Generation duration (seconds) */ uint256 public immutable generationDuration; /** @dev Start date for the generation; when ETH deposits are accepted */ uint256 public immutable generationStartDate; /** @dev Maximum deposit cap in ETH from which new deposits are ignored */ uint256 public depositCap; /** @dev Date from when FOREX claiming is allowed */ uint256 public claimDate; /** @dev Amount of ETH deposited during the TGE */ uint256 public ethDeposited; /** @dev Mapping of (depositor => eth amount) for the TGE period */ mapping(address => uint256) private deposits; /** @dev Mapping of (depositor => T&Cs signature status) */ mapping(address => bool) public signedTermsAndConditions; /** @dev Mapping of (depositor => claimed eth) */ mapping(address => bool) private claimedEth; /** @dev Mapping of (depositor => claimed forex) */ mapping(address => bool) private claimedForex; /** @dev The total ETH deposited under a referral address */ mapping(address => uint256) public referrerDeposits; /** @dev Number of depositors */ uint256 public depositorCount; /** @dev Whether leftover FOREX tokens were withdrawn by owner (only possible if FOREX did not reach the max price) */ bool private withdrawnRemainingForex; /** @dev Whether the TGE was aborted by the owner */ bool private aborted; /** @dev ETH withdrawn by owner */ uint256 public ethWithdrawnByOwner; modifier notAborted() { require(!aborted, "TGE aborted"); _; } constructor( address _FOREX, uint256 _userCap, uint256 _depositCap, uint256 _minTokenPrice, uint256 _maxTokenPrice, uint256 _generationDuration, uint256 _generationStartDate ) { require(_generationDuration > 0, "Duration must be > 0"); require( _generationStartDate > block.timestamp, "Start date must be in the future" ); self = address(this); FOREX = _FOREX; userCap = _userCap; depositCap = _depositCap; minTokenPrice = _minTokenPrice; maxTokenPrice = _maxTokenPrice; generationDuration = _generationDuration; generationStartDate = _generationStartDate; } /** * @dev Deny direct ETH transfers. */ receive() external payable { revert("Must call deposit to participate"); } /** * @dev Validates a signature for the hashed terms & conditions message. * The T&Cs hash is converted to an ERC-191 message before verifying. * @param signature The signature to validate. */ function signTermsAndConditions(bytes memory signature) public { if (signedTermsAndConditions[msg.sender]) return; address signer = getSignatureAddress( termsAndConditionsERC191, signature ); require(signer == msg.sender, "Invalid signature"); signedTermsAndConditions[msg.sender] = true; } /** * @dev Allow incoming ETH transfers during the TGE period. */ function deposit(address referrer, bytes memory signature) external payable notAborted { // Sign T&Cs if the signature is not empty. // User must pass a valid signature before the first deposit. if (signature.length != 0) signTermsAndConditions(signature); // Assert that the user can deposit. require(signedTermsAndConditions[msg.sender], "Must sign T&Cs"); require(hasTgeBeenStarted(), "TGE has not started yet"); require(!hasTgeEnded(), "TGE has finished"); uint256 currentDeposit = deposits[msg.sender]; // Revert if the user cap or TGE cap has already been met. require(currentDeposit < userCap, "User cap met"); require(ethDeposited < depositCap, "TGE deposit cap met"); // Assert that the deposit amount is greater than zero. uint256 deposit = msg.value; assert(deposit > 0); // Increase the depositorCount if first deposit by user. if (currentDeposit == 0) depositorCount++; if (currentDeposit + deposit > userCap) { // Ensure deposit over user cap is returned. safeSendEth(msg.sender, currentDeposit + deposit - userCap); // Adjust user deposit. deposit = userCap - currentDeposit; } else if (ethDeposited + deposit > depositCap) { // Ensure deposit over TGE cap is returned. safeSendEth(msg.sender, ethDeposited + deposit - depositCap); // Adjust user deposit. deposit -= ethDeposited + deposit - depositCap; } // Only contribute to referrals if the hard cap hasn't been met yet. uint256 hardCap = ethHardCap(); if (ethDeposited < hardCap) { uint256 referralDepositAmount = deposit; // Subtract surplus from hard cap if any. if (ethDeposited + deposit > hardCap) referralDepositAmount -= ethDeposited + deposit - hardCap; referrerDeposits[referrer] += referralDepositAmount; } // Increase deposit variables. ethDeposited += deposit; deposits[msg.sender] += deposit; } /** * @dev Claim depositor funds (FOREX and ETH) once the TGE has closed. This may be called right after TGE closing for withdrawing surplus ETH (if FOREX reached max price/hard cap) or once (again when) the claim period starts for claiming both FOREX along with any surplus. */ function claim() external notAborted { require(hasTgeEnded(), notClaimable); (uint256 forex, uint256 forexReferred, uint256 eth) = balanceOf( msg.sender ); // Revert here if there's no ETH to withdraw as the FOREX claiming // period may not have yet started. require(eth > 0 || isTgeClaimable(), notClaimable); forex += forexReferred; // Claim forex only if the claimable period has started. if (isTgeClaimable() && forex > 0) claimForex(forex); // Claim ETH hardcap surplus if available. if (eth > 0) claimEthSurplus(eth); } /** * @dev Claims ETH for user. * @param eth The amount of ETH to claim. */ function claimEthSurplus(uint256 eth) private { if (claimedEth[msg.sender]) return; claimedEth[msg.sender] = true; if (eth > 0) safeSendEth(msg.sender, eth); } /** * @dev Claims FOREX for user. * @param forex The amount of FOREX to claim. */ function claimForex(uint256 forex) private { if (claimedForex[msg.sender]) return; claimedForex[msg.sender] = true; IERC20(FOREX).safeTransfer(msg.sender, forex); } /** * @dev Withdraws leftover forex in case the hard cap is not met during TGE. */ function withdrawRemainingForex(address recipient) external onlyOwner { assert(!withdrawnRemainingForex); // Revert if the TGE has not ended. require(hasTgeEnded(), "TGE has not finished"); (uint256 forexClaimable, ) = getClaimableData(); uint256 remainingForex = forexAmount - forexClaimable; withdrawnRemainingForex = true; // Add address zero (null) referrals to withdrawal. remainingForex += getReferralForexAmount(address(0)); if (remainingForex == 0) return; IERC20(FOREX).safeTransfer(recipient, remainingForex); } /** * @dev Returns an account's balance of claimable forex, referral forex, and ETH. * @param account The account to fetch the claimable balance for. */ function balanceOf(address account) public view returns ( uint256 forex, uint256 forexReferred, uint256 eth ) { if (!hasTgeEnded()) return (0, 0, 0); (uint256 forexClaimable, uint256 ethClaimable) = getClaimableData(); uint256 share = shareOf(account); eth = claimedEth[account] ? 0 : (ethClaimable * share) / (1 ether); if (claimedForex[account]) { forex = 0; forexReferred = 0; } else { forex = (forexClaimable * share) / (1 ether); // Forex earned through referrals is 5% of the referred deposits // in FOREX. forexReferred = getReferralForexAmount(account); } } /** * @dev Returns an account's share over the TGE deposits. * @param account The account to fetch the share for. * @return Share value as an 18 decimal ratio. 1 ether = 100%. */ function shareOf(address account) public view returns (uint256) { if (ethDeposited == 0) return 0; return (deposits[account] * (1 ether)) / ethDeposited; } /** * @dev Returns the ETH deposited by an address. * @param depositor The depositor address. */ function getDeposit(address depositor) external view returns (uint256) { return deposits[depositor]; } /** * @dev Whether the TGE already started. It could be closed even if this function returns true. */ function hasTgeBeenStarted() private view returns (bool) { return block.timestamp >= generationStartDate; } /** * @dev Whether the TGE has ended and is closed for new deposits. */ function hasTgeEnded() private view returns (bool) { return block.timestamp > generationStartDate + generationDuration; } /** * @dev Whether the TGE funds can be claimed. */ function isTgeClaimable() private view returns (bool) { return claimDate != 0 && block.timestamp >= claimDate; } /** * @dev The amount of ETH required to generate all supply at max price. */ function ethHardCap() private view returns (uint256) { return (forexAmount * maxTokenPrice) / (1 ether); } /** * @dev Returns the forex price as established by the deposit amount. * The formula for the price is the following: * minPrice + ([maxPrice - minPrice] * min(deposit, maxDeposit)/maxDeposit) * Where maxDeposit = ethHardCap() */ function forexPrice() public view returns (uint256) { uint256 hardCap = ethHardCap(); uint256 depositTowardsHardCap = ethDeposited > hardCap ? hardCap : ethDeposited; uint256 priceRange = maxTokenPrice - minTokenPrice; uint256 priceDelta = (priceRange * depositTowardsHardCap) / hardCap; return minTokenPrice + priceDelta; } /** * @dev Returns TGE data to be used for claims once the TGE closes. */ function getClaimableData() private view returns (uint256 forexClaimable, uint256 ethClaimable) { assert(hasTgeEnded()); uint256 forexPrice = forexPrice(); uint256 hardCap = ethHardCap(); // ETH is only claimable if the deposits exceeded the hard cap. ethClaimable = ethDeposited > hardCap ? ethDeposited - hardCap : 0; // Forex is claimable up to the maximum supply -- when deposits match // the hard cap amount. forexClaimable = ((ethDeposited - ethClaimable) * (1 ether)) / forexPrice; } /** * @dev Returns the amount of FOREX earned by a referrer. * @param referrer The referrer's address. */ function getReferralForexAmount(address referrer) private view returns (uint256) { // Referral claims are disabled. return 0; } /** * @dev Aborts the TGE, stopping new deposits and withdrawing all funds * for the owner. * The only use case for this function is in the * event of an emergency. */ function emergencyAbort() external onlyOwner { assert(!aborted); aborted = true; emergencyWithdrawAllFunds(); } /** * @dev Withdraws all contract funds for the owner. * The only use case for this function is in the * event of an emergency. */ function emergencyWithdrawAllFunds() public onlyOwner { // Transfer ETH. uint256 balance = self.balance; if (balance > 0) safeSendEth(msg.sender, balance); // Transfer FOREX. IERC20 forex = IERC20(FOREX); balance = forex.balanceOf(self); if (balance > 0) forex.transfer(msg.sender, balance); } /** * @dev Withdraws all ETH funds for the owner. * This function may be called at any time, as it correctly * withdraws only the correct contribution amount, ignoring * the ETH amount to be refunded if the deposits exceed * the hard cap. */ function collectContributions() public onlyOwner { uint256 hardCap = ethHardCap(); require( ethWithdrawnByOwner < hardCap, "Cannot withdraw more than hard cap amount" ); uint256 amount = self.balance; if (amount + ethWithdrawnByOwner > hardCap) amount = hardCap - ethWithdrawnByOwner; ethWithdrawnByOwner += amount; require(amount > 0, "Nothing available for withdrawal"); safeSendEth(msg.sender, amount); } /** * @dev Enables FOREX claiming from the next block. * Requires the TGE to have been closed. */ function enableForexClaims() external onlyOwner { assert(hasTgeEnded() && !isTgeClaimable()); claimDate = block.timestamp + 1; } /** * @dev Sets the minimum and maximum token prices before the TGE starts. * Also sets the deposit cap. * @param min The minimum token price in ETH. * @param max The maximum token price in ETH. * @param _depositCap The ETH deposit cap. */ function setMinMaxForexPrices( uint256 min, uint256 max, uint256 _depositCap ) external onlyOwner { assert(!hasTgeBeenStarted()); require(max > min && _depositCap > max, "Invalid values"); minTokenPrice = min; maxTokenPrice = max; depositCap = _depositCap; } /** * @dev Sends ETH and reverts if the transfer fails. * @param recipient The transfer recipient. * @param amount The transfer amount. */ function safeSendEth(address recipient, uint256 amount) private { (bool success, ) = recipient.call{value: amount}(""); require(success, "Failed to send ETH"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using 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"); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; abstract contract Signature { /** * @dev Returns the address that signed a message given a signature. * @param message The message signed. * @param signature The signature. */ function getSignatureAddress(bytes32 message, bytes memory signature) internal pure returns (address) { assert(signature.length == 65); uint8 v; bytes32 r; bytes32 s; assembly { // First 32 bytes after length prefix. r := mload(add(signature, 32)) // Next 32 bytes. s := mload(add(signature, 64)) // Final byte. v := byte(0, mload(add(signature, 96))) } return ecrecover(message, v, r, s); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT 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); } } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_FOREX","type":"address"},{"internalType":"uint256","name":"_userCap","type":"uint256"},{"internalType":"uint256","name":"_depositCap","type":"uint256"},{"internalType":"uint256","name":"_minTokenPrice","type":"uint256"},{"internalType":"uint256","name":"_maxTokenPrice","type":"uint256"},{"internalType":"uint256","name":"_generationDuration","type":"uint256"},{"internalType":"uint256","name":"_generationStartDate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"FOREX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"forex","type":"uint256"},{"internalType":"uint256","name":"forexReferred","type":"uint256"},{"internalType":"uint256","name":"eth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectContributions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositorCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyAbort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdrawAllFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableForexClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethWithdrawnByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forexAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forexPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generationDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generationStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"}],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrerDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"_depositCap","type":"uint256"}],"name":"setMinMaxForexPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shareOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"signTermsAndConditions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signedTermsAndConditions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"termsAndConditions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawRemainingForex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040523480156200001257600080fd5b5060405162003bb538038062003bb5833981810160405281019062000038919062000286565b620000586200004c6200018c60201b60201c565b6200019460201b60201c565b600082116200009e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200009590620003d9565b60405180910390fd5b428111620000e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000da90620003b7565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508673ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508560c081815250508460038190555083600181905550826002819055508160e08181525050806101008181525050505050505050506200047e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008151905062000269816200044a565b92915050565b600081519050620002808162000464565b92915050565b600080600080600080600060e0888a031215620002a257600080fd5b6000620002b28a828b0162000258565b9750506020620002c58a828b016200026f565b9650506040620002d88a828b016200026f565b9550506060620002eb8a828b016200026f565b9450506080620002fe8a828b016200026f565b93505060a0620003118a828b016200026f565b92505060c0620003248a828b016200026f565b91505092959891949750929550565b600062000342602083620003fb565b91507f53746172742064617465206d75737420626520696e20746865206675747572656000830152602082019050919050565b600062000384601483620003fb565b91507f4475726174696f6e206d757374206265203e20300000000000000000000000006000830152602082019050919050565b60006020820190508181036000830152620003d28162000333565b9050919050565b60006020820190508181036000830152620003f48162000375565b9050919050565b600082825260208201905092915050565b6000620004198262000420565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b62000455816200040c565b81146200046157600080fd5b50565b6200046f8162000440565b81146200047b57600080fd5b50565b60805160601c60a05160601c60c05160e051610100516136986200051d6000396000818161144b01528181611e540152612348015260008181610eff0152611e3301526000818161072501528181611732015281816118380152818161186f01526118ac01526000818161081701528181610ba00152818161154c015261208d0152600081816107c7015281816108560152611b3601526136986000f3fe6080604052600436106101dc5760003560e01c806377e5c4a811610102578063cf2c52cb11610095578063edb1649d11610064578063edb1649d14610679578063f2fde38b146106a4578063f678462f146106cd578063fd9b2356146106f85761021c565b8063cf2c52cb146105de578063d2052a42146105fa578063dbd5edc714610611578063e1254fba1461063c5761021c565b8063a5fb6731116100d1578063a5fb673114610548578063a7c81b5414610571578063b78d82131461059c578063c705b997146105b35761021c565b806377e5c4a81461048c5780638105a484146104b75780638da5cb5b146104f4578063957922ab1461051f5761021c565b80634e71d92d1161017a578063655218ef11610149578063655218ef146103f4578063683326d91461040b57806370a0823114610436578063715018a6146104755761021c565b80634e71d92d1461035c57806355a08b2014610373578063589db98c1461039e5780635dabb20e146103c95761021c565b80631285b8de116101b65780631285b8de1461028e57806321e5e2c4146102cb578063277e9d281461030857806331e93fbd146103335761021c565b80630170937a1461022157806301fd5a071461024c5780630db4bad0146102635761021c565b3661021c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021390612ff5565b60405180910390fd5b600080fd5b34801561022d57600080fd5b50610236610723565b60405161024391906131b5565b60405180910390f35b34801561025857600080fd5b50610261610747565b005b34801561026f57600080fd5b5061027861097f565b60405161028591906131b5565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b09190612698565b610985565b6040516102c29190612ef3565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612698565b6109a5565b6040516102ff91906131b5565b60405180910390f35b34801561031457600080fd5b5061031d610a22565b60405161032a91906131b5565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612698565b610a28565b005b34801561036857600080fd5b50610371610bea565b005b34801561037f57600080fd5b50610388610da2565b60405161039591906131b5565b60405180910390f35b3480156103aa57600080fd5b506103b3610da8565b6040516103c091906131b5565b60405180910390f35b3480156103d557600080fd5b506103de610e12565b6040516103eb91906131b5565b60405180910390f35b34801561040057600080fd5b50610409610e18565b005b34801561041757600080fd5b50610420610efd565b60405161042d91906131b5565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190612698565b610f21565b60405161046c939291906131d0565b60405180910390f35b34801561048157600080fd5b5061048a61106f565b005b34801561049857600080fd5b506104a16110f7565b6040516104ae91906131b5565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190612698565b6110fd565b6040516104eb91906131b5565b60405180910390f35b34801561050057600080fd5b50610509611115565b6040516105169190612eaf565b60405180910390f35b34801561052b57600080fd5b506105466004803603810190610541919061273e565b61113e565b005b34801561055457600080fd5b5061056f600480360381019061056a91906127a8565b61132a565b005b34801561057d57600080fd5b50610586611449565b60405161059391906131b5565b60405180910390f35b3480156105a857600080fd5b506105b161146d565b005b3480156105bf57600080fd5b506105c861154a565b6040516105d59190612eaf565b60405180910390f35b6105f860048036038101906105f391906126c1565b61156e565b005b34801561060657600080fd5b5061060f611a66565b005b34801561061d57600080fd5b50610626611bfe565b60405161063391906131b5565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190612698565b611c04565b60405161067091906131b5565b60405180910390f35b34801561068557600080fd5b5061068e611c4d565b60405161069b91906131b5565b60405180910390f35b3480156106b057600080fd5b506106cb60048036038101906106c69190612698565b611c5c565b005b3480156106d957600080fd5b506106e2611d54565b6040516106ef9190612f53565b60405180910390f35b34801561070457600080fd5b5061070d611d70565b60405161071a91906131b5565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b61074f611d76565b73ffffffffffffffffffffffffffffffffffffffff1661076d611115565b73ffffffffffffffffffffffffffffffffffffffff16146107c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ba906130b5565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163190506000811115610813576108123382611d7e565b5b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016108919190612eaf565b60206040518083038186803b1580156108a957600080fd5b505afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e1919061277f565b9150600082111561097b578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610927929190612eca565b602060405180830381600087803b15801561094157600080fd5b505af1158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190612715565b505b5050565b60045481565b60076020528060005260406000206000915054906101000a900460ff1681565b60008060055414156109ba5760009050610a1d565b600554670de0b6b3a7640000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a10919061332c565b610a1a91906132fb565b90505b919050565b600b5481565b610a30611d76565b73ffffffffffffffffffffffffffffffffffffffff16610a4e611115565b73ffffffffffffffffffffffffffffffffffffffff1614610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b906130b5565b60405180910390fd5b600c60009054906101000a900460ff1615610ae8577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b610af0611e2f565b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613195565b60405180910390fd5b6000610b39611e84565b5090506000816a112c19dae3e5fd7f000000610b559190613386565b90506001600c60006101000a81548160ff021916908315150217905550610b7c6000611f2f565b81610b8791906132a5565b90506000811415610b99575050610be7565b610be483827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611f369092919063ffffffff16565b50505b50565b600c60019054906101000a900460ff1615610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3190613075565b60405180910390fd5b610c42611e2f565b6040518060400160405280601781526020017f46756e6473206e6f742079657420636c61696d61626c6500000000000000000081525090610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb09190612f53565b60405180910390fd5b506000806000610cc833610f21565b9250925092506000811180610ce15750610ce0611fbc565b5b6040518060400160405280601781526020017f46756e6473206e6f742079657420636c61696d61626c6500000000000000000081525090610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f9190612f53565b60405180910390fd5b508183610d6591906132a5565b9250610d6f611fbc565b8015610d7b5750600083115b15610d8a57610d8983611fd7565b5b6000811115610d9d57610d9c816120d5565b5b505050565b60055481565b600080610db361219c565b905060008160055411610dc857600554610dca565b815b90506000600154600254610dde9190613386565b90506000838383610def919061332c565b610df991906132fb565b905080600154610e0991906132a5565b94505050505090565b60015481565b610e20611d76565b73ffffffffffffffffffffffffffffffffffffffff16610e3e611115565b73ffffffffffffffffffffffffffffffffffffffff1614610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b906130b5565b60405180910390fd5b600c60019054906101000a900460ff1615610ed8577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6001600c60016101000a81548160ff021916908315150217905550610efb610747565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610f2e611e2f565b610f42576000806000925092509250611068565b600080610f4d611e84565b915091506000610f5c876109a5565b9050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fd357670de0b6b3a76400008183610fc4919061332c565b610fce91906132fb565b610fd6565b60005b9350600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611037576000955060009450611064565b670de0b6b3a7640000818461104c919061332c565b61105691906132fb565b955061106187611f2f565b94505b5050505b9193909250565b611077611d76565b73ffffffffffffffffffffffffffffffffffffffff16611095611115565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e2906130b5565b60405180910390fd5b6110f560006121cf565b565b60025481565b600a6020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561119557611327565b600061125d601960f81b7f45000000000000000000000000000000000000000000000000000000000000006040518060400160405280601b81526020017f7468657265756d205369676e6564204d6573736167653a0a31363500000000008152506040518060e0016040528060a581526020016135be60a5913960405160200161121f9190612e83565b6040516020818303038152906040526040516020016112419493929190612e26565b6040516020818303038152906040528051906020012083612293565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490613015565b60405180910390fd5b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b50565b611332611d76565b73ffffffffffffffffffffffffffffffffffffffff16611350611115565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d906130b5565b60405180910390fd5b6113ae612344565b156113e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b82821180156113f057508181115b61142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690612f75565b60405180910390fd5b826001819055508160028190555080600381905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611475611d76565b73ffffffffffffffffffffffffffffffffffffffff16611493611115565b73ffffffffffffffffffffffffffffffffffffffff16146114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e0906130b5565b60405180910390fd5b6114f1611e2f565b80156115025750611500611fbc565b155b611535577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60014261154291906132a5565b600481905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c60019054906101000a900460ff16156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613075565b60405180910390fd5b60008151146115d1576115d08161113e565b5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165490613155565b60405180910390fd5b611665612344565b6116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b90612fd5565b60405180910390fd5b6116ac611e2f565b156116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390613115565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507f00000000000000000000000000000000000000000000000000000000000000008110611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613135565b60405180910390fd5b600354600554106117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90612fb5565b60405180910390fd5b600034905060008111611814577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082141561183657600b600081548092919061183090613487565b91905055505b7f0000000000000000000000000000000000000000000000000000000000000000818361186391906132a5565b11156118dc576118a9337f0000000000000000000000000000000000000000000000000000000000000000838561189a91906132a5565b6118a49190613386565b611d7e565b817f00000000000000000000000000000000000000000000000000000000000000006118d59190613386565b9050611941565b600354816005546118ed91906132a5565b111561194057611917336003548360055461190891906132a5565b6119129190613386565b611d7e565b6003548160055461192891906132a5565b6119329190613386565b8161193d9190613386565b90505b5b600061194b61219c565b90508060055410156119f0576000829050818360055461196b91906132a5565b111561199857818360055461198091906132a5565b61198a9190613386565b816119959190613386565b90505b80600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e791906132a5565b92505081905550505b8160056000828254611a0291906132a5565b9250508190555081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a5891906132a5565b925050819055505050505050565b611a6e611d76565b73ffffffffffffffffffffffffffffffffffffffff16611a8c611115565b73ffffffffffffffffffffffffffffffffffffffff1614611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad9906130b5565b60405180910390fd5b6000611aec61219c565b905080600d5410611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990613095565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1631905081600d5482611b7d91906132a5565b1115611b9457600d5482611b919190613386565b90505b80600d6000828254611ba691906132a5565b9250508190555060008111611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790613055565b60405180910390fd5b611bfa3382611d7e565b5050565b60035481565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6a112c19dae3e5fd7f00000081565b611c64611d76565b73ffffffffffffffffffffffffffffffffffffffff16611c82611115565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf906130b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90612f95565b60405180910390fd5b611d51816121cf565b50565b6040518060e0016040528060a581526020016135be60a5913981565b600d5481565b600033905090565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611da490612e9a565b60006040518083038185875af1925050503d8060008114611de1576040519150601f19603f3d011682016040523d82523d6000602084013e611de6565b606091505b5050905080611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e21906130d5565b60405180910390fd5b505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e7d91906132a5565b4211905090565b600080611e8f611e2f565b611ec2577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000611ecc610da8565b90506000611ed861219c565b90508060055411611eea576000611ef9565b80600554611ef89190613386565b5b925081670de0b6b3a764000084600554611f139190613386565b611f1d919061332c565b611f2791906132fb565b935050509091565b6000919050565b611fb78363a9059cbb60e01b8484604051602401611f55929190612eca565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061236f565b505050565b60008060045414158015611fd257506004544210155b905090565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561202e576120d2565b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120d133827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611f369092919063ffffffff16565b5b50565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561212c57612199565b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000811115612198576121973382611d7e565b5b5b50565b6000670de0b6b3a76400006002546a112c19dae3e5fd7f0000006121c0919061332c565b6121ca91906132fb565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060418251146122cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008060006020850151915060408501519050606085015160001a92506001868484846040516000815260200160405260405161230d9493929190612f0e565b6020604051602081039080840390855afa15801561232f573d6000803e3d6000fd5b50505060206040510351935050505092915050565b60007f0000000000000000000000000000000000000000000000000000000000000000421015905090565b60006123d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124369092919063ffffffff16565b905060008151111561243157808060200190518101906123f19190612715565b612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613175565b60405180910390fd5b5b505050565b6060612445848460008561244e565b90509392505050565b606082471015612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90613035565b60405180910390fd5b61249c85612562565b6124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d2906130f5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125049190612e6c565b60006040518083038185875af1925050503d8060008114612541576040519150601f19603f3d011682016040523d82523d6000602084013e612546565b606091505b5091509150612556828286612575565b92505050949350505050565b600080823b905060008111915050919050565b60608315612585578290506125d5565b6000835111156125985782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc9190612f53565b60405180910390fd5b9392505050565b60006125ef6125ea84613238565b613207565b90508281526020810184848401111561260757600080fd5b612612848285613445565b509392505050565b60008135905061262981613578565b92915050565b60008151905061263e8161358f565b92915050565b600082601f83011261265557600080fd5b81356126658482602086016125dc565b91505092915050565b60008135905061267d816135a6565b92915050565b600081519050612692816135a6565b92915050565b6000602082840312156126aa57600080fd5b60006126b88482850161261a565b91505092915050565b600080604083850312156126d457600080fd5b60006126e28582860161261a565b925050602083013567ffffffffffffffff8111156126ff57600080fd5b61270b85828601612644565b9150509250929050565b60006020828403121561272757600080fd5b60006127358482850161262f565b91505092915050565b60006020828403121561275057600080fd5b600082013567ffffffffffffffff81111561276a57600080fd5b61277684828501612644565b91505092915050565b60006020828403121561279157600080fd5b600061279f84828501612683565b91505092915050565b6000806000606084860312156127bd57600080fd5b60006127cb8682870161266e565b93505060206127dc8682870161266e565b92505060406127ed8682870161266e565b9150509250925092565b612800816133ba565b82525050565b61280f816133cc565b82525050565b612826612821826133d8565b6134d0565b82525050565b61283581613404565b82525050565b600061284682613268565b612850818561327e565b9350612860818560208601613454565b80840191505092915050565b600061287782613273565b6128818185613289565b9350612891818560208601613454565b61289a81613567565b840191505092915050565b60006128b082613273565b6128ba818561329a565b93506128ca818560208601613454565b80840191505092915050565b60006128e3600e83613289565b91507f496e76616c69642076616c7565730000000000000000000000000000000000006000830152602082019050919050565b6000612923602683613289565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612989601383613289565b91507f544745206465706f73697420636170206d6574000000000000000000000000006000830152602082019050919050565b60006129c9601783613289565b91507f54474520686173206e6f742073746172746564207965740000000000000000006000830152602082019050919050565b6000612a09602083613289565b91507f4d7573742063616c6c206465706f73697420746f2070617274696369706174656000830152602082019050919050565b6000612a49601183613289565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000612a89602683613289565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612aef602083613289565b91507f4e6f7468696e6720617661696c61626c6520666f72207769746864726177616c6000830152602082019050919050565b6000612b2f600b83613289565b91507f5447452061626f727465640000000000000000000000000000000000000000006000830152602082019050919050565b6000612b6f602983613289565b91507f43616e6e6f74207769746864726177206d6f7265207468616e2068617264206360008301527f617020616d6f756e7400000000000000000000000000000000000000000000006020830152604082019050919050565b6000612bd5602083613289565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612c15601283613289565b91507f4661696c656420746f2073656e642045544800000000000000000000000000006000830152602082019050919050565b6000612c5560008361327e565b9150600082019050919050565b6000612c6f601d83613289565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000612caf601083613289565b91507f544745206861732066696e6973686564000000000000000000000000000000006000830152602082019050919050565b6000612cef600c83613289565b91507f5573657220636170206d657400000000000000000000000000000000000000006000830152602082019050919050565b6000612d2f600e83613289565b91507f4d757374207369676e20542643730000000000000000000000000000000000006000830152602082019050919050565b6000612d6f602a83613289565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dd5601483613289565b91507f54474520686173206e6f742066696e69736865640000000000000000000000006000830152602082019050919050565b612e118161342e565b82525050565b612e2081613438565b82525050565b6000612e328287612815565b600182019150612e428286612815565b600182019150612e52828561283b565b9150612e5e828461283b565b915081905095945050505050565b6000612e78828461283b565b915081905092915050565b6000612e8f82846128a5565b915081905092915050565b6000612ea582612c48565b9150819050919050565b6000602082019050612ec460008301846127f7565b92915050565b6000604082019050612edf60008301856127f7565b612eec6020830184612e08565b9392505050565b6000602082019050612f086000830184612806565b92915050565b6000608082019050612f23600083018761282c565b612f306020830186612e17565b612f3d604083018561282c565b612f4a606083018461282c565b95945050505050565b60006020820190508181036000830152612f6d818461286c565b905092915050565b60006020820190508181036000830152612f8e816128d6565b9050919050565b60006020820190508181036000830152612fae81612916565b9050919050565b60006020820190508181036000830152612fce8161297c565b9050919050565b60006020820190508181036000830152612fee816129bc565b9050919050565b6000602082019050818103600083015261300e816129fc565b9050919050565b6000602082019050818103600083015261302e81612a3c565b9050919050565b6000602082019050818103600083015261304e81612a7c565b9050919050565b6000602082019050818103600083015261306e81612ae2565b9050919050565b6000602082019050818103600083015261308e81612b22565b9050919050565b600060208201905081810360008301526130ae81612b62565b9050919050565b600060208201905081810360008301526130ce81612bc8565b9050919050565b600060208201905081810360008301526130ee81612c08565b9050919050565b6000602082019050818103600083015261310e81612c62565b9050919050565b6000602082019050818103600083015261312e81612ca2565b9050919050565b6000602082019050818103600083015261314e81612ce2565b9050919050565b6000602082019050818103600083015261316e81612d22565b9050919050565b6000602082019050818103600083015261318e81612d62565b9050919050565b600060208201905081810360008301526131ae81612dc8565b9050919050565b60006020820190506131ca6000830184612e08565b92915050565b60006060820190506131e56000830186612e08565b6131f26020830185612e08565b6131ff6040830184612e08565b949350505050565b6000604051905081810181811067ffffffffffffffff8211171561322e5761322d613538565b5b8060405250919050565b600067ffffffffffffffff82111561325357613252613538565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132b08261342e565b91506132bb8361342e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132f0576132ef6134da565b5b828201905092915050565b60006133068261342e565b91506133118361342e565b92508261332157613320613509565b5b828204905092915050565b60006133378261342e565b91506133428361342e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561337b5761337a6134da565b5b828202905092915050565b60006133918261342e565b915061339c8361342e565b9250828210156133af576133ae6134da565b5b828203905092915050565b60006133c58261340e565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613472578082015181840152602081019050613457565b83811115613481576000848401525b50505050565b60006134928261342e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134c5576134c46134da565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613581816133ba565b811461358c57600080fd5b50565b613598816133cc565b81146135a357600080fd5b50565b6135af8161342e565b81146135ba57600080fd5b5056fe4279207369676e696e672074686973206d657373616765204920616772656520746f207468652024464f52455820544f4b454e202d205445524d5320414e4420434f4e444954494f4e53206964656e7469666965642062792074686520686173683a20307831623432613163363336396433656662663362363564373537653366356538303462633236393335623435646461316561663064393065663239373238396234a2646970667358221220a0b725b180c3b286d6ac8dd628e3b50e7c2a56024402d53dc8f5e15c545e915464736f6c63430008000033000000000000000000000000db298285fe4c5410b05390ca80e8fbe9de1f259b0000000000000000000000000000000000000000000000003a4965bf58a4000000000000000000000000000000000000000000000000014ade3ec696c628000000000000000000000000000000000000000000000000000000002a7181f52e0000000000000000000000000000000000000000000000000000003faa252260000000000000000000000000000000000000000000000000000000000000024ea00000000000000000000000000000000000000000000000000000000061494ab0
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c806377e5c4a811610102578063cf2c52cb11610095578063edb1649d11610064578063edb1649d14610679578063f2fde38b146106a4578063f678462f146106cd578063fd9b2356146106f85761021c565b8063cf2c52cb146105de578063d2052a42146105fa578063dbd5edc714610611578063e1254fba1461063c5761021c565b8063a5fb6731116100d1578063a5fb673114610548578063a7c81b5414610571578063b78d82131461059c578063c705b997146105b35761021c565b806377e5c4a81461048c5780638105a484146104b75780638da5cb5b146104f4578063957922ab1461051f5761021c565b80634e71d92d1161017a578063655218ef11610149578063655218ef146103f4578063683326d91461040b57806370a0823114610436578063715018a6146104755761021c565b80634e71d92d1461035c57806355a08b2014610373578063589db98c1461039e5780635dabb20e146103c95761021c565b80631285b8de116101b65780631285b8de1461028e57806321e5e2c4146102cb578063277e9d281461030857806331e93fbd146103335761021c565b80630170937a1461022157806301fd5a071461024c5780630db4bad0146102635761021c565b3661021c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021390612ff5565b60405180910390fd5b600080fd5b34801561022d57600080fd5b50610236610723565b60405161024391906131b5565b60405180910390f35b34801561025857600080fd5b50610261610747565b005b34801561026f57600080fd5b5061027861097f565b60405161028591906131b5565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b09190612698565b610985565b6040516102c29190612ef3565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612698565b6109a5565b6040516102ff91906131b5565b60405180910390f35b34801561031457600080fd5b5061031d610a22565b60405161032a91906131b5565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612698565b610a28565b005b34801561036857600080fd5b50610371610bea565b005b34801561037f57600080fd5b50610388610da2565b60405161039591906131b5565b60405180910390f35b3480156103aa57600080fd5b506103b3610da8565b6040516103c091906131b5565b60405180910390f35b3480156103d557600080fd5b506103de610e12565b6040516103eb91906131b5565b60405180910390f35b34801561040057600080fd5b50610409610e18565b005b34801561041757600080fd5b50610420610efd565b60405161042d91906131b5565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190612698565b610f21565b60405161046c939291906131d0565b60405180910390f35b34801561048157600080fd5b5061048a61106f565b005b34801561049857600080fd5b506104a16110f7565b6040516104ae91906131b5565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190612698565b6110fd565b6040516104eb91906131b5565b60405180910390f35b34801561050057600080fd5b50610509611115565b6040516105169190612eaf565b60405180910390f35b34801561052b57600080fd5b506105466004803603810190610541919061273e565b61113e565b005b34801561055457600080fd5b5061056f600480360381019061056a91906127a8565b61132a565b005b34801561057d57600080fd5b50610586611449565b60405161059391906131b5565b60405180910390f35b3480156105a857600080fd5b506105b161146d565b005b3480156105bf57600080fd5b506105c861154a565b6040516105d59190612eaf565b60405180910390f35b6105f860048036038101906105f391906126c1565b61156e565b005b34801561060657600080fd5b5061060f611a66565b005b34801561061d57600080fd5b50610626611bfe565b60405161063391906131b5565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190612698565b611c04565b60405161067091906131b5565b60405180910390f35b34801561068557600080fd5b5061068e611c4d565b60405161069b91906131b5565b60405180910390f35b3480156106b057600080fd5b506106cb60048036038101906106c69190612698565b611c5c565b005b3480156106d957600080fd5b506106e2611d54565b6040516106ef9190612f53565b60405180910390f35b34801561070457600080fd5b5061070d611d70565b60405161071a91906131b5565b60405180910390f35b7f0000000000000000000000000000000000000000000000003a4965bf58a4000081565b61074f611d76565b73ffffffffffffffffffffffffffffffffffffffff1661076d611115565b73ffffffffffffffffffffffffffffffffffffffff16146107c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ba906130b5565b60405180910390fd5b60007f000000000000000000000000e0a450b095266e97a2fe1f3a22259600ce6b521073ffffffffffffffffffffffffffffffffffffffff163190506000811115610813576108123382611d7e565b5b60007f000000000000000000000000db298285fe4c5410b05390ca80e8fbe9de1f259b90508073ffffffffffffffffffffffffffffffffffffffff166370a082317f000000000000000000000000e0a450b095266e97a2fe1f3a22259600ce6b52106040518263ffffffff1660e01b81526004016108919190612eaf565b60206040518083038186803b1580156108a957600080fd5b505afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e1919061277f565b9150600082111561097b578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610927929190612eca565b602060405180830381600087803b15801561094157600080fd5b505af1158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190612715565b505b5050565b60045481565b60076020528060005260406000206000915054906101000a900460ff1681565b60008060055414156109ba5760009050610a1d565b600554670de0b6b3a7640000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a10919061332c565b610a1a91906132fb565b90505b919050565b600b5481565b610a30611d76565b73ffffffffffffffffffffffffffffffffffffffff16610a4e611115565b73ffffffffffffffffffffffffffffffffffffffff1614610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b906130b5565b60405180910390fd5b600c60009054906101000a900460ff1615610ae8577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b610af0611e2f565b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613195565b60405180910390fd5b6000610b39611e84565b5090506000816a112c19dae3e5fd7f000000610b559190613386565b90506001600c60006101000a81548160ff021916908315150217905550610b7c6000611f2f565b81610b8791906132a5565b90506000811415610b99575050610be7565b610be483827f000000000000000000000000db298285fe4c5410b05390ca80e8fbe9de1f259b73ffffffffffffffffffffffffffffffffffffffff16611f369092919063ffffffff16565b50505b50565b600c60019054906101000a900460ff1615610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3190613075565b60405180910390fd5b610c42611e2f565b6040518060400160405280601781526020017f46756e6473206e6f742079657420636c61696d61626c6500000000000000000081525090610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb09190612f53565b60405180910390fd5b506000806000610cc833610f21565b9250925092506000811180610ce15750610ce0611fbc565b5b6040518060400160405280601781526020017f46756e6473206e6f742079657420636c61696d61626c6500000000000000000081525090610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f9190612f53565b60405180910390fd5b508183610d6591906132a5565b9250610d6f611fbc565b8015610d7b5750600083115b15610d8a57610d8983611fd7565b5b6000811115610d9d57610d9c816120d5565b5b505050565b60055481565b600080610db361219c565b905060008160055411610dc857600554610dca565b815b90506000600154600254610dde9190613386565b90506000838383610def919061332c565b610df991906132fb565b905080600154610e0991906132a5565b94505050505090565b60015481565b610e20611d76565b73ffffffffffffffffffffffffffffffffffffffff16610e3e611115565b73ffffffffffffffffffffffffffffffffffffffff1614610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b906130b5565b60405180910390fd5b600c60019054906101000a900460ff1615610ed8577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6001600c60016101000a81548160ff021916908315150217905550610efb610747565b565b7f0000000000000000000000000000000000000000000000000000000000024ea081565b6000806000610f2e611e2f565b610f42576000806000925092509250611068565b600080610f4d611e84565b915091506000610f5c876109a5565b9050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fd357670de0b6b3a76400008183610fc4919061332c565b610fce91906132fb565b610fd6565b60005b9350600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611037576000955060009450611064565b670de0b6b3a7640000818461104c919061332c565b61105691906132fb565b955061106187611f2f565b94505b5050505b9193909250565b611077611d76565b73ffffffffffffffffffffffffffffffffffffffff16611095611115565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e2906130b5565b60405180910390fd5b6110f560006121cf565b565b60025481565b600a6020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561119557611327565b600061125d601960f81b7f45000000000000000000000000000000000000000000000000000000000000006040518060400160405280601b81526020017f7468657265756d205369676e6564204d6573736167653a0a31363500000000008152506040518060e0016040528060a581526020016135be60a5913960405160200161121f9190612e83565b6040516020818303038152906040526040516020016112419493929190612e26565b6040516020818303038152906040528051906020012083612293565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490613015565b60405180910390fd5b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b50565b611332611d76565b73ffffffffffffffffffffffffffffffffffffffff16611350611115565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d906130b5565b60405180910390fd5b6113ae612344565b156113e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b82821180156113f057508181115b61142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690612f75565b60405180910390fd5b826001819055508160028190555080600381905550505050565b7f0000000000000000000000000000000000000000000000000000000061494ab081565b611475611d76565b73ffffffffffffffffffffffffffffffffffffffff16611493611115565b73ffffffffffffffffffffffffffffffffffffffff16146114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e0906130b5565b60405180910390fd5b6114f1611e2f565b80156115025750611500611fbc565b155b611535577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60014261154291906132a5565b600481905550565b7f000000000000000000000000db298285fe4c5410b05390ca80e8fbe9de1f259b81565b600c60019054906101000a900460ff16156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613075565b60405180910390fd5b60008151146115d1576115d08161113e565b5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165490613155565b60405180910390fd5b611665612344565b6116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b90612fd5565b60405180910390fd5b6116ac611e2f565b156116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390613115565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507f0000000000000000000000000000000000000000000000003a4965bf58a400008110611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613135565b60405180910390fd5b600354600554106117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90612fb5565b60405180910390fd5b600034905060008111611814577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082141561183657600b600081548092919061183090613487565b91905055505b7f0000000000000000000000000000000000000000000000003a4965bf58a40000818361186391906132a5565b11156118dc576118a9337f0000000000000000000000000000000000000000000000003a4965bf58a40000838561189a91906132a5565b6118a49190613386565b611d7e565b817f0000000000000000000000000000000000000000000000003a4965bf58a400006118d59190613386565b9050611941565b600354816005546118ed91906132a5565b111561194057611917336003548360055461190891906132a5565b6119129190613386565b611d7e565b6003548160055461192891906132a5565b6119329190613386565b8161193d9190613386565b90505b5b600061194b61219c565b90508060055410156119f0576000829050818360055461196b91906132a5565b111561199857818360055461198091906132a5565b61198a9190613386565b816119959190613386565b90505b80600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e791906132a5565b92505081905550505b8160056000828254611a0291906132a5565b9250508190555081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a5891906132a5565b925050819055505050505050565b611a6e611d76565b73ffffffffffffffffffffffffffffffffffffffff16611a8c611115565b73ffffffffffffffffffffffffffffffffffffffff1614611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad9906130b5565b60405180910390fd5b6000611aec61219c565b905080600d5410611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990613095565b60405180910390fd5b60007f000000000000000000000000e0a450b095266e97a2fe1f3a22259600ce6b521073ffffffffffffffffffffffffffffffffffffffff1631905081600d5482611b7d91906132a5565b1115611b9457600d5482611b919190613386565b90505b80600d6000828254611ba691906132a5565b9250508190555060008111611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790613055565b60405180910390fd5b611bfa3382611d7e565b5050565b60035481565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6a112c19dae3e5fd7f00000081565b611c64611d76565b73ffffffffffffffffffffffffffffffffffffffff16611c82611115565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf906130b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90612f95565b60405180910390fd5b611d51816121cf565b50565b6040518060e0016040528060a581526020016135be60a5913981565b600d5481565b600033905090565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611da490612e9a565b60006040518083038185875af1925050503d8060008114611de1576040519150601f19603f3d011682016040523d82523d6000602084013e611de6565b606091505b5050905080611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e21906130d5565b60405180910390fd5b505050565b60007f0000000000000000000000000000000000000000000000000000000000024ea07f0000000000000000000000000000000000000000000000000000000061494ab0611e7d91906132a5565b4211905090565b600080611e8f611e2f565b611ec2577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000611ecc610da8565b90506000611ed861219c565b90508060055411611eea576000611ef9565b80600554611ef89190613386565b5b925081670de0b6b3a764000084600554611f139190613386565b611f1d919061332c565b611f2791906132fb565b935050509091565b6000919050565b611fb78363a9059cbb60e01b8484604051602401611f55929190612eca565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061236f565b505050565b60008060045414158015611fd257506004544210155b905090565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561202e576120d2565b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120d133827f000000000000000000000000db298285fe4c5410b05390ca80e8fbe9de1f259b73ffffffffffffffffffffffffffffffffffffffff16611f369092919063ffffffff16565b5b50565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561212c57612199565b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000811115612198576121973382611d7e565b5b5b50565b6000670de0b6b3a76400006002546a112c19dae3e5fd7f0000006121c0919061332c565b6121ca91906132fb565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060418251146122cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008060006020850151915060408501519050606085015160001a92506001868484846040516000815260200160405260405161230d9493929190612f0e565b6020604051602081039080840390855afa15801561232f573d6000803e3d6000fd5b50505060206040510351935050505092915050565b60007f0000000000000000000000000000000000000000000000000000000061494ab0421015905090565b60006123d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124369092919063ffffffff16565b905060008151111561243157808060200190518101906123f19190612715565b612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613175565b60405180910390fd5b5b505050565b6060612445848460008561244e565b90509392505050565b606082471015612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90613035565b60405180910390fd5b61249c85612562565b6124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d2906130f5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125049190612e6c565b60006040518083038185875af1925050503d8060008114612541576040519150601f19603f3d011682016040523d82523d6000602084013e612546565b606091505b5091509150612556828286612575565b92505050949350505050565b600080823b905060008111915050919050565b60608315612585578290506125d5565b6000835111156125985782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc9190612f53565b60405180910390fd5b9392505050565b60006125ef6125ea84613238565b613207565b90508281526020810184848401111561260757600080fd5b612612848285613445565b509392505050565b60008135905061262981613578565b92915050565b60008151905061263e8161358f565b92915050565b600082601f83011261265557600080fd5b81356126658482602086016125dc565b91505092915050565b60008135905061267d816135a6565b92915050565b600081519050612692816135a6565b92915050565b6000602082840312156126aa57600080fd5b60006126b88482850161261a565b91505092915050565b600080604083850312156126d457600080fd5b60006126e28582860161261a565b925050602083013567ffffffffffffffff8111156126ff57600080fd5b61270b85828601612644565b9150509250929050565b60006020828403121561272757600080fd5b60006127358482850161262f565b91505092915050565b60006020828403121561275057600080fd5b600082013567ffffffffffffffff81111561276a57600080fd5b61277684828501612644565b91505092915050565b60006020828403121561279157600080fd5b600061279f84828501612683565b91505092915050565b6000806000606084860312156127bd57600080fd5b60006127cb8682870161266e565b93505060206127dc8682870161266e565b92505060406127ed8682870161266e565b9150509250925092565b612800816133ba565b82525050565b61280f816133cc565b82525050565b612826612821826133d8565b6134d0565b82525050565b61283581613404565b82525050565b600061284682613268565b612850818561327e565b9350612860818560208601613454565b80840191505092915050565b600061287782613273565b6128818185613289565b9350612891818560208601613454565b61289a81613567565b840191505092915050565b60006128b082613273565b6128ba818561329a565b93506128ca818560208601613454565b80840191505092915050565b60006128e3600e83613289565b91507f496e76616c69642076616c7565730000000000000000000000000000000000006000830152602082019050919050565b6000612923602683613289565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612989601383613289565b91507f544745206465706f73697420636170206d6574000000000000000000000000006000830152602082019050919050565b60006129c9601783613289565b91507f54474520686173206e6f742073746172746564207965740000000000000000006000830152602082019050919050565b6000612a09602083613289565b91507f4d7573742063616c6c206465706f73697420746f2070617274696369706174656000830152602082019050919050565b6000612a49601183613289565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000612a89602683613289565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612aef602083613289565b91507f4e6f7468696e6720617661696c61626c6520666f72207769746864726177616c6000830152602082019050919050565b6000612b2f600b83613289565b91507f5447452061626f727465640000000000000000000000000000000000000000006000830152602082019050919050565b6000612b6f602983613289565b91507f43616e6e6f74207769746864726177206d6f7265207468616e2068617264206360008301527f617020616d6f756e7400000000000000000000000000000000000000000000006020830152604082019050919050565b6000612bd5602083613289565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612c15601283613289565b91507f4661696c656420746f2073656e642045544800000000000000000000000000006000830152602082019050919050565b6000612c5560008361327e565b9150600082019050919050565b6000612c6f601d83613289565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000612caf601083613289565b91507f544745206861732066696e6973686564000000000000000000000000000000006000830152602082019050919050565b6000612cef600c83613289565b91507f5573657220636170206d657400000000000000000000000000000000000000006000830152602082019050919050565b6000612d2f600e83613289565b91507f4d757374207369676e20542643730000000000000000000000000000000000006000830152602082019050919050565b6000612d6f602a83613289565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dd5601483613289565b91507f54474520686173206e6f742066696e69736865640000000000000000000000006000830152602082019050919050565b612e118161342e565b82525050565b612e2081613438565b82525050565b6000612e328287612815565b600182019150612e428286612815565b600182019150612e52828561283b565b9150612e5e828461283b565b915081905095945050505050565b6000612e78828461283b565b915081905092915050565b6000612e8f82846128a5565b915081905092915050565b6000612ea582612c48565b9150819050919050565b6000602082019050612ec460008301846127f7565b92915050565b6000604082019050612edf60008301856127f7565b612eec6020830184612e08565b9392505050565b6000602082019050612f086000830184612806565b92915050565b6000608082019050612f23600083018761282c565b612f306020830186612e17565b612f3d604083018561282c565b612f4a606083018461282c565b95945050505050565b60006020820190508181036000830152612f6d818461286c565b905092915050565b60006020820190508181036000830152612f8e816128d6565b9050919050565b60006020820190508181036000830152612fae81612916565b9050919050565b60006020820190508181036000830152612fce8161297c565b9050919050565b60006020820190508181036000830152612fee816129bc565b9050919050565b6000602082019050818103600083015261300e816129fc565b9050919050565b6000602082019050818103600083015261302e81612a3c565b9050919050565b6000602082019050818103600083015261304e81612a7c565b9050919050565b6000602082019050818103600083015261306e81612ae2565b9050919050565b6000602082019050818103600083015261308e81612b22565b9050919050565b600060208201905081810360008301526130ae81612b62565b9050919050565b600060208201905081810360008301526130ce81612bc8565b9050919050565b600060208201905081810360008301526130ee81612c08565b9050919050565b6000602082019050818103600083015261310e81612c62565b9050919050565b6000602082019050818103600083015261312e81612ca2565b9050919050565b6000602082019050818103600083015261314e81612ce2565b9050919050565b6000602082019050818103600083015261316e81612d22565b9050919050565b6000602082019050818103600083015261318e81612d62565b9050919050565b600060208201905081810360008301526131ae81612dc8565b9050919050565b60006020820190506131ca6000830184612e08565b92915050565b60006060820190506131e56000830186612e08565b6131f26020830185612e08565b6131ff6040830184612e08565b949350505050565b6000604051905081810181811067ffffffffffffffff8211171561322e5761322d613538565b5b8060405250919050565b600067ffffffffffffffff82111561325357613252613538565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132b08261342e565b91506132bb8361342e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132f0576132ef6134da565b5b828201905092915050565b60006133068261342e565b91506133118361342e565b92508261332157613320613509565b5b828204905092915050565b60006133378261342e565b91506133428361342e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561337b5761337a6134da565b5b828202905092915050565b60006133918261342e565b915061339c8361342e565b9250828210156133af576133ae6134da565b5b828203905092915050565b60006133c58261340e565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613472578082015181840152602081019050613457565b83811115613481576000848401525b50505050565b60006134928261342e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134c5576134c46134da565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613581816133ba565b811461358c57600080fd5b50565b613598816133cc565b81146135a357600080fd5b50565b6135af8161342e565b81146135ba57600080fd5b5056fe4279207369676e696e672074686973206d657373616765204920616772656520746f207468652024464f52455820544f4b454e202d205445524d5320414e4420434f4e444954494f4e53206964656e7469666965642062792074686520686173683a20307831623432613163363336396433656662663362363564373537653366356538303462633236393335623435646461316561663064393065663239373238396234a2646970667358221220a0b725b180c3b286d6ac8dd628e3b50e7c2a56024402d53dc8f5e15c545e915464736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000db298285fe4c5410b05390ca80e8fbe9de1f259b0000000000000000000000000000000000000000000000003a4965bf58a4000000000000000000000000000000000000000000000000014ade3ec696c628000000000000000000000000000000000000000000000000000000002a7181f52e0000000000000000000000000000000000000000000000000000003faa252260000000000000000000000000000000000000000000000000000000000000024ea00000000000000000000000000000000000000000000000000000000061494ab0
-----Decoded View---------------
Arg [0] : _FOREX (address): 0xDb298285FE4C5410B05390cA80e8Fbe9DE1F259B
Arg [1] : _userCap (uint256): 4200000000000000000
Arg [2] : _depositCap (uint256): 6103440000000000000000
Arg [3] : _minTokenPrice (uint256): 46667000000000
Arg [4] : _maxTokenPrice (uint256): 70000000000000
Arg [5] : _generationDuration (uint256): 151200
Arg [6] : _generationStartDate (uint256): 1632193200
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000db298285fe4c5410b05390ca80e8fbe9de1f259b
Arg [1] : 0000000000000000000000000000000000000000000000003a4965bf58a40000
Arg [2] : 00000000000000000000000000000000000000000000014ade3ec696c6280000
Arg [3] : 00000000000000000000000000000000000000000000000000002a7181f52e00
Arg [4] : 00000000000000000000000000000000000000000000000000003faa25226000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000024ea0
Arg [6] : 0000000000000000000000000000000000000000000000000000000061494ab0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.