Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,531 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Tokens | 11288643 | 1533 days ago | IN | 0 ETH | 0.00128988 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.00058947 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.00047158 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.00058947 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.00058947 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.00057296 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11275073 | 1535 days ago | IN | 0 ETH | 0.00030652 | ||||
Withdraw Tokens | 11274626 | 1535 days ago | IN | 0 ETH | 0.00309401 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.00061305 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.0047158 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.00063663 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.00188632 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.0023579 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.00063663 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.00061305 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.00259369 | ||||
Withdraw Tokens | 11273879 | 1535 days ago | IN | 0 ETH | 0.00058947 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11265059 | 1536 days ago | Contract Creation | 0 ETH | |||
11265054 | 1536 days ago | 0.025 ETH | ||||
11265053 | 1536 days ago | 0.065 ETH | ||||
11265052 | 1536 days ago | 0.5 ETH | ||||
11265052 | 1536 days ago | 1 ETH | ||||
11265052 | 1536 days ago | 1 ETH | ||||
11265051 | 1536 days ago | 0.01 ETH | ||||
11265048 | 1536 days ago | 0.05 ETH | ||||
11265043 | 1536 days ago | 0.1 ETH | ||||
11265043 | 1536 days ago | 0.2 ETH | ||||
11265039 | 1536 days ago | 0.2 ETH | ||||
11265037 | 1536 days ago | 1 ETH | ||||
11265035 | 1536 days ago | 0.5 ETH | ||||
11265030 | 1536 days ago | 3 ETH | ||||
11265028 | 1536 days ago | 1 ETH | ||||
11265027 | 1536 days ago | 3 ETH | ||||
11265027 | 1536 days ago | 0.5 ETH | ||||
11265025 | 1536 days ago | 0.5 ETH | ||||
11265025 | 1536 days ago | 1 ETH | ||||
11265025 | 1536 days ago | 1 ETH | ||||
11265023 | 1536 days ago | 0.1 ETH | ||||
11265022 | 1536 days ago | 0.01 ETH | ||||
11265021 | 1536 days ago | 1.6 ETH | ||||
11265017 | 1536 days ago | 0.03156294 ETH | ||||
11265016 | 1536 days ago | 0.5 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Sav3Crowdsale
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-14 */ // 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/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/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/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/crowdsale/distribution/PostDeliveryCrowdsale.sol pragma solidity ^0.5.0; /** * @title PostDeliveryCrowdsale * @dev Crowdsale that locks tokens from withdrawal until it ends. */ contract PostDeliveryCrowdsale is TimedCrowdsale { using SafeMath for uint256; mapping(address => uint256) private _balances; __unstable__TokenVault private _vault; constructor() public { _vault = new __unstable__TokenVault(); } /** * @dev Withdraw tokens only after crowdsale ends. * @param beneficiary Whose tokens will be withdrawn. */ function withdrawTokens(address beneficiary) public { require(hasClosed(), "PostDeliveryCrowdsale: not closed"); uint256 amount = _balances[beneficiary]; require(amount > 0, "PostDeliveryCrowdsale: beneficiary is not due any tokens"); _balances[beneficiary] = 0; _vault.transfer(token(), beneficiary, amount); } /** * @return the balance of an account. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev Overrides parent by storing due balances, and delivering tokens to the vault instead of the end user. This * ensures that the tokens will be available by the time they are withdrawn (which may not be the case if * `_deliverTokens` was called later). * @param beneficiary Token purchaser * @param tokenAmount Amount of tokens purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal { _balances[beneficiary] = _balances[beneficiary].add(tokenAmount); _deliverTokens(address(_vault), tokenAmount); } } /** * @title __unstable__TokenVault * @dev Similar to an Escrow for tokens, this contract allows its primary account to spend its tokens as it sees fit. * This contract is an internal helper for PostDeliveryCrowdsale, and should not be used outside of this context. */ // solhint-disable-next-line contract-name-camelcase contract __unstable__TokenVault is Secondary { function transfer(IERC20 token, address to, uint256 amount) public onlyPrimary { token.transfer(to, amount); } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: @openzeppelin/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: @openzeppelin/contracts/access/roles/MinterRole.sol pragma solidity ^0.5.0; contract MinterRole is Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(_msgSender()); } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Mintable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole}, * which have permission to mint (create) new tokens as they see fit. * * At construction, the deployer of the contract is the only minter. */ contract ERC20Mintable is ERC20, MinterRole { /** * @dev See {ERC20-_mint}. * * Requirements: * * - the caller must have the {MinterRole}. */ function mint(address account, uint256 amount) public onlyMinter returns (bool) { _mint(account, amount); return true; } } // File: @openzeppelin/contracts/crowdsale/emission/MintedCrowdsale.sol pragma solidity ^0.5.0; /** * @title MintedCrowdsale * @dev Extension of Crowdsale contract whose tokens are minted in each purchase. * Token ownership should be transferred to MintedCrowdsale for minting. */ contract MintedCrowdsale is Crowdsale { /** * @dev Overrides delivery by minting tokens upon purchase. * @param beneficiary Token purchaser * @param tokenAmount Number of tokens to be minted */ function _deliverTokens(address beneficiary, uint256 tokenAmount) internal { // Potentially dangerous assumption about the type of the token. require( ERC20Mintable(address(token())).mint(beneficiary, tokenAmount), "MintedCrowdsale: minting failed" ); } } // File: contracts/crowdsale/WhitelistCrowdsale.sol pragma solidity ^0.5.0; // custom validation using the whitelister contract contract WhitelistCrowdsale is Crowdsale { address public whitelister; constructor(address _whitelister) public { whitelister = _whitelister; } function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal view { require(IWhitelister(whitelister).whitelisted(_beneficiary) == true, "WhitelistCrowdsale: beneficiary not whitelisted"); super._preValidatePurchase(_beneficiary, _weiAmount); } function isWhitelisted(address _address) external view returns (bool) { return IWhitelister(whitelister).whitelisted(_address); } } interface IWhitelister { function whitelisted(address _address) external view returns (bool); } // File: @openzeppelin/contracts/access/roles/CapperRole.sol pragma solidity ^0.5.0; contract CapperRole is Context { using Roles for Roles.Role; event CapperAdded(address indexed account); event CapperRemoved(address indexed account); Roles.Role private _cappers; constructor () internal { _addCapper(_msgSender()); } modifier onlyCapper() { require(isCapper(_msgSender()), "CapperRole: caller does not have the Capper role"); _; } function isCapper(address account) public view returns (bool) { return _cappers.has(account); } function addCapper(address account) public onlyCapper { _addCapper(account); } function renounceCapper() public { _removeCapper(_msgSender()); } function _addCapper(address account) internal { _cappers.add(account); emit CapperAdded(account); } function _removeCapper(address account) internal { _cappers.remove(account); emit CapperRemoved(account); } } // File: contracts/crowdsale/IndividuallyCappedCrowdsale.sol pragma solidity ^0.5.0; // a single cap applied to all users /** * @title IndividuallyCappedCrowdsale * @dev Crowdsale with per-beneficiary caps. */ contract IndividuallyCappedCrowdsale is Crowdsale { using SafeMath for uint256; mapping(address => uint256) private _contributions; // mapping(address => uint256) private _caps; uint256 public individualCap; constructor(uint256 _individualCap) public { individualCap = _individualCap; } /** * @dev Sets a specific beneficiary's maximum contribution. * @param beneficiary Address to be capped * @param cap Wei limit for individual contribution */ // function setCap(address beneficiary, uint256 cap) external onlyCapper { // _caps[beneficiary] = cap; // } /** * @dev Returns the cap of a specific beneficiary. * @param beneficiary Address whose cap is to be checked * @return Current cap for individual beneficiary */ // function getCap(address beneficiary) public view returns (uint256) { // return _caps[beneficiary]; // } /** * @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]; } /** * @dev Extend parent behavior requiring purchase to respect the beneficiary's funding cap. * @param beneficiary Token purchaser * @param weiAmount Amount of wei contributed */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view { super._preValidatePurchase(beneficiary, weiAmount); // solhint-disable-next-line max-line-length // require(_contributions[beneficiary].add(weiAmount) <= _caps[beneficiary], "IndividuallyCappedCrowdsale: beneficiary's cap exceeded"); require(_contributions[beneficiary].add(weiAmount) <= individualCap, "IndividuallyCappedCrowdsale: beneficiary's cap exceeded"); } /** * @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/crowdsale/IncreasingPriceCrowdsale.sol pragma solidity ^0.5.0; /** * @title IncreasingPriceCrowdsale * @dev Extension of Crowdsale contract that increases the price of tokens linearly in time. * Note that what should be provided to the constructor is the initial and final _rates_, that is, * the amount of tokens per wei contributed. Thus, the initial rate must be greater than the final rate. */ contract IncreasingPriceCrowdsale is TimedCrowdsale { using SafeMath for uint256; // uint256 private _initialRate; uint256 private _finalRate; address public referrers; /** * @dev Constructor, takes initial and final rates of tokens received per wei contributed. * @param finalRate Number of tokens a buyer gets per wei at the end of the crowdsale */ constructor (uint256 finalRate, address _referrers) public { require(finalRate > 0, "IncreasingPriceCrowdsale: final rate is 0"); // solhint-disable-next-line max-line-length _finalRate = finalRate; referrers = _referrers; } function isReferrer(address _address) public view returns (bool) { if (referrers == address(0)) { return false; } return IReferrers(referrers).isReferrer(_address); } /** * 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("IncreasingPriceCrowdsale: rate() called"); } // function initialRate() public view returns (uint256) { // return _initialRate; // } /** * @return the final rate of the crowdsale. */ function finalRate() public view returns (uint256) { return _finalRate; } /** * @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; } uint256 _weiRaised = weiRaised(); uint256 _rate = _finalRate; if (isReferrer(msg.sender)) { _rate = _rate.mul(125).div(100); } if (_weiRaised < 15e18) { return _rate.mul(250).div(100); } if (_weiRaised < 30e18) { return _rate.mul(200).div(100); } if (_weiRaised < 45e18) { return _rate.mul(175).div(100); } if (_weiRaised < 75e18) { return _rate.mul(150).div(100); } if (_weiRaised < 105e18) { return _rate.mul(120).div(100); } if (_weiRaised < 135e18) { return _rate.mul(110).div(100); } if (_weiRaised < 165e18) { return _rate.mul(105).div(100); } return _rate; } /** * @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 currentRate.mul(weiAmount); } } interface IReferrers { function isReferrer(address _address) external view returns (bool); } // 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: contracts/crowdsale/TokenTimelock.sol pragma solidity ^0.5.0; // a progressively unlocking timelock /** * @dev A token holder contract that will allow a beneficiary to extract the * tokens after a given release time. * * Useful for simple vesting schedules like "advisors get all of their tokens * after 1 year". * * For a more complete vesting schedule, see {TokenVesting}. */ contract TokenTimelock { using SafeMath for uint256; using SafeERC20 for IERC20; // ERC20 basic token contract being held IERC20 private _token; // beneficiary of tokens after they are released address private _beneficiary; // timestamp when token release is enabled uint256 private _releaseTime; // timestamp when tokens were locked uint256 public startTime = block.timestamp; // how many tokens have been released so far uint256 public totalReleased; // how many tokens to lock initially uint256 public startLockedBalance; constructor (IERC20 token, address beneficiary, uint256 releaseTime, uint256 _startLockedBalance) public { // solhint-disable-next-line not-rely-on-time require(releaseTime > block.timestamp, "TokenTimelock: release time is before current time"); _token = token; _beneficiary = beneficiary; _releaseTime = releaseTime; startLockedBalance = _startLockedBalance; } /** * @return the token being held. */ function token() public view returns (IERC20) { return _token; } /** * @return the beneficiary of the tokens. */ function beneficiary() public view returns (address) { return _beneficiary; } /** * @return the time when 100% of the tokens can be released. */ function releaseTime() public view returns (uint256) { return _releaseTime; } // how much can be released right now function releasable() public view returns (uint256) { uint256 totalLockTime = _releaseTime.sub(startTime); uint256 timeElapsed = block.timestamp.sub(startTime); uint256 percentTimeElapsed = timeElapsed.mul(100).div(totalLockTime); uint256 startLockedBalanceReleasable = startLockedBalance.mul(percentTimeElapsed).div(100); uint256 balanceReleasable = startLockedBalanceReleasable.sub(totalReleased); uint256 balance = _token.balanceOf(address(this)); // will occur after release time has passed if (balanceReleasable > balance) { return balance; } return balanceReleasable; } /** * @notice Transfers tokens held by timelock to beneficiary. */ function release() public { uint256 balanceReleasable = releasable(); require(balanceReleasable > 0, "TokenTimelock: no tokens to release"); totalReleased = totalReleased + balanceReleasable; _token.safeTransfer(_beneficiary, balanceReleasable); } } // File: contracts/crowdsale/TreasuryCrowdsale.sol pragma solidity ^0.5.0; contract TreasuryCrowdsale is FinalizableCrowdsale { using SafeMath for uint256; TokenTimelock public treasuryTimelock; // mint treasury supply a single time after finalization (~3% unlocked, ~20% locked for 5 years) function _finalization() internal { uint256 treasuryAmountUnlocked = token().totalSupply().mul(4).div(100); uint256 treasuryAmountLocked = token().totalSupply().mul(25).div(100); treasuryTimelock = new TokenTimelock( token(), wallet(), block.timestamp.add(60 * 60 * 24 * 365 * 5), // 5 years treasuryAmountLocked ); ERC20Mintable(address(token())).mint(wallet(), treasuryAmountUnlocked); ERC20Mintable(address(token())).mint(address(treasuryTimelock), treasuryAmountLocked); super._finalization(); } } // File: contracts/Sav3Crowdsale.sol pragma solidity ^0.5.17; contract Sav3Crowdsale is Crowdsale, MintedCrowdsale, WhitelistCrowdsale, TimedCrowdsale, PostDeliveryCrowdsale, IndividuallyCappedCrowdsale, IncreasingPriceCrowdsale, TreasuryCrowdsale { uint256 private _finalRate = 10000; uint256 private _individualCap = 3e18; constructor( address payable crowdsaleWallet, IERC20 token, uint256 openingTime, uint256 closingTime, address whitelister, address referrers ) TreasuryCrowdsale() WhitelistCrowdsale(whitelister) IncreasingPriceCrowdsale(_finalRate, referrers) PostDeliveryCrowdsale() TimedCrowdsale(openingTime, closingTime) IndividuallyCappedCrowdsale(_individualCap) MintedCrowdsale() Crowdsale(_finalRate, crowdsaleWallet, token) public {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"crowdsaleWallet","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"openingTime","type":"uint256"},{"internalType":"uint256","name":"closingTime","type":"uint256"},{"internalType":"address","name":"whitelister","type":"address"},{"internalType":"address","name":"referrers","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"CrowdsaleFinalized","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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":true,"inputs":[],"name":"closingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"finalRate","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":"hasClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"individualCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isReferrer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referrers","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"treasuryTimelock","outputs":[{"internalType":"contract TokenTimelock","name":"","type":"address"}],"payable":false,"stateMutability":"view","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"},{"constant":true,"inputs":[],"name":"whitelister","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052612710600e556729a2241af62c0000600f553480156200002357600080fd5b5060405162003a4738038062003a47833981810160405260c08110156200004957600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050600e5481600f54868686600e548c8c60016000806101000a81548160ff021916908315150217905550600083116200012c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f43726f776473616c653a2072617465206973203000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018062003a226025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200023c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620039fe6024913960400191505060405180910390fd5b8260028190555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550504282101562000365576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806200396b6033913960400191505060405180910390fd5b818111620003bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806200399e6037913960400191505060405180910390fd5b81600581905550806006819055505050604051620003dd906200050f565b604051809103906000f080158015620003fa573d6000803e3d6000fd5b50600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a8190555050600082116200049e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180620039d56029913960400191505060405180910390fd5b81600b8190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506000600c60146101000a81548160ff0219169083151502179055505050505050506200051d565b610620806200334b83390190565b612e1e806200052d6000396000f3fe6080604052600436106101355760003560e01c806349df728c116100ab578063b3f05b971161006f578063b3f05b9714610573578063b7a8807c146105a2578063d64d6968146105cd578063ec8ac4d814610636578063f7fb07b01461067a578063fc0c546a146106a557610135565b806349df728c146104245780634b6753bc146104755780634bb278f3146104a0578063521eb273146104b757806370a082311461050e57610135565b806321eff7fc116100fd57806321eff7fc1461027a57806322758a4a146102df5780632c4e722e146103365780633af32abf146103615780634042b66f146103ca57806347535d7b146103f557610135565b80630276650b146101475780630c559659146101725780631515bc2b146101c95780631dfe1898146101f8578063211061091461024f575b6101456101406106fc565b610704565b005b34801561015357600080fd5b5061015c61088f565b6040518082815260200191505060405180910390f35b34801561017e57600080fd5b50610187610895565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101d557600080fd5b506101de6108bb565b604051808215151515815260200191505060405180910390f35b34801561020457600080fd5b5061020d6108c7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025b57600080fd5b506102646108ed565b6040518082815260200191505060405180910390f35b34801561028657600080fd5b506102c96004803603602081101561029d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108f7565b6040518082815260200191505060405180910390f35b3480156102eb57600080fd5b506102f4610940565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561034257600080fd5b5061034b610966565b6040518082815260200191505060405180910390f35b34801561036d57600080fd5b506103b06004803603602081101561038457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109ba565b604051808215151515815260200191505060405180910390f35b3480156103d657600080fd5b506103df610a9d565b6040518082815260200191505060405180910390f35b34801561040157600080fd5b5061040a610aa7565b604051808215151515815260200191505060405180910390f35b34801561043057600080fd5b506104736004803603602081101561044757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ac2565b005b34801561048157600080fd5b5061048a610d03565b6040518082815260200191505060405180910390f35b3480156104ac57600080fd5b506104b5610d0d565b005b3480156104c357600080fd5b506104cc610e3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051a57600080fd5b5061055d6004803603602081101561053157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e69565b6040518082815260200191505060405180910390f35b34801561057f57600080fd5b50610588610eb2565b604051808215151515815260200191505060405180910390f35b3480156105ae57600080fd5b506105b7610ec9565b6040518082815260200191505060405180910390f35b3480156105d957600080fd5b5061061c600480360360208110156105f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ed3565b604051808215151515815260200191505060405180910390f35b6106786004803603602081101561064c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610704565b005b34801561068657600080fd5b5061068f611016565b6040518082815260200191505060405180910390f35b3480156106b157600080fd5b506106ba611247565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600033905090565b6000809054906101000a900460ff16610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60008060006101000a81548160ff02191690831515021790555060003490506107ae8282611270565b60006107b98261132b565b90506107d08260035461135390919063ffffffff16565b6003819055506107e083826113db565b8273ffffffffffffffffffffffffffffffffffffffff166107ff6106fc565b73ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a361085e83836114a0565b610866611543565b61087083836115ae565b505060016000806101000a81548160ff02191690831515021790555050565b600a5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006544211905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062002c926027913960400191505060405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d936547e836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a5b57600080fd5b505afa158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b81019080805190602001909291905050509050919050565b6000600354905090565b60006005544210158015610abd57506006544211155b905090565b610aca6108bb565b610b20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018062002d926021913960400191505060405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018062002cb96038913960400191505060405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc8610c49611247565b84846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015610ce757600080fd5b505af1158015610cfb573d6000803e3d6000fd5b505050505050565b6000600654905090565b600c60149054906101000a900460ff1615610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062002d416027913960400191505060405180910390fd5b610d7c6108bb565b610dee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f46696e616c697a61626c6543726f776473616c653a206e6f7420636c6f73656481525060200191505060405180910390fd5b6001600c60146101000a81548160ff021916908315150217905550610e116115b2565b7f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183660405160405180910390a1565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c60149054906101000a900460ff16905090565b6000600554905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f345760009050611011565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d64d6968836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fd357600080fd5b505afa158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b810190808051906020019092919050505090505b919050565b6000611020610aa7565b61102d5760009050611244565b6000611037610a9d565b90506000600b54905061104933610ed3565b15611078576110756064611067607d846119e790919063ffffffff16565b611a6e90919063ffffffff16565b90505b67d02ab486cedc00008210156110b8576110af60646110a160fa846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6801a055690d9db800008210156110f9576110f060646110e260c8846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b680270801d946c94000082101561113a57611131606461112360af846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b680410d586a20a4c000082101561117b5761117260646111646096846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6805b12aefafa80400008210156111bc576111b360646111a56078846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6807518058bd45bc00008210156111fd576111f460646111e6606e846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6808f1d5c1cae374000082101561123e5761123560646112276069846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b80925050505b90565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61127a8282611ab8565b600a546112cf82600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461135390919063ffffffff16565b1115611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018062002db36037913960400191505060405180910390fd5b5050565b600080611336611016565b905061134b83826119e790919063ffffffff16565b915050919050565b6000808284019050838110156113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61142d81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461135390919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061149c600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611b40565b5050565b6114aa8282611c7f565b6114fc81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461135390919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156115ab573d6000803e3d6000fd5b50565b5050565b6000611662606461165460046115c6611247565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561160b57600080fd5b505afa15801561161f573d6000803e3d6000fd5b505050506040513d602081101561163557600080fd5b81019080805190602001909291905050506119e790919063ffffffff16565b611a6e90919063ffffffff16565b9050600061171460646117066019611678611247565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116bd57600080fd5b505afa1580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b81019080805190602001909291905050506119e790919063ffffffff16565b611a6e90919063ffffffff16565b905061171e611247565b611726610e3f565b61173d63096601804261135390919063ffffffff16565b8360405161174a90611f92565b808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001945050505050604051809103906000f0801580156117dd573d6000803e3d6000fd5b50600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611826611247565b73ffffffffffffffffffffffffffffffffffffffff166340c10f19611849610e3f565b846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118b357600080fd5b505af11580156118c7573d6000803e3d6000fd5b505050506040513d60208110156118dd57600080fd5b8101908080519060200190929190505050506118f7611247565b73ffffffffffffffffffffffffffffffffffffffff166340c10f19600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b505050506040513d60208110156119c957600080fd5b8101908080519060200190929190505050506119e3611c83565b5050565b6000808314156119fa5760009050611a68565b6000828402905082848281611a0b57fe5b0414611a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018062002cf16021913960400191505060405180910390fd5b809150505b92915050565b6000611ab083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c85565b905092915050565b611ac0610aa7565b611b32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b611b3c8282611d4b565b5050565b611b48611247565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611bce57600080fd5b505af1158015611be2573d6000803e3d6000fd5b505050506040513d6020811015611bf857600080fd5b8101908080519060200190929190505050611c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4d696e74656443726f776473616c653a206d696e74696e67206661696c65640081525060200191505060405180910390fd5b5050565b5050565b565b60008083118290611d31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cf6578082015181840152602081019050611cdb565b50505050905090810190601f168015611d235780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611d3d57fe5b049050809150509392505050565b60011515600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d936547e846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611dee57600080fd5b505afa158015611e02573d6000803e3d6000fd5b505050506040513d6020811015611e1857600080fd5b8101908080519060200190929190505050151514611e82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018062002d12602f913960400191505060405180910390fd5b611e8c8282611e90565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018062002d68602a913960400191505060405180910390fd5b6000811415611f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a20776569416d6f756e7420697320300000000000000081525060200191505060405180910390fd5b5050565b610cf18062001fa18339019056fe60806040524260035534801561001457600080fd5b50604051610cf1380380610cf18339818101604052608081101561003757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050504282116100be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180610cbf6032913960400191505060405180910390fd5b836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816002819055508060058190555050505050610b5f806101606000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063b91d40011161005b578063b91d40011461011d578063e33b7de31461013b578063fbccedae14610159578063fc0c546a1461017757610088565b806338af3eed1461008d57806378e97925146100d757806386d1a69f146100f557806390b17c4a146100ff575b600080fd5b6100956101c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100df6101eb565b6040518082815260200191505060405180910390f35b6100fd6101f1565b005b6101076102d2565b6040518082815260200191505060405180910390f35b6101256102d8565b6040518082815260200191505060405180910390f35b6101436102e2565b6040518082815260200191505060405180910390f35b6101616102e8565b6040518082815260200191505060405180910390f35b61017f61048c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b60006101fb6102e8565b905060008111610256576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610b086023913960400191505060405180910390fd5b80600454016004819055506102cf600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166104b59092919063ffffffff16565b50565b60055481565b6000600254905090565b60045481565b60008061030260035460025461058690919063ffffffff16565b9050600061031b6003544261058690919063ffffffff16565b90506000610345836103376064856105d090919063ffffffff16565b61065690919063ffffffff16565b905060006103716064610363846005546105d090919063ffffffff16565b61065690919063ffffffff16565b9050600061038a6004548361058690919063ffffffff16565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561042c57600080fd5b505afa158015610440573d6000803e3d6000fd5b505050506040513d602081101561045657600080fd5b810190808051906020019092919050505090508082111561047f57809650505050505050610489565b8196505050505050505b90565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610581838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506106a0565b505050565b60006105c883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506108eb565b905092915050565b6000808314156105e35760009050610650565b60008284029050828482816105f457fe5b041461064b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180610abd6021913960400191505060405180910390fd5b809150505b92915050565b600061069883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506109ab565b905092915050565b6106bf8273ffffffffffffffffffffffffffffffffffffffff16610a71565b610731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310610780578051825260208201915060208101905060208303925061075d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146107e2576040519150601f19603f3d011682016040523d82523d6000602084013e6107e7565b606091505b50915091508161085f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b6000815111156108e55780806020019051602081101561087e57600080fd5b81019080805190602001909291905050506108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180610ade602a913960400191505060405180910390fd5b5b50505050565b6000838311158290610998576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561095d578082015181840152602081019050610942565b50505050905090810190601f16801561098a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290610a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a1c578082015181840152602081019050610a01565b50505050905090810190601f168015610a495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581610a6357fe5b049050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015610ab357506000801b8214155b9250505091905056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564546f6b656e54696d656c6f636b3a206e6f20746f6b656e7320746f2072656c65617365a265627a7a723158200f0cf93c4416412a8b3c032bb26a4c89e5d1da7c2238c839bab2e71d8e603b3d64736f6c63430005110032546f6b656e54696d656c6f636b3a2072656c656173652074696d65206973206265666f72652063757272656e742074696d65496e6372656173696e67507269636543726f776473616c653a207261746528292063616c6c6564506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7757686974656c69737443726f776473616c653a2062656e6566696369617279206e6f742077686974656c697374656446696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a656443726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a206e6f7420636c6f736564496e646976696475616c6c7943617070656443726f776473616c653a2062656e6566696369617279277320636170206578636565646564a265627a7a723158207472fb1bb6b0b519cebda21d2e8df278ea388863b0a97a5520632466e79e24f264736f6c63430005110032608060405260006100146100bf60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1506100c7565b600033905090565b61054a806100d66000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632348238c14610046578063beabacc81461008a578063c6dbdf61146100f8575b600080fd5b6100886004803603602081101561005c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610142565b005b6100f6600480360360608110156100a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061031a565b005b61010061048e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166101826104b7565b73ffffffffffffffffffffffffffffffffffffffff16146101ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806104ea602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806104c0602a913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661035a6104b7565b73ffffffffffffffffffffffffffffffffffffffff16146103c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806104ea602c913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561044d57600080fd5b505af1158015610461573d6000803e3d6000fd5b505050506040513d602081101561047757600080fd5b810190808051906020019092919050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60003390509056fe5365636f6e646172793a206e6577207072696d61727920697320746865207a65726f20616464726573735365636f6e646172793a2063616c6c6572206973206e6f7420746865207072696d617279206163636f756e74a265627a7a7231582007b27290a3e75bfe4b2c44d031719dba9b236ce4a315bedfd7b00a221f6fe12b64736f6c6343000511003254696d656443726f776473616c653a206f70656e696e672074696d65206973206265666f72652063757272656e742074696d6554696d656443726f776473616c653a206f70656e696e672074696d65206973206e6f74206265666f726520636c6f73696e672074696d65496e6372656173696e67507269636543726f776473616c653a2066696e616c2072617465206973203043726f776473616c653a20746f6b656e20697320746865207a65726f206164647265737343726f776473616c653a2077616c6c657420697320746865207a65726f206164647265737300000000000000000000000083ad8ee27c441054175b43a217df295b733d55ba0000000000000000000000006e10aacb89a28d6fa0fe68790777fec7e7f01890000000000000000000000000000000000000000000000000000000005fb05360000000000000000000000000000000000000000000000000000000005fb1a4e000000000000000000000000085b8fc2b78ae2c2e484c89203408b810a78b314800000000000000000000000083a7797b334016553929b957ab3f4e05d8cd087e
Deployed Bytecode
0x6080604052600436106101355760003560e01c806349df728c116100ab578063b3f05b971161006f578063b3f05b9714610573578063b7a8807c146105a2578063d64d6968146105cd578063ec8ac4d814610636578063f7fb07b01461067a578063fc0c546a146106a557610135565b806349df728c146104245780634b6753bc146104755780634bb278f3146104a0578063521eb273146104b757806370a082311461050e57610135565b806321eff7fc116100fd57806321eff7fc1461027a57806322758a4a146102df5780632c4e722e146103365780633af32abf146103615780634042b66f146103ca57806347535d7b146103f557610135565b80630276650b146101475780630c559659146101725780631515bc2b146101c95780631dfe1898146101f8578063211061091461024f575b6101456101406106fc565b610704565b005b34801561015357600080fd5b5061015c61088f565b6040518082815260200191505060405180910390f35b34801561017e57600080fd5b50610187610895565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101d557600080fd5b506101de6108bb565b604051808215151515815260200191505060405180910390f35b34801561020457600080fd5b5061020d6108c7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025b57600080fd5b506102646108ed565b6040518082815260200191505060405180910390f35b34801561028657600080fd5b506102c96004803603602081101561029d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108f7565b6040518082815260200191505060405180910390f35b3480156102eb57600080fd5b506102f4610940565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561034257600080fd5b5061034b610966565b6040518082815260200191505060405180910390f35b34801561036d57600080fd5b506103b06004803603602081101561038457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109ba565b604051808215151515815260200191505060405180910390f35b3480156103d657600080fd5b506103df610a9d565b6040518082815260200191505060405180910390f35b34801561040157600080fd5b5061040a610aa7565b604051808215151515815260200191505060405180910390f35b34801561043057600080fd5b506104736004803603602081101561044757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ac2565b005b34801561048157600080fd5b5061048a610d03565b6040518082815260200191505060405180910390f35b3480156104ac57600080fd5b506104b5610d0d565b005b3480156104c357600080fd5b506104cc610e3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051a57600080fd5b5061055d6004803603602081101561053157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e69565b6040518082815260200191505060405180910390f35b34801561057f57600080fd5b50610588610eb2565b604051808215151515815260200191505060405180910390f35b3480156105ae57600080fd5b506105b7610ec9565b6040518082815260200191505060405180910390f35b3480156105d957600080fd5b5061061c600480360360208110156105f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ed3565b604051808215151515815260200191505060405180910390f35b6106786004803603602081101561064c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610704565b005b34801561068657600080fd5b5061068f611016565b6040518082815260200191505060405180910390f35b3480156106b157600080fd5b506106ba611247565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600033905090565b6000809054906101000a900460ff16610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60008060006101000a81548160ff02191690831515021790555060003490506107ae8282611270565b60006107b98261132b565b90506107d08260035461135390919063ffffffff16565b6003819055506107e083826113db565b8273ffffffffffffffffffffffffffffffffffffffff166107ff6106fc565b73ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a361085e83836114a0565b610866611543565b61087083836115ae565b505060016000806101000a81548160ff02191690831515021790555050565b600a5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006544211905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062002c926027913960400191505060405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d936547e836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a5b57600080fd5b505afa158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b81019080805190602001909291905050509050919050565b6000600354905090565b60006005544210158015610abd57506006544211155b905090565b610aca6108bb565b610b20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018062002d926021913960400191505060405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018062002cb96038913960400191505060405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc8610c49611247565b84846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015610ce757600080fd5b505af1158015610cfb573d6000803e3d6000fd5b505050505050565b6000600654905090565b600c60149054906101000a900460ff1615610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062002d416027913960400191505060405180910390fd5b610d7c6108bb565b610dee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f46696e616c697a61626c6543726f776473616c653a206e6f7420636c6f73656481525060200191505060405180910390fd5b6001600c60146101000a81548160ff021916908315150217905550610e116115b2565b7f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183660405160405180910390a1565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c60149054906101000a900460ff16905090565b6000600554905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f345760009050611011565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d64d6968836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fd357600080fd5b505afa158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b810190808051906020019092919050505090505b919050565b6000611020610aa7565b61102d5760009050611244565b6000611037610a9d565b90506000600b54905061104933610ed3565b15611078576110756064611067607d846119e790919063ffffffff16565b611a6e90919063ffffffff16565b90505b67d02ab486cedc00008210156110b8576110af60646110a160fa846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6801a055690d9db800008210156110f9576110f060646110e260c8846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b680270801d946c94000082101561113a57611131606461112360af846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b680410d586a20a4c000082101561117b5761117260646111646096846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6805b12aefafa80400008210156111bc576111b360646111a56078846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6807518058bd45bc00008210156111fd576111f460646111e6606e846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b6808f1d5c1cae374000082101561123e5761123560646112276069846119e790919063ffffffff16565b611a6e90919063ffffffff16565b92505050611244565b80925050505b90565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61127a8282611ab8565b600a546112cf82600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461135390919063ffffffff16565b1115611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018062002db36037913960400191505060405180910390fd5b5050565b600080611336611016565b905061134b83826119e790919063ffffffff16565b915050919050565b6000808284019050838110156113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61142d81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461135390919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061149c600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611b40565b5050565b6114aa8282611c7f565b6114fc81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461135390919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156115ab573d6000803e3d6000fd5b50565b5050565b6000611662606461165460046115c6611247565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561160b57600080fd5b505afa15801561161f573d6000803e3d6000fd5b505050506040513d602081101561163557600080fd5b81019080805190602001909291905050506119e790919063ffffffff16565b611a6e90919063ffffffff16565b9050600061171460646117066019611678611247565b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116bd57600080fd5b505afa1580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b81019080805190602001909291905050506119e790919063ffffffff16565b611a6e90919063ffffffff16565b905061171e611247565b611726610e3f565b61173d63096601804261135390919063ffffffff16565b8360405161174a90611f92565b808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001945050505050604051809103906000f0801580156117dd573d6000803e3d6000fd5b50600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611826611247565b73ffffffffffffffffffffffffffffffffffffffff166340c10f19611849610e3f565b846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118b357600080fd5b505af11580156118c7573d6000803e3d6000fd5b505050506040513d60208110156118dd57600080fd5b8101908080519060200190929190505050506118f7611247565b73ffffffffffffffffffffffffffffffffffffffff166340c10f19600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b505050506040513d60208110156119c957600080fd5b8101908080519060200190929190505050506119e3611c83565b5050565b6000808314156119fa5760009050611a68565b6000828402905082848281611a0b57fe5b0414611a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018062002cf16021913960400191505060405180910390fd5b809150505b92915050565b6000611ab083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c85565b905092915050565b611ac0610aa7565b611b32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b611b3c8282611d4b565b5050565b611b48611247565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611bce57600080fd5b505af1158015611be2573d6000803e3d6000fd5b505050506040513d6020811015611bf857600080fd5b8101908080519060200190929190505050611c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4d696e74656443726f776473616c653a206d696e74696e67206661696c65640081525060200191505060405180910390fd5b5050565b5050565b565b60008083118290611d31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cf6578082015181840152602081019050611cdb565b50505050905090810190601f168015611d235780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611d3d57fe5b049050809150509392505050565b60011515600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d936547e846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611dee57600080fd5b505afa158015611e02573d6000803e3d6000fd5b505050506040513d6020811015611e1857600080fd5b8101908080519060200190929190505050151514611e82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018062002d12602f913960400191505060405180910390fd5b611e8c8282611e90565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018062002d68602a913960400191505060405180910390fd5b6000811415611f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a20776569416d6f756e7420697320300000000000000081525060200191505060405180910390fd5b5050565b610cf18062001fa18339019056fe60806040524260035534801561001457600080fd5b50604051610cf1380380610cf18339818101604052608081101561003757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050504282116100be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180610cbf6032913960400191505060405180910390fd5b836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816002819055508060058190555050505050610b5f806101606000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063b91d40011161005b578063b91d40011461011d578063e33b7de31461013b578063fbccedae14610159578063fc0c546a1461017757610088565b806338af3eed1461008d57806378e97925146100d757806386d1a69f146100f557806390b17c4a146100ff575b600080fd5b6100956101c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100df6101eb565b6040518082815260200191505060405180910390f35b6100fd6101f1565b005b6101076102d2565b6040518082815260200191505060405180910390f35b6101256102d8565b6040518082815260200191505060405180910390f35b6101436102e2565b6040518082815260200191505060405180910390f35b6101616102e8565b6040518082815260200191505060405180910390f35b61017f61048c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b60006101fb6102e8565b905060008111610256576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610b086023913960400191505060405180910390fd5b80600454016004819055506102cf600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166104b59092919063ffffffff16565b50565b60055481565b6000600254905090565b60045481565b60008061030260035460025461058690919063ffffffff16565b9050600061031b6003544261058690919063ffffffff16565b90506000610345836103376064856105d090919063ffffffff16565b61065690919063ffffffff16565b905060006103716064610363846005546105d090919063ffffffff16565b61065690919063ffffffff16565b9050600061038a6004548361058690919063ffffffff16565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561042c57600080fd5b505afa158015610440573d6000803e3d6000fd5b505050506040513d602081101561045657600080fd5b810190808051906020019092919050505090508082111561047f57809650505050505050610489565b8196505050505050505b90565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610581838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506106a0565b505050565b60006105c883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506108eb565b905092915050565b6000808314156105e35760009050610650565b60008284029050828482816105f457fe5b041461064b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180610abd6021913960400191505060405180910390fd5b809150505b92915050565b600061069883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506109ab565b905092915050565b6106bf8273ffffffffffffffffffffffffffffffffffffffff16610a71565b610731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310610780578051825260208201915060208101905060208303925061075d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146107e2576040519150601f19603f3d011682016040523d82523d6000602084013e6107e7565b606091505b50915091508161085f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b6000815111156108e55780806020019051602081101561087e57600080fd5b81019080805190602001909291905050506108e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180610ade602a913960400191505060405180910390fd5b5b50505050565b6000838311158290610998576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561095d578082015181840152602081019050610942565b50505050905090810190601f16801561098a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290610a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a1c578082015181840152602081019050610a01565b50505050905090810190601f168015610a495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581610a6357fe5b049050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015610ab357506000801b8214155b9250505091905056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564546f6b656e54696d656c6f636b3a206e6f20746f6b656e7320746f2072656c65617365a265627a7a723158200f0cf93c4416412a8b3c032bb26a4c89e5d1da7c2238c839bab2e71d8e603b3d64736f6c63430005110032546f6b656e54696d656c6f636b3a2072656c656173652074696d65206973206265666f72652063757272656e742074696d65496e6372656173696e67507269636543726f776473616c653a207261746528292063616c6c6564506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7757686974656c69737443726f776473616c653a2062656e6566696369617279206e6f742077686974656c697374656446696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a656443726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a206e6f7420636c6f736564496e646976696475616c6c7943617070656443726f776473616c653a2062656e6566696369617279277320636170206578636565646564a265627a7a723158207472fb1bb6b0b519cebda21d2e8df278ea388863b0a97a5520632466e79e24f264736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000083ad8ee27c441054175b43a217df295b733d55ba0000000000000000000000006e10aacb89a28d6fa0fe68790777fec7e7f01890000000000000000000000000000000000000000000000000000000005fb05360000000000000000000000000000000000000000000000000000000005fb1a4e000000000000000000000000085b8fc2b78ae2c2e484c89203408b810a78b314800000000000000000000000083a7797b334016553929b957ab3f4e05d8cd087e
-----Decoded View---------------
Arg [0] : crowdsaleWallet (address): 0x83Ad8ee27c441054175B43a217Df295B733D55BA
Arg [1] : token (address): 0x6E10AAcb89A28d6FA0FE68790777fec7E7f01890
Arg [2] : openingTime (uint256): 1605391200
Arg [3] : closingTime (uint256): 1605477600
Arg [4] : whitelister (address): 0x85B8Fc2B78AE2c2E484c89203408B810a78B3148
Arg [5] : referrers (address): 0x83A7797B334016553929B957Ab3F4e05d8cd087e
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000083ad8ee27c441054175b43a217df295b733d55ba
Arg [1] : 0000000000000000000000006e10aacb89a28d6fa0fe68790777fec7e7f01890
Arg [2] : 000000000000000000000000000000000000000000000000000000005fb05360
Arg [3] : 000000000000000000000000000000000000000000000000000000005fb1a4e0
Arg [4] : 00000000000000000000000085b8fc2b78ae2c2e484c89203408b810a78b3148
Arg [5] : 00000000000000000000000083a7797b334016553929b957ab3f4e05d8cd087e
Deployed Bytecode Sourcemap
59265:902:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21820:23;21830:12;:10;:12::i;:::-;21820:9;:23::i;:::-;59265:902;47909:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47909:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58423:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58423:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28777:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28777:159:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50750:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50750:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51933:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51933:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48877:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48877:129:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48877:129:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45715:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45715:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51634:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51634:114:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46139:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46139:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46139:140:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22398:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22398:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28415:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28415:192:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31881:363;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31881:363:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31881:363:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;28234:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28234:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54598:270;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54598:270:0;;;:::i;:::-;;22074:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22074:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32313:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32313:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32313:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54350:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54350:84:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28073:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28073:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51261:211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51261:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51261:211:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22750:622;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22750:622:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;52262:969;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52262:969:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21915:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21915:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;858:98;903:15;938:10;931:17;;858:98;:::o;22750:622::-;18513:11;;;;;;;;;;;18505:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18652:5;18638:11;;:19;;;;;;;;;;;;;;;;;;22829:17;22849:9;22829:29;;22869:44;22890:11;22903:9;22869:20;:44::i;:::-;22975:14;22992:26;23008:9;22992:15;:26::i;:::-;22975:43;;23069:25;23084:9;23069:10;;:14;;:25;;;;:::i;:::-;23056:10;:38;;;;23107:37;23124:11;23137:6;23107:16;:37::i;:::-;23190:11;23160:61;;23176:12;:10;:12::i;:::-;23160:61;;;23203:9;23214:6;23160:61;;;;;;;;;;;;;;;;;;;;;;;;23234:46;23257:11;23270:9;23234:22;:46::i;:::-;23293:15;:13;:15::i;:::-;23319:45;23341:11;23354:9;23319:21;:45::i;:::-;18670:1;;18832:4;18818:11;;:18;;;;;;;;;;;;;;;;;;22750:622;:::o;47909:28::-;;;;:::o;58423:37::-;;;;;;;;;;;;;:::o;28777:159::-;28819:4;28916:12;;28898:15;:30;28891:37;;28777:159;:::o;50750:24::-;;;;;;;;;;;;;:::o;51933:87::-;51975:7;52002:10;;51995:17;;51933:87;:::o;48877:129::-;48944:7;48971:14;:27;48986:11;48971:27;;;;;;;;;;;;;;;;48964:34;;48877:129;;;:::o;45715:26::-;;;;;;;;;;;;;:::o;51634:114::-;51671:7;51691:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46139:140;46203:4;46237:11;;;;;;;;;;;46224:37;;;46262:8;46224:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46224:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46224:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46224:47:0;;;;;;;;;;;;;;;;46217:54;;46139:140;;;:::o;22398:87::-;22440:7;22467:10;;22460:17;;22398:87;:::o;28415:192::-;28454:4;28552:12;;28533:15;:31;;:66;;;;;28587:12;;28568:15;:31;;28533:66;28526:73;;28415:192;:::o;31881:363::-;31952:11;:9;:11::i;:::-;31944:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32012:14;32029:9;:22;32039:11;32029:22;;;;;;;;;;;;;;;;32012:39;;32079:1;32070:6;:10;32062:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32179:1;32154:9;:22;32164:11;32154:22;;;;;;;;;;;;;;;:26;;;;32191:6;;;;;;;;;;;:15;;;32207:7;:5;:7::i;:::-;32216:11;32229:6;32191:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32191:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32191:45:0;;;;31881:363;;:::o;28234:91::-;28278:7;28305:12;;28298:19;;28234:91;:::o;54598:270::-;54645:10;;;;;;;;;;;54644:11;54636:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54718:11;:9;:11::i;:::-;54710:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54792:4;54779:10;;:17;;;;;;;;;;;;;;;;;;54809:15;:13;:15::i;:::-;54840:20;;;;;;;;;;54598:270::o;22074:89::-;22113:15;22148:7;;;;;;;;;;;22141:14;;22074:89;:::o;32313:110::-;32370:7;32397:9;:18;32407:7;32397:18;;;;;;;;;;;;;;;;32390:25;;32313:110;;;:::o;54350:84::-;54392:4;54416:10;;;;;;;;;;;54409:17;;54350:84;:::o;28073:91::-;28117:7;28144:12;;28137:19;;28073:91;:::o;51261:211::-;51320:4;51362:1;51341:23;;:9;;;;;;;;;;;:23;;;51337:68;;;51388:5;51381:12;;;;51337:68;51433:9;;;;;;;;;;;51422:32;;;51455:8;51422:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51422:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51422:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51422:42:0;;;;;;;;;;;;;;;;51415:49;;51261:211;;;;:::o;52262:969::-;52309:7;52334:8;:6;:8::i;:::-;52329:50;;52366:1;52359:8;;;;52329:50;52391:18;52412:11;:9;:11::i;:::-;52391:32;;52434:13;52450:10;;52434:26;;52477:22;52488:10;52477;:22::i;:::-;52473:86;;;52524:23;52543:3;52524:14;52534:3;52524:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52516:31;;52473:86;52588:5;52575:10;:18;52571:81;;;52617:23;52636:3;52617:14;52627:3;52617:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52610:30;;;;;;52571:81;52679:5;52666:10;:18;52662:81;;;52708:23;52727:3;52708:14;52718:3;52708:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52701:30;;;;;;52662:81;52770:5;52757:10;:18;52753:81;;;52799:23;52818:3;52799:14;52809:3;52799:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52792:30;;;;;;52753:81;52861:5;52848:10;:18;52844:81;;;52890:23;52909:3;52890:14;52900:3;52890:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52883:30;;;;;;52844:81;52952:6;52939:10;:19;52935:82;;;52982:23;53001:3;52982:14;52992:3;52982:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52975:30;;;;;;52935:82;53044:6;53031:10;:19;53027:82;;;53074:23;53093:3;53074:14;53084:3;53074:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;53067:30;;;;;;53027:82;53136:6;53123:10;:19;53119:82;;;53166:23;53185:3;53166:14;53176:3;53166:5;:9;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;53159:30;;;;;;53119:82;53218:5;53211:12;;;;52262:969;;:::o;21915:78::-;21953:6;21979;;;;;;;;;;;21972:13;;21915:78;:::o;49223:491::-;49318:50;49345:11;49358:9;49318:26;:50::i;:::-;49633:13;;49587:42;49619:9;49587:14;:27;49602:11;49587:27;;;;;;;;;;;;;;;;:31;;:42;;;;:::i;:::-;:59;;49579:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49223:491;;:::o;53476:177::-;53543:7;53563:19;53585:16;:14;:16::i;:::-;53563:38;;53619:26;53635:9;53619:11;:15;;:26;;;;:::i;:::-;53612:33;;;53476:177;;;:::o;4989:181::-;5047:7;5067:9;5083:1;5079;:5;5067:17;;5108:1;5103;:6;;5095:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5161:1;5154:8;;;4989:181;;;;:::o;32821:215::-;32934:39;32961:11;32934:9;:22;32944:11;32934:22;;;;;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;32909:9;:22;32919:11;32909:22;;;;;;;;;;;;;;;:64;;;;32984:44;33007:6;;;;;;;;;;;33016:11;32984:14;:44::i;:::-;32821:215;;:::o;49907:235::-;49999:52;50028:11;50041:9;49999:28;:52::i;:::-;50092:42;50124:9;50092:14;:27;50107:11;50092:27;;;;;;;;;;;;;;;;:31;;:42;;;;:::i;:::-;50062:14;:27;50077:11;50062:27;;;;;;;;;;;;;;;:72;;;;49907:235;;:::o;26491:80::-;26536:7;;;;;;;;;;;:16;;:27;26553:9;26536:27;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26536:27:0;26491:80::o;24608:151::-;;;:::o;58571:619::-;58616:30;58649:37;58682:3;58649:28;58675:1;58649:7;:5;:7::i;:::-;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58649:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58649:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58649:21:0;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;:32;;:37;;;;:::i;:::-;58616:70;;58697:28;58728:38;58762:3;58728:29;58754:2;58728:7;:5;:7::i;:::-;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58728:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58728:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58728:21:0;;;;;;;;;;;;;;;;:25;;:29;;;;:::i;:::-;:33;;:38;;;;:::i;:::-;58697:69;;58828:7;:5;:7::i;:::-;58850:8;:6;:8::i;:::-;58873:43;58893:22;58873:15;:19;;:43;;;;:::i;:::-;58942:20;58796:177;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58796:177:0;58777:16;;:196;;;;;;;;;;;;;;;;;;59006:7;:5;:7::i;:::-;58984:36;;;59021:8;:6;:8::i;:::-;59031:22;58984:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58984:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58984:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58984:70:0;;;;;;;;;;;;;;;;;59087:7;:5;:7::i;:::-;59065:36;;;59110:16;;;;;;;;;;;59129:20;59065:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59065:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59065:85:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59065:85:0;;;;;;;;;;;;;;;;;59161:21;:19;:21::i;:::-;58571:619;;:::o;6361:471::-;6419:7;6669:1;6664;:6;6660:47;;;6694:1;6687:8;;;;6660:47;6719:9;6735:1;6731;:5;6719:17;;6764:1;6759;6755;:5;;;;;;:10;6747:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6823:1;6816:8;;;6361:471;;;;;:::o;7300:132::-;7358:7;7385:39;7389:1;7392;7385:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7378:46;;7300:132;;;;:::o;29136:167::-;27287:8;:6;:8::i;:::-;27279:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29245:50;29272:11;29285:9;29245:26;:50::i;:::-;29136:167;;:::o;45208:315::-;45412:7;:5;:7::i;:::-;45390:36;;;45427:11;45440;45390:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45390:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45390:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45390:62:0;;;;;;;;;;;;;;;;45368:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45208:315;;:::o;25874:147::-;;;:::o;55084:100::-;:::o;7962:345::-;8048:7;8147:1;8143;:5;8150:12;8135:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8135:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8174:9;8190:1;8186;:5;;;;;;8174:17;;8298:1;8291:8;;;7962:345;;;;;:::o;45844:287::-;46004:4;45949:59;;45962:11;;;;;;;;;;;45949:37;;;45987:12;45949:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45949:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45949:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45949:51:0;;;;;;;;;;;;;;;;:59;;;45941:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46071:52;46098:12;46112:10;46071:26;:52::i;:::-;45844:287;;:::o;23925:380::-;24051:1;24028:25;;:11;:25;;;;24020:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24132:1;24119:9;:14;;24111:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23925:380;;:::o;59265:902::-;;;;;;;;:::o
Swarm Source
bzzr://07b27290a3e75bfe4b2c44d031719dba9b236ce4a315bedfd7b00a221f6fe12b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.