Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 692 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.022158 | ||||
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.011079 | ||||
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.00175048 | ||||
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.0155106 | ||||
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.0177264 | ||||
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.00186127 | ||||
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.00177264 | ||||
Transfer | 11067955 | 1477 days ago | IN | 2 ETH | 0.00179479 | ||||
Transfer | 10983601 | 1490 days ago | IN | 0 ETH | 0.001008 | ||||
Transfer | 10983591 | 1490 days ago | IN | 0 ETH | 0.00105 | ||||
Transfer | 10961347 | 1493 days ago | IN | 0.5 ETH | 0.00159537 | ||||
Transfer | 10961341 | 1493 days ago | IN | 0.5 ETH | 0.00315 | ||||
Transfer | 10961330 | 1493 days ago | IN | 0.5 ETH | 0.001512 | ||||
Transfer | 10961327 | 1493 days ago | IN | 0.5 ETH | 0.001512 | ||||
Transfer | 10951282 | 1495 days ago | IN | 0.2867 ETH | 0.00148458 | ||||
Transfer | 10951107 | 1495 days ago | IN | 0.5 ETH | 0.00299797 | ||||
Transfer | 10951097 | 1495 days ago | IN | 0.5 ETH | 0.00304672 | ||||
Transfer | 10951093 | 1495 days ago | IN | 0.5 ETH | 0.00304672 | ||||
Withdraw Funds | 10950952 | 1495 days ago | IN | 0 ETH | 0.00590989 | ||||
Transfer | 10950865 | 1495 days ago | IN | 0.13 ETH | 0.00321291 | ||||
Transfer | 10950843 | 1495 days ago | IN | 0.33 ETH | 0.00872707 | ||||
Transfer | 10950838 | 1495 days ago | IN | 1 ETH | 0.01258778 | ||||
Has Started | 10950838 | 1495 days ago | IN | 0 ETH | 0.00222773 | ||||
Transfer | 10950819 | 1495 days ago | IN | 0.13 ETH | 0.01381817 | ||||
Transfer | 10950815 | 1495 days ago | IN | 0.25 ETH | 0.012929 |
Latest 9 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10950952 | 1495 days ago | 159.43105771 ETH | ||||
10950952 | 1495 days ago | 372.00580134 ETH | ||||
10924388 | 1499 days ago | 0.32 ETH | ||||
10899429 | 1503 days ago | 21.31215375 ETH | ||||
10899429 | 1503 days ago | 49.72835875 ETH | ||||
10873399 | 1507 days ago | 41.50047183 ETH | ||||
10873399 | 1507 days ago | 96.83443427 ETH | ||||
10847523 | 1511 days ago | 47.1 ETH | ||||
10847523 | 1511 days ago | 109.9 ETH |
Loading...
Loading
Contract Name:
IPMCrowdSale
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-10 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.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. */ 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ 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 // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @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 Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.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 IERC20;` 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // 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. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/crowdsale/crowdsale.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.2; interface ERCMintable { //function crowdSaleMint(address to, uint256 amount) external returns(bool); function mint(address to, uint256 amount) external; } /** * @title IPM Token CrowdSale * @dev CrowdSale contract for IPM Token: * * Tokens for Sale: 9M IPM * Minted on demand up to the hard cap per round. * Unsold supply won't be minted and will result in a * lower circulating supply after the sale. Unsold tokens of each round * don't transfer to the next round * * PRIVATE ROUND: * - whitelisted * - garuanteed allocation, overminted gets reduced from last round * - duration of 2 days (10.09.2020 - 12.09.2020) * - Min-Max allocation per address 2 ETH - 50 ETH * - 1M flexible Cap (ETH price on launch could result in more) * - 1 IPM = ~0.15 USD * * ROUND 1: * - duration of 2 days (14.09.2020 - 16.09.2020) * - 1 IPM = ~0.2 USD * - 1M IPM Hard Cap * * ROUND 2: * - duration of 2 days (18.09.2020 - 20.09.2020) * - 1 IPM = 0.3 USD * - 2M IPM Hard Cap * * ROUND 3: * - duration of 6 days (22.09.2020 - 28.09.2020) * - 1 IPM = 0.4 USD * - 5M IPM Hard Cap (possible less, based on private round) * * After CrowdSale: * Cooldown phase of 5 days begins * and will unpause all tokens. * * More at https://timers.network/ * * @author @KTimersnetwork */ contract IPMCrowdSale { using SafeMath for uint256; ////////////////////////////////////// // Contract configuration // ////////////////////////////////////// // owner address owner; // allow pausing of contract to halt everything beside // administrative functions bool public paused = true; // min payment for private round uint256 public constant PRIVATE_PAYMENT_MIN = 2 ether; // min payment for other rounds uint256 public constant PUBLIC_PAYMENT_MIN = 0.1 ether; // max payment is always equal uint256 public constant PAYMENT_MAX = 50 ether; // crowdsale can mint 9m IPM at maximum for all rounds uint256 public constant MAXIMUM_MINTABLE_TOKENS = 9000000000000000000000000; // start of private round 09/10/2020 @ 12:00pm UTC uint256 public constant PRIVATE_ROUND_START = 1599739200; // end of private round 09/12/2020 @ 12:00pm UTC uint256 public constant PRIVATE_ROUND_END = 1599912000; // private sale limit 1m uint256 public constant PRIVATE_ROUND_CAP = 1000000 * (10**18); // start of round 1 09/14/2020 @ 12:00pm UTC uint256 public constant ROUND_1_START = 1600084800; // end of round 1 09/16/2020 @ 12:00pm UTC uint256 public constant ROUND_1_END = 1600257600; // round 1 sale limit 1m uint256 public constant ROUND_1_CAP = 1000000 * (10**18); // start of round 2 09/18/2020 @ 12:00pm UTC uint256 public constant ROUND_2_START = 1600430400; // end of round 2 09/20/2020 @ 12:00pm UTC uint256 public constant ROUND_2_END = 1600603200; // round 2 sale limit 2m uint256 public constant ROUND_2_CAP = 2000000 * (10**18); // start of round 3 09/22/2020 @ 12:00pm UTC uint256 public constant ROUND_3_START = 1600776000; // end of round 3 09/28/2020 @ 12:00pm UTC uint256 public constant ROUND_3_END = 1601294400; // round 3 sale limit 5m uint256 public constant ROUND_3_CAP = 5000000 * (10**18); // sold tokens private round uint256 public privateRoundSold; // sold tokens round 1 uint256 public round1Sold; // sold tokens round 2 uint256 public round2Sold; // sold tokens round 3 uint256 public round3Sold; // private round white list mapping(address => uint256) public whitelist; // contributors mapping(address => uint256) public contributors; // current rate uint256 public ipmPerETH; // IPM token references address public ipmTokenAddress; // withdrawal address public foundation1Address; address public foundation2Address; ////////////////////////////////////// // Control functions / modifiers // ////////////////////////////////////// function isPrivateRoundActive() public view returns(bool) { return (now >= PRIVATE_ROUND_START && now < PRIVATE_ROUND_END); } function isRound1Active() public view returns(bool) { return (now >= ROUND_1_START && now < ROUND_1_END); } function isRound2Active() public view returns(bool) { return (now >= ROUND_2_START && now < ROUND_2_END); } function isRound3Active() public view returns(bool) { return (now >= ROUND_3_START && now < ROUND_3_END); } function hasStarted() public view returns(bool) { return (now > PRIVATE_ROUND_START); } function hasEnded() public view returns(bool) { return (now > ROUND_3_END); } modifier onlyOwner() { require(msg.sender == owner); _; } modifier ifPaused() { require(paused == true); _; } modifier ifNotPaused() { require(paused == false); _; } modifier saleActive() { require(hasStarted() == true, "Error: Sale has not started"); require(hasEnded() == false, "Error: Sale has already ended"); require(isPrivateRoundActive() || isRound1Active() || isRound2Active() || isRound3Active(), "Error: No round active at the moment"); _; } ////////////////////////////////////// // Events // ////////////////////////////////////// event IPMPurchase( address indexed beneficiary, uint256 tokensPurchased, uint256 weiUsed ); ////////////////////////////////////// // Implementation // ////////////////////////////////////// constructor() public { paused = true; owner = msg.sender; } function getCurrentIPMRatio() external view returns(uint256) { return ipmPerETH; } function getCurrentRound() external view returns(string memory) { if(hasEnded()) { return "Finished"; } if(isRound1Active()) { return "Pre-Sale Round 1"; } else if(isRound2Active()) { return "Pre-Sale Round 2"; } else if(isRound3Active()) { return "Pre-Sale Round 3"; } return "Private Sale"; } function getCurrentCap() public view returns (uint256) { if(hasEnded()) { return 0; } if(isRound1Active()) { return ROUND_1_CAP; } else if(isRound2Active()) { return ROUND_2_CAP; } else if(isRound3Active()) { return ROUND_3_CAP; } return PRIVATE_ROUND_CAP; } /** * @dev Used to update the current eth price of 1 IPM * Function is needed to set the final price ahead * of each round and for possible big price changes * of eth itself to keep somewhat stable usd prices */ function updateIPMPerETH(uint256 _tokens) external onlyOwner { require(hasEnded() == false, "Error: CrowdSale has ended, no need to update ratio"); require(_tokens > 0, "Error: IPM per ETH can't be 0"); require(_tokens != ipmPerETH, "Error: Prices are identical, no changes needed"); require(_tokens < 100000, "Error: Amount of tokens per ETH seems unrealistically high. Input error?"); ipmPerETH = _tokens; } function unpause() external onlyOwner ifPaused { paused = false; } function pause() external onlyOwner ifNotPaused { paused = true; } function getTokenAddress() external view returns(address) { return ipmTokenAddress; } function setIPMTokenContract(address _token) external onlyOwner ifPaused { ipmTokenAddress = _token; } function setWhitelist(address[] calldata _beneficiaries, uint256[] calldata _weiAmounts) external onlyOwner { require(_beneficiaries.length > 0, "Error: Beneficiaries are empty"); require(_weiAmounts.length > 0, "Error: Investments are empty"); require(_beneficiaries.length == _weiAmounts.length, "Error: Addresses length is not equal investments"); for(uint256 i=0;i<_beneficiaries.length;i++) { whitelist[_beneficiaries[i]] = _weiAmounts[i]; } } function addOrUpdateWhitelistEntry(address _beneficiary, uint256 _weiAmount) external onlyOwner { require(_weiAmount >= PRIVATE_PAYMENT_MIN, "Error: Investment is below private sell minimum"); require(_weiAmount <= PAYMENT_MAX, "Error: Investment is above maximum sell amount"); whitelist[_beneficiary] = _weiAmount; } function removeWhitelistEntry(address _beneficiary) external onlyOwner { require(whitelist[_beneficiary] > 0, "Error: Address is not whitelisted"); whitelist[_beneficiary] = 0; delete whitelist[_beneficiary]; } function isWhitelisted(address _beneficiary) public view returns(bool) { require(_beneficiary != address(0), 'Error: Address cannot be empty'); return (whitelist[_beneficiary] > 0) ? true:false; } function setFoundation1Address(address _foundationAddress) external onlyOwner { require(_foundationAddress != address(0), 'Error: Address cannot be empty'); foundation1Address = _foundationAddress; } function setFoundation2Address(address _foundationAddress) external onlyOwner { require(_foundationAddress != address(0), 'Error: Address cannot be empty'); foundation2Address = _foundationAddress; } function withdrawFunds() external onlyOwner { require(hasStarted() == true, "Error: No reason to withdraw funds before sale has started"); require( isPrivateRoundActive() == false && isRound1Active() == false && isRound2Active() == false && isRound3Active() == false, "Error: Withdrawal during active rounds is not allowed" ); require(foundation1Address != address(0), 'Error: No foundation1 wallet set'); require(foundation2Address != address(0), 'Error: No foundation2 wallet set'); uint256 fundsAvailable = address(this).balance; require(fundsAvailable > 0, "Error: No funds available to withdraw"); uint256 amountForFoundation1Wallet = fundsAvailable.div(100).mul(70); uint256 amountForFoundation2Wallet = fundsAvailable.sub(amountForFoundation1Wallet); require(amountForFoundation1Wallet.add(amountForFoundation2Wallet) == fundsAvailable, "Error: Amount to be sent is not equal the funds"); payable(foundation1Address).transfer(amountForFoundation1Wallet); payable(foundation2Address).transfer(amountForFoundation2Wallet); } /** * @dev Default fallback function that will also allow * the contract owner to deposit additional ETH, * without triggering the IPM purchase functionality. */ receive() external payable { require(msg.value > 0, "Error: No ether received. Msg.value is empty"); // no need for owner to buy if(msg.sender != owner) { // let others buy tokens _buyTokens(msg.sender, msg.value); } } function _buyTokens(address _beneficiary, uint256 _amountPayedInWei) internal saleActive { require(_beneficiary != address(0), "Error: Burn/Mint address cant purchase tokens"); require(_hasAllowance(_beneficiary), "Error: Address is not allowed to purchase"); require(_amountPayedInWei <= PAYMENT_MAX, "Error: Paymed exceeds maximum single purchase"); uint256 tokensForPayment = _calculateTokensForPayment(_amountPayedInWei); uint256 tokensLeft = _getCurrentRemainingIPM(); require(tokensForPayment > 0, "Error: payment too low. no tokens for this wei amount"); require(tokensLeft > 0, "Error: No tokens left for this round"); require(tokensLeft >= tokensForPayment, "Error: Purchase exceeds remaining tokens for this round"); if(isPrivateRoundActive()) { uint256 alreadyPurchased = contributors[_beneficiary]; uint256 allowedToPurchase = whitelist[_beneficiary]; if(alreadyPurchased == 0) { require(_amountPayedInWei >= PRIVATE_PAYMENT_MIN, "Error: Payment smaller than minimum payment"); } uint256 combinedPurchase = alreadyPurchased.add(_amountPayedInWei); require(combinedPurchase <= allowedToPurchase, "Error: This purchase exceeds the whitelisted limited"); } require(_amountPayedInWei >= PUBLIC_PAYMENT_MIN, "Error: Payment smaller than minimum payment"); ERCMintable(ipmTokenAddress).mint(_beneficiary, tokensForPayment); if(isRound1Active()) { round1Sold = round1Sold.add(tokensForPayment); } else if(isRound2Active()) { round2Sold = round2Sold.add(tokensForPayment); } else if(isRound3Active()) { round3Sold = round3Sold.add(tokensForPayment); } else { privateRoundSold = privateRoundSold.add(tokensForPayment); } contributors[_beneficiary] = contributors[_beneficiary].add(_amountPayedInWei); emit IPMPurchase( _beneficiary, tokensForPayment, _amountPayedInWei ); } function _calculateTokensForPayment(uint256 payedWei) internal view returns(uint256) { require(payedWei > 0, "Error: Invalid wei amount"); return payedWei.mul(ipmPerETH); } function _hasAllowance(address _beneficiary) internal view returns(bool) { if(isPrivateRoundActive()) { return (whitelist[_beneficiary] > 0); } return true; } function _getCurrentRemainingIPM() internal view returns(uint256) { if(isRound1Active()) { return ROUND_1_CAP.sub(round1Sold); } else if(isRound2Active()) { return ROUND_2_CAP.sub(round2Sold); } else if(isRound3Active()) { return ROUND_3_CAP.sub(round3Sold.add(_getPrivateRoundOverhead())); } return PRIVATE_ROUND_CAP.add(ROUND_3_CAP).sub(privateRoundSold); } function _getPrivateRoundOverhead() internal view returns(uint256) { if(privateRoundSold > PRIVATE_ROUND_CAP) { return privateRoundSold.sub(PRIVATE_ROUND_CAP); } return 0; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensPurchased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weiUsed","type":"uint256"}],"name":"IPMPurchase","type":"event"},{"inputs":[],"name":"MAXIMUM_MINTABLE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMENT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_PAYMENT_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_ROUND_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_ROUND_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_ROUND_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PAYMENT_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_1_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_1_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_1_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_2_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_2_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_2_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_3_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_3_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_3_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_weiAmount","type":"uint256"}],"name":"addOrUpdateWhitelistEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundation1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundation2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIPMRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRound","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ipmPerETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ipmTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPrivateRoundActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRound1Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRound2Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRound3Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateRoundSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"removeWhitelistEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"round1Sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"round2Sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"round3Sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_foundationAddress","type":"address"}],"name":"setFoundation1Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_foundationAddress","type":"address"}],"name":"setFoundation2Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setIPMTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"_weiAmounts","type":"uint256[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"updateIPMPerETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000805460ff60a01b1916600160a01b17905534801561002357600080fd5b50600080546001600160a01b031960ff60a01b19909116600160a01b171633179055612356806100546000396000f3fe6080604052600436106102975760003560e01c80637c99b6c81161015a578063d7bdf637116100c1578063ecb70fb71161007a578063ecb70fb714610808578063ece7328a1461081d578063f013e0e114610832578063f216718214610901578063f3d377461461092b578063f62516ca14610940576102f9565b8063d7bdf6371461078a578063d8c307001461079f578063db937190146107b4578063dfef26c1146107c9578063e6bb9b94146107de578063e75f1292146107f3576102f9565b8063a32bf59711610113578063a32bf597146106ac578063a812108414610736578063b97e93f61461074b578063be68beda14610760578063c4645cc914610775578063d7bd1185146104ab576102f9565b80637c99b6c8146105ce5780637ca0294d146106015780638456cb591461063a57806386d0b48c1461064f5780639b19251a146106645780639d53343914610697576102f9565b8063270bf499116101fe57806344691f7e116101b757806344691f7e1461053257806344e4f334146105475780635c975abb1461055c57806360c9a5f81461057157806366d27d1a146105a457806374e129c8146105b9576102f9565b8063270bf499146104965780632a511c3b146104ab5780633804ad79146104c05780633af32abf146104d55780633d960ec3146105085780633f4ba83a1461051d576102f9565b80631a3d948a116102505780631a3d948a146103dc5780631f6d49421461040f5780631fbe327514610442578063203921601461045757806324600fc31461046c57806324b9f4c414610481576102f9565b8063010e4284146102fe5780630672a86914610331578063082f9bd4146103625780630a5461591461038b57806310fe9ae8146103b257806312182bd8146103c7576102f9565b366102f957600034116102db5760405162461bcd60e51b815260040180806020018281038252602c815260200180612085602c913960400191505060405180910390fd5b6000546001600160a01b031633146102f7576102f73334610955565b005b600080fd5b34801561030a57600080fd5b506102f76004803603602081101561032157600080fd5b50356001600160a01b0316610ec2565b34801561033d57600080fd5b50610346610f47565b604080516001600160a01b039092168252519081900360200190f35b34801561036e57600080fd5b50610377610f56565b604080519115158252519081900360200190f35b34801561039757600080fd5b506103a0610f75565b60408051918252519081900360200190f35b3480156103be57600080fd5b50610346610f7d565b3480156103d357600080fd5b506103a0610f8c565b3480156103e857600080fd5b506102f7600480360360208110156103ff57600080fd5b50356001600160a01b0316610f9b565b34801561041b57600080fd5b506103a06004803603602081101561043257600080fd5b50356001600160a01b0316610fef565b34801561044e57600080fd5b50610377611001565b34801561046357600080fd5b506103a061101d565b34801561047857600080fd5b506102f7611023565b34801561048d57600080fd5b506103a06112f2565b3480156104a257600080fd5b506103a0611301565b3480156104b757600080fd5b506103a061130d565b3480156104cc57600080fd5b506103a061131b565b3480156104e157600080fd5b50610377600480360360208110156104f857600080fd5b50356001600160a01b0316611328565b34801561051457600080fd5b506103a06113b4565b34801561052957600080fd5b506102f76113ba565b34801561053e57600080fd5b506103776113fb565b34801561055357600080fd5b506103a0611405565b34801561056857600080fd5b5061037761140d565b34801561057d57600080fd5b506102f76004803603602081101561059457600080fd5b50356001600160a01b031661141d565b3480156105b057600080fd5b506103466114b1565b3480156105c557600080fd5b506103a06114c0565b3480156105da57600080fd5b506102f7600480360360208110156105f157600080fd5b50356001600160a01b03166114cf565b34801561060d57600080fd5b506102f76004803603604081101561062457600080fd5b506001600160a01b038135169060200135611563565b34801561064657600080fd5b506102f7611625565b34801561065b57600080fd5b506103a0611668565b34801561067057600080fd5b506103a06004803603602081101561068757600080fd5b50356001600160a01b031661166e565b3480156106a357600080fd5b506103a0611680565b3480156106b857600080fd5b506106c1611688565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106fb5781810151838201526020016106e3565b50505050905090810190601f1680156107285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561074257600080fd5b506103a0611791565b34801561075757600080fd5b50610377611797565b34801561076c57600080fd5b506103a06117b3565b34801561078157600080fd5b506103776117b9565b34801561079657600080fd5b506103a06117d5565b3480156107ab57600080fd5b506103a06117dd565b3480156107c057600080fd5b506103a061185f565b3480156107d557600080fd5b506103a0611867565b3480156107ea57600080fd5b506103a061186f565b3480156107ff57600080fd5b506103a0611877565b34801561081457600080fd5b5061037761187f565b34801561082957600080fd5b50610346611889565b34801561083e57600080fd5b506102f76004803603604081101561085557600080fd5b81019060208101813564010000000081111561087057600080fd5b82018360208201111561088257600080fd5b803590602001918460208302840111640100000000831117156108a457600080fd5b9193909290916020810190356401000000008111156108c257600080fd5b8201836020820111156108d457600080fd5b803590602001918460208302840111640100000000831117156108f657600080fd5b509092509050611898565b34801561090d57600080fd5b506102f76004803603602081101561092457600080fd5b50356119f1565b34801561093757600080fd5b506103a0611b28565b34801561094c57600080fd5b506103a0611b34565b61095d6113fb565b15156001146109b3576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2053616c6520686173206e6f7420737461727465640000000000604482015290519081900360640190fd5b6109bb61187f565b15610a0d576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2053616c652068617320616c726561647920656e646564000000604482015290519081900360640190fd5b610a15610f56565b80610a235750610a23611001565b80610a315750610a31611797565b80610a3f5750610a3f6117b9565b610a7a5760405162461bcd60e51b815260040180806020018281038252602481526020018061217d6024913960400191505060405180910390fd5b6001600160a01b038216610abf5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121a1602d913960400191505060405180910390fd5b610ac882611b3a565b610b035760405162461bcd60e51b81526004018080602001828103825260298152602001806121336029913960400191505060405180910390fd5b6802b5e3af16b1880000811115610b4b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121fc602d913960400191505060405180910390fd5b6000610b5682611b6a565b90506000610b62611bd4565b905060008211610ba35760405162461bcd60e51b81526004018080602001828103825260358152602001806122ec6035913960400191505060405180910390fd5b60008111610be25760405162461bcd60e51b81526004018080602001828103825260248152602001806120b16024913960400191505060405180910390fd5b81811015610c215760405162461bcd60e51b8152600401808060200182810382526037815260200180611f246037913960400191505060405180910390fd5b610c29610f56565b15610cf6576001600160a01b03841660009081526006602090815260408083205460059092529091205481610c9f57671bc16d674ec80000851015610c9f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b6000610cb1838763ffffffff611cae16565b905081811115610cf25760405162461bcd60e51b81526004018080602001828103825260348152602001806122836034913960400191505060405180910390fd5b5050505b67016345785d8a0000831015610d3d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b600854604080516340c10f1960e01b81526001600160a01b03878116600483015260248201869052915191909216916340c10f1991604480830192600092919082900301818387803b158015610d9257600080fd5b505af1158015610da6573d6000803e3d6000fd5b50505050610db2611001565b15610dd257600254610dca908363ffffffff611cae16565b600255610e39565b610dda611797565b15610dfa57600354610df2908363ffffffff611cae16565b600355610e39565b610e026117b9565b15610e2257600454610e1a908363ffffffff611cae16565b600455610e39565b600154610e35908363ffffffff611cae16565b6001555b6001600160a01b038416600090815260066020526040902054610e62908463ffffffff611cae16565b6001600160a01b038516600081815260066020908152604091829020939093558051858152928301869052805191927f62ea3479470df7563c5a39f2835a33a651f2d09d29d392aa142ada944f9fdc2b929081900390910190a250505050565b6000546001600160a01b03163314610ed957600080fd5b6001600160a01b038116600090815260056020526040902054610f2d5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f5b6021913960400191505060405180910390fd5b6001600160a01b0316600090815260056020526040812055565b6009546001600160a01b031681565b6000635f5a15404210158015610f6f5750635f5cb84042105b90505b90565b635f5cb84081565b6008546001600160a01b031690565b6a01a784379d99db4200000081565b6000546001600160a01b03163314610fb257600080fd5b600054600160a01b900460ff161515600114610fcd57600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60066020526000908152604090205481565b6000635f5f5b404210158015610f6f575050635f61fe40421090565b60025481565b6000546001600160a01b0316331461103a57600080fd5b6110426113fb565b15156001146110825760405162461bcd60e51b815260040180806020018281038252603a815260200180611f7c603a913960400191505060405180910390fd5b61108a610f56565b15801561109c575061109a611001565b155b80156110ad57506110ab611797565b155b80156110be57506110bc6117b9565b155b6110f95760405162461bcd60e51b81526004018080602001828103825260358152602001806122b76035913960400191505060405180910390fd5b6009546001600160a01b0316611156576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e312077616c6c657420736574604482015290519081900360640190fd5b600a546001600160a01b03166111b3576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e322077616c6c657420736574604482015290519081900360640190fd5b47806111f05760405162461bcd60e51b8152600401808060200182810382526025815260200180611fb66025913960400191505060405180910390fd5b6000611214604661120884606463ffffffff611d1116565b9063ffffffff611d5316565b90506000611228838363ffffffff611dac16565b90508261123b838363ffffffff611cae16565b146112775760405162461bcd60e51b815260040180806020018281038252602f815260200180612254602f913960400191505060405180910390fd5b6009546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156112b1573d6000803e3d6000fd5b50600a546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156112ec573d6000803e3d6000fd5b50505050565b6a0422ca8b0a00a42500000081565b671bc16d674ec8000081565b69d3c21bcecceda100000081565b6802b5e3af16b188000081565b60006001600160a01b038216611385576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b6001600160a01b0382166000908152600560205260409020546113a95760006113ac565b60015b90505b919050565b60035481565b6000546001600160a01b031633146113d157600080fd5b600054600160a01b900460ff1615156001146113ec57600080fd5b6000805460ff60a01b19169055565b635f5a1540421190565b635f69e74081565b600054600160a01b900460ff1681565b6000546001600160a01b0316331461143457600080fd5b6001600160a01b03811661148f576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031681565b6a0771d2fa45345aa900000081565b6000546001600160a01b031633146114e657600080fd5b6001600160a01b038116611541576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461157a57600080fd5b671bc16d674ec800008110156115c15760405162461bcd60e51b815260040180806020018281038252602f81526020018061200e602f913960400191505060405180910390fd5b6802b5e3af16b18800008111156116095760405162461bcd60e51b815260040180806020018281038252602e8152602001806120d5602e913960400191505060405180910390fd5b6001600160a01b03909116600090815260056020526040902055565b6000546001600160a01b0316331461163c57600080fd5b600054600160a01b900460ff161561165357600080fd5b6000805460ff60a01b1916600160a01b179055565b60045481565b60056020526000908152604090205481565b635f61fe4081565b606061169261187f565b156116bc5750604080518082019091526008815267119a5b9a5cda195960c21b6020820152610f72565b6116c4611001565b156116f6575060408051808201909152601081526f5072652d53616c6520526f756e64203160801b6020820152610f72565b6116fe611797565b15611730575060408051808201909152601081526f28393296a9b0b632902937bab732101960811b6020820152610f72565b6117386117b9565b1561176a575060408051808201909152601081526f5072652d53616c6520526f756e64203360801b6020820152610f72565b5060408051808201909152600c81526b507269766174652053616c6560a01b602082015290565b60015481565b6000635f64a1404210158015610f6f575050635f674440421090565b60075490565b6000635f69e7404210158015610f6f575050635f71d040421090565b635f5a154081565b60006117e761187f565b156117f457506000610f72565b6117fc611001565b15611812575069d3c21bcecceda1000000610f72565b61181a611797565b1561183157506a01a784379d99db42000000610f72565b6118396117b9565b1561185057506a0422ca8b0a00a425000000610f72565b5069d3c21bcecceda100000090565b635f67444081565b635f5f5b4081565b635f64a14081565b635f71d04081565b635f71d040421190565b6008546001600160a01b031681565b6000546001600160a01b031633146118af57600080fd5b82611901576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a2042656e656669636961726965732061726520656d7074790000604482015290519081900360640190fd5b80611953576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20496e766573746d656e74732061726520656d70747900000000604482015290519081900360640190fd5b8281146119915760405162461bcd60e51b81526004018080602001828103825260308152602001806121036030913960400191505060405180910390fd5b60005b838110156119ea578282828181106119a857fe5b90506020020135600560008787858181106119bf57fe5b602090810292909201356001600160a01b031683525081019190915260400160002055600101611994565b5050505050565b6000546001600160a01b03163314611a0857600080fd5b611a1061187f565b15611a4c5760405162461bcd60e51b8152600401808060200182810382526033815260200180611fdb6033913960400191505060405180910390fd5b60008111611aa1576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2049504d20706572204554482063616e27742062652030000000604482015290519081900360640190fd5b600754811415611ae25760405162461bcd60e51b815260040180806020018281038252602e8152602001806121ce602e913960400191505060405180910390fd5b620186a08110611b235760405162461bcd60e51b815260040180806020018281038252604881526020018061203d6048913960600191505060405180910390fd5b600755565b67016345785d8a000081565b60075481565b6000611b44610f56565b156113a957506001600160a01b03811660009081526005602052604090205415156113af565b6000808211611bc0576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642077656920616d6f756e7400000000000000604482015290519081900360640190fd5b6007546113ac90839063ffffffff611d5316565b6000611bde611001565b15611c0857600254611c019069d3c21bcecceda10000009063ffffffff611dac16565b9050610f72565b611c10611797565b15611c3457600354611c01906a01a784379d99db420000009063ffffffff611dac16565b611c3c6117b9565b15611c7657611c01611c5e611c4f611dee565b6004549063ffffffff611cae16565b6a0422ca8b0a00a4250000009063ffffffff611dac16565b600154610f6f90611ca269d3c21bcecceda10000006a0422ca8b0a00a42500000063ffffffff611cae16565b9063ffffffff611dac16565b600082820183811015611d08576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611d0883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e27565b600082611d6257506000611d0b565b82820282848281611d6f57fe5b0414611d085760405162461bcd60e51b815260040180806020018281038252602181526020018061215c6021913960400191505060405180910390fd5b6000611d0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ec9565b600069d3c21bcecceda10000006001541115611e2157600154611c019069d3c21bcecceda100000063ffffffff611dac16565b50600090565b60008183611eb35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e78578181015183820152602001611e60565b50505050905090810190601f168015611ea55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611ebf57fe5b0495945050505050565b60008184841115611f1b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e78578181015183820152602001611e60565b50505090039056fe4572726f723a20507572636861736520657863656564732072656d61696e696e6720746f6b656e7320666f72207468697320726f756e644572726f723a2041646472657373206973206e6f742077686974656c69737465644572726f723a204e6f20726561736f6e20746f2077697468647261772066756e6473206265666f72652073616c652068617320737461727465644572726f723a204e6f2066756e647320617661696c61626c6520746f2077697468647261774572726f723a2043726f776453616c652068617320656e6465642c206e6f206e65656420746f2075706461746520726174696f4572726f723a20496e766573746d656e742069732062656c6f7720707269766174652073656c6c206d696e696d756d4572726f723a20416d6f756e74206f6620746f6b656e732070657220455448207365656d7320756e7265616c6973746963616c6c7920686967682e20496e707574206572726f723f4572726f723a204e6f2065746865722072656365697665642e204d73672e76616c756520697320656d7074794572726f723a204e6f20746f6b656e73206c65667420666f72207468697320726f756e644572726f723a20496e766573746d656e742069732061626f7665206d6178696d756d2073656c6c20616d6f756e744572726f723a20416464726573736573206c656e677468206973206e6f7420657175616c20696e766573746d656e74734572726f723a2041646472657373206973206e6f7420616c6c6f77656420746f207075726368617365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774572726f723a204e6f20726f756e642061637469766520617420746865206d6f6d656e744572726f723a204275726e2f4d696e7420616464726573732063616e7420707572636861736520746f6b656e734572726f723a2050726963657320617265206964656e746963616c2c206e6f206368616e676573206e65656465644572726f723a205061796d65642065786365656473206d6178696d756d2073696e676c652070757263686173654572726f723a205061796d656e7420736d616c6c6572207468616e206d696e696d756d207061796d656e744572726f723a20416d6f756e7420746f2062652073656e74206973206e6f7420657175616c207468652066756e64734572726f723a20546869732070757263686173652065786365656473207468652077686974656c6973746564206c696d697465644572726f723a205769746864726177616c20647572696e672061637469766520726f756e6473206973206e6f7420616c6c6f7765644572726f723a207061796d656e7420746f6f206c6f772e206e6f20746f6b656e7320666f7220746869732077656920616d6f756e74a26469706673582212205c197172575d10cbc8531fbd92829a9092aca5dd16026f5e7618170c43e4ead464736f6c63430006020033
Deployed Bytecode
0x6080604052600436106102975760003560e01c80637c99b6c81161015a578063d7bdf637116100c1578063ecb70fb71161007a578063ecb70fb714610808578063ece7328a1461081d578063f013e0e114610832578063f216718214610901578063f3d377461461092b578063f62516ca14610940576102f9565b8063d7bdf6371461078a578063d8c307001461079f578063db937190146107b4578063dfef26c1146107c9578063e6bb9b94146107de578063e75f1292146107f3576102f9565b8063a32bf59711610113578063a32bf597146106ac578063a812108414610736578063b97e93f61461074b578063be68beda14610760578063c4645cc914610775578063d7bd1185146104ab576102f9565b80637c99b6c8146105ce5780637ca0294d146106015780638456cb591461063a57806386d0b48c1461064f5780639b19251a146106645780639d53343914610697576102f9565b8063270bf499116101fe57806344691f7e116101b757806344691f7e1461053257806344e4f334146105475780635c975abb1461055c57806360c9a5f81461057157806366d27d1a146105a457806374e129c8146105b9576102f9565b8063270bf499146104965780632a511c3b146104ab5780633804ad79146104c05780633af32abf146104d55780633d960ec3146105085780633f4ba83a1461051d576102f9565b80631a3d948a116102505780631a3d948a146103dc5780631f6d49421461040f5780631fbe327514610442578063203921601461045757806324600fc31461046c57806324b9f4c414610481576102f9565b8063010e4284146102fe5780630672a86914610331578063082f9bd4146103625780630a5461591461038b57806310fe9ae8146103b257806312182bd8146103c7576102f9565b366102f957600034116102db5760405162461bcd60e51b815260040180806020018281038252602c815260200180612085602c913960400191505060405180910390fd5b6000546001600160a01b031633146102f7576102f73334610955565b005b600080fd5b34801561030a57600080fd5b506102f76004803603602081101561032157600080fd5b50356001600160a01b0316610ec2565b34801561033d57600080fd5b50610346610f47565b604080516001600160a01b039092168252519081900360200190f35b34801561036e57600080fd5b50610377610f56565b604080519115158252519081900360200190f35b34801561039757600080fd5b506103a0610f75565b60408051918252519081900360200190f35b3480156103be57600080fd5b50610346610f7d565b3480156103d357600080fd5b506103a0610f8c565b3480156103e857600080fd5b506102f7600480360360208110156103ff57600080fd5b50356001600160a01b0316610f9b565b34801561041b57600080fd5b506103a06004803603602081101561043257600080fd5b50356001600160a01b0316610fef565b34801561044e57600080fd5b50610377611001565b34801561046357600080fd5b506103a061101d565b34801561047857600080fd5b506102f7611023565b34801561048d57600080fd5b506103a06112f2565b3480156104a257600080fd5b506103a0611301565b3480156104b757600080fd5b506103a061130d565b3480156104cc57600080fd5b506103a061131b565b3480156104e157600080fd5b50610377600480360360208110156104f857600080fd5b50356001600160a01b0316611328565b34801561051457600080fd5b506103a06113b4565b34801561052957600080fd5b506102f76113ba565b34801561053e57600080fd5b506103776113fb565b34801561055357600080fd5b506103a0611405565b34801561056857600080fd5b5061037761140d565b34801561057d57600080fd5b506102f76004803603602081101561059457600080fd5b50356001600160a01b031661141d565b3480156105b057600080fd5b506103466114b1565b3480156105c557600080fd5b506103a06114c0565b3480156105da57600080fd5b506102f7600480360360208110156105f157600080fd5b50356001600160a01b03166114cf565b34801561060d57600080fd5b506102f76004803603604081101561062457600080fd5b506001600160a01b038135169060200135611563565b34801561064657600080fd5b506102f7611625565b34801561065b57600080fd5b506103a0611668565b34801561067057600080fd5b506103a06004803603602081101561068757600080fd5b50356001600160a01b031661166e565b3480156106a357600080fd5b506103a0611680565b3480156106b857600080fd5b506106c1611688565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106fb5781810151838201526020016106e3565b50505050905090810190601f1680156107285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561074257600080fd5b506103a0611791565b34801561075757600080fd5b50610377611797565b34801561076c57600080fd5b506103a06117b3565b34801561078157600080fd5b506103776117b9565b34801561079657600080fd5b506103a06117d5565b3480156107ab57600080fd5b506103a06117dd565b3480156107c057600080fd5b506103a061185f565b3480156107d557600080fd5b506103a0611867565b3480156107ea57600080fd5b506103a061186f565b3480156107ff57600080fd5b506103a0611877565b34801561081457600080fd5b5061037761187f565b34801561082957600080fd5b50610346611889565b34801561083e57600080fd5b506102f76004803603604081101561085557600080fd5b81019060208101813564010000000081111561087057600080fd5b82018360208201111561088257600080fd5b803590602001918460208302840111640100000000831117156108a457600080fd5b9193909290916020810190356401000000008111156108c257600080fd5b8201836020820111156108d457600080fd5b803590602001918460208302840111640100000000831117156108f657600080fd5b509092509050611898565b34801561090d57600080fd5b506102f76004803603602081101561092457600080fd5b50356119f1565b34801561093757600080fd5b506103a0611b28565b34801561094c57600080fd5b506103a0611b34565b61095d6113fb565b15156001146109b3576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2053616c6520686173206e6f7420737461727465640000000000604482015290519081900360640190fd5b6109bb61187f565b15610a0d576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2053616c652068617320616c726561647920656e646564000000604482015290519081900360640190fd5b610a15610f56565b80610a235750610a23611001565b80610a315750610a31611797565b80610a3f5750610a3f6117b9565b610a7a5760405162461bcd60e51b815260040180806020018281038252602481526020018061217d6024913960400191505060405180910390fd5b6001600160a01b038216610abf5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121a1602d913960400191505060405180910390fd5b610ac882611b3a565b610b035760405162461bcd60e51b81526004018080602001828103825260298152602001806121336029913960400191505060405180910390fd5b6802b5e3af16b1880000811115610b4b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121fc602d913960400191505060405180910390fd5b6000610b5682611b6a565b90506000610b62611bd4565b905060008211610ba35760405162461bcd60e51b81526004018080602001828103825260358152602001806122ec6035913960400191505060405180910390fd5b60008111610be25760405162461bcd60e51b81526004018080602001828103825260248152602001806120b16024913960400191505060405180910390fd5b81811015610c215760405162461bcd60e51b8152600401808060200182810382526037815260200180611f246037913960400191505060405180910390fd5b610c29610f56565b15610cf6576001600160a01b03841660009081526006602090815260408083205460059092529091205481610c9f57671bc16d674ec80000851015610c9f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b6000610cb1838763ffffffff611cae16565b905081811115610cf25760405162461bcd60e51b81526004018080602001828103825260348152602001806122836034913960400191505060405180910390fd5b5050505b67016345785d8a0000831015610d3d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b600854604080516340c10f1960e01b81526001600160a01b03878116600483015260248201869052915191909216916340c10f1991604480830192600092919082900301818387803b158015610d9257600080fd5b505af1158015610da6573d6000803e3d6000fd5b50505050610db2611001565b15610dd257600254610dca908363ffffffff611cae16565b600255610e39565b610dda611797565b15610dfa57600354610df2908363ffffffff611cae16565b600355610e39565b610e026117b9565b15610e2257600454610e1a908363ffffffff611cae16565b600455610e39565b600154610e35908363ffffffff611cae16565b6001555b6001600160a01b038416600090815260066020526040902054610e62908463ffffffff611cae16565b6001600160a01b038516600081815260066020908152604091829020939093558051858152928301869052805191927f62ea3479470df7563c5a39f2835a33a651f2d09d29d392aa142ada944f9fdc2b929081900390910190a250505050565b6000546001600160a01b03163314610ed957600080fd5b6001600160a01b038116600090815260056020526040902054610f2d5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f5b6021913960400191505060405180910390fd5b6001600160a01b0316600090815260056020526040812055565b6009546001600160a01b031681565b6000635f5a15404210158015610f6f5750635f5cb84042105b90505b90565b635f5cb84081565b6008546001600160a01b031690565b6a01a784379d99db4200000081565b6000546001600160a01b03163314610fb257600080fd5b600054600160a01b900460ff161515600114610fcd57600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60066020526000908152604090205481565b6000635f5f5b404210158015610f6f575050635f61fe40421090565b60025481565b6000546001600160a01b0316331461103a57600080fd5b6110426113fb565b15156001146110825760405162461bcd60e51b815260040180806020018281038252603a815260200180611f7c603a913960400191505060405180910390fd5b61108a610f56565b15801561109c575061109a611001565b155b80156110ad57506110ab611797565b155b80156110be57506110bc6117b9565b155b6110f95760405162461bcd60e51b81526004018080602001828103825260358152602001806122b76035913960400191505060405180910390fd5b6009546001600160a01b0316611156576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e312077616c6c657420736574604482015290519081900360640190fd5b600a546001600160a01b03166111b3576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e322077616c6c657420736574604482015290519081900360640190fd5b47806111f05760405162461bcd60e51b8152600401808060200182810382526025815260200180611fb66025913960400191505060405180910390fd5b6000611214604661120884606463ffffffff611d1116565b9063ffffffff611d5316565b90506000611228838363ffffffff611dac16565b90508261123b838363ffffffff611cae16565b146112775760405162461bcd60e51b815260040180806020018281038252602f815260200180612254602f913960400191505060405180910390fd5b6009546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156112b1573d6000803e3d6000fd5b50600a546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156112ec573d6000803e3d6000fd5b50505050565b6a0422ca8b0a00a42500000081565b671bc16d674ec8000081565b69d3c21bcecceda100000081565b6802b5e3af16b188000081565b60006001600160a01b038216611385576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b6001600160a01b0382166000908152600560205260409020546113a95760006113ac565b60015b90505b919050565b60035481565b6000546001600160a01b031633146113d157600080fd5b600054600160a01b900460ff1615156001146113ec57600080fd5b6000805460ff60a01b19169055565b635f5a1540421190565b635f69e74081565b600054600160a01b900460ff1681565b6000546001600160a01b0316331461143457600080fd5b6001600160a01b03811661148f576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031681565b6a0771d2fa45345aa900000081565b6000546001600160a01b031633146114e657600080fd5b6001600160a01b038116611541576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461157a57600080fd5b671bc16d674ec800008110156115c15760405162461bcd60e51b815260040180806020018281038252602f81526020018061200e602f913960400191505060405180910390fd5b6802b5e3af16b18800008111156116095760405162461bcd60e51b815260040180806020018281038252602e8152602001806120d5602e913960400191505060405180910390fd5b6001600160a01b03909116600090815260056020526040902055565b6000546001600160a01b0316331461163c57600080fd5b600054600160a01b900460ff161561165357600080fd5b6000805460ff60a01b1916600160a01b179055565b60045481565b60056020526000908152604090205481565b635f61fe4081565b606061169261187f565b156116bc5750604080518082019091526008815267119a5b9a5cda195960c21b6020820152610f72565b6116c4611001565b156116f6575060408051808201909152601081526f5072652d53616c6520526f756e64203160801b6020820152610f72565b6116fe611797565b15611730575060408051808201909152601081526f28393296a9b0b632902937bab732101960811b6020820152610f72565b6117386117b9565b1561176a575060408051808201909152601081526f5072652d53616c6520526f756e64203360801b6020820152610f72565b5060408051808201909152600c81526b507269766174652053616c6560a01b602082015290565b60015481565b6000635f64a1404210158015610f6f575050635f674440421090565b60075490565b6000635f69e7404210158015610f6f575050635f71d040421090565b635f5a154081565b60006117e761187f565b156117f457506000610f72565b6117fc611001565b15611812575069d3c21bcecceda1000000610f72565b61181a611797565b1561183157506a01a784379d99db42000000610f72565b6118396117b9565b1561185057506a0422ca8b0a00a425000000610f72565b5069d3c21bcecceda100000090565b635f67444081565b635f5f5b4081565b635f64a14081565b635f71d04081565b635f71d040421190565b6008546001600160a01b031681565b6000546001600160a01b031633146118af57600080fd5b82611901576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a2042656e656669636961726965732061726520656d7074790000604482015290519081900360640190fd5b80611953576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20496e766573746d656e74732061726520656d70747900000000604482015290519081900360640190fd5b8281146119915760405162461bcd60e51b81526004018080602001828103825260308152602001806121036030913960400191505060405180910390fd5b60005b838110156119ea578282828181106119a857fe5b90506020020135600560008787858181106119bf57fe5b602090810292909201356001600160a01b031683525081019190915260400160002055600101611994565b5050505050565b6000546001600160a01b03163314611a0857600080fd5b611a1061187f565b15611a4c5760405162461bcd60e51b8152600401808060200182810382526033815260200180611fdb6033913960400191505060405180910390fd5b60008111611aa1576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2049504d20706572204554482063616e27742062652030000000604482015290519081900360640190fd5b600754811415611ae25760405162461bcd60e51b815260040180806020018281038252602e8152602001806121ce602e913960400191505060405180910390fd5b620186a08110611b235760405162461bcd60e51b815260040180806020018281038252604881526020018061203d6048913960600191505060405180910390fd5b600755565b67016345785d8a000081565b60075481565b6000611b44610f56565b156113a957506001600160a01b03811660009081526005602052604090205415156113af565b6000808211611bc0576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642077656920616d6f756e7400000000000000604482015290519081900360640190fd5b6007546113ac90839063ffffffff611d5316565b6000611bde611001565b15611c0857600254611c019069d3c21bcecceda10000009063ffffffff611dac16565b9050610f72565b611c10611797565b15611c3457600354611c01906a01a784379d99db420000009063ffffffff611dac16565b611c3c6117b9565b15611c7657611c01611c5e611c4f611dee565b6004549063ffffffff611cae16565b6a0422ca8b0a00a4250000009063ffffffff611dac16565b600154610f6f90611ca269d3c21bcecceda10000006a0422ca8b0a00a42500000063ffffffff611cae16565b9063ffffffff611dac16565b600082820183811015611d08576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611d0883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e27565b600082611d6257506000611d0b565b82820282848281611d6f57fe5b0414611d085760405162461bcd60e51b815260040180806020018281038252602181526020018061215c6021913960400191505060405180910390fd5b6000611d0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ec9565b600069d3c21bcecceda10000006001541115611e2157600154611c019069d3c21bcecceda100000063ffffffff611dac16565b50600090565b60008183611eb35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e78578181015183820152602001611e60565b50505050905090810190601f168015611ea55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611ebf57fe5b0495945050505050565b60008184841115611f1b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e78578181015183820152602001611e60565b50505090039056fe4572726f723a20507572636861736520657863656564732072656d61696e696e6720746f6b656e7320666f72207468697320726f756e644572726f723a2041646472657373206973206e6f742077686974656c69737465644572726f723a204e6f20726561736f6e20746f2077697468647261772066756e6473206265666f72652073616c652068617320737461727465644572726f723a204e6f2066756e647320617661696c61626c6520746f2077697468647261774572726f723a2043726f776453616c652068617320656e6465642c206e6f206e65656420746f2075706461746520726174696f4572726f723a20496e766573746d656e742069732062656c6f7720707269766174652073656c6c206d696e696d756d4572726f723a20416d6f756e74206f6620746f6b656e732070657220455448207365656d7320756e7265616c6973746963616c6c7920686967682e20496e707574206572726f723f4572726f723a204e6f2065746865722072656365697665642e204d73672e76616c756520697320656d7074794572726f723a204e6f20746f6b656e73206c65667420666f72207468697320726f756e644572726f723a20496e766573746d656e742069732061626f7665206d6178696d756d2073656c6c20616d6f756e744572726f723a20416464726573736573206c656e677468206973206e6f7420657175616c20696e766573746d656e74734572726f723a2041646472657373206973206e6f7420616c6c6f77656420746f207075726368617365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774572726f723a204e6f20726f756e642061637469766520617420746865206d6f6d656e744572726f723a204275726e2f4d696e7420616464726573732063616e7420707572636861736520746f6b656e734572726f723a2050726963657320617265206964656e746963616c2c206e6f206368616e676573206e65656465644572726f723a205061796d65642065786365656473206d6178696d756d2073696e676c652070757263686173654572726f723a205061796d656e7420736d616c6c6572207468616e206d696e696d756d207061796d656e744572726f723a20416d6f756e7420746f2062652073656e74206973206e6f7420657175616c207468652066756e64734572726f723a20546869732070757263686173652065786365656473207468652077686974656c6973746564206c696d697465644572726f723a205769746864726177616c20647572696e672061637469766520726f756e6473206973206e6f7420616c6c6f7765644572726f723a207061796d656e7420746f6f206c6f772e206e6f20746f6b656e7320666f7220746869732077656920616d6f756e74a26469706673582212205c197172575d10cbc8531fbd92829a9092aca5dd16026f5e7618170c43e4ead464736f6c63430006020033
Deployed Bytecode Sourcemap
19864:13792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30072:1;30060:9;:13;30052:70;;;;-1:-1:-1;;;30052:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30187:5;;-1:-1:-1;;;;;30187:5:0;30173:10;:19;30170:122;;30247:33;30258:10;30270:9;30247:10;:33::i;:::-;19864:13792;;;;;27631:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27631:246:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27631:246:0;-1:-1:-1;;;;;27631:246:0;;:::i;22626:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22626:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;22626:33:0;;;;;;;;;;;;;;22840:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22840:139:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;20855:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20855:62:0;;;:::i;:::-;;;;;;;;;;;;;;;;26500:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26500:99:0;;;:::i;21645:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21645:70:0;;;:::i;26607:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26607:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26607:118:0;-1:-1:-1;;;;;26607:118:0;;:::i;22429:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22429:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22429:47:0;-1:-1:-1;;;;;22429:47:0;;:::i;22985:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22985:121:0;;;:::i;22169:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22169:25:0;;;:::i;28572:1237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28572:1237:0;;;:::i;21990:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21990:70:0;;;:::i;20268:55::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20268:55:0;;;:::i;21300:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21300:70:0;;;:::i;20471:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20471:48:0;;;:::i;27885:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27885:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27885:219:0;-1:-1:-1;;;;;27885:219:0;;:::i;22229:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22229:25:0;;;:::i;26321:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26321:80:0;;;:::i;23372:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23372:101:0;;;:::i;21774:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21774:62:0;;;:::i;20191:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20191:30:0;;;:::i;28342:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28342:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28342:222:0;-1:-1:-1;;;;;28342:222:0;;:::i;22666:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22666:33:0;;;:::i;20590:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20590:77:0;;;:::i;28112:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28112:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28112:222:0;-1:-1:-1;;;;;28112:222:0;;:::i;27267:356::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27267:356:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27267:356:0;;;;;;;;:::i;26410:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26410:80:0;;;:::i;22289:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22289:25:0;;;:::i;22357:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22357:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22357:44:0;-1:-1:-1;;;;;22357:44:0;;:::i;21201:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21201:62:0;;;:::i;24777:414::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24777:414:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24777:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22103:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22103:31:0;;;:::i;23114:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23114:121:0;;;:::i;24673:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24673:96:0;;;:::i;23243:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23243:121:0;;;:::i;20732:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20732:62:0;;;:::i;25199:378::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25199:378:0;;;:::i;21546:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21546:62:0;;;:::i;21084:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21084:62:0;;;:::i;21429:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21429:62:0;;;:::i;21891:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21891:62:0;;;:::i;23481:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23481:91:0;;;:::i;22568:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22568:30:0;;;:::i;26733:526::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26733:526:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26733:526:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;26733:526:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26733:526:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26733:526:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;26733:526:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26733:526:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;26733:526:0;;-1:-1:-1;26733:526:0;-1:-1:-1;26733:526:0;:::i;25849:464::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25849:464:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25849:464:0;;:::i;20369:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20369:57:0;;;:::i;22506:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22506:24:0;;;:::i;30307:2244::-;23877:12;:10;:12::i;:::-;:20;;23893:4;23877:20;23869:60;;;;;-1:-1:-1;;;23869:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23948:10;:8;:10::i;:::-;:19;23940:61;;;;;-1:-1:-1;;;23940:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24020:22;:20;:22::i;:::-;:42;;;;24046:16;:14;:16::i;:::-;24020:62;;;;24066:16;:14;:16::i;:::-;24020:82;;;;24086:16;:14;:16::i;:::-;24012:131;;;;-1:-1:-1;;;24012:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30415:26:0;::::1;30407:84;;;;-1:-1:-1::0;;;30407:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30510:27;30524:12;30510:13;:27::i;:::-;30502:81;;;;-1:-1:-1::0;;;30502:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20511:8;30612:17;:32;;30604:90;;;;-1:-1:-1::0;;;30604:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30715:24;30747:45;30774:17;30747:26;:45::i;:::-;30715:77;;30803:18;30835:25;:23;:25::i;:::-;30803:57;;30900:1;30881:16;:20;30873:86;;;;-1:-1:-1::0;;;30873:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30991:1;30978:10;:14;30970:63;;;;-1:-1:-1::0;;;30970:63:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31066:16;31052:10;:30;;31044:98;;;;-1:-1:-1::0;;;31044:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31158:22;:20;:22::i;:::-;31155:562;;;-1:-1:-1::0;;;;;31229:26:0;::::1;31197:24;31229:26:::0;;;:12:::1;:26;::::0;;;;;;;;31302:9:::1;:23:::0;;;;;;;31345:21;31342:157:::1;;20316:7;31395:17;:40;;31387:96;;;;-1:-1:-1::0;;;31387:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31515:24;31547:39;:16:::0;31568:17;31547:39:::1;:20;:39;:::i;:::-;31515:71;;31631:17;31611:16;:37;;31603:102;;;;-1:-1:-1::0;;;31603:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31155:562;;;;20417:9;31746:17;:39;;31738:95;;;;-1:-1:-1::0;;;31738:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31866:15;::::0;31854:65:::1;::::0;;-1:-1:-1;;;31854:65:0;;-1:-1:-1;;;;;31854:65:0;;::::1;;::::0;::::1;::::0;;;;;;;;;31866:15;;;::::1;::::0;31854:33:::1;::::0;:65;;;;;31866:15:::1;::::0;31854:65;;;;;;;31866:15;;31854:65;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;31854:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31854:65:0;;;;31943:16;:14;:16::i;:::-;31940:381;;;31989:10;::::0;:32:::1;::::0;32004:16;31989:32:::1;:14;:32;:::i;:::-;31976:10;:45:::0;31940:381:::1;;;32042:16;:14;:16::i;:::-;32039:282;;;32088:10;::::0;:32:::1;::::0;32103:16;32088:32:::1;:14;:32;:::i;:::-;32075:10;:45:::0;32039:282:::1;;;32141:16;:14;:16::i;:::-;32138:183;;;32187:10;::::0;:32:::1;::::0;32202:16;32187:32:::1;:14;:32;:::i;:::-;32174:10;:45:::0;32138:183:::1;;;32271:16;::::0;:38:::1;::::0;32292:16;32271:38:::1;:20;:38;:::i;:::-;32252:16;:57:::0;32138:183:::1;-1:-1:-1::0;;;;;32363:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;:49:::1;::::0;32394:17;32363:49:::1;:30;:49;:::i;:::-;-1:-1:-1::0;;;;;32331:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:81;;;;32430:112;;;;;;;::::1;::::0;;;;;32331:26;;32430:112:::1;::::0;;;;;;;;;::::1;24154:1;;30307:2244:::0;;:::o;27631:246::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;-1:-1:-1;;;;;27721:23:0;::::1;27747:1;27721:23:::0;;;:9:::1;:23;::::0;;;;;27713:73:::1;;;;-1:-1:-1::0;;;27713:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27797:23:0::1;27825:1;27797:23:::0;;;:9:::1;:23;::::0;;;;:29;27631:246::o;22626:33::-;;;-1:-1:-1;;;;;22626:33:0;;:::o;22840:139::-;22892:4;20784:10;22917:3;:26;;:53;;;;;20907:10;22947:3;:23;22917:53;22909:62;;22840:139;;:::o;20855:62::-;20907:10;20855:62;:::o;26500:99::-;26576:15;;-1:-1:-1;;;;;26576:15:0;26500:99;:::o;21645:70::-;21697:18;21645:70;:::o;26607:118::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;23707:6:::1;::::0;-1:-1:-1;;;23707:6:0;::::1;;;:14;;23717:4;23707:14;23699:23;;;::::0;::::1;;26691:15:::2;:26:::0;;-1:-1:-1;;;;;;26691:26:0::2;-1:-1:-1::0;;;;;26691:26:0;;;::::2;::::0;;;::::2;::::0;;26607:118::o;22429:47::-;;;;;;;;;;;;;:::o;22985:121::-;23031:4;21136:10;23056:3;:20;;:41;;;;-1:-1:-1;;21253:10:0;23080:3;:17;;22985:121::o;22169:25::-;;;;:::o;28572:1237::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;28635:12:::1;:10;:12::i;:::-;:20;;28651:4;28635:20;28627:91;;;;-1:-1:-1::0;;;28627:91:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28751:22;:20;:22::i;:::-;:31;::::0;::::1;:73;;;28799:16;:14;:16::i;:::-;:25;28751:73;:115;;;;;28841:16;:14;:16::i;:::-;:25;28751:115;:157;;;;;28883:16;:14;:16::i;:::-;:25;28751:157;28729:260;;;;-1:-1:-1::0;;;28729:260:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29008:18;::::0;-1:-1:-1;;;;;29008:18:0::1;29000:77;;;::::0;;-1:-1:-1;;;29000:77:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29096:18;::::0;-1:-1:-1;;;;;29096:18:0::1;29088:77;;;::::0;;-1:-1:-1;;;29088:77:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29218:21;29258:18:::0;29250:68:::1;;;;-1:-1:-1::0;;;29250:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29331:34;29371:31;29399:2;29371:23;:14:::0;29390:3:::1;29371:23;:18;:23;:::i;:::-;:27:::0;:31:::1;:27;:31;:::i;:::-;29331:71:::0;-1:-1:-1;29414:34:0::1;29454:46;:14:::0;29331:71;29454:46:::1;:18;:46;:::i;:::-;29414:86:::0;-1:-1:-1;29581:14:0;29519:58:::1;:26:::0;29414:86;29519:58:::1;:30;:58;:::i;:::-;:76;29511:136;;;;-1:-1:-1::0;;;29511:136:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29668:18;::::0;29660:64:::1;::::0;-1:-1:-1;;;;;29668:18:0;;::::1;::::0;29660:64;::::1;;;::::0;29697:26;;29668:18:::1;29660:64:::0;29668:18;29660:64;29697:26;29668:18;29660:64;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;29743:18:0::1;::::0;29735:64:::1;::::0;-1:-1:-1;;;;;29743:18:0;;::::1;::::0;29735:64;::::1;;;::::0;29772:26;;29743:18:::1;29735:64:::0;29743:18;29735:64;29772:26;29743:18;29735:64;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29735:64:0;23651:1;;;28572:1237::o:0;21990:70::-;22042:18;21990:70;:::o;20268:55::-;20316:7;20268:55;:::o;21300:70::-;21352:18;21300:70;:::o;20471:48::-;20511:8;20471:48;:::o;27885:219::-;27950:4;-1:-1:-1;;;;;27975:26:0;;27967:69;;;;;-1:-1:-1;;;27967:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28055:23:0;;28081:1;28055:23;;;:9;:23;;;;;;28054:42;;28091:5;28054:42;;;28086:4;28054:42;28047:49;;27885:219;;;;:::o;22229:25::-;;;;:::o;26321:80::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;23707:6:::1;::::0;-1:-1:-1;;;23707:6:0;::::1;;;:14;;23717:4;23707:14;23699:23;;;::::0;::::1;;26388:5:::2;26379:14:::0;;-1:-1:-1;;;;26379:14:0::2;::::0;;26321:80::o;23372:101::-;20784:10;23439:3;:25;23372:101;:::o;21774:62::-;21826:10;21774:62;:::o;20191:30::-;;;-1:-1:-1;;;20191:30:0;;;;;:::o;28342:222::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;-1:-1:-1;;;;;28439:32:0;::::1;28431:75;;;::::0;;-1:-1:-1;;;28431:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28517:18;:39:::0;;-1:-1:-1;;;;;;28517:39:0::1;-1:-1:-1::0;;;;;28517:39:0;;;::::1;::::0;;;::::1;::::0;;28342:222::o;22666:33::-;;;-1:-1:-1;;;;;22666:33:0;;:::o;20590:77::-;20642:25;20590:77;:::o;28112:222::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;-1:-1:-1;;;;;28209:32:0;::::1;28201:75;;;::::0;;-1:-1:-1;;;28201:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28287:18;:39:::0;;-1:-1:-1;;;;;;28287:39:0::1;-1:-1:-1::0;;;;;28287:39:0;;;::::1;::::0;;;::::1;::::0;;28112:222::o;27267:356::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;20316:7:::1;27382:10;:33;;27374:93;;;;-1:-1:-1::0;;;27374:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20511:8;27486:10;:25;;27478:84;;;;-1:-1:-1::0;;;27478:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27575:23:0;;::::1;;::::0;;;:9:::1;:23;::::0;;;;:40;27267:356::o;26410:80::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;23792:6:::1;::::0;-1:-1:-1;;;23792:6:0;::::1;;;:15;23784:24;;;::::0;::::1;;26469:6:::2;:13:::0;;-1:-1:-1;;;;26469:13:0::2;-1:-1:-1::0;;;26469:13:0::2;::::0;;26410:80::o;22289:25::-;;;;:::o;22357:44::-;;;;;;;;;;;;;:::o;21201:62::-;21253:10;21201:62;:::o;24777:414::-;24826:13;24855:10;:8;:10::i;:::-;24852:59;;;-1:-1:-1;24882:17:0;;;;;;;;;;;;-1:-1:-1;;;24882:17:0;;;;;;24852:59;24924:16;:14;:16::i;:::-;24921:231;;;-1:-1:-1;24957:25:0;;;;;;;;;;;;-1:-1:-1;;;24957:25:0;;;;;;24921:231;25003:16;:14;:16::i;:::-;25000:152;;;-1:-1:-1;25036:25:0;;;;;;;;;;;;-1:-1:-1;;;25036:25:0;;;;;;25000:152;25082:16;:14;:16::i;:::-;25079:73;;;-1:-1:-1;25115:25:0;;;;;;;;;;;;-1:-1:-1;;;25115:25:0;;;;;;25079:73;-1:-1:-1;25162:21:0;;;;;;;;;;;;-1:-1:-1;;;25162:21:0;;;;24777:414;:::o;22103:31::-;;;;:::o;23114:121::-;23160:4;21481:10;23185:3;:20;;:41;;;;-1:-1:-1;;21598:10:0;23209:3;:17;;23114:121::o;24673:96::-;24752:9;;24673:96;:::o;23243:121::-;23289:4;21826:10;23314:3;:20;;:41;;;;-1:-1:-1;;21943:10:0;23338:3;:17;;23243:121::o;20732:62::-;20784:10;20732:62;:::o;25199:378::-;25245:7;25268:10;:8;:10::i;:::-;25265:50;;;-1:-1:-1;25302:1:0;25295:8;;25265:50;25328:16;:14;:16::i;:::-;25325:210;;;-1:-1:-1;21352:18:0;25361;;25325:210;25400:16;:14;:16::i;:::-;25397:138;;;-1:-1:-1;21697:18:0;25433;;25397:138;25472:16;:14;:16::i;:::-;25469:66;;;-1:-1:-1;22042:18:0;25505;;25469:66;-1:-1:-1;21007:18:0;25199:378;:::o;21546:62::-;21598:10;21546:62;:::o;21084:::-;21136:10;21084:62;:::o;21429:::-;21481:10;21429:62;:::o;21891:::-;21943:10;21891:62;:::o;23481:91::-;21943:10;23546:3;:17;23481:91;:::o;22568:30::-;;;-1:-1:-1;;;;;22568:30:0;;:::o;26733:526::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;26860:25;26852:68:::1;;;::::0;;-1:-1:-1;;;26852:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26939:22:::0;26931:63:::1;;;::::0;;-1:-1:-1;;;26931:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27013:43:::0;;::::1;27005:104;;;;-1:-1:-1::0;;;27005:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27134:9;27130:122;27146:23:::0;;::::1;27130:122;;;27226:11;;27238:1;27226:14;;;;;;;;;;;;;27190:9;:28;27200:14;;27215:1;27200:17;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;27200:17:0::1;27190:28:::0;;-1:-1:-1;27190:28:0;::::1;::::0;;;;;;-1:-1:-1;27190:28:0;:50;27170:3:::1;;27130:122;;;;26733:526:::0;;;;:::o;25849:464::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;25929:10:::1;:8;:10::i;:::-;:19;25921:83;;;;-1:-1:-1::0;;;25921:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26033:1;26023:7;:11;26015:53;;;::::0;;-1:-1:-1;;;26015:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26098:9;;26087:7;:20;;26079:79;;;;-1:-1:-1::0;;;26079:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26187:6;26177:7;:16;26169:101;;;;-1:-1:-1::0;;;26169:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26283:9;:22:::0;25849:464::o;20369:57::-;20417:9;20369:57;:::o;22506:24::-;;;;:::o;32764:203::-;32831:4;32851:22;:20;:22::i;:::-;32848:90;;;-1:-1:-1;;;;;;32898:23:0;;32924:1;32898:23;;;:9;:23;;;;;;:27;;32890:36;;32559:197;32635:7;32674:1;32663:8;:12;32655:50;;;;;-1:-1:-1;;;32655:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32738:9;;32725:23;;:8;;:23;:12;:23;:::i;32975:448::-;33032:7;33055:16;:14;:16::i;:::-;33052:290;;;33111:10;;33095:27;;21352:18;;33095:27;:15;:27;:::i;:::-;33088:34;;;;33052:290;33143:16;:14;:16::i;:::-;33140:202;;;33199:10;;33183:27;;21697:18;;33183:27;:15;:27;:::i;33140:202::-;33231:16;:14;:16::i;:::-;33228:114;;;33271:59;33287:42;33302:26;:24;:26::i;:::-;33287:10;;;:42;:14;:42;:::i;:::-;22042:18;;33271:59;:15;:59;:::i;33228:114::-;33398:16;;33359:56;;:34;21007:18;22042;33359:34;:21;:34;:::i;:::-;:38;:56;:38;:56;:::i;3790:181::-;3848:7;3880:5;;;3904:6;;;;3896:46;;;;;-1:-1:-1;;;3896:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3962:1;-1:-1:-1;3790:181:0;;;;;:::o;6091:132::-;6149:7;6176:39;6180:1;6183;6176:39;;;;;;;;;;;;;;;;;:3;:39::i;5144:471::-;5202:7;5447:6;5443:47;;-1:-1:-1;5477:1:0;5470:8;;5443:47;5514:5;;;5518:1;5514;:5;:1;5538:5;;;;;:10;5530:56;;;;-1:-1:-1;;;5530:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4254:136;4312:7;4339:43;4343:1;4346;4339:43;;;;;;;;;;;;;;;;;:3;:43::i;33431:220::-;33489:7;21007:18;33512:16;;:36;33509:114;;;33572:16;;:39;;21007:18;33572:39;:20;:39;:::i;33509:114::-;-1:-1:-1;33642:1:0;33431:220;:::o;6719:278::-;6805:7;6840:12;6833:5;6825:28;;;;-1:-1:-1;;;6825:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6825:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6864:9;6880:1;6876;:5;;;;;;;6719:278;-1:-1:-1;;;;;6719:278:0:o;4693:192::-;4779:7;4815:12;4807:6;;;;4799:29;;;;-1:-1:-1;;;4799:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4799:29:0;-1:-1:-1;;;4851:5:0;;;4693:192::o
Swarm Source
ipfs://5c197172575d10cbc8531fbd92829a9092aca5dd16026f5e7618170c43e4ead4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.