Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Showing the last 25 transactions (View Advanced Filter)
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 11003793 | 1904 days ago | IN | 70 ETH | 0.00954654 | ||||
| Transfer | 11003782 | 1904 days ago | IN | 40 ETH | 0.00954654 | ||||
| Transfer | 11003773 | 1904 days ago | IN | 15 ETH | 0.00954654 | ||||
| Transfer | 11003751 | 1904 days ago | IN | 90 ETH | 0.00970564 | ||||
| Transfer | 11003750 | 1904 days ago | IN | 20 ETH | 0.00986475 | ||||
| Transfer | 11003740 | 1904 days ago | IN | 25 ETH | 0.00986475 | ||||
| Transfer | 11003737 | 1904 days ago | IN | 4.9 ETH | 0.0089101 | ||||
| Transfer | 11002639 | 1904 days ago | IN | 1 ETH | 0.02084327 | ||||
| Transfer | 11002500 | 1904 days ago | IN | 6 ETH | 0.01909308 | ||||
| Transfer | 11002478 | 1904 days ago | IN | 6 ETH | 0.0075 | ||||
| Transfer | 11002465 | 1904 days ago | IN | 8 ETH | 0.00615 | ||||
| Transfer | 11002440 | 1904 days ago | IN | 8 ETH | 0.0058 | ||||
| Transfer | 11001959 | 1904 days ago | IN | 100 ETH | 0.01256961 | ||||
| Transfer | 11001940 | 1904 days ago | IN | 100 ETH | 0.01081941 | ||||
| Transfer | 11001879 | 1904 days ago | IN | 50 ETH | 0.01207637 | ||||
| Transfer | 11001783 | 1904 days ago | IN | 50 ETH | 0.01081941 | ||||
| Transfer | 11001782 | 1904 days ago | IN | 50 ETH | 0.01081941 | ||||
| Transfer | 11001707 | 1904 days ago | IN | 20 ETH | 0.0106603 | ||||
| Transfer | 11001702 | 1904 days ago | IN | 90 ETH | 0.01050119 | ||||
| Transfer | 11001700 | 1904 days ago | IN | 50 ETH | 0.01050119 | ||||
| Transfer | 11001698 | 1904 days ago | IN | 60 ETH | 0.01050119 | ||||
| Transfer | 11001698 | 1904 days ago | IN | 30 ETH | 0.01050119 | ||||
| Transfer | 10999733 | 1904 days ago | IN | 2 ETH | 0.02227526 | ||||
| Transfer | 10999546 | 1904 days ago | IN | 5 ETH | 0.01031026 | ||||
| Transfer | 10999105 | 1904 days ago | IN | 150 ETH | 0.00859188 |
Showing the last 25 internal transactions (View Advanced Filter)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 11003793 | 1904 days ago | 70 ETH | ||||
| - | 11003782 | 1904 days ago | 40 ETH | ||||
| - | 11003773 | 1904 days ago | 15 ETH | ||||
| - | 11003751 | 1904 days ago | 90 ETH | ||||
| - | 11003750 | 1904 days ago | 20 ETH | ||||
| - | 11003740 | 1904 days ago | 25 ETH | ||||
| - | 11003737 | 1904 days ago | 4.9 ETH | ||||
| - | 11002639 | 1904 days ago | 1 ETH | ||||
| - | 11002500 | 1904 days ago | 6 ETH | ||||
| - | 11001959 | 1904 days ago | 100 ETH | ||||
| - | 11001940 | 1904 days ago | 100 ETH | ||||
| - | 11001879 | 1904 days ago | 50 ETH | ||||
| - | 11001783 | 1904 days ago | 50 ETH | ||||
| - | 11001782 | 1904 days ago | 50 ETH | ||||
| - | 11001707 | 1904 days ago | 20 ETH | ||||
| - | 11001702 | 1904 days ago | 90 ETH | ||||
| - | 11001700 | 1904 days ago | 50 ETH | ||||
| - | 11001698 | 1904 days ago | 60 ETH | ||||
| - | 11001698 | 1904 days ago | 30 ETH | ||||
| - | 10999733 | 1904 days ago | 2 ETH | ||||
| - | 10999546 | 1904 days ago | 5 ETH | ||||
| - | 10999105 | 1904 days ago | 150 ETH | ||||
| - | 10999069 | 1904 days ago | 150 ETH | ||||
| - | 10999038 | 1904 days ago | 150 ETH | ||||
| - | 10999029 | 1904 days ago | 150 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
C42CrowdSale
Compiler Version
v0.5.15+commit.6a57276f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-10-03
*/
// 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/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: @openzeppelin/contracts/crowdsale/validation/CappedCrowdsale.sol
pragma solidity ^0.5.0;
/**
* @title CappedCrowdsale
* @dev Crowdsale with a limit for total contributions.
*/
contract CappedCrowdsale is Crowdsale {
using SafeMath for uint256;
uint256 private _cap;
/**
* @dev Constructor, takes maximum amount of wei accepted in the crowdsale.
* @param cap Max amount of wei to be contributed
*/
constructor (uint256 cap) public {
require(cap > 0, "CappedCrowdsale: cap is 0");
_cap = cap;
}
/**
* @return the cap of the crowdsale.
*/
function cap() public view returns (uint256) {
return _cap;
}
/**
* @dev Checks whether the cap has been reached.
* @return Whether the cap was reached
*/
function capReached() public view returns (bool) {
return weiRaised() >= _cap;
}
/**
* @dev Extend parent behavior requiring purchase to respect the funding cap.
* @param beneficiary Token purchaser
* @param weiAmount Amount of wei contributed
*/
function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
super._preValidatePurchase(beneficiary, weiAmount);
require(weiRaised().add(weiAmount) <= _cap, "CappedCrowdsale: cap exceeded");
}
}
// File: @openzeppelin/contracts/access/roles/PauserRole.sol
pragma solidity ^0.5.0;
contract PauserRole is Context {
using Roles for Roles.Role;
event PauserAdded(address indexed account);
event PauserRemoved(address indexed account);
Roles.Role private _pausers;
constructor () internal {
_addPauser(_msgSender());
}
modifier onlyPauser() {
require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role");
_;
}
function isPauser(address account) public view returns (bool) {
return _pausers.has(account);
}
function addPauser(address account) public onlyPauser {
_addPauser(account);
}
function renouncePauser() public {
_removePauser(_msgSender());
}
function _addPauser(address account) internal {
_pausers.add(account);
emit PauserAdded(account);
}
function _removePauser(address account) internal {
_pausers.remove(account);
emit PauserRemoved(account);
}
}
// File: @openzeppelin/contracts/lifecycle/Pausable.sol
pragma solidity ^0.5.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
contract Pausable is Context, PauserRole {
/**
* @dev Emitted when the pause is triggered by a pauser (`account`).
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by a pauser (`account`).
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state. Assigns the Pauser role
* to the deployer.
*/
constructor () internal {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!_paused, "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(_paused, "Pausable: not paused");
_;
}
/**
* @dev Called by a pauser to pause, triggers stopped state.
*/
function pause() public onlyPauser whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Called by a pauser to unpause, returns to normal state.
*/
function unpause() public onlyPauser whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: @openzeppelin/contracts/crowdsale/validation/PausableCrowdsale.sol
pragma solidity ^0.5.0;
/**
* @title PausableCrowdsale
* @dev Extension of Crowdsale contract where purchases can be paused and unpaused by the pauser role.
*/
contract PausableCrowdsale is Crowdsale, Pausable {
/**
* @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met.
* Use super to concatenate validations.
* Adds the validation that the crowdsale must not be paused.
* @param _beneficiary Address performing the token purchase
* @param _weiAmount Value in wei involved in the purchase
*/
function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal view whenNotPaused {
return super._preValidatePurchase(_beneficiary, _weiAmount);
}
}
// File: @openzeppelin/contracts/crowdsale/validation/TimedCrowdsale.sol
pragma solidity ^0.5.0;
/**
* @title TimedCrowdsale
* @dev Crowdsale accepting contributions only within a time frame.
*/
contract TimedCrowdsale is Crowdsale {
using SafeMath for uint256;
uint256 private _openingTime;
uint256 private _closingTime;
/**
* Event for crowdsale extending
* @param newClosingTime new closing time
* @param prevClosingTime old closing time
*/
event TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime);
/**
* @dev Reverts if not in crowdsale time range.
*/
modifier onlyWhileOpen {
require(isOpen(), "TimedCrowdsale: not open");
_;
}
/**
* @dev Constructor, takes crowdsale opening and closing times.
* @param openingTime Crowdsale opening time
* @param closingTime Crowdsale closing time
*/
constructor (uint256 openingTime, uint256 closingTime) public {
// solhint-disable-next-line not-rely-on-time
require(openingTime >= block.timestamp, "TimedCrowdsale: opening time is before current time");
// solhint-disable-next-line max-line-length
require(closingTime > openingTime, "TimedCrowdsale: opening time is not before closing time");
_openingTime = openingTime;
_closingTime = closingTime;
}
/**
* @return the crowdsale opening time.
*/
function openingTime() public view returns (uint256) {
return _openingTime;
}
/**
* @return the crowdsale closing time.
*/
function closingTime() public view returns (uint256) {
return _closingTime;
}
/**
* @return true if the crowdsale is open, false otherwise.
*/
function isOpen() public view returns (bool) {
// solhint-disable-next-line not-rely-on-time
return block.timestamp >= _openingTime && block.timestamp <= _closingTime;
}
/**
* @dev Checks whether the period in which the crowdsale is open has already elapsed.
* @return Whether crowdsale period has elapsed
*/
function hasClosed() public view returns (bool) {
// solhint-disable-next-line not-rely-on-time
return block.timestamp > _closingTime;
}
/**
* @dev Extend parent behavior requiring to be within contributing period.
* @param beneficiary Token purchaser
* @param weiAmount Amount of wei contributed
*/
function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal onlyWhileOpen view {
super._preValidatePurchase(beneficiary, weiAmount);
}
/**
* @dev Extend crowdsale.
* @param newClosingTime Crowdsale closing time
*/
function _extendTime(uint256 newClosingTime) internal {
require(!hasClosed(), "TimedCrowdsale: already closed");
// solhint-disable-next-line max-line-length
require(newClosingTime > _closingTime, "TimedCrowdsale: new closing time is before current closing time");
emit TimedCrowdsaleExtended(_closingTime, newClosingTime);
_closingTime = newClosingTime;
}
}
// File: @openzeppelin/contracts/crowdsale/distribution/FinalizableCrowdsale.sol
pragma solidity ^0.5.0;
/**
* @title FinalizableCrowdsale
* @dev Extension of TimedCrowdsale with a one-off finalization action, where one
* can do extra work after finishing.
*/
contract FinalizableCrowdsale is TimedCrowdsale {
using SafeMath for uint256;
bool private _finalized;
event CrowdsaleFinalized();
constructor () internal {
_finalized = false;
}
/**
* @return true if the crowdsale is finalized, false otherwise.
*/
function finalized() public view returns (bool) {
return _finalized;
}
/**
* @dev Must be called after crowdsale ends, to do some extra finalization
* work. Calls the contract's finalization function.
*/
function finalize() public {
require(!_finalized, "FinalizableCrowdsale: already finalized");
require(hasClosed(), "FinalizableCrowdsale: not closed");
_finalized = true;
_finalization();
emit CrowdsaleFinalized();
}
/**
* @dev Can be overridden to add finalization logic. The overriding function
* should call super._finalization() to ensure the chain of finalization is
* executed entirely.
*/
function _finalization() internal {
// solhint-disable-previous-line no-empty-blocks
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol
pragma solidity ^0.5.0;
/**
* @dev Optional functions from the ERC20 standard.
*/
contract ERC20Detailed is IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
* these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol, uint8 decimals) public {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol
pragma solidity ^0.5.0;
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public {
_burn(_msgSender(), amount);
}
/**
* @dev See {ERC20-_burnFrom}.
*/
function burnFrom(address account, uint256 amount) public {
_burnFrom(account, amount);
}
}
// File: contracts/Clover42Token.sol
pragma solidity >=0.4.25 <0.7.0;
//多功能众筹合约:可增发,可销毁,有封顶,可暂停,有时限,成功后交付
contract Clover42Token is
ERC20,
ERC20Detailed,
ERC20Mintable,
ERC20Burnable
{
constructor(
string memory name,
string memory symbol,
uint8 decimals,
uint256 totalSupply
) public ERC20Detailed(name, symbol, decimals) {
// Boost uniswap liquidity
_mint(msg.sender, totalSupply * (10**uint256(decimals)));
}
}
// File: contracts/Clover42LockerToken.sol
pragma solidity >=0.4.25 <0.7.0;
contract Clover42LockerToken is
ERC20,
ERC20Detailed,
ERC20Mintable,
ERC20Burnable
{
constructor(
string memory name,
string memory symbol,
uint8 decimals,
uint256 totalSupply
) public ERC20Detailed(name, symbol, decimals) {
}
}
// File: contracts/LockerRole.sol
pragma solidity >=0.4.25 <0.7.0;
contract LockerRole is Context {
using Roles for Roles.Role;
event LockerAdded(address indexed account);
event LockerRemoved(address indexed account);
Roles.Role private _lockers;
constructor () internal {
_addLocker(_msgSender());
}
modifier onlyLocker() {
require(isLocker(_msgSender()), "LockerRole: caller does not have the locker role");
_;
}
function isLocker(address account) public view returns (bool) {
return _lockers.has(account);
}
function addLocker(address account) public onlyLocker {
_addLocker(account);
}
function renounceLocker() public {
_removeLocker(_msgSender());
}
function _addLocker(address account) internal {
_lockers.add(account);
emit LockerAdded(account);
}
function _removeLocker(address account) internal {
_lockers.remove(account);
emit LockerRemoved(account);
}
}
// File: contracts/UnLockerRole.sol
pragma solidity >=0.4.25 <0.7.0;
contract UnLockerRole is Context {
using Roles for Roles.Role;
event UnLockerAdded(address indexed account);
event UnLockerRemoved(address indexed account);
Roles.Role private _unLockers;
constructor () internal {
_addUnLocker(_msgSender());
}
modifier onlyUnLocker() {
require(isUnLocker(_msgSender()), "UnLockerRole: caller does not have the unLocker role");
_;
}
function isUnLocker(address account) public view returns (bool) {
return _unLockers.has(account);
}
function addUnLocker(address account) public onlyUnLocker {
_addUnLocker(account);
}
function renounceUnLocker() public {
_removeUnLocker(_msgSender());
}
function _addUnLocker(address account) internal {
_unLockers.add(account);
emit UnLockerAdded(account);
}
function _removeUnLocker(address account) internal {
_unLockers.remove(account);
emit UnLockerRemoved(account);
}
}
// 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: contracts/__unstable__TokenVault.sol
pragma solidity >=0.4.25 <0.7.0;
/**
* @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.
*/
contract __unstable__TokenVault is Secondary {
function _transfer(IERC20 token, address to, uint256 amount) public onlyPrimary {
token.transfer(to, amount);
}
}
// File: contracts/Clover42Locker.sol
pragma solidity >=0.4.25 <0.7.0;
contract Clover42Locker is LockerRole, UnLockerRole {
using SafeMath for uint256;
using SafeERC20 for Clover42Token;
using SafeERC20 for Clover42LockerToken;
// The locker token being delivered
Clover42LockerToken private _locker_token;
// The token being locked
Clover42Token private _token;
uint256 private _totalLocked;
__unstable__TokenVault private _vault;
event TokenUnlocked(address indexed beneficiary, uint256 amount);
constructor (Clover42Token token, Clover42LockerToken lockerToken) public {
require(address(token) != address(0), "Clover42Locker: token is the zero address");
require(address(lockerToken) != address(0), "Clover42Locker: lockerToken is the zero address");
_vault = new __unstable__TokenVault();
_token = token;
_locker_token = lockerToken;
_totalLocked = 0;
}
function token() public view returns(Clover42Token) {
return _token;
}
function lockerToken() public view returns(Clover42LockerToken) {
return _locker_token;
}
function totalLocked() public view returns(uint256) {
return _totalLocked;
}
function vault() public view returns(__unstable__TokenVault) {
return _vault;
}
function _deliverTokens(address beneficiary, uint256 tokenAmount) internal {
_token.safeTransfer(beneficiary, tokenAmount);
}
function _deliverLockerTokens(address beneficiary, uint256 tokenAmount) internal {
require(Clover42LockerToken(address(lockerToken())).mint(beneficiary, tokenAmount),
"Clover42Locker: Minting LockerToken failed");
}
function lock(address beneficiary, uint256 tokenAmount, address lockerVault) public onlyLocker {
require(beneficiary != address(0), "Clover42Locker: beneficiary is the zero address");
require(tokenAmount > 0, "Clover42Locker: lock amount is zero");
_deliverLockerTokens(lockerVault, tokenAmount);
_totalLocked = _totalLocked.add(tokenAmount);
}
function unLock(address beneficiary, uint256 tokenAmount) public onlyUnLocker {
require(beneficiary != address(0), "Clover42Locker: beneficiary is the zero address");
require(tokenAmount > 0, "Clover42Locker: unlock amount is zero");
require(tokenAmount <= _totalLocked, "Clover42Locker: unlock amount exceeded");
require(tokenAmount <= _locker_token.balanceOf(beneficiary), "Clover42Locker: tokenAmount is larger than the balance of beneficiary");
_vault._transfer(token(), beneficiary, tokenAmount);
_totalLocked = _totalLocked.sub(tokenAmount);
emit TokenUnlocked(beneficiary, tokenAmount);
}
}
// File: contracts/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;
mapping(address => uint256) private _locker_balances;
__unstable__TokenVault private _vault;
__unstable__TokenVault private _locker_valut;
// 锁仓合约
Clover42Locker private _locker;
// 锁仓token
Clover42LockerToken private _locker_token;
// 锁仓比例 10/8
uint256 private _rate;
constructor(Clover42Locker locker, uint256 rate, Clover42LockerToken lockerToken) public {
_vault = new __unstable__TokenVault();
_locker_valut = new __unstable__TokenVault();
_locker = locker;
_rate = rate;
_locker_token = lockerToken;
}
function locker() public view returns(Clover42Locker) {
return _locker;
}
function lockRate() public view returns(uint256) {
return _rate;
}
function lockerToken() public view returns(Clover42LockerToken) {
return _locker_token;
}
/**
* @dev Withdraw tokens only after crowdsale ends.
* @param beneficiary Whose tokens will be withdrawn.
*/
function withdrawTokens(address beneficiary) internal {
uint256 amount = _balances[beneficiary];
uint256 lockerTokenAmount = _locker_balances[beneficiary];
require(amount > 0, "PostDeliveryCrowdsale: beneficiary is not due any tokens");
require(lockerTokenAmount > 0, "PostDeliveryCrowdsale: beneficiary is not due any locker tokens");
_balances[beneficiary] = 0;
_locker_balances[beneficiary] = 0;
_vault._transfer(token(), beneficiary, amount);
_locker_valut._transfer(lockerToken(), beneficiary, lockerTokenAmount);
}
/**
* @return the balance of an account.
*/
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function balanceOfLockerToken(address account) public view returns(uint256) {
return _locker_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 {
uint256 lockAmount = tokenAmount.mul(lockRate()).div(10);
uint256 withdrawAmount = tokenAmount.sub(lockAmount);
_balances[beneficiary] = _balances[beneficiary].add(withdrawAmount);
_locker_balances[beneficiary] = _locker_balances[beneficiary].add(lockAmount);
_deliverTokens(address(_vault), withdrawAmount);
_deliverTokens(address(locker().vault()), lockAmount);
locker().lock(beneficiary, lockAmount, address(_locker_valut));
}
}
// File: contracts/C42CrowdSale.sol
pragma solidity >=0.4.25 <0.7.0;
contract C42CrowdSale is
CappedCrowdsale,
MintedCrowdsale,
PausableCrowdsale,
FinalizableCrowdsale,
PostDeliveryCrowdsale
{
bool private _finalized;
address private owner;
constructor(
uint256 rate,
uint256 cap,
address payable wallet,
uint256 openingTime,
uint256 closingTime,
uint256 lockRate,
Clover42Token token,
Clover42LockerToken lockerToken,
Clover42Locker locker
)
public
CappedCrowdsale(cap)
Crowdsale(rate, wallet, token)
TimedCrowdsale(openingTime, closingTime)
PostDeliveryCrowdsale(locker, lockRate, lockerToken)
{
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "C42CrowdSale: must be called by owner");
_;
}
function finalized() public view returns (bool) {
return _finalized;
}
function _finalization() internal {
super._finalization();
}
function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) {
return weiAmount.mul(rate());
}
function finalize() public onlyOwner {
require(!finalized(), "C42CrowdSale: already finalized");
_finalized = true;
_finalization();
emit CrowdsaleFinalized();
}
function withdraw(address beneficiary) public {
require(finalized(), "FinalizableCrowdsale: not finalized");
withdrawTokens(beneficiary);
}
function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal onlyWhileOpen view {
require(!finalized(), "FinalizableCrowdsale: already finalized");
super._preValidatePurchase(beneficiary, weiAmount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address payable","name":"wallet","type":"address"},{"internalType":"uint256","name":"openingTime","type":"uint256"},{"internalType":"uint256","name":"closingTime","type":"uint256"},{"internalType":"uint256","name":"lockRate","type":"uint256"},{"internalType":"contract Clover42Token","name":"token","type":"address"},{"internalType":"contract Clover42LockerToken","name":"lockerToken","type":"address"},{"internalType":"contract Clover42Locker","name":"locker","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"CrowdsaleFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfLockerToken","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":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"capReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"locker","outputs":[{"internalType":"contract Clover42Locker","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockerToken","outputs":[{"internalType":"contract Clover42LockerToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"openingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620033f9380380620033f983398181016040526101208110156200003857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505080848388888c8e8d8a60016000806101000a81548160ff0219169083151502179055506000831162000133576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f43726f776473616c653a2072617465206973203000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180620033d46025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000243576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806200338e6024913960400191505060405180910390fd5b8260028190555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506000811162000346576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43617070656443726f776473616c653a2063617020697320300000000000000081525060200191505060405180910390fd5b80600481905550506200036e620003626200061d60201b60201c565b6200062560201b60201c565b6000600660006101000a81548160ff02191690831515021790555042821015620003e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180620033246033913960400191505060405180910390fd5b8181116200043e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180620033576037913960400191505060405180910390fd5b816007819055508060088190555050506000600960006101000a81548160ff02191690831515021790555060405162000477906200084a565b604051809103906000f08015801562000494573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051620004e3906200084a565b604051809103906000f08015801562000500573d6000803e3d6000fd5b50600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160108190555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505033601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505062000858565b600033905090565b620006408160056200068660201b62001e311790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b6200069882826200076a60201b60201c565b156200070c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620033b26022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6106208062002d0483390190565b61249c80620008686000396000f3fe6080604052600436106101665760003560e01c806351cff8d9116100d15780638456cb591161008a578063cccff94211610064578063cccff942146105df578063d7b96d4e14610644578063ec8ac4d81461069b578063fc0c546a146106df57610166565b80638456cb591461056e578063b3f05b9714610585578063b7a8807c146105b457610166565b806351cff8d9146103ca578063521eb2731461041b5780635c975abb146104725780636ef8d66d146104a157806370a08231146104b857806382dc1ec41461051d57610166565b80634042b66f116101235780634042b66f1461029657806346fbf68e146102c157806347535d7b1461032a5780634b6753bc146103595780634bb278f3146103845780634f9359451461039b57610166565b8063048a6a5c146101785780631515bc2b146101cf578063234ea19c146101fe5780632c4e722e14610229578063355274ea146102545780633f4ba83a1461027f575b610176610171610736565b61073e565b005b34801561018457600080fd5b5061018d6108c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101db57600080fd5b506101e46108f3565b604051808215151515815260200191505060405180910390f35b34801561020a57600080fd5b506102136108ff565b6040518082815260200191505060405180910390f35b34801561023557600080fd5b5061023e610909565b6040518082815260200191505060405180910390f35b34801561026057600080fd5b50610269610913565b6040518082815260200191505060405180910390f35b34801561028b57600080fd5b5061029461091d565b005b3480156102a257600080fd5b506102ab610a8b565b6040518082815260200191505060405180910390f35b3480156102cd57600080fd5b50610310600480360360208110156102e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a95565b604051808215151515815260200191505060405180910390f35b34801561033657600080fd5b5061033f610ab2565b604051808215151515815260200191505060405180910390f35b34801561036557600080fd5b5061036e610acd565b6040518082815260200191505060405180910390f35b34801561039057600080fd5b50610399610ad7565b005b3480156103a757600080fd5b506103b0610c49565b604051808215151515815260200191505060405180910390f35b3480156103d657600080fd5b50610419600480360360208110156103ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c5d565b005b34801561042757600080fd5b50610430610cc6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047e57600080fd5b50610487610cf0565b604051808215151515815260200191505060405180910390f35b3480156104ad57600080fd5b506104b6610d07565b005b3480156104c457600080fd5b50610507600480360360208110156104db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d19565b6040518082815260200191505060405180910390f35b34801561052957600080fd5b5061056c6004803603602081101561054057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d62565b005b34801561057a57600080fd5b50610583610dd3565b005b34801561059157600080fd5b5061059a610f42565b604051808215151515815260200191505060405180910390f35b3480156105c057600080fd5b506105c9610f59565b6040518082815260200191505060405180910390f35b3480156105eb57600080fd5b5061062e6004803603602081101561060257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f63565b6040518082815260200191505060405180910390f35b34801561065057600080fd5b50610659610fac565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106dd600480360360208110156106b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061073e565b005b3480156106eb57600080fd5b506106f4610fd6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600033905090565b6000809054906101000a900460ff166107bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60008060006101000a81548160ff02191690831515021790555060003490506107e88282610fff565b60006107f3826110e5565b905061080a8260035461110890919063ffffffff16565b60038190555061081a8382611190565b8273ffffffffffffffffffffffffffffffffffffffff16610839610736565b73ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a361089883836114c1565b6108a06114c5565b6108aa8383611530565b505060016000806101000a81548160ff02191690831515021790555050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006008544211905090565b6000601054905090565b6000600254905090565b6000600454905090565b61092d610928610736565b610a95565b610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806122c46030913960400191505060405180910390fd5b600660009054906101000a900460ff16610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610a48610736565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000600354905090565b6000610aab82600561153490919063ffffffff16565b9050919050565b60006007544210158015610ac857506008544211155b905090565b6000600854905090565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806122f46025913960400191505060405180910390fd5b610b85610f42565b15610bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43343243726f776453616c653a20616c72656164792066696e616c697a65640081525060200191505060405180910390fd5b6001601160006101000a81548160ff021916908315150217905550610c1b611612565b7f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183660405160405180910390a1565b6000600454610c56610a8b565b1015905090565b610c65610f42565b610cba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806124456023913960400191505060405180910390fd5b610cc38161161c565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600660009054906101000a900460ff16905090565b610d17610d12610736565b6119dd565b565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d72610d6d610736565b610a95565b610dc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806122c46030913960400191505060405180910390fd5b610dd081611a37565b50565b610de3610dde610736565b610a95565b610e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806122c46030913960400191505060405180910390fd5b600660009054906101000a900460ff1615610ebb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610eff610736565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000601160009054906101000a900460ff16905090565b6000600754905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611007610ab2565b611079576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b611081610f42565b156110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806123b56027913960400191505060405180910390fd5b6110e18282611a91565b5050565b60006111016110f2610909565b83611b1990919063ffffffff16565b9050919050565b600080828401905083811015611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006111bf600a6111b16111a26108ff565b85611b1990919063ffffffff16565b611b9f90919063ffffffff16565b905060006111d68284611be990919063ffffffff16565b905061122a81600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461110890919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112bf82600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461110890919063ffffffff16565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061132e600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611c33565b6113bf611339610fac565b73ffffffffffffffffffffffffffffffffffffffff1663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137e57600080fd5b505afa158015611392573d6000803e3d6000fd5b505050506040513d60208110156113a857600080fd5b810190808051906020019092919050505083611c33565b6113c7610fac565b73ffffffffffffffffffffffffffffffffffffffff16634bbc170a8584600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156114a357600080fd5b505af11580156114b7573d6000803e3d6000fd5b5050505050505050565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561152d573d6000803e3d6000fd5b50565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806123936022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161a611d72565b565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082116116fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061233a6038913960400191505060405180910390fd5b60008111611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612406603f913960400191505060405180910390fd5b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166330e0789e611826610fd6565b85856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156118c457600080fd5b505af11580156118d8573d6000803e3d6000fd5b50505050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166330e0789e6119226108c9565b85846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156119c057600080fd5b505af11580156119d4573d6000803e3d6000fd5b50505050505050565b6119f1816005611d7490919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b611a4b816005611e3190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b611a99610ab2565b611b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b611b158282611f0c565b5050565b600080831415611b2c5760009050611b99565b6000828402905082848281611b3d57fe5b0414611b94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806123726021913960400191505060405180910390fd5b809150505b92915050565b6000611be183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611f9d565b905092915050565b6000611c2b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612063565b905092915050565b611c3b610fd6565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cc157600080fd5b505af1158015611cd5573d6000803e3d6000fd5b505050506040513d6020811015611ceb57600080fd5b8101908080519060200190929190505050611d6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4d696e74656443726f776473616c653a206d696e74696e67206661696c65640081525060200191505060405180910390fd5b5050565b565b611d7e8282611534565b611dd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806123196021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611e3b8282611534565b15611eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900460ff1615611f8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611f998282612123565b5050565b60008083118290612049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561200e578082015181840152602081019050611ff3565b50505050905090810190601f16801561203b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161205557fe5b049050809150509392505050565b6000838311158290612110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120d55780820151818401526020810190506120ba565b50505050905090810190601f1680156121025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b61212d82826121c2565b60045461214a8261213c610a8b565b61110890919063ffffffff16565b11156121be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43617070656443726f776473616c653a2063617020657863656564656400000081525060200191505060405180910390fd5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806123dc602a913960400191505060405180910390fd5b60008114156122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a20776569416d6f756e7420697320300000000000000081525060200191505060405180910390fd5b505056fe506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6543343243726f776453616c653a206d7573742062652063616c6c6564206279206f776e6572526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737346696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a656443726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e79206c6f636b657220746f6b656e7346696e616c697a61626c6543726f776473616c653a206e6f742066696e616c697a6564a265627a7a7231582022a0d613d426e1677e789248f7a569f2be294d6c4261602db38fbc537e591b2664736f6c634300050f0032608060405260006100146100bf60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1506100c7565b600033905090565b61054a806100d66000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632348238c1461004657806330e0789e1461008a578063c6dbdf61146100f8575b600080fd5b6100886004803603602081101561005c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610142565b005b6100f6600480360360608110156100a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061031a565b005b61010061048e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166101826104b7565b73ffffffffffffffffffffffffffffffffffffffff16146101ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806104ea602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806104c0602a913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661035a6104b7565b73ffffffffffffffffffffffffffffffffffffffff16146103c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806104ea602c913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561044d57600080fd5b505af1158015610461573d6000803e3d6000fd5b505050506040513d602081101561047757600080fd5b810190808051906020019092919050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60003390509056fe5365636f6e646172793a206e6577207072696d61727920697320746865207a65726f20616464726573735365636f6e646172793a2063616c6c6572206973206e6f7420746865207072696d617279206163636f756e74a265627a7a72315820df9958b75c62e6e2159c9778cf31a665ea05443555c048ac7e382e4ec309514a64736f6c634300050f003254696d656443726f776473616c653a206f70656e696e672074696d65206973206265666f72652063757272656e742074696d6554696d656443726f776473616c653a206f70656e696e672074696d65206973206e6f74206265666f726520636c6f73696e672074696d6543726f776473616c653a20746f6b656e20697320746865207a65726f2061646472657373526f6c65733a206163636f756e7420697320746865207a65726f206164647265737343726f776473616c653a2077616c6c657420697320746865207a65726f206164647265737300000000000000000000000000000000000000000000000000000000000000e60000000000000000000000000000000000000000000000d8d726b7177a800000000000000000000000000000aae49be2f2178fcdf81552405311aabfaf705dfb000000000000000000000000000000000000000000000000000000005f7867c0000000000000000000000000000000000000000000000000000000005f7eff40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000008a840a446bad3269122abe7f638d969a993ee64000000000000000000000000d1471cf969b76a734d76645ad08eec7efae293e70000000000000000000000009974a81446a1ed97c50d93df441421508de6624a
Deployed Bytecode
0x6080604052600436106101665760003560e01c806351cff8d9116100d15780638456cb591161008a578063cccff94211610064578063cccff942146105df578063d7b96d4e14610644578063ec8ac4d81461069b578063fc0c546a146106df57610166565b80638456cb591461056e578063b3f05b9714610585578063b7a8807c146105b457610166565b806351cff8d9146103ca578063521eb2731461041b5780635c975abb146104725780636ef8d66d146104a157806370a08231146104b857806382dc1ec41461051d57610166565b80634042b66f116101235780634042b66f1461029657806346fbf68e146102c157806347535d7b1461032a5780634b6753bc146103595780634bb278f3146103845780634f9359451461039b57610166565b8063048a6a5c146101785780631515bc2b146101cf578063234ea19c146101fe5780632c4e722e14610229578063355274ea146102545780633f4ba83a1461027f575b610176610171610736565b61073e565b005b34801561018457600080fd5b5061018d6108c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101db57600080fd5b506101e46108f3565b604051808215151515815260200191505060405180910390f35b34801561020a57600080fd5b506102136108ff565b6040518082815260200191505060405180910390f35b34801561023557600080fd5b5061023e610909565b6040518082815260200191505060405180910390f35b34801561026057600080fd5b50610269610913565b6040518082815260200191505060405180910390f35b34801561028b57600080fd5b5061029461091d565b005b3480156102a257600080fd5b506102ab610a8b565b6040518082815260200191505060405180910390f35b3480156102cd57600080fd5b50610310600480360360208110156102e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a95565b604051808215151515815260200191505060405180910390f35b34801561033657600080fd5b5061033f610ab2565b604051808215151515815260200191505060405180910390f35b34801561036557600080fd5b5061036e610acd565b6040518082815260200191505060405180910390f35b34801561039057600080fd5b50610399610ad7565b005b3480156103a757600080fd5b506103b0610c49565b604051808215151515815260200191505060405180910390f35b3480156103d657600080fd5b50610419600480360360208110156103ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c5d565b005b34801561042757600080fd5b50610430610cc6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047e57600080fd5b50610487610cf0565b604051808215151515815260200191505060405180910390f35b3480156104ad57600080fd5b506104b6610d07565b005b3480156104c457600080fd5b50610507600480360360208110156104db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d19565b6040518082815260200191505060405180910390f35b34801561052957600080fd5b5061056c6004803603602081101561054057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d62565b005b34801561057a57600080fd5b50610583610dd3565b005b34801561059157600080fd5b5061059a610f42565b604051808215151515815260200191505060405180910390f35b3480156105c057600080fd5b506105c9610f59565b6040518082815260200191505060405180910390f35b3480156105eb57600080fd5b5061062e6004803603602081101561060257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f63565b6040518082815260200191505060405180910390f35b34801561065057600080fd5b50610659610fac565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106dd600480360360208110156106b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061073e565b005b3480156106eb57600080fd5b506106f4610fd6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600033905090565b6000809054906101000a900460ff166107bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60008060006101000a81548160ff02191690831515021790555060003490506107e88282610fff565b60006107f3826110e5565b905061080a8260035461110890919063ffffffff16565b60038190555061081a8382611190565b8273ffffffffffffffffffffffffffffffffffffffff16610839610736565b73ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a361089883836114c1565b6108a06114c5565b6108aa8383611530565b505060016000806101000a81548160ff02191690831515021790555050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006008544211905090565b6000601054905090565b6000600254905090565b6000600454905090565b61092d610928610736565b610a95565b610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806122c46030913960400191505060405180910390fd5b600660009054906101000a900460ff16610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610a48610736565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000600354905090565b6000610aab82600561153490919063ffffffff16565b9050919050565b60006007544210158015610ac857506008544211155b905090565b6000600854905090565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806122f46025913960400191505060405180910390fd5b610b85610f42565b15610bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43343243726f776453616c653a20616c72656164792066696e616c697a65640081525060200191505060405180910390fd5b6001601160006101000a81548160ff021916908315150217905550610c1b611612565b7f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183660405160405180910390a1565b6000600454610c56610a8b565b1015905090565b610c65610f42565b610cba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806124456023913960400191505060405180910390fd5b610cc38161161c565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600660009054906101000a900460ff16905090565b610d17610d12610736565b6119dd565b565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d72610d6d610736565b610a95565b610dc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806122c46030913960400191505060405180910390fd5b610dd081611a37565b50565b610de3610dde610736565b610a95565b610e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806122c46030913960400191505060405180910390fd5b600660009054906101000a900460ff1615610ebb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610eff610736565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000601160009054906101000a900460ff16905090565b6000600754905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611007610ab2565b611079576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b611081610f42565b156110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806123b56027913960400191505060405180910390fd5b6110e18282611a91565b5050565b60006111016110f2610909565b83611b1990919063ffffffff16565b9050919050565b600080828401905083811015611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006111bf600a6111b16111a26108ff565b85611b1990919063ffffffff16565b611b9f90919063ffffffff16565b905060006111d68284611be990919063ffffffff16565b905061122a81600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461110890919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112bf82600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461110890919063ffffffff16565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061132e600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611c33565b6113bf611339610fac565b73ffffffffffffffffffffffffffffffffffffffff1663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137e57600080fd5b505afa158015611392573d6000803e3d6000fd5b505050506040513d60208110156113a857600080fd5b810190808051906020019092919050505083611c33565b6113c7610fac565b73ffffffffffffffffffffffffffffffffffffffff16634bbc170a8584600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156114a357600080fd5b505af11580156114b7573d6000803e3d6000fd5b5050505050505050565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561152d573d6000803e3d6000fd5b50565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806123936022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161a611d72565b565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082116116fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061233a6038913960400191505060405180910390fd5b60008111611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612406603f913960400191505060405180910390fd5b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166330e0789e611826610fd6565b85856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156118c457600080fd5b505af11580156118d8573d6000803e3d6000fd5b50505050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166330e0789e6119226108c9565b85846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156119c057600080fd5b505af11580156119d4573d6000803e3d6000fd5b50505050505050565b6119f1816005611d7490919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b611a4b816005611e3190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b611a99610ab2565b611b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b611b158282611f0c565b5050565b600080831415611b2c5760009050611b99565b6000828402905082848281611b3d57fe5b0414611b94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806123726021913960400191505060405180910390fd5b809150505b92915050565b6000611be183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611f9d565b905092915050565b6000611c2b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612063565b905092915050565b611c3b610fd6565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cc157600080fd5b505af1158015611cd5573d6000803e3d6000fd5b505050506040513d6020811015611ceb57600080fd5b8101908080519060200190929190505050611d6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4d696e74656443726f776473616c653a206d696e74696e67206661696c65640081525060200191505060405180910390fd5b5050565b565b611d7e8282611534565b611dd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806123196021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611e3b8282611534565b15611eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900460ff1615611f8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611f998282612123565b5050565b60008083118290612049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561200e578082015181840152602081019050611ff3565b50505050905090810190601f16801561203b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161205557fe5b049050809150509392505050565b6000838311158290612110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120d55780820151818401526020810190506120ba565b50505050905090810190601f1680156121025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b61212d82826121c2565b60045461214a8261213c610a8b565b61110890919063ffffffff16565b11156121be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43617070656443726f776473616c653a2063617020657863656564656400000081525060200191505060405180910390fd5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806123dc602a913960400191505060405180910390fd5b60008114156122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a20776569416d6f756e7420697320300000000000000081525060200191505060405180910390fd5b505056fe506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6543343243726f776453616c653a206d7573742062652063616c6c6564206279206f776e6572526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737346696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a656443726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e79206c6f636b657220746f6b656e7346696e616c697a61626c6543726f776473616c653a206e6f742066696e616c697a6564a265627a7a7231582022a0d613d426e1677e789248f7a569f2be294d6c4261602db38fbc537e591b2664736f6c634300050f0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e60000000000000000000000000000000000000000000000d8d726b7177a800000000000000000000000000000aae49be2f2178fcdf81552405311aabfaf705dfb000000000000000000000000000000000000000000000000000000005f7867c0000000000000000000000000000000000000000000000000000000005f7eff40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000008a840a446bad3269122abe7f638d969a993ee64000000000000000000000000d1471cf969b76a734d76645ad08eec7efae293e70000000000000000000000009974a81446a1ed97c50d93df441421508de6624a
-----Decoded View---------------
Arg [0] : rate (uint256): 230
Arg [1] : cap (uint256): 4000000000000000000000
Arg [2] : wallet (address): 0xAAe49BE2f2178FCdF81552405311AabFaf705DFB
Arg [3] : openingTime (uint256): 1601726400
Arg [4] : closingTime (uint256): 1602158400
Arg [5] : lockRate (uint256): 8
Arg [6] : token (address): 0x08A840a446baD3269122aBE7f638D969A993Ee64
Arg [7] : lockerToken (address): 0xd1471CF969B76a734D76645Ad08Eec7EFAE293E7
Arg [8] : locker (address): 0x9974A81446a1ED97c50D93dF441421508de6624a
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e6
Arg [1] : 0000000000000000000000000000000000000000000000d8d726b7177a800000
Arg [2] : 000000000000000000000000aae49be2f2178fcdf81552405311aabfaf705dfb
Arg [3] : 000000000000000000000000000000000000000000000000000000005f7867c0
Arg [4] : 000000000000000000000000000000000000000000000000000000005f7eff40
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 00000000000000000000000008a840a446bad3269122abe7f638d969a993ee64
Arg [7] : 000000000000000000000000d1471cf969b76a734d76645ad08eec7efae293e7
Arg [8] : 0000000000000000000000009974a81446a1ed97c50d93df441421508de6624a
Deployed Bytecode Sourcemap
62494:1818:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21836:23;21846:12;:10;:12::i;:::-;21836:9;:23::i;:::-;62494:1818;60265:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60265:103:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;46221:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46221:159:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;60177:80;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60177:80:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22269:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22269:77:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39229:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39229:75:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43018:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43018:120:0;;;:::i;:::-;;22414:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22414:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40497:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40497:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40497:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45859:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45859:192:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45678:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45678:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;63683:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63683:206:0;;;:::i;:::-;;39428:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39428:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;63897:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63897:162:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;63897:162:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;22090:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22090:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42225:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42225:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40714:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40714:79:0;;;:::i;:::-;;61177:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61177:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61177:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40614:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40614:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40614:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;42805:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42805:118:0;;;:::i;:::-;;63378:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63378:84:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45517:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45517:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61295:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61295:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61295:127:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60082:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60082:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22766:622;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22766:622:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21931:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21931:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;858:98;903:15;938:10;931:17;;858:98;:::o;22766:622::-;18519:11;;;;;;;;;;;18511:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18658:5;18644:11;;:19;;;;;;;;;;;;;;;;;;22845:17;22865:9;22845:29;;22885:44;22906:11;22919:9;22885:20;:44::i;:::-;22991:14;23008:26;23024:9;23008:15;:26::i;:::-;22991:43;;23085:25;23100:9;23085:10;;:14;;:25;;;;:::i;:::-;23072:10;:38;;;;23123:37;23140:11;23153:6;23123:16;:37::i;:::-;23206:11;23176:61;;23192:12;:10;:12::i;:::-;23176:61;;;23219:9;23230:6;23176:61;;;;;;;;;;;;;;;;;;;;;;;;23250:46;23273:11;23286:9;23250:22;:46::i;:::-;23309:15;:13;:15::i;:::-;23335:45;23357:11;23370:9;23335:21;:45::i;:::-;18676:1;;18838:4;18824:11;;:18;;;;;;;;;;;;;;;;;;22766:622;:::o;60265:103::-;60308:19;60347:13;;;;;;;;;;;60340:20;;60265:103;:::o;46221:159::-;46263:4;46360:12;;46342:15;:30;46335:37;;46221:159;:::o;60177:80::-;60217:7;60244:5;;60237:12;;60177:80;:::o;22269:77::-;22306:7;22333:5;;22326:12;;22269:77;:::o;39229:75::-;39265:7;39292:4;;39285:11;;39229:75;:::o;43018:120::-;40394:22;40403:12;:10;:12::i;:::-;40394:8;:22::i;:::-;40386:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42661:7;;;;;;;;;;;42653:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43087:5;43077:7;;:15;;;;;;;;;;;;;;;;;;43108:22;43117:12;:10;:12::i;:::-;43108:22;;;;;;;;;;;;;;;;;;;;;;43018:120::o;22414:87::-;22456:7;22483:10;;22476:17;;22414:87;:::o;40497:109::-;40553:4;40577:21;40590:7;40577:8;:12;;:21;;;;:::i;:::-;40570:28;;40497:109;;;:::o;45859:192::-;45898:4;45996:12;;45977:15;:31;;:66;;;;;46031:12;;46012:15;:31;;45977:66;45970:73;;45859:192;:::o;45678:91::-;45722:7;45749:12;;45742:19;;45678:91;:::o;63683:206::-;63303:5;;;;;;;;;;;63289:19;;:10;:19;;;63281:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63740:11;:9;:11::i;:::-;63739:12;63731:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63813:4;63800:10;;:17;;;;;;;;;;;;;;;;;;63830:15;:13;:15::i;:::-;63861:20;;;;;;;;;;63683:206::o;39428:94::-;39471:4;39510;;39495:11;:9;:11::i;:::-;:19;;39488:26;;39428:94;:::o;63897:162::-;63962:11;:9;:11::i;:::-;63954:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64024:27;64039:11;64024:14;:27::i;:::-;63897:162;:::o;22090:89::-;22129:15;22164:7;;;;;;;;;;;22157:14;;22090:89;:::o;42225:78::-;42264:4;42288:7;;;;;;;;;;;42281:14;;42225:78;:::o;40714:79::-;40758:27;40772:12;:10;:12::i;:::-;40758:13;:27::i;:::-;40714:79::o;61177:110::-;61234:7;61261:9;:18;61271:7;61261:18;;;;;;;;;;;;;;;;61254:25;;61177:110;;;:::o;40614:92::-;40394:22;40403:12;:10;:12::i;:::-;40394:8;:22::i;:::-;40386:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40679:19;40690:7;40679:10;:19::i;:::-;40614:92;:::o;42805:118::-;40394:22;40403:12;:10;:12::i;:::-;40394:8;:22::i;:::-;40386:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42462:7;;;;;;;;;;;42461:8;42453:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42875:4;42865:7;;:14;;;;;;;;;;;;;;;;;;42895:20;42902:12;:10;:12::i;:::-;42895:20;;;;;;;;;;;;;;;;;;;;;;42805:118::o;63378:84::-;63420:4;63444:10;;;;;;;;;;;63437:17;;63378:84;:::o;45517:91::-;45561:7;45588:12;;45581:19;;45517:91;:::o;61295:127::-;61362:7;61389:16;:25;61406:7;61389:25;;;;;;;;;;;;;;;;61382:32;;61295:127;;;:::o;60082:87::-;60120:14;60154:7;;;;;;;;;;;60147:14;;60082:87;:::o;21931:78::-;21969:6;21995;;;;;;;;;;;21988:13;;21931:78;:::o;64067:242::-;44731:8;:6;:8::i;:::-;44723:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64185:11;:9;:11::i;:::-;64184:12;64176:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64251:50;64278:11;64291:9;64251:26;:50::i;:::-;64067:242;;:::o;63552:123::-;63619:7;63646:21;63660:6;:4;:6::i;:::-;63646:9;:13;;:21;;;;:::i;:::-;63639:28;;63552:123;;;:::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;61820:576::-;61908:18;61929:35;61961:2;61929:27;61945:10;:8;:10::i;:::-;61929:11;:15;;:27;;;;:::i;:::-;:31;;:35;;;;:::i;:::-;61908:56;;61975:22;62000:27;62016:10;62000:11;:15;;:27;;;;:::i;:::-;61975:52;;62063:42;62090:14;62063:9;:22;62073:11;62063:22;;;;;;;;;;;;;;;;:26;;:42;;;;:::i;:::-;62038:9;:22;62048:11;62038:22;;;;;;;;;;;;;;;:67;;;;62148:45;62182:10;62148:16;:29;62165:11;62148:29;;;;;;;;;;;;;;;;:33;;:45;;;;:::i;:::-;62116:16;:29;62133:11;62116:29;;;;;;;;;;;;;;;:77;;;;62204:47;62227:6;;;;;;;;;;;62236:14;62204;:47::i;:::-;62262:53;62285:8;:6;:8::i;:::-;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62285:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62285:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62285:16:0;;;;;;;;;;;;;;;;62304:10;62262:14;:53::i;:::-;62326:8;:6;:8::i;:::-;:13;;;62340:11;62353:10;62373:13;;;;;;;;;;;62326:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62326:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62326:62:0;;;;61820:576;;;;:::o;25890:147::-;;;:::o;26507:80::-;26552:7;;;;;;;;;;;:16;;:27;26569:9;26552:27;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26552:27:0;26507:80::o;24624:151::-;;;:::o;35751:203::-;35823:4;35867:1;35848:21;;:7;:21;;;;35840:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35926:4;:11;;:20;35938:7;35926:20;;;;;;;;;;;;;;;;;;;;;;;;;35919:27;;35751:203;;;;:::o;63470:74::-;63515:21;:19;:21::i;:::-;63470:74::o;60509:599::-;60574:14;60591:9;:22;60601:11;60591:22;;;;;;;;;;;;;;;;60574:39;;60624:25;60652:16;:29;60669:11;60652:29;;;;;;;;;;;;;;;;60624:57;;60709:1;60700:6;:10;60692:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60810:1;60790:17;:21;60782:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60917:1;60892:9;:22;60902:11;60892:22;;;;;;;;;;;;;;;:26;;;;60961:1;60929:16;:29;60946:11;60929:29;;;;;;;;;;;;;;;:33;;;;60973:6;;;;;;;;;;;:16;;;60990:7;:5;:7::i;:::-;60999:11;61012:6;60973:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60973:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60973:46:0;;;;61030:13;;;;;;;;;;;:23;;;61054:13;:11;:13::i;:::-;61069:11;61082:17;61030:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61030:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61030:70:0;;;;60509:599;;;:::o;40931:130::-;40991:24;41007:7;40991:8;:15;;:24;;;;:::i;:::-;41045:7;41031:22;;;;;;;;;;;;40931:130;:::o;40801:122::-;40858:21;40871:7;40858:8;:12;;:21;;;;:::i;:::-;40907:7;40895:20;;;;;;;;;;;;40801:122;:::o;46580:167::-;44731:8;:6;:8::i;:::-;44723:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46689:50;46716:11;46729:9;46689:26;:50::i;:::-;46580:167;;:::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;5445:136::-;5503:7;5530:43;5534:1;5537;5530:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5523:50;;5445:136;;;;:::o;38256:315::-;38460:7;:5;:7::i;:::-;38438:36;;;38475:11;38488;38438:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38438:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38438:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38438:62:0;;;;;;;;;;;;;;;;38416:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38256:315;;:::o;48598:100::-;:::o;35473:183::-;35553:18;35557:4;35563:7;35553:3;:18::i;:::-;35545:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35643:5;35620:4;:11;;:20;35632:7;35620:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;35473:183;;:::o;35215:178::-;35293:18;35297:4;35303:7;35293:3;:18::i;:::-;35292:19;35284:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35381:4;35358;:11;;:20;35370:7;35358:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;35215:178;;:::o;43833:::-;42462:7;;;;;;;;;;;42461:8;42453:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43951:52;43978:12;43992:10;43951:26;:52::i;:::-;43833:178;;:::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;5918:192::-;6004:7;6037:1;6032;:6;;6040:12;6024:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;6024:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6064:9;6080:1;6076;:5;6064:17;;6101:1;6094:8;;;5918:192;;;;;:::o;39725:240::-;39820:50;39847:11;39860:9;39820:26;:50::i;:::-;39919:4;;39889:26;39905:9;39889:11;:9;:11::i;:::-;:15;;:26;;;;:::i;:::-;:34;;39881:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39725:240;;:::o;23941:380::-;24067:1;24044:25;;:11;:25;;;;24036:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24148:1;24135:9;:14;;24127:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23941:380;;:::o
Swarm Source
bzzr://df9958b75c62e6e2159c9778cf31a665ea05443555c048ac7e382e4ec309514a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.