Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 22,685 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 21095441 | 168 days ago | IN | 0 ETH | 0.00039638 | ||||
Emergency Withdr... | 21095437 | 168 days ago | IN | 0 ETH | 0.0005796 | ||||
Emergency Withdr... | 21095428 | 168 days ago | IN | 0 ETH | 0.00050988 | ||||
Emergency Withdr... | 21095313 | 168 days ago | IN | 0 ETH | 0.00057233 | ||||
Withdraw | 19601570 | 376 days ago | IN | 0 ETH | 0.00081143 | ||||
Update Pool | 17669299 | 647 days ago | IN | 0 ETH | 0.00086281 | ||||
Withdraw | 16672152 | 788 days ago | IN | 0 ETH | 0.00349447 | ||||
Withdraw | 16260597 | 845 days ago | IN | 0 ETH | 0.00116069 | ||||
Withdraw | 16192810 | 855 days ago | IN | 0 ETH | 0.00104441 | ||||
Withdraw | 15685484 | 925 days ago | IN | 0 ETH | 0.00081187 | ||||
Withdraw | 15247434 | 992 days ago | IN | 0 ETH | 0.00021457 | ||||
Withdraw | 15247283 | 992 days ago | IN | 0 ETH | 0.00029585 | ||||
Withdraw | 15158952 | 1006 days ago | IN | 0 ETH | 0.00049296 | ||||
Withdraw | 15072920 | 1019 days ago | IN | 0 ETH | 0.00089975 | ||||
Withdraw | 15061276 | 1021 days ago | IN | 0 ETH | 0.00021578 | ||||
Withdraw | 15061276 | 1021 days ago | IN | 0 ETH | 0.00075226 | ||||
Withdraw | 14816879 | 1063 days ago | IN | 0 ETH | 0.00034519 | ||||
Withdraw | 14816878 | 1063 days ago | IN | 0 ETH | 0.00039526 | ||||
Withdraw | 14712335 | 1080 days ago | IN | 0 ETH | 0.00430198 | ||||
Withdraw | 14710877 | 1080 days ago | IN | 0 ETH | 0.00277872 | ||||
Withdraw | 14446295 | 1121 days ago | IN | 0 ETH | 0.00408471 | ||||
Withdraw | 14421221 | 1125 days ago | IN | 0 ETH | 0.00192126 | ||||
Emergency Withdr... | 14400889 | 1128 days ago | IN | 0 ETH | 0.00193831 | ||||
Emergency Withdr... | 14400513 | 1128 days ago | IN | 0 ETH | 0.00331214 | ||||
Emergency Withdr... | 14400217 | 1129 days ago | IN | 0 ETH | 0.00297419 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Memestake
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-22 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.12; library SafeMaths { /** * @dev Returns the addition of two unsigned integers, reverting on * 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). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { 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. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; return c; } } contract Memefund { using SafeMaths for uint256; address public rebaseOracle; // Used for authentication address public owner; // Used for authentication address public newOwner; uint8 public decimals; uint256 public totalSupply; string public name; string public symbol; uint256 private constant MAX_UINT256 = ~uint256(0); // (2^256) - 1 uint256 private constant MAXSUPPLY = ~uint128(0); // (2^128) - 1 uint256 private totalAtoms; uint256 private atomsPerMolecule; mapping (address => uint256) private atomBalances; mapping (address => mapping (address => uint256)) private allowedMolecules; event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); event LogRebase(uint256 _totalSupply); event LogNewRebaseOracle(address _rebaseOracle); event OwnershipTransferred(address indexed _from, address indexed _to); constructor() public { decimals = 9; // decimals totalSupply = 100000000*10**9; // initialSupply name = "Memefund"; // Set the name for display purposes symbol = "MFUND"; // Set the symbol for display purposes owner = msg.sender; totalAtoms = MAX_UINT256 - (MAX_UINT256 % totalSupply); // totalAtoms is a multiple of totalSupply so that atomsPerMolecule is an integer. atomBalances[msg.sender] = totalAtoms; atomsPerMolecule = totalAtoms.div(totalSupply); emit Transfer(address(0), msg.sender, totalSupply); } /** * @param newRebaseOracle The address of the new oracle for rebasement (used for authentication). */ function setRebaseOracle(address newRebaseOracle) external { require(msg.sender == owner, "Can only be executed by owner."); rebaseOracle = newRebaseOracle; emit LogNewRebaseOracle(rebaseOracle); } /** * @dev Propose a new owner. * @param _newOwner The address of the new owner. */ function transferOwnership(address _newOwner) public { require(msg.sender == owner, "Can only be executed by owner."); require(_newOwner != address(0), "0x00 address not allowed."); newOwner = _newOwner; } /** * @dev Accept new owner. */ function acceptOwnership() public { require(msg.sender == newOwner, "Sender not authorized."); emit OwnershipTransferred(owner, newOwner); owner = newOwner; newOwner = address(0); } /** * @dev Notifies Benchmark contract about a new rebase cycle. * @param supplyDelta The number of new molecule tokens to add into or remove from circulation. * @param increaseSupply Whether to increase or decrease the total supply. * @return The total number of molecules after the supply adjustment. */ function rebase(uint256 supplyDelta, bool increaseSupply) external returns (uint256) { require(msg.sender == rebaseOracle, "Can only be executed by rebaseOracle."); if (supplyDelta == 0) { emit LogRebase(totalSupply); return totalSupply; } if (increaseSupply == true) { totalSupply = totalSupply.add(supplyDelta); } else { totalSupply = totalSupply.sub(supplyDelta); } if (totalSupply > MAXSUPPLY) { totalSupply = MAXSUPPLY; } atomsPerMolecule = totalAtoms.div(totalSupply); emit LogRebase(totalSupply); return totalSupply; } /** * @param who The address to query. * @return The balance of the specified address. */ function balanceOf(address who) public view returns (uint256) { return atomBalances[who].div(atomsPerMolecule); } /** * @dev Transfer tokens to a specified address. * @param to The address to transfer to. * @param value The amount to be transferred. * @return True on success, false otherwise. */ function transfer(address to, uint256 value) public returns (bool) { require(to != address(0),"Invalid address."); require(to != address(this),"Molecules contract can't receive MARK."); uint256 atomValue = value.mul(atomsPerMolecule); atomBalances[msg.sender] = atomBalances[msg.sender].sub(atomValue); atomBalances[to] = atomBalances[to].add(atomValue); emit Transfer(msg.sender, to, value); return true; } /** * @dev Function to check the amount of tokens that an owner has allowed to a spender. * @param owner_ The address which owns the funds. * @param spender The address which will spend the funds. * @return The number of tokens still available for the spender. */ function allowance(address owner_, address spender) public view returns (uint256) { return allowedMolecules[owner_][spender]; } /** * @dev Transfer tokens from one address to another. * @param from The address you want to send tokens from. * @param to The address you want to transfer to. * @param value The amount of tokens to be transferred. */ function transferFrom(address from, address to, uint256 value) public returns (bool) { require(to != address(0),"Invalid address."); require(to != address(this),"Molecules contract can't receive MARK."); allowedMolecules[from][msg.sender] = allowedMolecules[from][msg.sender].sub(value); uint256 atomValue = value.mul(atomsPerMolecule); atomBalances[from] = atomBalances[from].sub(atomValue); atomBalances[to] = atomBalances[to].add(atomValue); emit Transfer(from, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of * msg.sender. This method is included for ERC20 compatibility. * IncreaseAllowance and decreaseAllowance should be used instead. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) public returns (bool) { allowedMolecules[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Increase the amount of tokens that an owner has allowed to a spender. * This method should be used instead of approve() to avoid the double approval vulnerability. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { allowedMolecules[msg.sender][spender] = allowedMolecules[msg.sender][spender].add(addedValue); emit Approval(msg.sender, spender, allowedMolecules[msg.sender][spender]); return true; } /** * @dev Decrease the amount of tokens that an owner has allowed to a spender. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { uint256 oldValue = allowedMolecules[msg.sender][spender]; if (subtractedValue >= oldValue) { allowedMolecules[msg.sender][spender] = 0; } else { allowedMolecules[msg.sender][spender] = oldValue.sub(subtractedValue); } emit Approval(msg.sender, spender, allowedMolecules[msg.sender][spender]); return true; } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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); } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @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; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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"); } } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract Memestake is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; struct UserInfo{ uint256 amount; // How many tokens got staked by user. uint256 rewardDebt; // Reward debt. See Explanation below. // We do some fancy math here. Basically, any point in time, the amount of // claimable MFUND by a user is: // // pending reward = (user.amount * pool.accMFundPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accMfundPerShare` (and `lastRewardedBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } struct PoolInfo { IERC20 tokenContract; // Address of Token contract. uint256 allocPoint; // Allocation points from the pool uint256 lastRewardBlock; // Last block number where MFUND got distributed. uint256 accMfundPerShare; // Accumulated MFUND per share. } Memefund public mFundToken; uint256 public mFundPerBlock; PoolInfo[] public poolInfo; mapping (uint256 => mapping(address => UserInfo)) public userInfo; mapping (address => bool) isTokenContractAdded; uint256 public totalAllocPoint; uint256 public totalMfund; uint256 public startBlock; uint256 public endBlock; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event Claim(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); constructor(Memefund _mFundToken, uint256 _totalMfund, uint256 _startBlock, uint256 _endBlock) public{ require(address(_mFundToken) != address(0), "constructor: _mFundToken must not be zero address!"); require(_totalMfund > 0, "constructor: _totalMfund must be greater than 0"); mFundToken = _mFundToken; totalMfund = _totalMfund; startBlock = _startBlock; endBlock = _endBlock; uint256 numberOfBlocksForFarming = endBlock.sub(startBlock); mFundPerBlock = totalMfund.div(numberOfBlocksForFarming); } /// @notice Returns the number of pools that have been added by the owner /// @return Number of pools function numberOfPools() external view returns(uint256){ return poolInfo.length; } /// @notice Create a new LPT pool by whitelisting a new ERC20 token. /// @dev Can only be called by the contract owner /// @param _allocPoint Governs what percentage of the total LPT rewards this pool and other pools will get /// @param _tokenContract Address of the staking token being whitelisted /// @param _withUpdate Set to true for updating all pools before adding this one function add(uint256 _allocPoint, IERC20 _tokenContract, bool _withUpdate) public onlyOwner { require(block.number < endBlock, "add: must be before end"); address tokenContractAddress = address(_tokenContract); require(tokenContractAddress != address(0), "add: _tokenConctract must not be zero address"); require(isTokenContractAdded[tokenContractAddress] == false, "add: already whitelisted"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ tokenContract : _tokenContract, allocPoint : _allocPoint, lastRewardBlock : lastRewardBlock, accMfundPerShare : 0 })); isTokenContractAdded[tokenContractAddress] = true; } /// @notice Update a pool's allocation point to increase or decrease its share of contract-level rewards /// @notice Can also update the max amount that can be staked per user /// @dev Can only be called by the owner /// @param _pid ID of the pool being updated /// @param _allocPoint New allocation point /// @param _withUpdate Set to true if you want to update all pools before making this change - it will checkpoint those rewards function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner { require(block.number < endBlock, "set: must be before end"); require(_pid < poolInfo.length, "set: invalid _pid"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } /// @notice View function to see pending and unclaimed Mfunds for a given user /// @param _pid ID of the pool where a user has a stake /// @param _user Account being queried /// @return Amount of MFUND tokens due to a user function pendingRewards(uint256 _pid, address _user) external view returns (uint256) { require(_pid < poolInfo.length, "pendingMfund: invalid _pid"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accMfundPerShare = pool.accMfundPerShare; uint256 lpSupply = pool.tokenContract.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 maxBlock = block.number <= endBlock ? block.number : endBlock; uint256 multiplier = getMultiplier(pool.lastRewardBlock, maxBlock); uint256 mFundReward = multiplier.mul(mFundPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accMfundPerShare = accMfundPerShare.add(mFundReward.mul(1e18).div(lpSupply)); } return user.amount.mul(accMfundPerShare).div(1e18).sub(user.rewardDebt); } function claimRewards(uint256 _pid) public{ PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 pending = user.amount.mul(pool.accMfundPerShare).div(1e24).sub(user.rewardDebt); require(pending > 0, "harvest: no reward owed"); user.rewardDebt = user.amount.mul(pool.accMfundPerShare).div(1e24); safeMfundTransfer(msg.sender, pending); emit Claim(msg.sender, _pid, pending); } /// @notice Cycles through the pools to update all of the rewards accrued function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } /// @notice Updates a specific pool to track all of the rewards accrued up to the TX block /// @param _pid ID of the pool function updatePool(uint256 _pid) public { require(_pid < poolInfo.length, "updatePool: invalid _pid"); PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 tokenContractSupply = pool.tokenContract.balanceOf(address(this)); if (tokenContractSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 maxEndBlock = block.number <= endBlock ? block.number : endBlock; uint256 multiplier = getMultiplier(pool.lastRewardBlock, maxEndBlock); // No point in doing any more logic as the rewards have ended if (multiplier == 0) { return; } uint256 mFundReward = multiplier.mul(mFundPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accMfundPerShare = pool.accMfundPerShare.add(mFundReward.mul(1e18).div(tokenContractSupply)); pool.lastRewardBlock = maxEndBlock; } /// @notice Where any user can stake their ERC20 tokens into a pool in order to farm $LPT /// @param _pid ID of the pool /// @param _amount Amount of ERC20 being staked function deposit(uint256 _pid, uint256 _amount) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accMfundPerShare).div(1e18).sub(user.rewardDebt); if (pending > 0) { safeMfundTransfer(msg.sender, pending); } } if (_amount > 0) { pool.tokenContract.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accMfundPerShare).div(1e18); emit Deposit(msg.sender, _pid, _amount); } /// @notice Allows a user to withdraw any ERC20 tokens staked in a pool /// @dev Partial withdrawals permitted /// @param _pid Pool ID /// @param _amount Being withdrawn function withdraw(uint256 _pid, uint256 _amount) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: _amount not good"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accMfundPerShare).div(1e18).sub(user.rewardDebt); if (pending > 0) { safeMfundTransfer(msg.sender, pending); } if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.tokenContract.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accMfundPerShare).div(1e18); emit Withdraw(msg.sender, _pid, _amount); } /// @notice Emergency only. Should the rewards issuance mechanism fail, people can still withdraw their stake /// @param _pid Pool ID function emergencyWithdraw(uint256 _pid) external { require(_pid < poolInfo.length, "updatePool: invalid _pid"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; pool.tokenContract.safeTransfer(address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } //////////// // Private / //////////// /// @dev Safe MFUND transfer function, just in case if rounding error causes pool to not have enough LPTs. /// @param _to Whom to send MFUND into /// @param _amount of MFUND to send function safeMfundTransfer(address _to, uint256 _amount) internal { uint256 mFundBal = mFundToken.balanceOf(address(this)); if (_amount > mFundBal) { mFundToken.transfer(_to, mFundBal); } else { mFundToken.transfer(_to, _amount); } } /// @notice Return reward multiplier over the given _from to _to block. /// @param _from Block number /// @param _to Block number /// @return Number of blocks that have passed function getMultiplier(uint256 _from, uint256 _to) private view returns (uint256) { return _to.sub(_from); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract Memefund","name":"_mFundToken","type":"address"},{"internalType":"uint256","name":"_totalMfund","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_tokenContract","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mFundPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mFundToken","outputs":[{"internalType":"contract Memefund","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numberOfPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accMfundPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMfund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002ead38038062002ead833981810160405260808110156200003757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000786200029e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018062002e4c6032913960400191505060405180910390fd5b60008311620001f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018062002e7e602f913960400191505060405180910390fd5b83600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600781905550816008819055508060098190555060006200026f600854600954620002a660201b62001db11790919060201c565b90506200028d81600754620002f860201b62001dfb1790919060201c565b6002819055505050505050620004d9565b600033905090565b6000620002f083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200034a60201b60201c565b905092915050565b60006200034283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200040e60201b60201c565b905092915050565b6000838311158290620003fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620003bf578082015181840152602081019050620003a2565b50505050905090810190601f168015620003ed5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290620004be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200048257808201518184015260208101905062000465565b50505050905090810190601f168015620004b05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581620004cb57fe5b049050809150509392505050565b61296380620004e96000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063630b5ba1116100b857806393f1a40b1161007c57806393f1a40b146103e75780639c14facc14610450578063bbc596291461046e578063d18df53c146104a2578063e2bbb15814610504578063f2fde38b1461053c57610137565b8063630b5ba11461033d57806364482f79146103475780636f682a531461038b578063715018a6146103a95780638da5cb5b146103b357610137565b80633417a062116100ff5780633417a0621461026d578063441a3e701461028b57806348cd4cb1146102c357806351eb05a6146102e15780635312ea8e1461030f57610137565b8063083c63231461013c5780630962ef791461015a5780631526fe271461018857806317caf6f1146101f55780631eaaa04514610213575b600080fd5b610144610580565b6040518082815260200191505060405180910390f35b6101866004803603602081101561017057600080fd5b8101908080359060200190929190505050610586565b005b6101b46004803603602081101561019e57600080fd5b8101908080359060200190929190505050610767565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6101fd6107c4565b6040518082815260200191505060405180910390f35b61026b6004803603606081101561022957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506107ca565b005b610275610bc4565b6040518082815260200191505060405180910390f35b6102c1600480360360408110156102a157600080fd5b810190808035906020019092919080359060200190929190505050610bca565b005b6102cb610e2e565b6040518082815260200191505060405180910390f35b61030d600480360360208110156102f757600080fd5b8101908080359060200190929190505050610e34565b005b61033b6004803603602081101561032557600080fd5b810190808035906020019092919050505061109d565b005b61034561124b565b005b6103896004803603606081101561035d57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611278565b005b6103936114b3565b6040518082815260200191505060405180910390f35b6103b16114c0565b005b6103bb611646565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610433600480360360408110156103fd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061166f565b604051808381526020018281526020019250505060405180910390f35b6104586116a0565b6040518082815260200191505060405180910390f35b6104766116a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104ee600480360360408110156104b857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cc565b6040518082815260200191505060405180910390f35b61053a6004803603604081101561051a57600080fd5b8101908080359060200190929190803590602001909291905050506119ac565b005b61057e6004803603602081101561055257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ba6565b005b60095481565b60006003828154811061059557fe5b9060005260206000209060040201905060006004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061060283610e34565b6000610651826001015461064369d3c21bcecceda100000061063587600301548760000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b9050600081116106c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f686172766573743a206e6f20726577617264206f77656400000000000000000081525060200191505060405180910390fd5b61070069d3c21bcecceda10000006106f285600301548560000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b82600101819055506107123382611ecb565b833373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7836040518082815260200191505060405180910390a350505050565b6003818154811061077457fe5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60065481565b6107d2612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610892576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6009544310610909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6164643a206d757374206265206265666f726520656e6400000000000000000081525060200191505060405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806128d7602d913960400191505060405180910390fd5b60001515600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610a5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6164643a20616c72656164792077686974656c6973746564000000000000000081525060200191505060405180910390fd5b8115610a6957610a6861124b565b5b60006008544311610a7c57600854610a7e565b435b9050610a958560065461214c90919063ffffffff16565b600681905550600360405180608001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018381526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b60025481565b600060038381548110610bd957fe5b9060005260206000209060040201905060006004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f77697468647261773a205f616d6f756e74206e6f7420676f6f6400000000000081525060200191505060405180910390fd5b610cc084610e34565b6000610d0d8260010154610cff670de0b6b3a7640000610cf187600301548760000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b90506000811115610d2357610d223382611ecb565b5b6000841115610d9b57610d43848360000154611db190919063ffffffff16565b8260000181905550610d9a33858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121d49092919063ffffffff16565b5b610dd0670de0b6b3a7640000610dc285600301548560000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b60085481565b6003805490508110610eae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f757064617465506f6f6c3a20696e76616c6964205f706964000000000000000081525060200191505060405180910390fd5b600060038281548110610ebd57fe5b9060005260206000209060040201905080600201544311610ede575061109a565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f6b57600080fd5b505afa158015610f7f573d6000803e3d6000fd5b505050506040513d6020811015610f9557600080fd5b810190808051906020019092919050505090506000811415610fc157438260020181905550505061109a565b6000600954431115610fd557600954610fd7565b435b90506000610fe9846002015483612276565b90506000811415610ffd575050505061109a565b600061103e600654611030876001015461102260025487611e4590919063ffffffff16565b611e4590919063ffffffff16565b611dfb90919063ffffffff16565b905061108361107085611062670de0b6b3a764000085611e4590919063ffffffff16565b611dfb90919063ffffffff16565b866003015461214c90919063ffffffff16565b856003018190555082856002018190555050505050505b50565b6003805490508110611117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f757064617465506f6f6c3a20696e76616c6964205f706964000000000000000081525060200191505060405180910390fd5b60006003828154811061112657fe5b9060005260206000209060040201905060006004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008260000181905550600082600101819055506111f633828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121d49092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a350505050565b6000600380549050905060005b818110156112745761126981610e34565b806001019050611258565b5050565b611280612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60095443106113b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f7365743a206d757374206265206265666f726520656e6400000000000000000081525060200191505060405180910390fd5b6003805490508310611431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f7365743a20696e76616c6964205f70696400000000000000000000000000000081525060200191505060405180910390fd5b80156114405761143f61124b565b5b611485826114776003868154811061145457fe5b906000526020600020906004020160010154600654611db190919063ffffffff16565b61214c90919063ffffffff16565b600681905550816003848154811061149957fe5b906000526020600020906004020160010181905550505050565b6000600380549050905090565b6114c8612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6004602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003805490508310611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e674d66756e643a20696e76616c6964205f70696400000000000081525060200191505060405180910390fd5b60006003848154811061175757fe5b9060005260206000209060040201905060006004600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561185157600080fd5b505afa158015611865573d6000803e3d6000fd5b505050506040513d602081101561187b57600080fd5b810190808051906020019092919050505090508360020154431180156118a2575060008114155b156119595760006009544311156118bb576009546118bd565b435b905060006118cf866002015483612276565b9050600061191260065461190489600101546118f660025487611e4590919063ffffffff16565b611e4590919063ffffffff16565b611dfb90919063ffffffff16565b905061195361194485611936670de0b6b3a764000085611e4590919063ffffffff16565b611dfb90919063ffffffff16565b8661214c90919063ffffffff16565b94505050505b6119a08360010154611992670de0b6b3a7640000611984868860000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b94505050505092915050565b6000600383815481106119bb57fe5b9060005260206000209060040201905060006004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a2884610e34565b600081600001541115611a9a576000611a828260010154611a74670de0b6b3a7640000611a6687600301548760000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b90506000811115611a9857611a973382611ecb565b5b505b6000831115611b1457611af43330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612293909392919063ffffffff16565b611b0b83826000015461214c90919063ffffffff16565b81600001819055505b611b49670de0b6b3a7640000611b3b84600301548460000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b611bae612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061286a6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611df383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612354565b905092915050565b6000611e3d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612414565b905092915050565b600080831415611e585760009050611ec5565b6000828402905082848281611e6957fe5b0414611ec0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128b66021913960400191505060405180910390fd5b809150505b92915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f5657600080fd5b505afa158015611f6a573d6000803e3d6000fd5b505050506040513d6020811015611f8057600080fd5b810190808051906020019092919050505090508082111561206f57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b505050506040513d602081101561205857600080fd5b81019080805190602001909291905050505061213f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561210257600080fd5b505af1158015612116573d6000803e3d6000fd5b505050506040513d602081101561212c57600080fd5b8101908080519060200190929190505050505b505050565b600033905090565b6000808284019050838110156121ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6122718363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124da565b505050565b600061228b8383611db190919063ffffffff16565b905092915050565b61234e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124da565b50505050565b6000838311158290612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123c65780820151818401526020810190506123ab565b50505050905090810190601f1680156123f35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831182906124c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561248557808201518184015260208101905061246a565b50505050905090810190601f1680156124b25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124cc57fe5b049050809150509392505050565b606061253c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125c99092919063ffffffff16565b90506000815111156125c45780806020019051602081101561255d57600080fd5b81019080805190602001909291905050506125c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612904602a913960400191505060405180910390fd5b5b505050565b60606125d884846000856125e1565b90509392505050565b60608247101561263c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128906026913960400191505060405180910390fd5b6126458561278a565b6126b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061270757805182526020820191506020810190506020830392506126e4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612769576040519150601f19603f3d011682016040523d82523d6000602084013e61276e565b606091505b509150915061277e82828661279d565b92505050949350505050565b600080823b905060008111915050919050565b606083156127ad57829050612862565b6000835111156127c05782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561282757808201518184015260208101905061280c565b50505050905090810190601f1680156128545780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776164643a205f746f6b656e436f6e637472616374206d757374206e6f74206265207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212205da014727d9416ba59d161d64c03106ad32e92c2289472cdc442e801b35287f164736f6c634300060c0033636f6e7374727563746f723a205f6d46756e64546f6b656e206d757374206e6f74206265207a65726f206164647265737321636f6e7374727563746f723a205f746f74616c4d66756e64206d7573742062652067726561746572207468616e2030000000000000000000000000ddaddd4f73abc3a6552de43aba325f506232fa8a00000000000000000000000000000000000000000000000001634561151318000000000000000000000000000000000000000000000000000000000000c16a420000000000000000000000000000000000000000000000000000000000c75523
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c8063630b5ba1116100b857806393f1a40b1161007c57806393f1a40b146103e75780639c14facc14610450578063bbc596291461046e578063d18df53c146104a2578063e2bbb15814610504578063f2fde38b1461053c57610137565b8063630b5ba11461033d57806364482f79146103475780636f682a531461038b578063715018a6146103a95780638da5cb5b146103b357610137565b80633417a062116100ff5780633417a0621461026d578063441a3e701461028b57806348cd4cb1146102c357806351eb05a6146102e15780635312ea8e1461030f57610137565b8063083c63231461013c5780630962ef791461015a5780631526fe271461018857806317caf6f1146101f55780631eaaa04514610213575b600080fd5b610144610580565b6040518082815260200191505060405180910390f35b6101866004803603602081101561017057600080fd5b8101908080359060200190929190505050610586565b005b6101b46004803603602081101561019e57600080fd5b8101908080359060200190929190505050610767565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6101fd6107c4565b6040518082815260200191505060405180910390f35b61026b6004803603606081101561022957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506107ca565b005b610275610bc4565b6040518082815260200191505060405180910390f35b6102c1600480360360408110156102a157600080fd5b810190808035906020019092919080359060200190929190505050610bca565b005b6102cb610e2e565b6040518082815260200191505060405180910390f35b61030d600480360360208110156102f757600080fd5b8101908080359060200190929190505050610e34565b005b61033b6004803603602081101561032557600080fd5b810190808035906020019092919050505061109d565b005b61034561124b565b005b6103896004803603606081101561035d57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611278565b005b6103936114b3565b6040518082815260200191505060405180910390f35b6103b16114c0565b005b6103bb611646565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610433600480360360408110156103fd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061166f565b604051808381526020018281526020019250505060405180910390f35b6104586116a0565b6040518082815260200191505060405180910390f35b6104766116a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104ee600480360360408110156104b857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cc565b6040518082815260200191505060405180910390f35b61053a6004803603604081101561051a57600080fd5b8101908080359060200190929190803590602001909291905050506119ac565b005b61057e6004803603602081101561055257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ba6565b005b60095481565b60006003828154811061059557fe5b9060005260206000209060040201905060006004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061060283610e34565b6000610651826001015461064369d3c21bcecceda100000061063587600301548760000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b9050600081116106c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f686172766573743a206e6f20726577617264206f77656400000000000000000081525060200191505060405180910390fd5b61070069d3c21bcecceda10000006106f285600301548560000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b82600101819055506107123382611ecb565b833373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7836040518082815260200191505060405180910390a350505050565b6003818154811061077457fe5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60065481565b6107d2612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610892576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6009544310610909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6164643a206d757374206265206265666f726520656e6400000000000000000081525060200191505060405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806128d7602d913960400191505060405180910390fd5b60001515600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610a5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6164643a20616c72656164792077686974656c6973746564000000000000000081525060200191505060405180910390fd5b8115610a6957610a6861124b565b5b60006008544311610a7c57600854610a7e565b435b9050610a958560065461214c90919063ffffffff16565b600681905550600360405180608001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018381526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b60025481565b600060038381548110610bd957fe5b9060005260206000209060040201905060006004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f77697468647261773a205f616d6f756e74206e6f7420676f6f6400000000000081525060200191505060405180910390fd5b610cc084610e34565b6000610d0d8260010154610cff670de0b6b3a7640000610cf187600301548760000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b90506000811115610d2357610d223382611ecb565b5b6000841115610d9b57610d43848360000154611db190919063ffffffff16565b8260000181905550610d9a33858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121d49092919063ffffffff16565b5b610dd0670de0b6b3a7640000610dc285600301548560000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b60085481565b6003805490508110610eae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f757064617465506f6f6c3a20696e76616c6964205f706964000000000000000081525060200191505060405180910390fd5b600060038281548110610ebd57fe5b9060005260206000209060040201905080600201544311610ede575061109a565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f6b57600080fd5b505afa158015610f7f573d6000803e3d6000fd5b505050506040513d6020811015610f9557600080fd5b810190808051906020019092919050505090506000811415610fc157438260020181905550505061109a565b6000600954431115610fd557600954610fd7565b435b90506000610fe9846002015483612276565b90506000811415610ffd575050505061109a565b600061103e600654611030876001015461102260025487611e4590919063ffffffff16565b611e4590919063ffffffff16565b611dfb90919063ffffffff16565b905061108361107085611062670de0b6b3a764000085611e4590919063ffffffff16565b611dfb90919063ffffffff16565b866003015461214c90919063ffffffff16565b856003018190555082856002018190555050505050505b50565b6003805490508110611117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f757064617465506f6f6c3a20696e76616c6964205f706964000000000000000081525060200191505060405180910390fd5b60006003828154811061112657fe5b9060005260206000209060040201905060006004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008260000181905550600082600101819055506111f633828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121d49092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a350505050565b6000600380549050905060005b818110156112745761126981610e34565b806001019050611258565b5050565b611280612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60095443106113b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f7365743a206d757374206265206265666f726520656e6400000000000000000081525060200191505060405180910390fd5b6003805490508310611431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f7365743a20696e76616c6964205f70696400000000000000000000000000000081525060200191505060405180910390fd5b80156114405761143f61124b565b5b611485826114776003868154811061145457fe5b906000526020600020906004020160010154600654611db190919063ffffffff16565b61214c90919063ffffffff16565b600681905550816003848154811061149957fe5b906000526020600020906004020160010181905550505050565b6000600380549050905090565b6114c8612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6004602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003805490508310611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70656e64696e674d66756e643a20696e76616c6964205f70696400000000000081525060200191505060405180910390fd5b60006003848154811061175757fe5b9060005260206000209060040201905060006004600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561185157600080fd5b505afa158015611865573d6000803e3d6000fd5b505050506040513d602081101561187b57600080fd5b810190808051906020019092919050505090508360020154431180156118a2575060008114155b156119595760006009544311156118bb576009546118bd565b435b905060006118cf866002015483612276565b9050600061191260065461190489600101546118f660025487611e4590919063ffffffff16565b611e4590919063ffffffff16565b611dfb90919063ffffffff16565b905061195361194485611936670de0b6b3a764000085611e4590919063ffffffff16565b611dfb90919063ffffffff16565b8661214c90919063ffffffff16565b94505050505b6119a08360010154611992670de0b6b3a7640000611984868860000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b94505050505092915050565b6000600383815481106119bb57fe5b9060005260206000209060040201905060006004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a2884610e34565b600081600001541115611a9a576000611a828260010154611a74670de0b6b3a7640000611a6687600301548760000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b611db190919063ffffffff16565b90506000811115611a9857611a973382611ecb565b5b505b6000831115611b1457611af43330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612293909392919063ffffffff16565b611b0b83826000015461214c90919063ffffffff16565b81600001819055505b611b49670de0b6b3a7640000611b3b84600301548460000154611e4590919063ffffffff16565b611dfb90919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b611bae612144565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061286a6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611df383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612354565b905092915050565b6000611e3d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612414565b905092915050565b600080831415611e585760009050611ec5565b6000828402905082848281611e6957fe5b0414611ec0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128b66021913960400191505060405180910390fd5b809150505b92915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f5657600080fd5b505afa158015611f6a573d6000803e3d6000fd5b505050506040513d6020811015611f8057600080fd5b810190808051906020019092919050505090508082111561206f57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b505050506040513d602081101561205857600080fd5b81019080805190602001909291905050505061213f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561210257600080fd5b505af1158015612116573d6000803e3d6000fd5b505050506040513d602081101561212c57600080fd5b8101908080519060200190929190505050505b505050565b600033905090565b6000808284019050838110156121ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6122718363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124da565b505050565b600061228b8383611db190919063ffffffff16565b905092915050565b61234e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124da565b50505050565b6000838311158290612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123c65780820151818401526020810190506123ab565b50505050905090810190601f1680156123f35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831182906124c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561248557808201518184015260208101905061246a565b50505050905090810190601f1680156124b25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124cc57fe5b049050809150509392505050565b606061253c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125c99092919063ffffffff16565b90506000815111156125c45780806020019051602081101561255d57600080fd5b81019080805190602001909291905050506125c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612904602a913960400191505060405180910390fd5b5b505050565b60606125d884846000856125e1565b90509392505050565b60608247101561263c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128906026913960400191505060405180910390fd5b6126458561278a565b6126b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061270757805182526020820191506020810190506020830392506126e4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612769576040519150601f19603f3d011682016040523d82523d6000602084013e61276e565b606091505b509150915061277e82828661279d565b92505050949350505050565b600080823b905060008111915050919050565b606083156127ad57829050612862565b6000835111156127c05782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561282757808201518184015260208101905061280c565b50505050905090810190601f1680156128545780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776164643a205f746f6b656e436f6e637472616374206d757374206e6f74206265207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212205da014727d9416ba59d161d64c03106ad32e92c2289472cdc442e801b35287f164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ddaddd4f73abc3a6552de43aba325f506232fa8a00000000000000000000000000000000000000000000000001634561151318000000000000000000000000000000000000000000000000000000000000c16a420000000000000000000000000000000000000000000000000000000000c75523
-----Decoded View---------------
Arg [0] : _mFundToken (address): 0xddAdDD4F73ABC3a6552dE43aBA325f506232fA8A
Arg [1] : _totalMfund (uint256): 99999900000000000
Arg [2] : _startBlock (uint256): 12675650
Arg [3] : _endBlock (uint256): 13063459
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ddaddd4f73abc3a6552de43aba325f506232fa8a
Arg [1] : 0000000000000000000000000000000000000000000000000163456115131800
Arg [2] : 0000000000000000000000000000000000000000000000000000000000c16a42
Arg [3] : 0000000000000000000000000000000000000000000000000000000000c75523
Deployed Bytecode Sourcemap
39970:11709:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41493:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46265:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41222:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41386:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43206:939;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41185:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49397:771;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41459:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47209:1027;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50320:469;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46871:180;;;:::i;:::-;;44617:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42691:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39416:148;;;:::i;:::-;;38774:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41257:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;41425:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41152:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45311:936;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48428:771;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39719:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41493:23;;;;:::o;46265:517::-;46318:21;46342:8;46351:4;46342:14;;;;;;;;;;;;;;;;;;46318:38;;46367:21;46391:8;:14;46400:4;46391:14;;;;;;;;;;;:26;46406:10;46391:26;;;;;;;;;;;;;;;46367:50;;46428:16;46439:4;46428:10;:16::i;:::-;46455:15;46473:69;46526:4;:15;;;46473:48;46516:4;46473:38;46489:4;:21;;;46473:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;46455:87;;46571:1;46561:7;:11;46553:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46629:48;46672:4;46629:38;46645:4;:21;;;46629:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;46611:4;:15;;:66;;;;46688:38;46706:10;46718:7;46688:17;:38::i;:::-;46760:4;46748:10;46742:32;;;46766:7;46742:32;;;;;;;;;;;;;;;;;;46265:517;;;;:::o;41222:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41386:30::-;;;;:::o;43206:939::-;38996:12;:10;:12::i;:::-;38986:22;;:6;;;;;;;;;;:22;;;38978:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43332:8:::1;;43317:12;:23;43309:59;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;43379:28;43418:14;43379:54;;43484:1;43452:34;;:20;:34;;;;43444:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43601:5;43555:51;;:20;:42;43576:20;43555:42;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;43547:88;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;43652:11;43648:61;;;43680:17;:15;:17::i;:::-;43648:61;43721:23;43762:10;;43747:12;:25;:53;;43790:10;;43747:53;;;43775:12;43747:53;43721:79;;43829:32;43849:11;43829:15;;:19;;:32;;;;:::i;:::-;43811:15;:50;;;;43872:8;43886:188;;;;;;;;43926:14;43886:188;;;;;;43968:11;43886:188;;;;44012:15;43886:188;;;;44061:1;43886:188;;::::0;43872:203:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44133:4;44088:20;:42;44109:20;44088:42;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;39056:1;;43206:939:::0;;;:::o;41185:28::-;;;;:::o;49397:771::-;49466:21;49490:8;49499:4;49490:14;;;;;;;;;;;;;;;;;;49466:38;;49515:21;49539:8;:14;49548:4;49539:14;;;;;;;;;;;:26;49554:10;49539:26;;;;;;;;;;;;;;;49515:50;;49601:7;49586:4;:11;;;:22;;49578:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49652:16;49663:4;49652:10;:16::i;:::-;49681:15;49699:69;49752:4;:15;;;49699:48;49742:4;49699:38;49715:4;:21;;;49699:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;49681:87;;49793:1;49783:7;:11;49779:82;;;49811:38;49829:10;49841:7;49811:17;:38::i;:::-;49779:82;49887:1;49877:7;:11;49873:158;;;49919:24;49935:7;49919:4;:11;;;:15;;:24;;;;:::i;:::-;49905:4;:11;;:38;;;;49958:61;49998:10;50011:7;49958:4;:18;;;;;;;;;;;;:31;;;;:61;;;;;:::i;:::-;49873:158;50061:48;50104:4;50061:38;50077:4;:21;;;50061:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;50043:4;:15;;:66;;;;50146:4;50134:10;50125:35;;;50152:7;50125:35;;;;;;;;;;;;;;;;;;49397:771;;;;;:::o;41459:25::-;;;;:::o;47209:1027::-;47276:8;:15;;;;47269:4;:22;47261:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47333:21;47357:8;47366:4;47357:14;;;;;;;;;;;;;;;;;;47333:38;;47402:4;:20;;;47386:12;:36;47382:75;;47439:7;;;47382:75;47469:27;47499:4;:18;;;;;;;;;;;;:28;;;47536:4;47499:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47469:73;;47580:1;47557:19;:24;47553:113;;;47621:12;47598:4;:20;;:35;;;;47648:7;;;;47553:113;47678:19;47716:8;;47700:12;:24;;:50;;47742:8;;47700:50;;;47727:12;47700:50;47678:72;;47761:18;47782:48;47796:4;:20;;;47818:11;47782:13;:48::i;:::-;47761:69;;47932:1;47918:10;:15;47914:54;;;47950:7;;;;;;47914:54;47980:19;48002:71;48057:15;;48002:50;48036:4;:15;;;48002:29;48017:13;;48002:10;:14;;:29;;;;:::i;:::-;:33;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;47980:93;;48110:73;48136:46;48162:19;48136:21;48152:4;48136:11;:15;;:21;;;;:::i;:::-;:25;;:46;;;;:::i;:::-;48110:4;:21;;;:25;;:73;;;;:::i;:::-;48086:4;:21;;:97;;;;48217:11;48194:4;:20;;:34;;;;47209:1027;;;;;;;:::o;50320:469::-;50396:8;:15;;;;50389:4;:22;50381:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50453:21;50477:8;50486:4;50477:14;;;;;;;;;;;;;;;;;;50453:38;;50502:21;50526:8;:14;50535:4;50526:14;;;;;;;;;;;:26;50541:10;50526:26;;;;;;;;;;;;;;;50502:50;;50565:14;50582:4;:11;;;50565:28;;50618:1;50604:4;:11;;:15;;;;50648:1;50630:4;:15;;:19;;;;50662:60;50702:10;50715:6;50662:4;:18;;;;;;;;;;;;:31;;;;:60;;;;;:::i;:::-;50768:4;50756:10;50738:43;;;50774:6;50738:43;;;;;;;;;;;;;;;;;;50320:469;;;;:::o;46871:180::-;46916:14;46933:8;:15;;;;46916:32;;46964:11;46959:85;46987:6;46981:3;:12;46959:85;;;47017:15;47028:3;47017:10;:15::i;:::-;46995:5;;;;;46959:85;;;;46871:180;:::o;44617:443::-;38996:12;:10;:12::i;:::-;38986:22;;:6;;;;;;;;;;:22;;;38978:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44734:8:::1;;44719:12;:23;44711:59;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;44796:8;:15;;;;44789:4;:22;44781:52;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;44850:11;44846:61;;;44878:17;:15;:17::i;:::-;44846:61;44937:63;44988:11;44937:46;44957:8;44966:4;44957:14;;;;;;;;;;;;;;;;;;:25;;;44937:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;44919:15;:81;;;;45041:11;45013:8;45022:4;45013:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;44617:443:::0;;;:::o;42691:96::-;42738:7;42764:8;:15;;;;42757:22;;42691:96;:::o;39416:148::-;38996:12;:10;:12::i;:::-;38986:22;;:6;;;;;;;;;;:22;;;38978:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39523:1:::1;39486:40;;39507:6;::::0;::::1;;;;;;;;39486:40;;;;;;;;;;;;39554:1;39537:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;39416:148::o:0;38774:79::-;38812:7;38839:6;;;;;;;;;;;38832:13;;38774:79;:::o;41257:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41425:25::-;;;;:::o;41152:26::-;;;;;;;;;;;;;:::o;45311:936::-;45387:7;45422:8;:15;;;;45415:4;:22;45407:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45481:21;45505:8;45514:4;45505:14;;;;;;;;;;;;;;;;;;45481:38;;45530:21;45554:8;:14;45563:4;45554:14;;;;;;;;;;;:21;45569:5;45554:21;;;;;;;;;;;;;;;45530:45;;45588:24;45615:4;:21;;;45588:48;;45647:16;45666:4;:18;;;;;;;;;;;;:28;;;45703:4;45666:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45647:62;;45741:4;:20;;;45726:12;:35;:52;;;;;45777:1;45765:8;:13;;45726:52;45722:434;;;45795:16;45830:8;;45814:12;:24;;:50;;45856:8;;45814:50;;;45841:12;45814:50;45795:69;;45879:18;45900:45;45914:4;:20;;;45936:8;45900:13;:45::i;:::-;45879:66;;45960:19;45982:71;46037:15;;45982:50;46016:4;:15;;;45982:29;45997:13;;45982:10;:14;;:29;;;;:::i;:::-;:33;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;45960:93;;46087:57;46108:35;46134:8;46108:21;46124:4;46108:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;46087:16;:20;;:57;;;;:::i;:::-;46068:76;;45722:434;;;;46175:64;46223:4;:15;;;46175:43;46213:4;46175:33;46191:16;46175:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:64;;;;:::i;:::-;46168:71;;;;;;45311:936;;;;:::o;48428:771::-;48496:21;48520:8;48529:4;48520:14;;;;;;;;;;;;;;;;;;48496:38;;48545:21;48569:8;:14;48578:4;48569:14;;;;;;;;;;;:26;48584:10;48569:26;;;;;;;;;;;;;;;48545:50;;48606:16;48617:4;48606:10;:16::i;:::-;48653:1;48639:4;:11;;;:15;48635:239;;;48671:15;48689:69;48742:4;:15;;;48689:48;48732:4;48689:38;48705:4;:21;;;48689:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;48671:87;;48787:1;48777:7;:11;48773:90;;;48809:38;48827:10;48839:7;48809:17;:38::i;:::-;48773:90;48635:239;;48900:1;48890:7;:11;48886:177;;;48918:80;48962:10;48983:4;48990:7;48918:4;:18;;;;;;;;;;;;:35;;;;:80;;;;;;:::i;:::-;49027:24;49043:7;49027:4;:11;;;:15;;:24;;;;:::i;:::-;49013:4;:11;;:38;;;;48886:177;49093:48;49136:4;49093:38;49109:4;:21;;;49093:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;49075:4;:15;;:66;;;;49177:4;49165:10;49157:34;;;49183:7;49157:34;;;;;;;;;;;;;;;;;;48428:771;;;;:::o;39719:244::-;38996:12;:10;:12::i;:::-;38986:22;;:6;;;;;;;;;;:22;;;38978:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39828:1:::1;39808:22;;:8;:22;;;;39800:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39918:8;39889:38;;39910:6;::::0;::::1;;;;;;;;39889:38;;;;;;;;;;;;39947:8;39938:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;39719:244:::0;:::o;22701:136::-;22759:7;22786:43;22790:1;22793;22786:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;22779:50;;22701:136;;;;:::o;24538:132::-;24596:7;24623:39;24627:1;24630;24623:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;24616:46;;24538:132;;;;:::o;23591:471::-;23649:7;23899:1;23894;:6;23890:47;;;23924:1;23917:8;;;;23890:47;23949:9;23965:1;23961;:5;23949:17;;23994:1;23989;23985;:5;;;;;;:10;23977:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24053:1;24046:8;;;23591:471;;;;;:::o;51050:300::-;51127:16;51146:10;;;;;;;;;;;:20;;;51175:4;51146:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51127:54;;51206:8;51196:7;:18;51192:151;;;51231:10;;;;;;;;;;;:19;;;51251:3;51256:8;51231:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51192:151;;;51298:10;;;;;;;;;;;:19;;;51318:3;51323:7;51298:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51192:151;51050:300;;;:::o;9532:106::-;9585:15;9620:10;9613:17;;9532:106;:::o;22237:181::-;22295:7;22315:9;22331:1;22327;:5;22315:17;;22356:1;22351;:6;;22343:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22409:1;22402:8;;;22237:181;;;;:::o;35198:177::-;35281:86;35301:5;35331:23;;;35356:2;35360:5;35308:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35281:19;:86::i;:::-;35198:177;;;:::o;51554:122::-;51627:7;51654:14;51662:5;51654:3;:7;;:14;;;;:::i;:::-;51647:21;;51554:122;;;;:::o;35383:205::-;35484:96;35504:5;35534:27;;;35563:4;35569:2;35573:5;35511:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35484:19;:96::i;:::-;35383:205;;;;:::o;23140:192::-;23226:7;23259:1;23254;:6;;23262:12;23246:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23286:9;23302:1;23298;:5;23286:17;;23323:1;23316:8;;;23140:192;;;;;:::o;25166:278::-;25252:7;25284:1;25280;:5;25287:12;25272:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25311:9;25327:1;25323;:5;;;;;;25311:17;;25435:1;25428:8;;;25166:278;;;;;:::o;37503:761::-;37927:23;37953:69;37981:4;37953:69;;;;;;;;;;;;;;;;;37961:5;37953:27;;;;:69;;;;;:::i;:::-;37927:95;;38057:1;38037:10;:17;:21;38033:224;;;38179:10;38168:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38160:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38033:224;37503:761;;;:::o;30296:195::-;30399:12;30431:52;30453:6;30461:4;30467:1;30470:12;30431:21;:52::i;:::-;30424:59;;30296:195;;;;;:::o;31348:530::-;31475:12;31533:5;31508:21;:30;;31500:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31600:18;31611:6;31600:10;:18::i;:::-;31592:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31726:12;31740:23;31767:6;:11;;31787:5;31795:4;31767:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31725:75;;;;31818:52;31836:7;31845:10;31857:12;31818:17;:52::i;:::-;31811:59;;;;31348:530;;;;;;:::o;27378:422::-;27438:4;27646:12;27757:7;27745:20;27737:28;;27791:1;27784:4;:8;27777:15;;;27378:422;;;:::o;33888:742::-;34003:12;34032:7;34028:595;;;34063:10;34056:17;;;;34028:595;34197:1;34177:10;:17;:21;34173:439;;;34440:10;34434:17;34501:15;34488:10;34484:2;34480:19;34473:44;34388:148;34583:12;34576:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33888:742;;;;;;:::o
Swarm Source
ipfs://5da014727d9416ba59d161d64c03106ad32e92c2289472cdc442e801b35287f1
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.