Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 865 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy Tokens With ... | 15503088 | 930 days ago | IN | 0.62 ETH | 0.00264471 | ||||
Buy Tokens With ... | 15503088 | 930 days ago | IN | 0.6231 ETH | 0.00177759 | ||||
Buy Tokens With ... | 15404178 | 946 days ago | IN | 0.003 ETH | 0.00453257 | ||||
Buy Tokens With ... | 13222087 | 1290 days ago | IN | 0.03 ETH | 0.00197467 | ||||
Buy Tokens With ... | 13222087 | 1290 days ago | IN | 0.033 ETH | 0.00175028 | ||||
Buy Tokens With ... | 13222087 | 1290 days ago | IN | 0.035 ETH | 0.00134637 | ||||
Buy Tokens With ... | 13221833 | 1290 days ago | IN | 0.035 ETH | 0.00134681 | ||||
Buy Tokens With ... | 13204052 | 1293 days ago | IN | 0.03 ETH | 0.00188491 | ||||
Buy Tokens With ... | 12604507 | 1386 days ago | IN | 0.001 ETH | 0.00123455 | ||||
Buy Tokens With ... | 12604507 | 1386 days ago | IN | 0.00445626 ETH | 0.00025542 | ||||
Buy Tokens With ... | 12578437 | 1390 days ago | IN | 0.001 ETH | 0.00042583 | ||||
Finalize | 12533208 | 1397 days ago | IN | 0 ETH | 0.00218073 | ||||
Buy Tokens With ... | 12533141 | 1397 days ago | IN | 0.1 ETH | 0.00504512 | ||||
Buy Tokens With ... | 12533099 | 1397 days ago | IN | 2.86 ETH | 0.00414189 | ||||
Buy Tokens With ... | 12533098 | 1397 days ago | IN | 0.084 ETH | 0.00288828 | ||||
Buy Tokens With ... | 12533066 | 1397 days ago | IN | 0.03 ETH | 0.00272814 | ||||
Add Root | 12533035 | 1397 days ago | IN | 0 ETH | 0.0018403 | ||||
Buy Tokens With ... | 12532975 | 1397 days ago | IN | 0.09 ETH | 0.00397292 | ||||
Buy Tokens With ... | 12532834 | 1397 days ago | IN | 0.72 ETH | 0.00286029 | ||||
Buy Tokens With ... | 12532784 | 1397 days ago | IN | 0.3225 ETH | 0.00306344 | ||||
Buy Tokens With ... | 12532388 | 1397 days ago | IN | 0.618 ETH | 0.0044156 | ||||
Buy Tokens With ... | 12531702 | 1397 days ago | IN | 1.5 ETH | 0.00558669 | ||||
Buy Tokens With ... | 12530980 | 1398 days ago | IN | 3.3 ETH | 0.01200498 | ||||
Buy Tokens With ... | 12530555 | 1398 days ago | IN | 0.116 ETH | 0.00540317 | ||||
Buy Tokens With ... | 12530282 | 1398 days ago | IN | 1.69231125 ETH | 0.0114666 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 12533141 | 1397 days ago | 0.1 ETH | ||||
- | 12533099 | 1397 days ago | 2.86 ETH | ||||
- | 12533098 | 1397 days ago | 0.084 ETH | ||||
- | 12533066 | 1397 days ago | 0.03 ETH | ||||
- | 12532975 | 1397 days ago | 0.09 ETH | ||||
- | 12532834 | 1397 days ago | 0.72 ETH | ||||
- | 12532784 | 1397 days ago | 0.3225 ETH | ||||
- | 12532388 | 1397 days ago | 0.618 ETH | ||||
- | 12531702 | 1397 days ago | 1.5 ETH | ||||
- | 12530980 | 1398 days ago | 3.3 ETH | ||||
- | 12530555 | 1398 days ago | 0.116 ETH | ||||
- | 12530282 | 1398 days ago | 1.69231125 ETH | ||||
- | 12530047 | 1398 days ago | 1.46 ETH | ||||
- | 12530029 | 1398 days ago | 0.04 ETH | ||||
- | 12530029 | 1398 days ago | 0.04 ETH | ||||
- | 12530029 | 1398 days ago | 0.04 ETH | ||||
- | 12530029 | 1398 days ago | 0.04 ETH | ||||
- | 12529996 | 1398 days ago | 0.02 ETH | ||||
- | 12529898 | 1398 days ago | 11.5 ETH | ||||
- | 12529883 | 1398 days ago | 0.975 ETH | ||||
- | 12529819 | 1398 days ago | 0.902 ETH | ||||
- | 12529763 | 1398 days ago | 0.01251205 ETH | ||||
- | 12529696 | 1398 days ago | 1.1 ETH | ||||
- | 12529614 | 1398 days ago | 0.5147 ETH | ||||
- | 12529586 | 1398 days ago | 4 ETH |
Loading...
Loading
Contract Name:
PublicSale
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-09 */ // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.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 GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // File: @openzeppelin/contracts/crowdsale/Crowdsale.sol pragma solidity ^0.5.0; /** * @title Crowdsale * @dev Crowdsale is a base contract for managing a token crowdsale, * allowing investors to purchase tokens with ether. This contract implements * such functionality in its most fundamental form and can be extended to provide additional * functionality and/or custom behavior. * The external interface represents the basic interface for purchasing tokens, and conforms * the base architecture for crowdsales. It is *not* intended to be modified / overridden. * The internal interface conforms the extensible and modifiable surface of crowdsales. Override * the methods to add functionality. Consider using 'super' where appropriate to concatenate * behavior. */ contract Crowdsale is Context, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // The token being sold IERC20 private _token; // Address where funds are collected address payable private _wallet; // How many token units a buyer gets per wei. // The rate is the conversion between wei and the smallest and indivisible token unit. // So, if you are using a rate of 1 with a ERC20Detailed token with 3 decimals called TOK // 1 wei will give you 1 unit, or 0.001 TOK. uint256 private _rate; // Amount of wei raised uint256 private _weiRaised; /** * Event for token purchase logging * @param purchaser who paid for the tokens * @param beneficiary who got the tokens * @param value weis paid for purchase * @param amount amount of tokens purchased */ event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount); /** * @param rate Number of token units a buyer gets per wei * @dev The rate is the conversion between wei and the smallest and indivisible * token unit. So, if you are using a rate of 1 with a ERC20Detailed token * with 3 decimals called TOK, 1 wei will give you 1 unit, or 0.001 TOK. * @param wallet Address where collected funds will be forwarded to * @param token Address of the token being sold */ constructor (uint256 rate, address payable wallet, IERC20 token) public { require(rate > 0, "Crowdsale: rate is 0"); require(wallet != address(0), "Crowdsale: wallet is the zero address"); require(address(token) != address(0), "Crowdsale: token is the zero address"); _rate = rate; _wallet = wallet; _token = token; } /** * @dev fallback function ***DO NOT OVERRIDE*** * Note that other contracts will transfer funds with a base gas stipend * of 2300, which is not enough to call buyTokens. Consider calling * buyTokens directly when purchasing tokens from a contract. */ function () external payable { buyTokens(_msgSender()); } /** * @return the token being sold. */ function token() public view returns (IERC20) { return _token; } /** * @return the address where funds are collected. */ function wallet() public view returns (address payable) { return _wallet; } /** * @return the number of token units a buyer gets per wei. */ function rate() public view returns (uint256) { return _rate; } /** * @return the amount of wei raised. */ function weiRaised() public view returns (uint256) { return _weiRaised; } /** * @dev low level token purchase ***DO NOT OVERRIDE*** * This function has a non-reentrancy guard, so it shouldn't be called by * another `nonReentrant` function. * @param beneficiary Recipient of the token purchase */ function buyTokens(address beneficiary) public nonReentrant payable { uint256 weiAmount = msg.value; _preValidatePurchase(beneficiary, weiAmount); // calculate token amount to be created uint256 tokens = _getTokenAmount(weiAmount); // update state _weiRaised = _weiRaised.add(weiAmount); _processPurchase(beneficiary, tokens); emit TokensPurchased(_msgSender(), beneficiary, weiAmount, tokens); _updatePurchasingState(beneficiary, weiAmount); _forwardFunds(); _postValidatePurchase(beneficiary, weiAmount); } /** * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. * Use `super` in contracts that inherit from Crowdsale to extend their validations. * Example from CappedCrowdsale.sol's _preValidatePurchase method: * super._preValidatePurchase(beneficiary, weiAmount); * require(weiRaised().add(weiAmount) <= cap); * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view { require(beneficiary != address(0), "Crowdsale: beneficiary is the zero address"); require(weiAmount != 0, "Crowdsale: weiAmount is 0"); this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 } /** * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid * conditions are not met. * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _postValidatePurchase(address beneficiary, uint256 weiAmount) internal view { // solhint-disable-previous-line no-empty-blocks } /** * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends * its tokens. * @param beneficiary Address performing the token purchase * @param tokenAmount Number of tokens to be emitted */ function _deliverTokens(address beneficiary, uint256 tokenAmount) internal { _token.safeTransfer(beneficiary, tokenAmount); } /** * @dev Executed when a purchase has been validated and is ready to be executed. Doesn't necessarily emit/send * tokens. * @param beneficiary Address receiving the tokens * @param tokenAmount Number of tokens to be purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal { _deliverTokens(beneficiary, tokenAmount); } /** * @dev Override for extensions that require an internal state to check for validity (current user contributions, * etc.) * @param beneficiary Address receiving the tokens * @param weiAmount Value in wei involved in the purchase */ function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal { // solhint-disable-previous-line no-empty-blocks } /** * @dev Override to extend the way in which ether is converted to tokens. * @param weiAmount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _weiAmount */ function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) { return weiAmount.mul(_rate); } /** * @dev Determines how ETH is stored/forwarded on purchases. */ function _forwardFunds() internal { _wallet.transfer(msg.value); } } // File: @openzeppelin/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/crowdsale/emission/AllowanceCrowdsale.sol pragma solidity ^0.5.0; /** * @title AllowanceCrowdsale * @dev Extension of Crowdsale where tokens are held by a wallet, which approves an allowance to the crowdsale. */ contract AllowanceCrowdsale is Crowdsale { using SafeMath for uint256; using SafeERC20 for IERC20; address private _tokenWallet; /** * @dev Constructor, takes token wallet address. * @param tokenWallet Address holding the tokens, which has approved allowance to the crowdsale. */ constructor (address tokenWallet) public { require(tokenWallet != address(0), "AllowanceCrowdsale: token wallet is the zero address"); _tokenWallet = tokenWallet; } /** * @return the address of the wallet that will hold the tokens. */ function tokenWallet() public view returns (address) { return _tokenWallet; } /** * @dev Checks the amount of tokens left in the allowance. * @return Amount of tokens left in the allowance */ function remainingTokens() public view returns (uint256) { return Math.min(token().balanceOf(_tokenWallet), token().allowance(_tokenWallet, address(this))); } /** * @dev Overrides parent behavior by transferring tokens from wallet. * @param beneficiary Token purchaser * @param tokenAmount Amount of tokens purchased */ function _deliverTokens(address beneficiary, uint256 tokenAmount) internal { token().safeTransferFrom(_tokenWallet, beneficiary, tokenAmount); } } // File: @openzeppelin/contracts/crowdsale/validation/TimedCrowdsale.sol pragma solidity ^0.5.0; /** * @title TimedCrowdsale * @dev Crowdsale accepting contributions only within a time frame. */ contract TimedCrowdsale is Crowdsale { using SafeMath for uint256; uint256 private _openingTime; uint256 private _closingTime; /** * Event for crowdsale extending * @param newClosingTime new closing time * @param prevClosingTime old closing time */ event TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime); /** * @dev Reverts if not in crowdsale time range. */ modifier onlyWhileOpen { require(isOpen(), "TimedCrowdsale: not open"); _; } /** * @dev Constructor, takes crowdsale opening and closing times. * @param openingTime Crowdsale opening time * @param closingTime Crowdsale closing time */ constructor (uint256 openingTime, uint256 closingTime) public { // solhint-disable-next-line not-rely-on-time require(openingTime >= block.timestamp, "TimedCrowdsale: opening time is before current time"); // solhint-disable-next-line max-line-length require(closingTime > openingTime, "TimedCrowdsale: opening time is not before closing time"); _openingTime = openingTime; _closingTime = closingTime; } /** * @return the crowdsale opening time. */ function openingTime() public view returns (uint256) { return _openingTime; } /** * @return the crowdsale closing time. */ function closingTime() public view returns (uint256) { return _closingTime; } /** * @return true if the crowdsale is open, false otherwise. */ function isOpen() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp >= _openingTime && block.timestamp <= _closingTime; } /** * @dev Checks whether the period in which the crowdsale is open has already elapsed. * @return Whether crowdsale period has elapsed */ function hasClosed() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp > _closingTime; } /** * @dev Extend parent behavior requiring to be within contributing period. * @param beneficiary Token purchaser * @param weiAmount Amount of wei contributed */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal onlyWhileOpen view { super._preValidatePurchase(beneficiary, weiAmount); } /** * @dev Extend crowdsale. * @param newClosingTime Crowdsale closing time */ function _extendTime(uint256 newClosingTime) internal { require(!hasClosed(), "TimedCrowdsale: already closed"); // solhint-disable-next-line max-line-length require(newClosingTime > _closingTime, "TimedCrowdsale: new closing time is before current closing time"); emit TimedCrowdsaleExtended(_closingTime, newClosingTime); _closingTime = newClosingTime; } } // File: @openzeppelin/contracts/crowdsale/distribution/FinalizableCrowdsale.sol pragma solidity ^0.5.0; /** * @title FinalizableCrowdsale * @dev Extension of TimedCrowdsale with a one-off finalization action, where one * can do extra work after finishing. */ contract FinalizableCrowdsale is TimedCrowdsale { using SafeMath for uint256; bool private _finalized; event CrowdsaleFinalized(); constructor () internal { _finalized = false; } /** * @return true if the crowdsale is finalized, false otherwise. */ function finalized() public view returns (bool) { return _finalized; } /** * @dev Must be called after crowdsale ends, to do some extra finalization * work. Calls the contract's finalization function. */ function finalize() public { require(!_finalized, "FinalizableCrowdsale: already finalized"); require(hasClosed(), "FinalizableCrowdsale: not closed"); _finalized = true; _finalization(); emit CrowdsaleFinalized(); } /** * @dev Can be overridden to add finalization logic. The overriding function * should call super._finalization() to ensure the chain of finalization is * executed entirely. */ function _finalization() internal { // solhint-disable-previous-line no-empty-blocks } } // File: @openzeppelin/contracts/ownership/Secondary.sol pragma solidity ^0.5.0; /** * @dev A Secondary contract can only be used by its primary account (the one that created it). */ contract Secondary is Context { address private _primary; /** * @dev Emitted when the primary contract changes. */ event PrimaryTransferred( address recipient ); /** * @dev Sets the primary account to the one that is creating the Secondary contract. */ constructor () internal { address msgSender = _msgSender(); _primary = msgSender; emit PrimaryTransferred(msgSender); } /** * @dev Reverts if called from any account other than the primary. */ modifier onlyPrimary() { require(_msgSender() == _primary, "Secondary: caller is not the primary account"); _; } /** * @return the address of the primary. */ function primary() public view returns (address) { return _primary; } /** * @dev Transfers contract to a new primary. * @param recipient The address of new primary. */ function transferPrimary(address recipient) public onlyPrimary { require(recipient != address(0), "Secondary: new primary is the zero address"); _primary = recipient; emit PrimaryTransferred(recipient); } } // File: @openzeppelin/contracts/payment/escrow/Escrow.sol pragma solidity ^0.5.0; /** * @title Escrow * @dev Base escrow contract, holds funds designated for a payee until they * withdraw them. * * Intended usage: This contract (and derived escrow contracts) should be a * standalone contract, that only interacts with the contract that instantiated * it. That way, it is guaranteed that all Ether will be handled according to * the `Escrow` rules, and there is no need to check for payable functions or * transfers in the inheritance tree. The contract that uses the escrow as its * payment method should be its primary, and provide public methods redirecting * to the escrow's deposit and withdraw. */ contract Escrow is Secondary { using SafeMath for uint256; using Address for address payable; event Deposited(address indexed payee, uint256 weiAmount); event Withdrawn(address indexed payee, uint256 weiAmount); mapping(address => uint256) private _deposits; function depositsOf(address payee) public view returns (uint256) { return _deposits[payee]; } /** * @dev Stores the sent amount as credit to be withdrawn. * @param payee The destination address of the funds. */ function deposit(address payee) public onlyPrimary payable { uint256 amount = msg.value; _deposits[payee] = _deposits[payee].add(amount); emit Deposited(payee, amount); } /** * @dev Withdraw accumulated balance for a payee, forwarding 2300 gas (a * Solidity `transfer`). * * NOTE: This function has been deprecated, use {withdrawWithGas} instead. * Calling contracts with fixed-gas limits is an anti-pattern and may break * contract interactions in network upgrades (hardforks). * https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more.] * * @param payee The address whose funds will be withdrawn and transferred to. */ function withdraw(address payable payee) public onlyPrimary { uint256 payment = _deposits[payee]; _deposits[payee] = 0; payee.transfer(payment); emit Withdrawn(payee, payment); } /** * @dev Same as {withdraw}, but forwarding all gas to the recipient. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * _Available since v2.4.0._ */ function withdrawWithGas(address payable payee) public onlyPrimary { uint256 payment = _deposits[payee]; _deposits[payee] = 0; payee.sendValue(payment); emit Withdrawn(payee, payment); } } // File: @openzeppelin/contracts/payment/escrow/ConditionalEscrow.sol pragma solidity ^0.5.0; /** * @title ConditionalEscrow * @dev Base abstract escrow to only allow withdrawal if a condition is met. * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. */ contract ConditionalEscrow is Escrow { /** * @dev Returns whether an address is allowed to withdraw their funds. To be * implemented by derived contracts. * @param payee The destination address of the funds. */ function withdrawalAllowed(address payee) public view returns (bool); function withdraw(address payable payee) public { require(withdrawalAllowed(payee), "ConditionalEscrow: payee is not allowed to withdraw"); super.withdraw(payee); } } // File: @openzeppelin/contracts/payment/escrow/RefundEscrow.sol pragma solidity ^0.5.0; /** * @title RefundEscrow * @dev Escrow that holds funds for a beneficiary, deposited from multiple * parties. * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. * @dev The primary account (that is, the contract that instantiates this * contract) may deposit, close the deposit period, and allow for either * withdrawal by the beneficiary, or refunds to the depositors. All interactions * with `RefundEscrow` will be made through the primary contract. See the * `RefundableCrowdsale` contract for an example of `RefundEscrow`’s use. */ contract RefundEscrow is ConditionalEscrow { enum State { Active, Refunding, Closed } event RefundsClosed(); event RefundsEnabled(); State private _state; address payable private _beneficiary; /** * @dev Constructor. * @param beneficiary The beneficiary of the deposits. */ constructor (address payable beneficiary) public { require(beneficiary != address(0), "RefundEscrow: beneficiary is the zero address"); _beneficiary = beneficiary; _state = State.Active; } /** * @return The current state of the escrow. */ function state() public view returns (State) { return _state; } /** * @return The beneficiary of the escrow. */ function beneficiary() public view returns (address) { return _beneficiary; } /** * @dev Stores funds that may later be refunded. * @param refundee The address funds will be sent to if a refund occurs. */ function deposit(address refundee) public payable { require(_state == State.Active, "RefundEscrow: can only deposit while active"); super.deposit(refundee); } /** * @dev Allows for the beneficiary to withdraw their funds, rejecting * further deposits. */ function close() public onlyPrimary { require(_state == State.Active, "RefundEscrow: can only close while active"); _state = State.Closed; emit RefundsClosed(); } /** * @dev Allows for refunds to take place, rejecting further deposits. */ function enableRefunds() public onlyPrimary { require(_state == State.Active, "RefundEscrow: can only enable refunds while active"); _state = State.Refunding; emit RefundsEnabled(); } /** * @dev Withdraws the beneficiary's funds. */ function beneficiaryWithdraw() public { require(_state == State.Closed, "RefundEscrow: beneficiary can only withdraw while closed"); _beneficiary.transfer(address(this).balance); } /** * @dev Returns whether refundees can withdraw their deposits (be refunded). The overridden function receives a * 'payee' argument, but we ignore it here since the condition is global, not per-payee. */ function withdrawalAllowed(address) public view returns (bool) { return _state == State.Refunding; } } // File: @openzeppelin/contracts/crowdsale/distribution/RefundableCrowdsale.sol pragma solidity ^0.5.0; /** * @title RefundableCrowdsale * @dev Extension of `FinalizableCrowdsale` contract that adds a funding goal, and the possibility of users * getting a refund if goal is not met. * * Deprecated, use `RefundablePostDeliveryCrowdsale` instead. Note that if you allow tokens to be traded before the goal * is met, then an attack is possible in which the attacker purchases tokens from the crowdsale and when they sees that * the goal is unlikely to be met, they sell their tokens (possibly at a discount). The attacker will be refunded when * the crowdsale is finalized, and the users that purchased from them will be left with worthless tokens. */ contract RefundableCrowdsale is Context, FinalizableCrowdsale { using SafeMath for uint256; // minimum amount of funds to be raised in weis uint256 private _goal; // refund escrow used to hold funds while crowdsale is running RefundEscrow private _escrow; /** * @dev Constructor, creates RefundEscrow. * @param goal Funding goal */ constructor (uint256 goal) public { require(goal > 0, "RefundableCrowdsale: goal is 0"); _escrow = new RefundEscrow(wallet()); _goal = goal; } /** * @return minimum amount of funds to be raised in wei. */ function goal() public view returns (uint256) { return _goal; } /** * @dev Investors can claim refunds here if crowdsale is unsuccessful. * @param refundee Whose refund will be claimed. */ function claimRefund(address payable refundee) public { require(finalized(), "RefundableCrowdsale: not finalized"); require(!goalReached(), "RefundableCrowdsale: goal reached"); _escrow.withdraw(refundee); } /** * @dev Checks whether funding goal was reached. * @return Whether funding goal was reached */ function goalReached() public view returns (bool) { return weiRaised() >= _goal; } /** * @dev Escrow finalization task, called when finalize() is called. */ function _finalization() internal { if (goalReached()) { _escrow.close(); _escrow.beneficiaryWithdraw(); } else { _escrow.enableRefunds(); } super._finalization(); } /** * @dev Overrides Crowdsale fund forwarding, sending funds to escrow. */ function _forwardFunds() internal { _escrow.deposit.value(msg.value)(_msgSender()); } } // File: contracts/lib/ds-hub.sol pragma solidity ^0.5.17; interface DSAuthority { function canCall( address src, address dst, bytes4 sig ) external view returns (bool); } contract DSAuthEvents { event LogSetAuthority(address indexed authority); event LogSetOwner(address indexed owner); } contract DSAuth is DSAuthEvents { DSAuthority public authority; address public owner; constructor() public { owner = msg.sender; emit LogSetOwner(msg.sender); } function setOwner(address owner_) public auth { owner = owner_; emit LogSetOwner(owner); } function setAuthority(DSAuthority authority_) public auth { authority = authority_; emit LogSetAuthority(address(authority)); } modifier auth { require(isAuthorized(msg.sender, msg.sig), "ds-auth-unauthorized"); _; } function isAuthorized(address src, bytes4 sig) internal view returns (bool) { if (src == address(this)) { return true; } else if (src == owner) { return true; } else if (authority == DSAuthority(0)) { return false; } else { return authority.canCall(src, address(this), sig); } } } contract DSNote { event LogNote(bytes4 indexed sig, address indexed guy, bytes32 indexed foo, bytes32 indexed bar, uint256 wad, bytes fax) anonymous; modifier note { bytes32 foo; bytes32 bar; uint256 wad; assembly { foo := calldataload(4) bar := calldataload(36) wad := callvalue() } _; emit LogNote(msg.sig, msg.sender, foo, bar, wad, msg.data); } } contract DSMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { return x <= y ? x : y; } function max(uint256 x, uint256 y) internal pure returns (uint256 z) { return x >= y ? x : y; } function imin(int256 x, int256 y) internal pure returns (int256 z) { return x <= y ? x : y; } function imax(int256 x, int256 y) internal pure returns (int256 z) { return x >= y ? x : y; } uint256 constant WAD = 10**18; uint256 constant RAY = 10**27; //rounds to zero if x*y < WAD / 2 function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), WAD / 2) / WAD; } //rounds to zero if x*y < WAD / 2 function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), RAY / 2) / RAY; } //rounds to zero if x*y < WAD / 2 function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, WAD), y / 2) / y; } //rounds to zero if x*y < RAY / 2 function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, RAY), y / 2) / y; } // This famous algorithm is called "exponentiation by squaring" // and calculates x^n with x as fixed-point and n as regular unsigned. // // It's O(log n), instead of O(n) for naive repeated multiplication. // // These facts are why it works: // // If n is even, then x^n = (x^2)^(n/2). // If n is odd, then x^n = x * x^(n-1), // and applying the equation for even x gives // x^n = x * (x^2)^((n-1) / 2). // // Also, EVM division is flooring and // floor[(n-1) / 2] = floor[n / 2]. // function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) { z = n % 2 != 0 ? x : RAY; for (n /= 2; n != 0; n /= 2) { x = rmul(x, x); if (n % 2 != 0) { z = rmul(z, x); } } } } contract DSThing is DSAuth, DSNote, DSMath { function S(string memory s) internal pure returns (bytes4) { return bytes4(keccak256(abi.encodePacked(s))); } } contract DSValue is DSThing { bool has; bytes32 val; function peek() public view returns (bytes32, bool) { return (val, has); } function read() public view returns (bytes32) { bytes32 wut; bool haz; (wut, haz) = peek(); require(haz, "haz-not"); return wut; } function poke(bytes32 wut) public note auth { val = wut; has = true; } function void() public note auth { // unset the value has = false; } } // File: contracts/lib/IUniswapV2Pair.sol pragma solidity >=0.5.10; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/sale/PricePicker.sol pragma solidity ^0.5.17; // calc eth price in usd contract PricePicker is DSMath, Ownable { function src() public pure returns (address) { return 0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11; } function getPrice() public view returns (uint256) { (uint112 reserve0, uint112 reserve1) = IUniswapV2Pair(src()).getReserves(); return wdiv(uint256(reserve0), uint256(reserve1)); } } // File: contracts/sale/RoundCrowdsale.sol pragma solidity ^0.5.17; contract RoundCrowdsale is DSMath, Crowdsale { using SafeMath for uint256; bool private _initialized; uint256 private _startTime; uint256 private _nRound; // array of block time stamps uint256[] private _roundEndTime; // array of rates of tokens per wei in WAD unit. uint256[] private _rates; uint256 private _roundTokenCap; mapping(uint256 => uint256) private _roundSoldToken; function initialize( uint256 roundTokenCap, uint256 startTime, uint256[] memory roundEndTime, uint256[] memory rates ) public { require(_initialized == false); require(roundEndTime.length == rates.length, "RoundCrowdsale: invalid input length"); require(startTime < roundEndTime[0], "RoundCrowdsale: invalid start time"); uint256 n = roundEndTime.length; for (uint256 i = 1; i < n; i++) { require(roundEndTime[i - 1] < roundEndTime[i], "RoundCrowdsale: time not sorted"); } _startTime = startTime; _nRound = n; _roundEndTime = roundEndTime; _rates = rates; _roundTokenCap = roundTokenCap; _initialized = true; } function nRound() public view returns (uint256) { return _nRound; } function startTime() public view returns (uint256) { return _startTime; } function roundEndTimes(uint256 i) public view returns (uint256) { return _roundEndTime[i]; } function roundSoldToken(uint256 i) public view returns (uint256) { return _roundSoldToken[i]; } function roundTokenCap() public view returns (uint256) { return _roundTokenCap; } function rates(uint256 i) external view returns (uint256) { return _rates[i]; } function isOpen() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp >= _startTime && block.timestamp <= _roundEndTime[_roundEndTime.length - 1]; } /** * The base rate function is overridden to revert, since this crowdsale doesn't use it, and * all calls to it are a mistake. */ function rate() public view returns (uint256) { revert("RoundCrowdsale: rate() called"); } function getCurrentRound() public view returns (uint256) { require(isOpen()); uint256 index; for (; index < _rates.length; index++) { if (block.timestamp <= _roundEndTime[index]) break; } return index; } /** * @dev Returns the rate of tokens per wei at the present time. * Note that, as price _increases_ with time, the rate _decreases_. * @return The number of tokens a buyer gets per wei at a given time */ function getCurrentRate() public view returns (uint256) { if (!isOpen()) { return 0; } return _rates[getCurrentRound()]; } /** * @dev Override Crowdsale#_processPurchase * @param beneficiary Address receiving the tokens * @param tokenAmount Number of tokens to be purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal { uint256 index = getCurrentRound(); require(_roundSoldToken[index].add(tokenAmount) < _roundTokenCap, "RoundCrowdsale: over payment"); _roundSoldToken[index] = _roundSoldToken[index].add(tokenAmount); super._processPurchase(beneficiary, tokenAmount); } /** * @dev Overrides parent method taking into account variable rate. * @param weiAmount The value in wei to be converted into tokens * @return The number of tokens _weiAmount wei will buy at present time */ function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) { uint256 currentRate = getCurrentRate(); return wmul(currentRate, weiAmount); } /** * @dev Overrides Crowdsale._preValidatePurchase * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view { super._preValidatePurchase(beneficiary, weiAmount); require(isOpen(), "RoundCrowdsale: not open yet"); this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 } } // File: contracts/lib/MerkleProof.sol // https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol pragma solidity >=0.4.22 <0.8.0; contract MerkleProof { function checkProof( bytes memory proof, bytes32 root, bytes32 hash ) public pure returns (bool) { bytes32 el; bytes32 h = hash; for (uint256 i = 32; i <= proof.length; i += 32) { assembly { el := mload(add(proof, i)) } if (h < el) { h = keccak256(abi.encodePacked(h, el)); } else { h = keccak256(abi.encodePacked(el, h)); } } return h == root; } // from StorJ -- https://github.com/nginnever/storj-audit-verifier/blob/master/contracts/MerkleVerifyv3.sol function checkProofOrdered( bytes memory proof, bytes32 root, bytes32 hash, uint256 index ) public pure returns (bool) { // use the index to determine the node ordering // index ranges 1 to n bytes32 el; bytes32 h = hash; uint256 remaining; for (uint256 j = 32; j <= proof.length; j += 32) { assembly { el := mload(add(proof, j)) } // calculate remaining elements in proof remaining = (proof.length - j + 32) / 32; // we don't assume that the tree is padded to a power of 2 // if the index is odd then the proof will start with a hash at a higher // layer, so we have to adjust the index to be the index at that layer while (remaining > 0 && index % 2 == 1 && index > 2**remaining) { index = uint256(index) / 2 + 1; } if (index % 2 == 0) { h = keccak256(abi.encodePacked(el, h)); index = index / 2; } else { h = keccak256(abi.encodePacked(h, el)); index = uint256(index) / 2 + 1; } } return h == root; } } // File: contracts/lib/LeafLib.sol // SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.8.0; contract LeafLib is MerkleProof { mapping(address => uint256) public amounts; mapping(bytes32 => bool) public isRoot; bytes32[] public roots; function addRoot(bytes32 root) public { require(!isRoot[root], "duplicate-root"); isRoot[root] = true; roots.push(root); } function addLeaf( bytes32 root, address account, uint256 amount, bytes memory proof ) public { require(isRoot[root], "no-root"); bytes32 h = keccak256(abi.encode(account, amount)); require(checkProof(proof, root, h), "invalid-proof"); amounts[account] = amount; } } // File: contracts/sale/MerkleProofCappedCrowdsale.sol // SPDX-License-Identifier: MIT pragma solidity ^0.5.17; contract MerkleProofCappedCrowdsale is Ownable, LeafLib, Crowdsale { using SafeMath for uint256; mapping(address => bool) public isRootAdder; modifier onlyRootAdder() { require(msg.sender == owner() || isRootAdder[msg.sender], "no-root-adder"); _; } function addRootAdder(address account) external onlyOwner { isRootAdder[account] = true; } function addRoot(bytes32 root) public onlyRootAdder { super.addRoot(root); } mapping(address => uint256) private _contributions; /** * @dev Returns the amount contributed so far by a specific beneficiary. * @param beneficiary Address of contributor * @return Beneficiary contribution so far */ function getContribution(address beneficiary) public view returns (uint256) { return _contributions[beneficiary]; } /** * @param amount cap * @param root merkle root * @param proof merkle proof */ function buyTokensWithProof( uint256 amount, bytes32 root, bytes calldata proof ) external payable { addLeaf(root, msg.sender, amount, proof); buyTokens(msg.sender); } function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view { super._preValidatePurchase(beneficiary, weiAmount); require(_contributions[beneficiary].add(weiAmount) <= amounts[beneficiary], "MerkleProofCappedCrowdsale: exceeds cap"); } /** * @dev Extend parent behavior to update beneficiary contributions. * @param beneficiary Token purchaser * @param weiAmount Amount of wei contributed */ function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal { super._updatePurchasingState(beneficiary, weiAmount); _contributions[beneficiary] = _contributions[beneficiary].add(weiAmount); } } // File: contracts/sale/PublicSale.sol pragma solidity ^0.5.17; /** * @dev RefundableCrowdsale is only used to prevent `wallet` from receiving Ether * during crowdsale. */ contract PublicSale is DSMath, Ownable, Crowdsale, AllowanceCrowdsale, TimedCrowdsale, MerkleProofCappedCrowdsale, FinalizableCrowdsale, RefundableCrowdsale, RoundCrowdsale, PricePicker { constructor( IERC20 token, // The token being sold address payable wallet, // Address where funds are collected address tokenWallet, // Address where the token is stored uint256 openingTime, // Time when the sale is opened uint256 closingTime ) public Crowdsale(1, wallet, token) AllowanceCrowdsale(tokenWallet) TimedCrowdsale(openingTime, closingTime) RefundableCrowdsale(1) {} //////////////////////// // Prices //////////////////////// function DAI_CFX() public view returns (uint256) { return getCurrentRate(); } function ETH_DAI() public view returns (uint256) { return getPrice(); } function ETH_CFX() public view returns (uint256) { return wdiv(ETH_DAI(), DAI_CFX()); } /** * @dev Override Crowdsale#_getTokenAmount * @param weiAmount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _weiAmount */ function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) { return calcTokenAmountWithEthPrice(weiAmount); } function calcTokenAmountWithEthPrice(uint256 ethAmount) public view returns (uint256) { return wmul(ethAmount, ETH_CFX()); } function isOpen() public view returns (bool) { return RoundCrowdsale.isOpen() && TimedCrowdsale.isOpen(); } /** * @dev Override FinalizableCrowdsale#finalize */ function finalize() public onlyOwner { super.finalize(); } /** * @dev Override RefundableCrowdsale#claimRefund */ function claimRefund(address payable) public { revert("PublicSale: not supported"); } /** * @dev Override RefundableCrowdsale#goalReached * @return Whether funding goal was reached */ function goalReached() public view returns (bool) { return hasClosed(); } function goal() public view returns (uint256) { revert("PublicSale: not supported"); } /** * @dev Overrides Crowdsale._preValidatePurchase * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view { super._preValidatePurchase(beneficiary, weiAmount); require(msg.sender == tx.origin, "PublicSale: invalid tx origin"); this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address payable","name":"wallet","type":"address"},{"internalType":"address","name":"tokenWallet","type":"address"},{"internalType":"uint256","name":"openingTime","type":"uint256"},{"internalType":"uint256","name":"closingTime","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"CrowdsaleFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevClosingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newClosingTime","type":"uint256"}],"name":"TimedCrowdsaleExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"DAI_CFX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_CFX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_DAI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"addLeaf","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"addRoot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addRootAdder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"buyTokensWithProof","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"calcTokenAmountWithEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"checkProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"checkProofOrdered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"","type":"address"}],"name":"claimRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"getContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goalReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"roundTokenCap","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256[]","name":"roundEndTime","type":"uint256[]"},{"internalType":"uint256[]","name":"rates","type":"uint256[]"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRootAdder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"openingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"rates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"remainingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"roundEndTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"roundSoldToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"roundTokenCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"src","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200382a3803806200382a833981810160405260a08110156200003757600080fd5b50805160208201516040830151606084015160809094015192939192909190600182828583888a6000620000736001600160e01b03620003b216565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506004805460ff19166001179055826200011d576040805162461bcd60e51b815260206004820152601460248201527f43726f776473616c653a20726174652069732030000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038216620001645760405162461bcd60e51b8152600401808060200182810382526025815260200180620038056025913960400191505060405180910390fd5b6001600160a01b038116620001ab5760405162461bcd60e51b8152600401808060200182810382526024815260200180620037e16024913960400191505060405180910390fd5b600692909255600580546001600160a01b0319166001600160a01b0392831617905560048054610100600160a81b031916610100938316939093029290921790915581166200022c5760405162461bcd60e51b8152600401808060200182810382526034815260200180620037766034913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055428210156200028d5760405162461bcd60e51b8152600401808060200182810382526033815260200180620037436033913960400191505060405180910390fd5b818111620002cd5760405162461bcd60e51b8152600401808060200182810382526037815260200180620037aa6037913960400191505060405180910390fd5b600991909155600a55600d805460ff191690558062000333576040805162461bcd60e51b815260206004820152601e60248201527f526566756e6461626c6543726f776473616c653a20676f616c20697320300000604482015290519081900360640190fd5b620003466001600160e01b03620003b616565b6040516200035490620003c5565b6001600160a01b03909116815260405190819003602001906000f08015801562000382573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b0392909216919091179055600e5550620003d39350505050565b3390565b6005546001600160a01b031690565b610de3806200296083390190565b61257d80620003e36000396000f3fe60806040526004361061027d5760003560e01c8063a69e5eda1161014f578063c4fd3d85116100c1578063ec8ac4d81161007a578063ec8ac4d814610aa4578063f2fde38b14610aca578063f48fcb9e14610afd578063f7fb07b014610b27578063fa720c8114610b3c578063fc0c546a14610b665761027d565b8063c4fd3d851461096d578063caadea1714610982578063d59e6461146109ac578063dd418ae2146109d6578063e0e9208d14610a00578063e8861b4a14610a7a5761027d565b8063b7a8807c11610113578063b7a8807c1461081b578063bf0af1ba14610830578063bf583903146108e6578063bff99c6c146108fb578063bffa55d514610910578063c2b40ae4146109435761027d565b8063a69e5eda1461066d578063a77a29fc14610682578063ab91b96a146107be578063ac5a8f58146107d3578063b3f05b97146108065761027d565b8063521eb273116101f35780638c498cca116101ac5780638c498cca146105d15780638da5cb5b146106045780638e2ce41e146106195780638f32d59b1461062e57806398d5fdca14610643578063a32bf597146106585761027d565b8063521eb2731461053557806355a3b2c11461054a578063715018a61461057d57806378e97925146105925780637d3d6522146105a757806385947d95146105bc5761027d565b80632fa69a1f116102455780632fa69a1f146103ff57806340193883146104cc5780634042b66f146104e157806347535d7b146104f65780634b6753bc1461050b5780634bb278f3146105205761027d565b80631515bc2b1461028f57806321eff7fc146102b857806323a27bcd146102fd5780632c4e722e146103b95780632e7dc6af146103ce575b61028d610288610b7b565b610b80565b005b34801561029b57600080fd5b506102a4610ca2565b604080519115158252519081900360200190f35b3480156102c457600080fd5b506102eb600480360360208110156102db57600080fd5b50356001600160a01b0316610caa565b60408051918252519081900360200190f35b34801561030957600080fd5b506102a46004803603608081101561032057600080fd5b810190602081018135600160201b81111561033a57600080fd5b82018360208201111561034c57600080fd5b803590602001918460018302840111600160201b8311171561036d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060400135610cc5565b3480156103c557600080fd5b506102eb610dc6565b3480156103da57600080fd5b506103e3610e15565b604080516001600160a01b039092168252519081900360200190f35b34801561040b57600080fd5b5061028d6004803603608081101561042257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561045857600080fd5b82018360208201111561046a57600080fd5b803590602001918460018302840111600160201b8311171561048b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e2d945050505050565b3480156104d857600080fd5b506102eb610f18565b3480156104ed57600080fd5b506102eb610f63565b34801561050257600080fd5b506102a4610f69565b34801561051757600080fd5b506102eb610f87565b34801561052c57600080fd5b5061028d610f8d565b34801561054157600080fd5b506103e3610fde565b34801561055657600080fd5b506102eb6004803603602081101561056d57600080fd5b50356001600160a01b0316610fed565b34801561058957600080fd5b5061028d610fff565b34801561059e57600080fd5b506102eb611090565b3480156105b357600080fd5b506102a4611096565b3480156105c857600080fd5b506102eb6110a0565b3480156105dd57600080fd5b506102a4600480360360208110156105f457600080fd5b50356001600160a01b03166110a6565b34801561061057600080fd5b506103e36110bb565b34801561062557600080fd5b506102eb6110ca565b34801561063a57600080fd5b506102a46110e4565b34801561064f57600080fd5b506102eb611108565b34801561066457600080fd5b506102eb6111a8565b34801561067957600080fd5b506102eb6111f3565b34801561068e57600080fd5b5061028d600480360360808110156106a557600080fd5b813591602081013591810190606081016040820135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561074d57600080fd5b82018360208201111561075f57600080fd5b803590602001918460208302840111600160201b8311171561078057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506111fd945050505050565b3480156107ca57600080fd5b506102eb61138a565b3480156107df57600080fd5b5061028d600480360360208110156107f657600080fd5b50356001600160a01b0316611390565b34801561081257600080fd5b506102a46113fb565b34801561082757600080fd5b506102eb611404565b34801561083c57600080fd5b506102a46004803603606081101561085357600080fd5b810190602081018135600160201b81111561086d57600080fd5b82018360208201111561087f57600080fd5b803590602001918460018302840111600160201b831117156108a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013561140a565b3480156108f257600080fd5b506102eb6114a3565b34801561090757600080fd5b506103e36115b7565b34801561091c57600080fd5b5061028d6004803603602081101561093357600080fd5b50356001600160a01b03166115c6565b34801561094f57600080fd5b506102eb6004803603602081101561096657600080fd5b503561160f565b34801561097957600080fd5b506102eb61162d565b34801561098e57600080fd5b506102a4600480360360208110156109a557600080fd5b5035611637565b3480156109b857600080fd5b5061028d600480360360208110156109cf57600080fd5b503561164c565b3480156109e257600080fd5b506102eb600480360360208110156109f957600080fd5b50356116cf565b61028d60048036036060811015610a1657600080fd5b813591602081013591810190606081016040820135600160201b811115610a3c57600080fd5b820183602082011115610a4e57600080fd5b803590602001918460018302840111600160201b83111715610a6f57600080fd5b5090925090506116f0565b348015610a8657600080fd5b506102eb60048036036020811015610a9d57600080fd5b5035611741565b61028d60048036036020811015610aba57600080fd5b50356001600160a01b0316610b80565b348015610ad657600080fd5b5061028d60048036036020811015610aed57600080fd5b50356001600160a01b031661175a565b348015610b0957600080fd5b506102eb60048036036020811015610b2057600080fd5b50356117aa565b348015610b3357600080fd5b506102eb6117bc565b348015610b4857600080fd5b506102eb60048036036020811015610b5f57600080fd5b50356117f6565b348015610b7257600080fd5b506103e3611805565b335b90565b60045460ff16610bd7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6004805460ff1916905534610bec8282611819565b6000610bf78261187b565b600754909150610c0d908363ffffffff61188616565b600755610c1a83826118e7565b826001600160a01b0316610c2c610b7b565b6001600160a01b03167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a3610c7e83836119a6565b610c866119f9565b610c908383611877565b50506004805460ff1916600117905550565b600a54421190565b6001600160a01b03166000908152600c602052604090205490565b600080838160205b88518111610db8578089015193506020818a510360200181610ceb57fe5b0491505b600082118015610d025750600286066001145b8015610d1057508160020a86115b15610d2357600286046001019550610cef565b60028606610d6e578383604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120925060028681610d6657fe5b049550610db0565b8284604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120925060028681610da957fe5b0460010195505b602001610ccd565b505090941495945050505050565b6040805162461bcd60e51b815260206004820152601d60248201527f526f756e6443726f776473616c653a207261746528292063616c6c65640000006044820152905160009181900360640190fd5b73a478c2975ab1ea89e8196811f51a7b7ade33eb1190565b60008481526002602052604090205460ff16610e7a576040805162461bcd60e51b81526020600482015260076024820152661b9bcb5c9bdbdd60ca1b604482015290519081900360640190fd5b604080516001600160a01b03851660208083019190915281830185905282518083038401815260609092019092528051910120610eb882868361140a565b610ef9576040805162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b216b83937b7b360991b604482015290519081900360640190fd5b50506001600160a01b0390911660009081526001602052604090205550565b6040805162461bcd60e51b8152602060048201526019602482015278141d589b1a58d4d85b194e881b9bdd081cdd5c1c1bdc9d1959603a1b6044820152905160009181900360640190fd5b60075490565b6000610f73611a75565b8015610f825750610f82611aa9565b905090565b600a5490565b610f956110e4565b610fd4576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b610fdc611ac2565b565b6005546001600160a01b031690565b60016020526000908152604090205481565b6110076110e4565b611046576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60105490565b6000610f82610ca2565b60145490565b600b6020526000908152604090205460ff1681565b6000546001600160a01b031690565b6000610f826110d761162d565b6110df6111f3565b611b9d565b600080546001600160a01b03166110f9610b7b565b6001600160a01b031614905090565b6000806000611115610e15565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b15801561114c57600080fd5b505afa158015611160573d6000803e3d6000fd5b505050506040513d604081101561117657600080fd5b50805160209091015190925090506111a16dffffffffffffffffffffffffffff808416908316611b9d565b9250505090565b60006111b2610f69565b6111bb57600080fd5b60005b601354811015610f8257601281815481106111d557fe5b906000526020600020015442116111eb57610f82565b6001016111be565b6000610f826117bc565b600f54600160a01b900460ff161561121457600080fd5b80518251146112545760405162461bcd60e51b815260040180806020018281038252602481526020018061241b6024913960400191505060405180910390fd5b8160008151811061126157fe5b602002602001015183106112a65760405162461bcd60e51b81526004018080602001828103825260228152602001806125006022913960400191505060405180910390fd5b815160015b81811015611338578381815181106112bf57fe5b60200260200101518460018303815181106112d657fe5b602002602001015110611330576040805162461bcd60e51b815260206004820152601f60248201527f526f756e6443726f776473616c653a2074696d65206e6f7420736f7274656400604482015290519081900360640190fd5b6001016112ab565b506010849055601181905582516113569060129060208601906123b5565b50815161136a9060139060208501906123b5565b5050506014929092555050600f805460ff60a01b1916600160a01b179055565b60115490565b6113986110e4565b6113d7576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b600d5460ff1690565b60095490565b6000808260205b86518111611497578087015192508282101561145d578183604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120915061148f565b828260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b602001611411565b50909314949350505050565b6000610f826114b0611805565b600854604080516370a0823160e01b81526001600160a01b039283166004820152905192909116916370a0823191602480820192602092909190829003018186803b1580156114fe57600080fd5b505afa158015611512573d6000803e3d6000fd5b505050506040513d602081101561152857600080fd5b5051611532611805565b60085460408051636eb1769f60e11b81526001600160a01b0392831660048201523060248201529051929091169163dd62ed3e91604480820192602092909190829003018186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d60208110156115b057600080fd5b5051611bce565b6008546001600160a01b031690565b6040805162461bcd60e51b8152602060048201526019602482015278141d589b1a58d4d85b194e881b9bdd081cdd5c1c1bdc9d1959603a1b604482015290519081900360640190fd5b6003818154811061161c57fe5b600091825260209091200154905081565b6000610f82611108565b60026020526000908152604090205460ff1681565b6116546110bb565b6001600160a01b0316336001600160a01b031614806116825750336000908152600b602052604090205460ff165b6116c3576040805162461bcd60e51b815260206004820152600d60248201526c373796b937b7ba16b0b23232b960991b604482015290519081900360640190fd5b6116cc81611be4565b50565b6000601382815481106116de57fe5b90600052602060002001549050919050565b61173283338685858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e2d92505050565b61173b33610b80565b50505050565b60006117548261174f6110ca565b611c86565b92915050565b6117626110e4565b6117a1576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b6116cc81611cae565b60009081526015602052604090205490565b60006117c6610f69565b6117d257506000610b7d565b60136117dc6111a8565b815481106117e657fe5b9060005260206000200154905090565b6000601282815481106116de57fe5b60045461010090046001600160a01b031690565b6118238282611d4e565b333214611877576040805162461bcd60e51b815260206004820152601d60248201527f5075626c696353616c653a20696e76616c6964207478206f726967696e000000604482015290519081900360640190fd5b5050565b600061175482611741565b6000828201838110156118e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006118f16111a8565b60145460008281526015602052604090205491925090611917908463ffffffff61188616565b10611969576040805162461bcd60e51b815260206004820152601c60248201527f526f756e6443726f776473616c653a206f766572207061796d656e7400000000604482015290519081900360640190fd5b600081815260156020526040902054611988908363ffffffff61188616565b6000828152601560205260409020556119a18383611db1565b505050565b6119b08282611877565b6001600160a01b0382166000908152600c60205260409020546119d9908263ffffffff61188616565b6001600160a01b039092166000908152600c602052604090209190915550565b600f546001600160a01b031663f340fa0134611a13610b7b565b6040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b158015611a5a57600080fd5b505af1158015611a6e573d6000803e3d6000fd5b5050505050565b60006010544210158015610f825750601280546000198101908110611a9657fe5b9060005260206000200154421115905090565b60006009544210158015610f82575050600a5442111590565b600d5460ff1615611b045760405162461bcd60e51b81526004018080602001828103825260278152602001806124856027913960400191505060405180910390fd5b611b0c610ca2565b611b5d576040805162461bcd60e51b815260206004820181905260248201527f46696e616c697a61626c6543726f776473616c653a206e6f7420636c6f736564604482015290519081900360640190fd5b600d805460ff19166001179055611b72611dbb565b6040517f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183690600090a1565b600081611bbf611bb585670de0b6b3a7640000611f0e565b6002855b04611f71565b81611bc657fe5b049392505050565b6000818310611bdd57816118e0565b5090919050565b60008181526002602052604090205460ff1615611c39576040805162461bcd60e51b815260206004820152600e60248201526d191d5c1b1a58d85d194b5c9bdbdd60921b604482015290519081900360640190fd5b6000818152600260205260408120805460ff191660019081179091556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0155565b6000670de0b6b3a7640000611bbf611c9e8585611f0e565b6002670de0b6b3a7640000611bb9565b6001600160a01b038116611cf35760405162461bcd60e51b815260040180806020018281038252602681526020018061243f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611d588282611fc0565b611d60610f69565b611877576040805162461bcd60e51b815260206004820152601c60248201527f526f756e6443726f776473616c653a206e6f74206f70656e2079657400000000604482015290519081900360640190fd5b611877828261203c565b611dc3611096565b15611e9d57600f60009054906101000a90046001600160a01b03166001600160a01b03166343d726d66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e1857600080fd5b505af1158015611e2c573d6000803e3d6000fd5b50505050600f60009054906101000a90046001600160a01b03166001600160a01b0316639af6549a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b50505050611f06565b600f60009054906101000a90046001600160a01b03166001600160a01b0316638c52dc416040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050505b610fdc610fdc565b6000811580611f2957505080820282828281611f2657fe5b04145b611754576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611754576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b611fca828261206d565b6001600160a01b038216600090815260016020908152604080832054600c90925290912054611fff908363ffffffff61188616565b11156118775760405162461bcd60e51b81526004018080602001828103825260278152602001806125226027913960400191505060405180910390fd5b600854611877906001600160a01b03168383612056611805565b6001600160a01b031692919063ffffffff6120d016565b612075610f69565b6120c6576040805162461bcd60e51b815260206004820152601860248201527f54696d656443726f776473616c653a206e6f74206f70656e0000000000000000604482015290519081900360640190fd5b611877828261212a565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261173b9085906121c1565b6001600160a01b03821661216f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806124ac602a913960400191505060405180910390fd5b80611877576040805162461bcd60e51b815260206004820152601960248201527f43726f776473616c653a20776569416d6f756e74206973203000000000000000604482015290519081900360640190fd5b6121d3826001600160a01b0316612379565b612224576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106122625780518252601f199092019160209182019101612243565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146122c4576040519150601f19603f3d011682016040523d82523d6000602084013e6122c9565b606091505b509150915081612320576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561173b5780806020019051602081101561233c57600080fd5b505161173b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806124d6602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906123ad57508115155b949350505050565b8280548282559060005260206000209081019282156123f0579160200282015b828111156123f05782518255916020019190600101906123d5565b506123fc929150612400565b5090565b610b7d91905b808211156123fc576000815560010161240656fe526f756e6443726f776473616c653a20696e76616c696420696e707574206c656e6774684f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657246696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a656443726f776473616c653a2062656e656669636961727920697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526f756e6443726f776473616c653a20696e76616c69642073746172742074696d654d65726b6c6550726f6f6643617070656443726f776473616c653a206578636565647320636170a265627a7a723158203e99fb4ba2dadbf37fdc3e3ad916f2edd4fcb20c13bcaf3b62f66f6d3b9ae65864736f6c63430005110032608060405234801561001057600080fd5b50604051610de3380380610de38339818101604052602081101561003357600080fd5b505160006100486001600160e01b0361011316565b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252519192507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d9919081900360200190a1506001600160a01b0381166100e35760405162461bcd60e51b815260040180806020018281038252602d815260200180610db6602d913960400191505060405180910390fd5b6002805460ff196001600160a01b039390931661010002610100600160a81b031990911617919091169055610117565b3390565b610c90806101266000396000f3fe6080604052600436106100a75760003560e01c80638c52dc41116100645780638c52dc41146101d45780639af6549a146101e9578063c19d93fb146101fe578063c6dbdf6114610237578063e3a9db1a1461024c578063f340fa0114610291576100a7565b80632348238c146100ac57806338af3eed146100e157806343d726d61461011257806351cff8d9146101275780636809691a1461015a578063685ca1941461018d575b600080fd5b3480156100b857600080fd5b506100df600480360360208110156100cf57600080fd5b50356001600160a01b03166102b7565b005b3480156100ed57600080fd5b506100f66103a9565b604080516001600160a01b039092168252519081900360200190f35b34801561011e57600080fd5b506100df6103bd565b34801561013357600080fd5b506100df6004803603602081101561014a57600080fd5b50356001600160a01b031661049c565b34801561016657600080fd5b506100df6004803603602081101561017d57600080fd5b50356001600160a01b03166104ec565b34801561019957600080fd5b506101c0600480360360208110156101b057600080fd5b50356001600160a01b03166105b6565b604080519115158252519081900360200190f35b3480156101e057600080fd5b506100df6105d2565b3480156101f557600080fd5b506100df6106b2565b34801561020a57600080fd5b5061021361073f565b6040518082600281111561022357fe5b60ff16815260200191505060405180910390f35b34801561024357600080fd5b506100f6610748565b34801561025857600080fd5b5061027f6004803603602081101561026f57600080fd5b50356001600160a01b0316610757565b60408051918252519081900360200190f35b6100df600480360360208110156102a757600080fd5b50356001600160a01b0316610772565b6000546001600160a01b03166102cb6107ca565b6001600160a01b0316146103105760405162461bcd60e51b815260040180806020018281038252602c815260200180610bfe602c913960400191505060405180910390fd5b6001600160a01b0381166103555760405162461bcd60e51b815260040180806020018281038252602a815260200180610bd4602a913960400191505060405180910390fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d99181900360200190a150565b60025461010090046001600160a01b031690565b6000546001600160a01b03166103d16107ca565b6001600160a01b0316146104165760405162461bcd60e51b815260040180806020018281038252602c815260200180610bfe602c913960400191505060405180910390fd5b60006002805460ff169081111561042957fe5b146104655760405162461bcd60e51b8152600401808060200182810382526029815260200180610bab6029913960400191505060405180910390fd5b6002805460ff1916811790556040517f088672c3a6e342f7cd94a65ba63b79df24a8973927b4d05d803c44bbf787d12f90600090a1565b6104a5816105b6565b6104e05760405162461bcd60e51b8152600401808060200182810382526033815260200180610b786033913960400191505060405180910390fd5b6104e9816107ce565b50565b6000546001600160a01b03166105006107ca565b6001600160a01b0316146105455760405162461bcd60e51b815260040180806020018281038252602c815260200180610bfe602c913960400191505060405180910390fd5b6001600160a01b0381166000818152600160205260408120805491905590610573908263ffffffff6108b516565b6040805182815290516001600160a01b038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b600060016002805460ff16908111156105cb57fe5b1492915050565b6000546001600160a01b03166105e66107ca565b6001600160a01b03161461062b5760405162461bcd60e51b815260040180806020018281038252602c815260200180610bfe602c913960400191505060405180910390fd5b60006002805460ff169081111561063e57fe5b1461067a5760405162461bcd60e51b8152600401808060200182810382526032815260200180610c2a6032913960400191505060405180910390fd5b6002805460ff191660011790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b6002805460ff16818111156106c357fe5b146106ff5760405162461bcd60e51b8152600401808060200182810382526038815260200180610adb6038913960400191505060405180910390fd5b6002546040516001600160a01b0361010090920491909116904780156108fc02916000818181858888f193505050501580156104e9573d6000803e3d6000fd5b60025460ff1690565b6000546001600160a01b031690565b6001600160a01b031660009081526001602052604090205490565b60006002805460ff169081111561078557fe5b146107c15760405162461bcd60e51b815260040180806020018281038252602b815260200180610b4d602b913960400191505060405180910390fd5b6104e98161099f565b3390565b6000546001600160a01b03166107e26107ca565b6001600160a01b0316146108275760405162461bcd60e51b815260040180806020018281038252602c815260200180610bfe602c913960400191505060405180910390fd5b6001600160a01b038116600081815260016020526040808220805490839055905190929183156108fc02918491818181858888f19350505050158015610871573d6000803e3d6000fd5b506040805182815290516001600160a01b038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b8047101561090a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114610955576040519150601f19603f3d011682016040523d82523d6000602084013e61095a565b606091505b505090508061099a5760405162461bcd60e51b815260040180806020018281038252603a815260200180610b13603a913960400191505060405180910390fd5b505050565b6000546001600160a01b03166109b36107ca565b6001600160a01b0316146109f85760405162461bcd60e51b815260040180806020018281038252602c815260200180610bfe602c913960400191505060405180910390fd5b6001600160a01b0381166000908152600160205260409020543490610a23908263ffffffff610a7916565b6001600160a01b038316600081815260016020908152604091829020939093558051848152905191927f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c492918290030190a25050565b600082820183811015610ad3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe526566756e64457363726f773a2062656e65666963696172792063616e206f6e6c79207769746864726177207768696c6520636c6f736564416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564526566756e64457363726f773a2063616e206f6e6c79206465706f736974207768696c6520616374697665436f6e646974696f6e616c457363726f773a207061796565206973206e6f7420616c6c6f77656420746f207769746864726177526566756e64457363726f773a2063616e206f6e6c7920636c6f7365207768696c65206163746976655365636f6e646172793a206e6577207072696d61727920697320746865207a65726f20616464726573735365636f6e646172793a2063616c6c6572206973206e6f7420746865207072696d617279206163636f756e74526566756e64457363726f773a2063616e206f6e6c7920656e61626c6520726566756e6473207768696c6520616374697665a265627a7a7231582079b5c59a7dcd7dc05ae276d424443416322f78621ae78834207bf763259b48d464736f6c63430005110032526566756e64457363726f773a2062656e656669636961727920697320746865207a65726f206164647265737354696d656443726f776473616c653a206f70656e696e672074696d65206973206265666f72652063757272656e742074696d65416c6c6f77616e636543726f776473616c653a20746f6b656e2077616c6c657420697320746865207a65726f206164647265737354696d656443726f776473616c653a206f70656e696e672074696d65206973206e6f74206265666f726520636c6f73696e672074696d6543726f776473616c653a20746f6b656e20697320746865207a65726f206164647265737343726f776473616c653a2077616c6c657420697320746865207a65726f20616464726573730000000000000000000000000e3590419b69bd157ab321569bb3b6a9862075800000000000000000000000002ce7fd20fca5b6589304048345328c8ad2063077000000000000000000000000cd9c21aa3e33b411c22c9120ff4518dbf7daf8e8000000000000000000000000000000000000000000000000000000006098a1b00000000000000000000000000000000000000000000000000000000060b2ffb0
Deployed Bytecode
0x60806040526004361061027d5760003560e01c8063a69e5eda1161014f578063c4fd3d85116100c1578063ec8ac4d81161007a578063ec8ac4d814610aa4578063f2fde38b14610aca578063f48fcb9e14610afd578063f7fb07b014610b27578063fa720c8114610b3c578063fc0c546a14610b665761027d565b8063c4fd3d851461096d578063caadea1714610982578063d59e6461146109ac578063dd418ae2146109d6578063e0e9208d14610a00578063e8861b4a14610a7a5761027d565b8063b7a8807c11610113578063b7a8807c1461081b578063bf0af1ba14610830578063bf583903146108e6578063bff99c6c146108fb578063bffa55d514610910578063c2b40ae4146109435761027d565b8063a69e5eda1461066d578063a77a29fc14610682578063ab91b96a146107be578063ac5a8f58146107d3578063b3f05b97146108065761027d565b8063521eb273116101f35780638c498cca116101ac5780638c498cca146105d15780638da5cb5b146106045780638e2ce41e146106195780638f32d59b1461062e57806398d5fdca14610643578063a32bf597146106585761027d565b8063521eb2731461053557806355a3b2c11461054a578063715018a61461057d57806378e97925146105925780637d3d6522146105a757806385947d95146105bc5761027d565b80632fa69a1f116102455780632fa69a1f146103ff57806340193883146104cc5780634042b66f146104e157806347535d7b146104f65780634b6753bc1461050b5780634bb278f3146105205761027d565b80631515bc2b1461028f57806321eff7fc146102b857806323a27bcd146102fd5780632c4e722e146103b95780632e7dc6af146103ce575b61028d610288610b7b565b610b80565b005b34801561029b57600080fd5b506102a4610ca2565b604080519115158252519081900360200190f35b3480156102c457600080fd5b506102eb600480360360208110156102db57600080fd5b50356001600160a01b0316610caa565b60408051918252519081900360200190f35b34801561030957600080fd5b506102a46004803603608081101561032057600080fd5b810190602081018135600160201b81111561033a57600080fd5b82018360208201111561034c57600080fd5b803590602001918460018302840111600160201b8311171561036d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060400135610cc5565b3480156103c557600080fd5b506102eb610dc6565b3480156103da57600080fd5b506103e3610e15565b604080516001600160a01b039092168252519081900360200190f35b34801561040b57600080fd5b5061028d6004803603608081101561042257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561045857600080fd5b82018360208201111561046a57600080fd5b803590602001918460018302840111600160201b8311171561048b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e2d945050505050565b3480156104d857600080fd5b506102eb610f18565b3480156104ed57600080fd5b506102eb610f63565b34801561050257600080fd5b506102a4610f69565b34801561051757600080fd5b506102eb610f87565b34801561052c57600080fd5b5061028d610f8d565b34801561054157600080fd5b506103e3610fde565b34801561055657600080fd5b506102eb6004803603602081101561056d57600080fd5b50356001600160a01b0316610fed565b34801561058957600080fd5b5061028d610fff565b34801561059e57600080fd5b506102eb611090565b3480156105b357600080fd5b506102a4611096565b3480156105c857600080fd5b506102eb6110a0565b3480156105dd57600080fd5b506102a4600480360360208110156105f457600080fd5b50356001600160a01b03166110a6565b34801561061057600080fd5b506103e36110bb565b34801561062557600080fd5b506102eb6110ca565b34801561063a57600080fd5b506102a46110e4565b34801561064f57600080fd5b506102eb611108565b34801561066457600080fd5b506102eb6111a8565b34801561067957600080fd5b506102eb6111f3565b34801561068e57600080fd5b5061028d600480360360808110156106a557600080fd5b813591602081013591810190606081016040820135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561074d57600080fd5b82018360208201111561075f57600080fd5b803590602001918460208302840111600160201b8311171561078057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506111fd945050505050565b3480156107ca57600080fd5b506102eb61138a565b3480156107df57600080fd5b5061028d600480360360208110156107f657600080fd5b50356001600160a01b0316611390565b34801561081257600080fd5b506102a46113fb565b34801561082757600080fd5b506102eb611404565b34801561083c57600080fd5b506102a46004803603606081101561085357600080fd5b810190602081018135600160201b81111561086d57600080fd5b82018360208201111561087f57600080fd5b803590602001918460018302840111600160201b831117156108a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013561140a565b3480156108f257600080fd5b506102eb6114a3565b34801561090757600080fd5b506103e36115b7565b34801561091c57600080fd5b5061028d6004803603602081101561093357600080fd5b50356001600160a01b03166115c6565b34801561094f57600080fd5b506102eb6004803603602081101561096657600080fd5b503561160f565b34801561097957600080fd5b506102eb61162d565b34801561098e57600080fd5b506102a4600480360360208110156109a557600080fd5b5035611637565b3480156109b857600080fd5b5061028d600480360360208110156109cf57600080fd5b503561164c565b3480156109e257600080fd5b506102eb600480360360208110156109f957600080fd5b50356116cf565b61028d60048036036060811015610a1657600080fd5b813591602081013591810190606081016040820135600160201b811115610a3c57600080fd5b820183602082011115610a4e57600080fd5b803590602001918460018302840111600160201b83111715610a6f57600080fd5b5090925090506116f0565b348015610a8657600080fd5b506102eb60048036036020811015610a9d57600080fd5b5035611741565b61028d60048036036020811015610aba57600080fd5b50356001600160a01b0316610b80565b348015610ad657600080fd5b5061028d60048036036020811015610aed57600080fd5b50356001600160a01b031661175a565b348015610b0957600080fd5b506102eb60048036036020811015610b2057600080fd5b50356117aa565b348015610b3357600080fd5b506102eb6117bc565b348015610b4857600080fd5b506102eb60048036036020811015610b5f57600080fd5b50356117f6565b348015610b7257600080fd5b506103e3611805565b335b90565b60045460ff16610bd7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6004805460ff1916905534610bec8282611819565b6000610bf78261187b565b600754909150610c0d908363ffffffff61188616565b600755610c1a83826118e7565b826001600160a01b0316610c2c610b7b565b6001600160a01b03167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a3610c7e83836119a6565b610c866119f9565b610c908383611877565b50506004805460ff1916600117905550565b600a54421190565b6001600160a01b03166000908152600c602052604090205490565b600080838160205b88518111610db8578089015193506020818a510360200181610ceb57fe5b0491505b600082118015610d025750600286066001145b8015610d1057508160020a86115b15610d2357600286046001019550610cef565b60028606610d6e578383604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120925060028681610d6657fe5b049550610db0565b8284604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120925060028681610da957fe5b0460010195505b602001610ccd565b505090941495945050505050565b6040805162461bcd60e51b815260206004820152601d60248201527f526f756e6443726f776473616c653a207261746528292063616c6c65640000006044820152905160009181900360640190fd5b73a478c2975ab1ea89e8196811f51a7b7ade33eb1190565b60008481526002602052604090205460ff16610e7a576040805162461bcd60e51b81526020600482015260076024820152661b9bcb5c9bdbdd60ca1b604482015290519081900360640190fd5b604080516001600160a01b03851660208083019190915281830185905282518083038401815260609092019092528051910120610eb882868361140a565b610ef9576040805162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b216b83937b7b360991b604482015290519081900360640190fd5b50506001600160a01b0390911660009081526001602052604090205550565b6040805162461bcd60e51b8152602060048201526019602482015278141d589b1a58d4d85b194e881b9bdd081cdd5c1c1bdc9d1959603a1b6044820152905160009181900360640190fd5b60075490565b6000610f73611a75565b8015610f825750610f82611aa9565b905090565b600a5490565b610f956110e4565b610fd4576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b610fdc611ac2565b565b6005546001600160a01b031690565b60016020526000908152604090205481565b6110076110e4565b611046576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60105490565b6000610f82610ca2565b60145490565b600b6020526000908152604090205460ff1681565b6000546001600160a01b031690565b6000610f826110d761162d565b6110df6111f3565b611b9d565b600080546001600160a01b03166110f9610b7b565b6001600160a01b031614905090565b6000806000611115610e15565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b15801561114c57600080fd5b505afa158015611160573d6000803e3d6000fd5b505050506040513d604081101561117657600080fd5b50805160209091015190925090506111a16dffffffffffffffffffffffffffff808416908316611b9d565b9250505090565b60006111b2610f69565b6111bb57600080fd5b60005b601354811015610f8257601281815481106111d557fe5b906000526020600020015442116111eb57610f82565b6001016111be565b6000610f826117bc565b600f54600160a01b900460ff161561121457600080fd5b80518251146112545760405162461bcd60e51b815260040180806020018281038252602481526020018061241b6024913960400191505060405180910390fd5b8160008151811061126157fe5b602002602001015183106112a65760405162461bcd60e51b81526004018080602001828103825260228152602001806125006022913960400191505060405180910390fd5b815160015b81811015611338578381815181106112bf57fe5b60200260200101518460018303815181106112d657fe5b602002602001015110611330576040805162461bcd60e51b815260206004820152601f60248201527f526f756e6443726f776473616c653a2074696d65206e6f7420736f7274656400604482015290519081900360640190fd5b6001016112ab565b506010849055601181905582516113569060129060208601906123b5565b50815161136a9060139060208501906123b5565b5050506014929092555050600f805460ff60a01b1916600160a01b179055565b60115490565b6113986110e4565b6113d7576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b600d5460ff1690565b60095490565b6000808260205b86518111611497578087015192508282101561145d578183604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120915061148f565b828260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012091505b602001611411565b50909314949350505050565b6000610f826114b0611805565b600854604080516370a0823160e01b81526001600160a01b039283166004820152905192909116916370a0823191602480820192602092909190829003018186803b1580156114fe57600080fd5b505afa158015611512573d6000803e3d6000fd5b505050506040513d602081101561152857600080fd5b5051611532611805565b60085460408051636eb1769f60e11b81526001600160a01b0392831660048201523060248201529051929091169163dd62ed3e91604480820192602092909190829003018186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d60208110156115b057600080fd5b5051611bce565b6008546001600160a01b031690565b6040805162461bcd60e51b8152602060048201526019602482015278141d589b1a58d4d85b194e881b9bdd081cdd5c1c1bdc9d1959603a1b604482015290519081900360640190fd5b6003818154811061161c57fe5b600091825260209091200154905081565b6000610f82611108565b60026020526000908152604090205460ff1681565b6116546110bb565b6001600160a01b0316336001600160a01b031614806116825750336000908152600b602052604090205460ff165b6116c3576040805162461bcd60e51b815260206004820152600d60248201526c373796b937b7ba16b0b23232b960991b604482015290519081900360640190fd5b6116cc81611be4565b50565b6000601382815481106116de57fe5b90600052602060002001549050919050565b61173283338685858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e2d92505050565b61173b33610b80565b50505050565b60006117548261174f6110ca565b611c86565b92915050565b6117626110e4565b6117a1576040805162461bcd60e51b81526020600482018190526024820152600080516020612465833981519152604482015290519081900360640190fd5b6116cc81611cae565b60009081526015602052604090205490565b60006117c6610f69565b6117d257506000610b7d565b60136117dc6111a8565b815481106117e657fe5b9060005260206000200154905090565b6000601282815481106116de57fe5b60045461010090046001600160a01b031690565b6118238282611d4e565b333214611877576040805162461bcd60e51b815260206004820152601d60248201527f5075626c696353616c653a20696e76616c6964207478206f726967696e000000604482015290519081900360640190fd5b5050565b600061175482611741565b6000828201838110156118e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006118f16111a8565b60145460008281526015602052604090205491925090611917908463ffffffff61188616565b10611969576040805162461bcd60e51b815260206004820152601c60248201527f526f756e6443726f776473616c653a206f766572207061796d656e7400000000604482015290519081900360640190fd5b600081815260156020526040902054611988908363ffffffff61188616565b6000828152601560205260409020556119a18383611db1565b505050565b6119b08282611877565b6001600160a01b0382166000908152600c60205260409020546119d9908263ffffffff61188616565b6001600160a01b039092166000908152600c602052604090209190915550565b600f546001600160a01b031663f340fa0134611a13610b7b565b6040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b158015611a5a57600080fd5b505af1158015611a6e573d6000803e3d6000fd5b5050505050565b60006010544210158015610f825750601280546000198101908110611a9657fe5b9060005260206000200154421115905090565b60006009544210158015610f82575050600a5442111590565b600d5460ff1615611b045760405162461bcd60e51b81526004018080602001828103825260278152602001806124856027913960400191505060405180910390fd5b611b0c610ca2565b611b5d576040805162461bcd60e51b815260206004820181905260248201527f46696e616c697a61626c6543726f776473616c653a206e6f7420636c6f736564604482015290519081900360640190fd5b600d805460ff19166001179055611b72611dbb565b6040517f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183690600090a1565b600081611bbf611bb585670de0b6b3a7640000611f0e565b6002855b04611f71565b81611bc657fe5b049392505050565b6000818310611bdd57816118e0565b5090919050565b60008181526002602052604090205460ff1615611c39576040805162461bcd60e51b815260206004820152600e60248201526d191d5c1b1a58d85d194b5c9bdbdd60921b604482015290519081900360640190fd5b6000818152600260205260408120805460ff191660019081179091556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0155565b6000670de0b6b3a7640000611bbf611c9e8585611f0e565b6002670de0b6b3a7640000611bb9565b6001600160a01b038116611cf35760405162461bcd60e51b815260040180806020018281038252602681526020018061243f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611d588282611fc0565b611d60610f69565b611877576040805162461bcd60e51b815260206004820152601c60248201527f526f756e6443726f776473616c653a206e6f74206f70656e2079657400000000604482015290519081900360640190fd5b611877828261203c565b611dc3611096565b15611e9d57600f60009054906101000a90046001600160a01b03166001600160a01b03166343d726d66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e1857600080fd5b505af1158015611e2c573d6000803e3d6000fd5b50505050600f60009054906101000a90046001600160a01b03166001600160a01b0316639af6549a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b50505050611f06565b600f60009054906101000a90046001600160a01b03166001600160a01b0316638c52dc416040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050505b610fdc610fdc565b6000811580611f2957505080820282828281611f2657fe5b04145b611754576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611754576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b611fca828261206d565b6001600160a01b038216600090815260016020908152604080832054600c90925290912054611fff908363ffffffff61188616565b11156118775760405162461bcd60e51b81526004018080602001828103825260278152602001806125226027913960400191505060405180910390fd5b600854611877906001600160a01b03168383612056611805565b6001600160a01b031692919063ffffffff6120d016565b612075610f69565b6120c6576040805162461bcd60e51b815260206004820152601860248201527f54696d656443726f776473616c653a206e6f74206f70656e0000000000000000604482015290519081900360640190fd5b611877828261212a565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261173b9085906121c1565b6001600160a01b03821661216f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806124ac602a913960400191505060405180910390fd5b80611877576040805162461bcd60e51b815260206004820152601960248201527f43726f776473616c653a20776569416d6f756e74206973203000000000000000604482015290519081900360640190fd5b6121d3826001600160a01b0316612379565b612224576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106122625780518252601f199092019160209182019101612243565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146122c4576040519150601f19603f3d011682016040523d82523d6000602084013e6122c9565b606091505b509150915081612320576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561173b5780806020019051602081101561233c57600080fd5b505161173b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806124d6602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906123ad57508115155b949350505050565b8280548282559060005260206000209081019282156123f0579160200282015b828111156123f05782518255916020019190600101906123d5565b506123fc929150612400565b5090565b610b7d91905b808211156123fc576000815560010161240656fe526f756e6443726f776473616c653a20696e76616c696420696e707574206c656e6774684f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657246696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a656443726f776473616c653a2062656e656669636961727920697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526f756e6443726f776473616c653a20696e76616c69642073746172742074696d654d65726b6c6550726f6f6643617070656443726f776473616c653a206578636565647320636170a265627a7a723158203e99fb4ba2dadbf37fdc3e3ad916f2edd4fcb20c13bcaf3b62f66f6d3b9ae65864736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000e3590419b69bd157ab321569bb3b6a9862075800000000000000000000000002ce7fd20fca5b6589304048345328c8ad2063077000000000000000000000000cd9c21aa3e33b411c22c9120ff4518dbf7daf8e8000000000000000000000000000000000000000000000000000000006098a1b00000000000000000000000000000000000000000000000000000000060b2ffb0
-----Decoded View---------------
Arg [0] : token (address): 0x0E3590419B69BD157aB321569bB3b6A986207580
Arg [1] : wallet (address): 0x2cE7Fd20fcA5b6589304048345328c8aD2063077
Arg [2] : tokenWallet (address): 0xcd9C21aa3e33b411c22C9120Ff4518dbF7daf8e8
Arg [3] : openingTime (uint256): 1620615600
Arg [4] : closingTime (uint256): 1622343600
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000e3590419b69bd157ab321569bb3b6a986207580
Arg [1] : 0000000000000000000000002ce7fd20fca5b6589304048345328c8ad2063077
Arg [2] : 000000000000000000000000cd9c21aa3e33b411c22c9120ff4518dbf7daf8e8
Arg [3] : 000000000000000000000000000000000000000000000000000000006098a1b0
Arg [4] : 0000000000000000000000000000000000000000000000000000000060b2ffb0
Deployed Bytecode Sourcemap
64155:2729:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24349:23;24359:12;:10;:12::i;:::-;24349:9;:23::i;:::-;64155:2729;33807:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33807:159:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;62823:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62823:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62823:123:0;-1:-1:-1;;;;;62823:123:0;;:::i;:::-;;;;;;;;;;;;;;;;60121:1119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60121:1119:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;60121:1119:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;60121:1119:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;60121:1119:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;60121:1119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;60121:1119:0;;-1:-1:-1;;60121:1119:0;;;-1:-1:-1;;;60121:1119:0;;;;;;;;;:::i;57154:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57154:98:0;;;:::i;54684:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54684:107:0;;;:::i;:::-;;;;-1:-1:-1;;;;;54684:107:0;;;;;;;;;;;;;;61658:315;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61658:315:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;61658:315:0;;;-1:-1:-1;;;;;61658:315:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;61658:315:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61658:315:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;61658:315:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61658:315:0;;-1:-1:-1;61658:315:0;;-1:-1:-1;;;;;61658:315:0:i;66242:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66242:94:0;;;:::i;24927:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24927:87:0;;;:::i;65620:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65620:115:0;;;:::i;33264:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33264:91:0;;;:::i;65805:66::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65805:66:0;;;:::i;24603:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24603:89:0;;;:::i;61393:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61393:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61393:42:0;-1:-1:-1;;;;;61393:42:0;;:::i;2963:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2963:140:0;;;:::i;56305:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56305:81:0;;;:::i;66155:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66155:81:0;;;:::i;56607:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56607:89:0;;;:::i;62212:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62212:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62212:43:0;-1:-1:-1;;;;;62212:43:0;;:::i;2152:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2152:79:0;;;:::i;65034:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65034:95:0;;;:::i;2518:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2518:94:0;;;:::i;54797:193::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54797:193:0;;;:::i;57258:242::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57258:242:0;;;:::i;64858:85::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64858:85:0;;;:::i;55504:714::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55504:714:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;55504:714:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55504:714:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55504:714:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55504:714:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;55504:714:0;;;;;;;;-1:-1:-1;55504:714:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;55504:714:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55504:714:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55504:714:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;55504:714:0;;-1:-1:-1;55504:714:0;;-1:-1:-1;;;;;55504:714:0:i;56224:75::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56224:75:0;;;:::i;62388:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62388:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62388:98:0;-1:-1:-1;;;;;62388:98:0;;:::i;35450:84::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35450:84:0;;;:::i;33103:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33103:91:0;;;:::i;59544:460::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59544:460:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59544:460:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;59544:460:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;59544:460:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;59544:460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;59544:460:0;;-1:-1:-1;;59544:460:0;;;-1:-1:-1;;;59544:460:0;;;;:::i;31069:172::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31069:172:0;;;:::i;30833:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30833:91:0;;;:::i;65943:93::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65943:93:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65943:93:0;-1:-1:-1;;;;;65943:93:0;;:::i;61483:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61483:22:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61483:22:0;;:::i;64949:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64949:79:0;;;:::i;61440:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61440:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61440:38:0;;:::i;62492:84::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62492:84:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62492:84:0;;:::i;56702:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56702:87:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56702:87:0;;:::i;63052:198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;63052:198:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;63052:198:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;63052:198:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;63052:198:0;;-1:-1:-1;63052:198:0;-1:-1:-1;63052:198:0;:::i;65482:132::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65482:132:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65482:132:0;;:::i;25279:622::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25279:622:0;-1:-1:-1;;;;;25279:622:0;;:::i;3258:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3258:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3258:109:0;-1:-1:-1;;;;;3258:109:0;;:::i;56498:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56498:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56498:103:0;;:::i;57730:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57730:149:0;;;:::i;56392:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56392:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56392:100:0;;:::i;24444:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24444:78:0;;;:::i;858:98::-;938:10;858:98;;:::o;25279:622::-;21032:11;;;;21024:55;;;;;-1:-1:-1;;;21024:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21157:11;:19;;-1:-1:-1;;21157:19:0;;;25378:9;25398:44;25419:11;25378:9;25398:20;:44::i;:::-;25504:14;25521:26;25537:9;25521:15;:26::i;:::-;25598:10;;25504:43;;-1:-1:-1;25598:25:0;;25613:9;25598:25;:14;:25;:::i;:::-;25585:10;:38;25636:37;25653:11;25666:6;25636:16;:37::i;:::-;25719:11;-1:-1:-1;;;;;25689:61:0;25705:12;:10;:12::i;:::-;-1:-1:-1;;;;;25689:61:0;;25732:9;25743:6;25689:61;;;;;;;;;;;;;;;;;;;;;;;;25763:46;25786:11;25799:9;25763:22;:46::i;:::-;25822:15;:13;:15::i;:::-;25848:45;25870:11;25883:9;25848:21;:45::i;:::-;-1:-1:-1;;21337:11:0;:18;;-1:-1:-1;;21337:18:0;21351:4;21337:18;;;-1:-1:-1;25279:622:0:o;33807:159::-;33946:12;;33928:15;:30;33807:159;:::o;62823:123::-;-1:-1:-1;;;;;62913:27:0;62890:7;62913:27;;;:14;:27;;;;;;;62823:123::o;60121:1119::-;60257:4;;60382;60257;60436:2;60419:791;60445:5;:12;60440:1;:17;60419:791;;60520:1;60513:5;60509:13;60503:20;60497:26;;60628:2;60618:1;60603:5;:12;:16;60622:2;60603:21;60602:28;;;;;;60590:40;;60865:115;60884:1;60872:9;:13;:31;;;;-1:-1:-1;60897:1:0;60889:5;:9;60902:1;60889:14;60872:31;:55;;;;;60918:9;60915:1;:12;60907:5;:20;60872:55;60865:115;;;60965:1;60956:5;60948:18;60969:1;60948:22;60940:30;;60865:115;;;61002:1;60994:5;:9;60990:213;;61052:2;61056:1;61035:23;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;61035:23:0;;;61025:34;;;;;;61021:38;;61086:1;61078:5;:9;;;;;;61070:17;;60990:213;;;61145:1;61148:2;61128:23;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;61128:23:0;;;61118:34;;;;;;61114:38;;61188:1;61179:5;61171:18;;;;;;61192:1;61171:22;61163:30;;60990:213;60464:2;60459:7;60419:791;;;-1:-1:-1;;61225:9:0;;;;60121:1119;-1:-1:-1;;;;;60121:1119:0:o;57154:98::-;57207:39;;;-1:-1:-1;;;57207:39:0;;;;;;;;;;;;;;;;;;;57191:7;;57207:39;;;;;;;54684:107;54743:42;54684:107;:::o;61658:315::-;61789:12;;;;:6;:12;;;;;;;;61781:32;;;;;-1:-1:-1;;;61781:32:0;;;;;;;;;;;;-1:-1:-1;;;61781:32:0;;;;;;;;;;;;;;;61844:27;;;-1:-1:-1;;;;;61844:27:0;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;61844:27:0;;;;;;;61834:38;;;;;61889:26;61900:5;61907:4;61834:38;61889:10;:26::i;:::-;61881:52;;;;;-1:-1:-1;;;61881:52:0;;;;;;;;;;;;-1:-1:-1;;;61881:52:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;61942:16:0;;;;;;;:7;:16;;;;;:25;-1:-1:-1;61658:315:0:o;66242:94::-;66295:35;;;-1:-1:-1;;;66295:35:0;;;;;;;;;;;;-1:-1:-1;;;66295:35:0;;;;;;66279:7;;66295:35;;;;;;;24927:87;24996:10;;24927:87;:::o;65620:115::-;65659:4;65679:23;:21;:23::i;:::-;:50;;;;;65706:23;:21;:23::i;:::-;65672:57;;65620:115;:::o;33264:91::-;33335:12;;33264:91;:::o;65805:66::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;65849:16;:14;:16::i;:::-;65805:66::o;24603:89::-;24677:7;;-1:-1:-1;;;;;24677:7:0;24603:89;:::o;61393:42::-;;;;;;;;;;;;;:::o;2963:140::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;3062:1;3046:6;;3025:40;;-1:-1:-1;;;;;3046:6:0;;;;3025:40;;3062:1;;3025:40;3093:1;3076:19;;-1:-1:-1;;;;;;3076:19:0;;;2963:140::o;56305:81::-;56370:10;;56305:81;:::o;66155:::-;66199:4;66219:11;:9;:11::i;56607:89::-;56676:14;;56607:89;:::o;62212:43::-;;;;;;;;;;;;;;;:::o;2152:79::-;2190:7;2217:6;-1:-1:-1;;;;;2217:6:0;2152:79;:::o;65034:95::-;65074:7;65097:26;65102:9;:7;:9::i;:::-;65113;:7;:9::i;:::-;65097:4;:26::i;2518:94::-;2558:4;2598:6;;-1:-1:-1;;;;;2598:6:0;2582:12;:10;:12::i;:::-;-1:-1:-1;;;;;2582:22:0;;2575:29;;2518:94;:::o;54797:193::-;54838:7;54855:16;54873;54908:5;:3;:5::i;:::-;-1:-1:-1;;;;;54893:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54893:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54893:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54893:35:0;;;;;;;;;-1:-1:-1;54893:35:0;-1:-1:-1;54942:42:0;54947:17;;;;;54966;;54942:4;:42::i;:::-;54935:49;;;;54797:193;:::o;57258:242::-;57306:7;57330:8;:6;:8::i;:::-;57322:17;;;;;;57348:13;57368:106;57383:6;:13;57375:21;;57368:106;;;57439:13;57453:5;57439:20;;;;;;;;;;;;;;;;57420:15;:39;57416:50;;57461:5;;57416:50;57398:7;;57368:106;;64858:85;64898:7;64921:16;:14;:16::i;55504:714::-;55668:12;;-1:-1:-1;;;55668:12:0;;;;:21;55660:30;;;;;;55728:5;:12;55705;:19;:35;55697:84;;;;-1:-1:-1;;;55697:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55808:12;55821:1;55808:15;;;;;;;;;;;;;;55796:9;:27;55788:74;;;;-1:-1:-1;;;55788:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55883:19;;55928:1;55911:130;55935:1;55931;:5;55911:130;;;55982:12;55995:1;55982:15;;;;;;;;;;;;;;55960:12;55977:1;55973;:5;55960:19;;;;;;;;;;;;;;:37;55952:81;;;;;-1:-1:-1;;;55952:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55938:3;;55911:130;;;-1:-1:-1;56047:10:0;:22;;;56076:7;:11;;;56096:28;;;;:13;;:28;;;;;:::i;:::-;-1:-1:-1;56131:14:0;;;;:6;;:14;;;;;:::i;:::-;-1:-1:-1;;;56154:14:0;:30;;;;-1:-1:-1;;56193:12:0;:19;;-1:-1:-1;;;;56193:19:0;-1:-1:-1;;;56193:19:0;;;55504:714::o;56224:75::-;56286:7;;56224:75;:::o;62388:98::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;62453:20:0;;;;;:11;:20;;;;;:27;;-1:-1:-1;;62453:27:0;62476:4;62453:27;;;62388:98::o;35450:84::-;35516:10;;;;35450:84;:::o;33103:91::-;33174:12;;33103:91;:::o;59544:460::-;59653:4;;59695;59725:2;59708:266;59734:5;:12;59729:1;:17;59708:266;;59809:1;59802:5;59798:13;59792:20;59786:26;;59839:2;59835:1;:6;59831:136;;;59885:1;59888:2;59868:23;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;59868:23:0;;;59858:34;;;;;;59854:38;;59831:136;;;59950:2;59954:1;59933:23;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;59933:23:0;;;59923:34;;;;;;59919:38;;59831:136;59753:2;59748:7;59708:266;;;-1:-1:-1;59989:9:0;;;;59544:460;-1:-1:-1;;;;59544:460:0:o;31069:172::-;31117:7;31144:89;31153:7;:5;:7::i;:::-;31171:12;;31153:31;;;-1:-1:-1;;;31153:31:0;;-1:-1:-1;;;;;31171:12:0;;;31153:31;;;;;;:17;;;;;;;:31;;;;;;;;;;;;;;;:17;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;31153:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31153:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31153:31:0;31186:7;:5;:7::i;:::-;31204:12;;31186:46;;;-1:-1:-1;;;31186:46:0;;-1:-1:-1;;;;;31204:12:0;;;31186:46;;;;31226:4;31186:46;;;;;;:17;;;;;;;:46;;;;;;;;;;;;;;;:17;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;31186:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31186:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31186:46:0;31144:8;:89::i;30833:91::-;30904:12;;-1:-1:-1;;;;;30904:12:0;30833:91;:::o;65943:93::-;65995:35;;;-1:-1:-1;;;65995:35:0;;;;;;;;;;;;-1:-1:-1;;;65995:35:0;;;;;;;;;;;;;;61483:22;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61483:22:0;:::o;64949:79::-;64989:7;65012:10;:8;:10::i;61440:38::-;;;;;;;;;;;;;;;:::o;62492:84::-;62316:7;:5;:7::i;:::-;-1:-1:-1;;;;;62302:21:0;:10;-1:-1:-1;;;;;62302:21:0;;:48;;;-1:-1:-1;62339:10:0;62327:23;;;;:11;:23;;;;;;;;62302:48;62294:74;;;;;-1:-1:-1;;;62294:74:0;;;;;;;;;;;;-1:-1:-1;;;62294:74:0;;;;;;;;;;;;;;;62551:19;62565:4;62551:13;:19::i;:::-;62492:84;:::o;56702:87::-;56751:7;56774:6;56781:1;56774:9;;;;;;;;;;;;;;;;56767:16;;56702:87;;;:::o;63052:198::-;63176:40;63184:4;63190:10;63202:6;63210:5;;63176:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63176:7:0;;-1:-1:-1;;;63176:40:0:i;:::-;63223:21;63233:10;63223:9;:21::i;:::-;63052:198;;;;:::o;65482:132::-;65559:7;65582:26;65587:9;65598;:7;:9::i;:::-;65582:4;:26::i;:::-;65575:33;65482:132;-1:-1:-1;;65482:132:0:o;3258:109::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;3331:28;3350:8;3331:18;:28::i;56498:103::-;56554:7;56577:18;;;:15;:18;;;;;;;56498:103::o;57730:149::-;57777:7;57798:8;:6;:8::i;:::-;57793:40;;-1:-1:-1;57824:1:0;57817:8;;57793:40;57848:6;57855:17;:15;:17::i;:::-;57848:25;;;;;;;;;;;;;;;;57841:32;;57730:149;:::o;56392:100::-;56447:7;56470:13;56484:1;56470:16;;;;;;;24444:78;24508:6;;;;;-1:-1:-1;;;;;24508:6:0;;24444:78::o;66532:349::-;66623:50;66650:11;66663:9;66623:26;:50::i;:::-;66688:10;66702:9;66688:23;66680:65;;;;;-1:-1:-1;;;66680:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66532:349;;:::o;65342:134::-;65409:7;65432:38;65460:9;65432:27;:38::i;7502:181::-;7560:7;7592:5;;;7616:6;;;;7608:46;;;;;-1:-1:-1;;;7608:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7674:1;7502:181;-1:-1:-1;;;7502:181:0:o;58058:357::-;58142:13;58158:17;:15;:17::i;:::-;58234:14;;58192:22;;;;:15;:22;;;;;;58142:33;;-1:-1:-1;58234:14:0;58192:39;;58219:11;58192:39;:26;:39;:::i;:::-;:56;58184:97;;;;;-1:-1:-1;;;58184:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58315:22;;;;:15;:22;;;;;;:39;;58342:11;58315:39;:26;:39;:::i;:::-;58290:22;;;;:15;:22;;;;;:64;58361:48;58384:11;58397;58361:22;:48::i;:::-;58058:357;;;:::o;63709:225::-;63797:52;63826:11;63839:9;63797:28;:52::i;:::-;-1:-1:-1;;;;;63886:27:0;;;;;;:14;:27;;;;;;:42;;63918:9;63886:42;:31;:42;:::i;:::-;-1:-1:-1;;;;;63856:27:0;;;;;;;:14;:27;;;;;:72;;;;-1:-1:-1;63709:225:0:o;47166:99::-;47211:7;;-1:-1:-1;;;;;47211:7:0;:15;47233:9;47244:12;:10;:12::i;:::-;47211:46;;;;;;;;;;;;;-1:-1:-1;;;;;47211:46:0;-1:-1:-1;;;;;47211:46:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47211:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47211:46:0;;;;;47166:99::o;56795:207::-;56834:4;56924:10;;56905:15;:29;;:91;;;;-1:-1:-1;56957:13:0;56971:20;;-1:-1:-1;;56971:24:0;;;56957:39;;;;;;;;;;;;;;56938:15;:58;;56898:98;;56795:207;:::o;33445:192::-;33484:4;33582:12;;33563:15;:31;;:66;;;;-1:-1:-1;;33617:12:0;;33598:15;:31;;;33445:192::o;35698:270::-;35745:10;;;;35744:11;35736:63;;;;-1:-1:-1;;;35736:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35818:11;:9;:11::i;:::-;35810:56;;;;;-1:-1:-1;;;35810:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35879:10;:17;;-1:-1:-1;;35879:17:0;35892:4;35879:17;;;35909:15;:13;:15::i;:::-;35940:20;;;;;;;35698:270::o;50228:114::-;50287:9;50335:1;50309:23;50313:11;50317:1;49826:6;50313:3;:11::i;:::-;50330:1;50326;:5;;50309:3;:23::i;:::-;:27;;;;;;;50228:114;-1:-1:-1;;;50228:114:0:o;29531:106::-;29589:7;29620:1;29616;:5;:13;;29628:1;29616:13;;;-1:-1:-1;29624:1:0;;29609:20;-1:-1:-1;29531:106:0:o;61512:140::-;61566:12;;;;:6;:12;;;;;;;;61565:13;61557:40;;;;;-1:-1:-1;;;61557:40:0;;;;;;;;;;;;-1:-1:-1;;;61557:40:0;;;;;;;;;;;;;;;61604:12;;;;:6;:12;;;;;:19;;-1:-1:-1;;61604:19:0;61619:4;61604:19;;;;;;61630:5;27:10:-1;;23:18;;;45:23;;61630:16:0;;;;;;61512:140::o;49910:116::-;49969:9;49826:6;49991:23;49995:9;49999:1;50002;49995:3;:9::i;:::-;50012:1;49826:6;50006:7;;3473:229;-1:-1:-1;;;;;3547:22:0;;3539:73;;;;-1:-1:-1;;;3539:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3649:6;;;3628:38;;-1:-1:-1;;;;;3628:38:0;;;;3649:6;;;3628:38;;;3677:6;:17;;-1:-1:-1;;;;;;3677:17:0;-1:-1:-1;;;;;3677:17:0;;;;;;;;;;3473:229::o;59013:333::-;59104:50;59131:11;59144:9;59104:26;:50::i;:::-;59169:8;:6;:8::i;:::-;59161:49;;;;;-1:-1:-1;;;59161:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;27989:136;28077:40;28092:11;28105;28077:14;:40::i;46818:247::-;46867:13;:11;:13::i;:::-;46863:161;;;46897:7;;;;;;;;;-1:-1:-1;;;;;46897:7:0;-1:-1:-1;;;;;46897:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46897:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46897:15:0;;;;46927:7;;;;;;;;;-1:-1:-1;;;;;46927:7:0;-1:-1:-1;;;;;46927:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46927:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46927:29:0;;;;46863:161;;;46989:7;;;;;;;;;-1:-1:-1;;;;;46989:7:0;-1:-1:-1;;;;;46989:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46989:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46989:23:0;;;;46863:161;47036:21;:19;:21::i;49220:145::-;49278:9;49304:6;;;:30;;-1:-1:-1;;49319:5:0;;;49333:1;49328;49319:5;49328:1;49314:15;;;;;:20;49304:30;49296:63;;;;;-1:-1:-1;;;49296:63:0;;;;;;;;;;;;-1:-1:-1;;;49296:63:0;;;;;;;;;;;;;;48945:131;49034:5;;;49029:16;;;;49021:49;;;;;-1:-1:-1;;;49021:49:0;;;;;;;;;;;;-1:-1:-1;;;49021:49:0;;;;;;;;;;;;;;63256:272;63347:50;63374:11;63387:9;63347:26;:50::i;:::-;-1:-1:-1;;;;;63458:20:0;;;;;;:7;:20;;;;;;;;;63412:14;:27;;;;;;;:42;;63444:9;63412:42;:31;:42;:::i;:::-;:66;;63404:118;;;;-1:-1:-1;;;63404:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31439:158;31550:12;;31525:64;;-1:-1:-1;;;;;31550:12:0;31564:11;31577;31525:7;:5;:7::i;:::-;-1:-1:-1;;;;;31525:24:0;;:64;;;:24;:64;:::i;34166:167::-;32317:8;:6;:8::i;:::-;32309:45;;;;;-1:-1:-1;;;32309:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34275:50;34302:11;34315:9;34275:26;:50::i;16017:204::-;16144:68;;;-1:-1:-1;;;;;16144:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16144:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;16118:95:0;;16137:5;;16118:18;:95::i;26454:380::-;-1:-1:-1;;;;;26557:25:0;;26549:80;;;;-1:-1:-1;;;26549:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26648:14;26640:52;;;;;-1:-1:-1;;;26640:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17872:1114;18476:27;18484:5;-1:-1:-1;;;;;18476:25:0;;:27::i;:::-;18468:71;;;;;-1:-1:-1;;;18468:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18613:12;18627:23;18662:5;-1:-1:-1;;;;;18654:19:0;18674:4;18654:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;18654:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;18612:67:0;;;;18698:7;18690:52;;;;;-1:-1:-1;;;18690:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18759:17;;:21;18755:224;;18901:10;18890:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18890:30:0;18882:85;;;;-1:-1:-1;;;18882:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12862:619;12922:4;13390:20;;13233:66;13430:23;;;;;;:42;;-1:-1:-1;13457:15:0;;;13430:42;13422:51;12862:619;-1:-1:-1;;;;12862:619:0:o;64155:2729::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64155:2729:0;;;-1:-1:-1;64155:2729:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://79b5c59a7dcd7dc05ae276d424443416322f78621ae78834207bf763259b48d4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.