Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 11 from a total of 11 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 11377871 | 9 hrs ago | IN | 0 S | 0.00476148 | ||||
Participate | 11377640 | 9 hrs ago | IN | 0 S | 0.00583463 | ||||
Set Presale Enab... | 11371769 | 9 hrs ago | IN | 0 S | 0.00272959 | ||||
Set Presale Enab... | 11370314 | 9 hrs ago | IN | 0 S | 0.00147718 | ||||
Emergency Withdr... | 11370155 | 9 hrs ago | IN | 0 S | 0.00380988 | ||||
Participate | 11369874 | 9 hrs ago | IN | 0 S | 0.01156117 | ||||
Set Presale Enab... | 11368280 | 10 hrs ago | IN | 0 S | 0.00272959 | ||||
Add Multiple To ... | 11368119 | 10 hrs ago | IN | 0 S | 0.0051563 | ||||
Set Hard Cap | 11364557 | 10 hrs ago | IN | 0 S | 0.00166883 | ||||
Set Contribution... | 10955166 | 2 days ago | IN | 0 S | 0.00188364 | ||||
Set Hard Cap | 10955164 | 2 days ago | IN | 0 S | 0.00158911 |
Loading...
Loading
Contract Name:
SolisPresale
Compiler Version
v0.7.5+commit.eb77ed08
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later pragma abicoder v2; pragma solidity 0.7.5; import "./lib/EnumerableSet.sol"; import "./lib/IERC2612Permit.sol"; import "./lib/IERC20.sol"; import "./lib/ERC20Permit.sol"; import "./lib/VaultOwned.sol"; import "./lib/IRouter.sol"; import "./lib/IPairFactory.sol"; import "./lib/SafeMath.sol"; import "./lib/Ownable.sol"; contract SolisPresale is Ownable { using SafeMath for uint256; using EnumerableSet for EnumerableSet.AddressSet; // Presale token IERC20 public presaleToken; // Solis token IERC20 public solisToken; // Whitelist of addresses allowed to participate in presale EnumerableSet.AddressSet private _whitelist; // Set of participants who have contributed to the presale EnumerableSet.AddressSet private _participants; // Mapping to track contributions per address mapping(address => uint256) public contributions; // Mapping to track if an address has claimed their tokens mapping(address => bool) public hasClaimed; // Total amount of presale tokens received uint256 public totalPresaleAmount; // Total amount of Solis tokens to distribute uint256 public totalSolisAmount; // Presale state variables bool public presaleEnabled; bool public distributionEnabled; bool public refundsEnabled; // Reentrancy guard bool private _locked; modifier nonReentrant() { require(!_locked, "ReentrancyGuard: reentrant call"); _locked = true; _; _locked = false; } // Minimum and maximum contribution limits per address uint256 public minContribution = 500 * 10**18; uint256 public maxContribution = 15000 * 10**18; // Hard cap for the presale uint256 public hardCap = 750000 * 10**18; // Events event WhitelistAdded(address indexed account); event WhitelistRemoved(address indexed account); event PresaleStateChanged(bool enabled); event DistributionStateChanged(bool enabled); event RefundsStateChanged(bool enabled); event PresaleContribution(address indexed participant, uint256 amount); event SolisDeposited(uint256 amount); event TokensClaimed(address indexed participant, uint256 amount); event Refunded(address indexed participant, uint256 amount); constructor(address _presaleToken) { presaleToken = IERC20(_presaleToken); } /** * @dev Add an address to the whitelist * @param _account Address to add to the whitelist */ function addToWhitelist(address _account) external onlyOwner { require(_account != address(0), "Cannot add zero address"); require(_whitelist.add(_account), "Address already whitelisted"); emit WhitelistAdded(_account); } /** * @dev Add multiple addresses to the whitelist * @param _accounts Array of addresses to add to the whitelist */ function addMultipleToWhitelist(address[] calldata _accounts) external onlyOwner { for (uint256 i = 0; i < _accounts.length; i++) { if (_accounts[i] != address(0) && _whitelist.add(_accounts[i])) { emit WhitelistAdded(_accounts[i]); } } } /** * @dev Remove an address from the whitelist * @param _account Address to remove from the whitelist */ function removeFromWhitelist(address _account) external onlyOwner { require(_whitelist.remove(_account), "Address not whitelisted"); emit WhitelistRemoved(_account); } /** * @dev Check if an address is whitelisted * @param _account Address to check * @return bool True if address is whitelisted */ function isWhitelisted(address _account) external view returns (bool) { return _whitelist.contains(_account); } /** * @dev Enable or disable the presale * @param _enabled New state for presale */ function setPresaleEnabled(bool _enabled) external onlyOwner { presaleEnabled = _enabled; emit PresaleStateChanged(_enabled); } /** * @dev Enable or disable the distribution * @param _enabled New state for distribution */ function setDistributionEnabled(bool _enabled) external onlyOwner { distributionEnabled = _enabled; emit DistributionStateChanged(_enabled); } /** * @dev Enable or disable refunds */ function setRefundsEnabled(bool _enabled) external onlyOwner { refundsEnabled = _enabled; emit RefundsStateChanged(_enabled); } /** * @dev Participate in the presale by sending presale tokens * @param _amount Amount of presale tokens to contribute */ function participate(uint256 _amount) external nonReentrant { require(presaleEnabled, "Presale is not enabled"); require(_whitelist.contains(msg.sender), "Address not whitelisted"); require(_amount > 0, "Amount must be greater than 0"); require(_amount >= minContribution, "Below minimum contribution"); require(contributions[msg.sender].add(_amount) <= maxContribution, "Exceeds maximum contribution"); require(totalPresaleAmount.add(_amount) <= hardCap, "Hard cap reached"); // Transfer presale tokens from participant to this contract require( presaleToken.transferFrom(msg.sender, address(this), _amount), "Token transfer failed" ); // Add participant to the participants set if not already added if (!_participants.contains(msg.sender)) { _participants.add(msg.sender); } // Update contribution amount contributions[msg.sender] = contributions[msg.sender].add(_amount); // Update total presale amount totalPresaleAmount = totalPresaleAmount.add(_amount); emit PresaleContribution(msg.sender, _amount); } /** * @dev Set the Solis token address and deposit Solis tokens for distribution * @param _solisToken Address of the Solis token * @param _amount Amount of Solis tokens to deposit */ function depositSolisTokens(address _solisToken, uint256 _amount) external onlyOwner { require(_solisToken != address(0), "Invalid Solis token address"); require(_amount > 0, "Amount must be greater than 0"); require(!presaleEnabled, "Presale must be disabled"); // Set Solis token address if not already set if (address(solisToken) == address(0)) { solisToken = IERC20(_solisToken); } else { require(address(solisToken) == _solisToken, "Solis token address mismatch"); } // Transfer Solis tokens from owner to this contract require( solisToken.transferFrom(msg.sender, address(this), _amount), "Token transfer failed" ); // Update total Solis amount totalSolisAmount = totalSolisAmount.add(_amount); emit SolisDeposited(_amount); } /** * @dev Claim Solis tokens based on contribution */ function claimTokens() external nonReentrant { require(distributionEnabled, "Distribution is not enabled"); require(_participants.contains(msg.sender), "Not a participant"); require(!hasClaimed[msg.sender], "Already claimed"); require(totalPresaleAmount > 0, "No presale contributions"); require(totalSolisAmount > 0, "No Solis tokens to distribute"); // Calculate claimable amount uint256 claimableAmount = calculateClaimableAmount(msg.sender); require(claimableAmount > 0, "Nothing to claim"); // Mark as claimed hasClaimed[msg.sender] = true; // Transfer Solis tokens to participant require( solisToken.transfer(msg.sender, claimableAmount), "Token transfer failed" ); emit TokensClaimed(msg.sender, claimableAmount); } /** * @dev Calculate claimable Solis tokens for a participant * @param _participant Address of the participant * @return uint256 Amount of Solis tokens claimable */ function calculateClaimableAmount(address _participant) public view returns (uint256) { if (totalPresaleAmount == 0 || totalSolisAmount == 0) { return 0; } // Calculate based on the formula: contribution * totalSolisTokens / totalPresale return contributions[_participant].mul(totalSolisAmount).div(totalPresaleAmount); } /** * @dev Get the number of whitelisted addresses * @return uint256 Number of whitelisted addresses */ function getWhitelistCount() external view returns (uint256) { return _whitelist.length(); } /** * @dev Get the number of participants * @return uint256 Number of participants */ function getParticipantCount() external view returns (uint256) { return _participants.length(); } /** * @dev Get participant at index * @param _index Index of the participant * @return address Participant address */ function getParticipantAtIndex(uint256 _index) external view returns (address) { require(_index < _participants.length(), "Index out of bounds"); return _participants.at(_index); } /** * @dev Emergency withdraw function for owner to recover tokens * @param _token Address of the token to withdraw */ function emergencyWithdraw(address _token) external onlyOwner { IERC20 token = IERC20(_token); uint256 balance = token.balanceOf(address(this)); require(balance > 0, "No tokens to withdraw"); require(token.transfer(owner(), balance), "Transfer failed"); } /** * @dev Refund function for participants */ function refund() external nonReentrant { require(refundsEnabled, "Refunds not enabled"); require(_participants.contains(msg.sender), "Not a participant"); require(contributions[msg.sender] > 0, "No contribution to refund"); uint256 amount = contributions[msg.sender]; contributions[msg.sender] = 0; _participants.remove(msg.sender); // Update total presale amount totalPresaleAmount = totalPresaleAmount.sub(amount); // Transfer tokens back to participant require( presaleToken.transfer(msg.sender, amount), "Refund transfer failed" ); emit Refunded(msg.sender, amount); } function setContributionLimits(uint256 _min, uint256 _max) external onlyOwner { require(_min <= _max, "Min must be <= max"); minContribution = _min; maxContribution = _max; } function setHardCap(uint256 _hardCap) external onlyOwner { hardCap = _hardCap; } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; import "./SafeMath.sol"; library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; 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]; } function _getValues( Set storage set_ ) private view returns (bytes32[] storage) { return set_._values; } // TODO needs insert function that maintains order. // TODO needs NatSpec documentation comment. /** * Inserts new value by moving existing value at provided index to end * of array and setting provided value at provided index */ function _insert( Set storage set_, uint256 index_, bytes32 valueToInsert_ ) private returns (bool) { require(set_._values.length > index_); require( !_contains(set_, valueToInsert_), "Remove value you wish to insert if you wish to reorder array." ); bytes32 existingValue_ = _at(set_, index_); set_._values[index_] = valueToInsert_; return _add(set_, existingValue_); } struct Bytes4Set { 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(Bytes4Set storage set, bytes4 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( Bytes4Set storage set, bytes4 value ) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains( Bytes4Set storage set, bytes4 value ) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values on the set. O(1). */ function length(Bytes4Set 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( Bytes4Set storage set, uint256 index ) internal view returns (bytes4) { return bytes4(_at(set._inner, index)); } function getValues( Bytes4Set storage set_ ) internal view returns (bytes4[] memory) { bytes4[] memory bytes4Array_; for ( uint256 iteration_ = 0; _length(set_._inner) > iteration_; iteration_++ ) { bytes4Array_[iteration_] = bytes4(_at(set_._inner, iteration_)); } return bytes4Array_; } function insert( Bytes4Set storage set_, uint256 index_, bytes4 valueToInsert_ ) internal returns (bool) { return _insert(set_._inner, index_, valueToInsert_); } 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 on 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); } function getValues( Bytes32Set storage set_ ) internal view returns (bytes4[] memory) { bytes4[] memory bytes4Array_; for ( uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++ ) { bytes4Array_[iteration_] = bytes4(at(set_, iteration_)); } return bytes4Array_; } function insert( Bytes32Set storage set_, uint256 index_, bytes32 valueToInsert_ ) internal returns (bool) { return _insert(set_._inner, index_, valueToInsert_); } // 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))); } /** * TODO Might require explicit conversion of bytes32[] to address[]. * Might require iteration. */ function getValues( AddressSet storage set_ ) internal view returns (address[] memory) { address[] memory addressArray; for ( uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++ ) { addressArray[iteration_] = at(set_, iteration_); } return addressArray; } function insert( AddressSet storage set_, uint256 index_, address valueToInsert_ ) internal returns (bool) { return _insert(set_._inner, index_, bytes32(uint256(valueToInsert_))); } // 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)); } struct UInt256Set { 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( UInt256Set 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( UInt256Set 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( UInt256Set 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(UInt256Set 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( UInt256Set storage set, uint256 index ) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; import "./IERC20.sol"; import "./SafeMath.sol"; abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 private constant ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256("ERC20Token"); // Present in ERC777 mapping(address => uint256) internal _balances; // Present in ERC777 mapping(address => mapping(address => uint256)) internal _allowances; // Present in ERC777 uint256 internal _totalSupply; // Present in ERC777 string internal _name; // Present in ERC777 string internal _symbol; // Present in ERC777 uint8 internal _decimals; constructor(string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } function transfer( address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve( address spender, uint256 amount ) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, msg.sender, _allowances[sender][msg.sender].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } function increaseAllowance( address spender, uint256 addedValue ) public virtual returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].add(addedValue) ); return true; } function decreaseAllowance( address spender, uint256 subtractedValue ) public virtual returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 amount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(this), account_, amount_); _totalSupply = _totalSupply.add(amount_); _balances[account_] = _balances[account_].add(amount_); emit Transfer(address(this), account_, amount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual {} }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; import "./IERC20.sol"; import "./IERC2612Permit.sol"; import "./Counters.sol"; import "./ERC20.sol"; abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } /** * @dev See {IERC2612Permit-permit}. * */ function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline ) ); bytes32 _hash = keccak256( abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct) ); address signer = ecrecover(_hash, v, r, s); require( signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature" ); _nonces[owner].increment(); _approve(owner, spender, amount); } /** * @dev See {IERC2612Permit-nonces}. */ function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IERC20 { function decimals() external view returns (uint8); /** * @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 ); }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function owner() external view returns (address); function renounceOwnership() external; function transferOwnership(address newOwner_) external; }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.7.5; interface IPairFactory { event FEE_TOO_HIGH(); event ZERO_FEE(); /// @dev invalid assortment event IA(); /// @dev zero address event ZA(); /// @dev pair exists event PE(); event NOT_AUTHORIZED(); event INVALID_FEE_SPLIT(); event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); event SetFee(uint256 indexed fee); event SetPairFee(address indexed pair, uint256 indexed fee); event SetFeeSplit(uint256 indexed _feeSplit); event SetPairFeeSplit(address indexed pair, uint256 indexed _feeSplit); event SkimStatus(address indexed _pair, bool indexed _status); event NewTreasury(address indexed _caller, address indexed _newTreasury); event FeeSplitWhenNoGauge(address indexed _caller, bool indexed _status); event SetFeeRecipient(address indexed pair, address indexed feeRecipient); /// @notice returns the total length of legacy pairs /// @return _length the length function allPairsLength() external view returns (uint256 _length); /// @notice calculates if the address is a legacy pair /// @param pair the address to check /// @return _boolean the bool return function isPair(address pair) external view returns (bool _boolean); /// @notice calculates the pairCodeHash /// @return _hash the pair code hash function pairCodeHash() external view returns (bytes32 _hash); /// @param tokenA address of tokenA /// @param tokenB address of tokenB /// @param stable whether it uses the stable curve /// @return _pair the address of the pair function getPair( address tokenA, address tokenB, bool stable ) external view returns (address _pair); /// @notice creates a new legacy pair /// @param tokenA address of tokenA /// @param tokenB address of tokenB /// @param stable whether it uses the stable curve /// @return pair the address of the created pair function createPair( address tokenA, address tokenB, bool stable ) external returns (address pair); /// @notice the address of the voter /// @return _voter the address of the voter function voter() external view returns (address _voter); /// @notice returns the address of a pair based on the index /// @param _index the index to check for a pair /// @return _pair the address of the pair at the index function allPairs(uint256 _index) external view returns (address _pair); /// @notice the swap fee of a pair /// @param _pair the address of the pair /// @return _fee the fee function pairFee(address _pair) external view returns (uint256 _fee); /// @notice the split of fees /// @return _split the feeSplit function feeSplit() external view returns (uint256 _split); /// @notice sets the swap fee for a pair /// @param _pair the address of the pair /// @param _fee the fee for the pair function setPairFee(address _pair, uint256 _fee) external; /// @notice set the swap fees of the pair /// @param _fee the fee, scaled to MAX 10% of 100_000 function setFee(uint256 _fee) external; /// @notice the address for the treasury /// @return _treasury address of the treasury function treasury() external view returns (address _treasury); /// @notice sets the pairFees contract /// @param _pair the address of the pair /// @param _pairFees the address of the new Pair Fees function setFeeRecipient(address _pair, address _pairFees) external; /// @notice sets the feeSplit for a pair /// @param _pair the address of the pair /// @param _feeSplit the feeSplit function setPairFeeSplit(address _pair, uint256 _feeSplit) external; /// @notice whether there is feeSplit when there's no gauge /// @return _boolean whether there is a feesplit when no gauge function feeSplitWhenNoGauge() external view returns (bool _boolean); /// @notice whether a pair can be skimmed /// @param _pair the pair address /// @return _boolean whether skim is enabled function skimEnabled(address _pair) external view returns (bool _boolean); /// @notice set whether skim is enabled for a specific pair function setSkimEnabled(address _pair, bool _status) external; /// @notice sets a new treasury address /// @param _treasury the new treasury address function setTreasury(address _treasury) external; /// @notice set whether there should be a feesplit without gauges /// @param status whether enabled or not function setFeeSplitWhenNoGauge(bool status) external; /// @notice sets the feesSplit globally /// @param _feeSplit the fee split function setFeeSplit(uint256 _feeSplit) external; }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.7.5; interface IRouter { event EXPIRED(); event IDENTICAL(); event ZERO_ADDRESS(); event INSUFFICIENT_AMOUNT(); event INSUFFICIENT_LIQUIDITY(); event INSUFFICIENT_OUTPUT_AMOUNT(); event INVALID_PATH(); event INSUFFICIENT_B_AMOUNT(); event INSUFFICIENT_A_AMOUNT(); event EXCESSIVE_INPUT_AMOUNT(); event ETH_TRANSFER_FAILED(); event INVALID_RESERVES(); function WETH() external view returns (address); function factory() external view returns (address); /// @notice sorts the tokens to see what the expected LP output would be for token0 and token1 (A/B) /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @return token0 address of which becomes token0 /// @return token1 address of which becomes token1 function sortTokens( address tokenA, address tokenB ) external pure returns (address token0, address token1); /// @notice calculates the CREATE2 address for a pair without making any external calls /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @param stable if the pair is using the stable curve /// @return pair address of the pair function pairFor( address tokenA, address tokenB, bool stable ) external view returns (address pair); /// @notice fetches and sorts the reserves for a pair /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @param stable if the pair is using the stable curve /// @return reserveA get the reserves for tokenA /// @return reserveB get the reserves for tokenB function getReserves( address tokenA, address tokenB, bool stable ) external view returns (uint256 reserveA, uint256 reserveB); /// @notice performs chained getAmountOut calculations on any number of pairs /// @param amountIn amount of tokenIn /// @param tokenIn address of the token going in /// @param tokenOut address of the token coming out /// @return amount uint amount out /// @return stable if the curve used is stable or not function getAmountOut( uint256 amountIn, address tokenIn, address tokenOut ) external view returns (uint256 amount, bool stable); /// @notice performs calculations to determine the expected state when adding liquidity /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @param stable if the pair is using the stable curve /// @param amountADesired amount of tokenA desired to be added /// @param amountBDesired amount of tokenB desired to be added /// @return amountA amount of tokenA added /// @return amountB amount of tokenB added /// @return liquidity liquidity value added function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired ) external view returns (uint256 amountA, uint256 amountB, uint256 liquidity); /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @param stable if the pair is using the stable curve /// @param liquidity liquidity value to remove /// @return amountA amount of tokenA removed /// @return amountB amount of tokenB removed function quoteRemoveLiquidity( address tokenA, address tokenB, bool stable, uint256 liquidity ) external view returns (uint256 amountA, uint256 amountB); /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @param stable if the pair is using the stable curve /// @param amountADesired amount of tokenA desired to be added /// @param amountBDesired amount of tokenB desired to be added /// @param amountAMin slippage for tokenA calculated from this param /// @param amountBMin slippage for tokenB calculated from this param /// @param to the address the liquidity tokens should be minted to /// @param deadline timestamp deadline /// @return amountA amount of tokenA used /// @return amountB amount of tokenB used /// @return liquidity amount of liquidity minted function addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); /// @param token the address of token /// @param stable if the pair is using the stable curve /// @param amountTokenDesired desired amount for token /// @param amountTokenMin slippage for token /// @param amountETHMin minimum amount of ETH added (slippage) /// @param to the address the liquidity tokens should be minted to /// @param deadline timestamp deadline /// @return amountToken amount of the token used /// @return amountETH amount of ETH used /// @return liquidity amount of liquidity minted function addLiquidityETH( address token, bool stable, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @param stable if the pair is using the stable curve /// @param amountADesired amount of tokenA desired to be added /// @param amountBDesired amount of tokenB desired to be added /// @param amountAMin slippage for tokenA calculated from this param /// @param amountBMin slippage for tokenB calculated from this param /// @param to the address the liquidity tokens should be minted to /// @param deadline timestamp deadline /// @return amountA amount of tokenA used /// @return amountB amount of tokenB used /// @return liquidity amount of liquidity minted function addLiquidityAndStake( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); /// @notice adds liquidity to a legacy pair using ETH, and stakes it into a gauge on "to's" behalf /// @param token the address of token /// @param stable if the pair is using the stable curve /// @param amountTokenDesired amount of token to be used /// @param amountTokenMin slippage of token /// @param amountETHMin slippage of ETH /// @param to the address the liquidity tokens should be minted to /// @param deadline timestamp deadline /// @return amountA amount of tokenA used /// @return amountB amount of tokenB used /// @return liquidity amount of liquidity minted function addLiquidityETHAndStake( address token, bool stable, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountA, uint256 amountB, uint256 liquidity); /// @param tokenA the address of tokenA /// @param tokenB the address of tokenB /// @param stable if the pair is using the stable curve /// @param liquidity amount of LP tokens to remove /// @param amountAMin slippage of tokenA /// @param amountBMin slippage of tokenB /// @param to the address the liquidity tokens should be minted to /// @param deadline timestamp deadline /// @return amountA amount of tokenA used /// @return amountB amount of tokenB used function removeLiquidity( address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); /// @param token address of the token /// @param stable if the pair is using the stable curve /// @param liquidity liquidity tokens to remove /// @param amountTokenMin slippage of token /// @param amountETHMin slippage of ETH /// @param to the address the liquidity tokens should be minted to /// @param deadline timestamp deadline /// @return amountToken amount of token used /// @return amountETH amount of ETH used function removeLiquidityETH( address token, bool stable, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); /// @notice **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)**** /// @param token address of the token /// @param stable if the swap curve is stable /// @param liquidity liquidity value (lp tokens) /// @param amountTokenMin slippage of token /// @param amountETHMin slippage of ETH /// @param to address to send to /// @param deadline timestamp deadline /// @return amountToken amount of token received /// @return amountETH amount of ETH received function removeLiquidityETHSupportingFeeOnTransferTokens( address token, bool stable, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; import "./IOwnable.sol"; contract Ownable is IOwnable { address internal _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } function owner() public view override returns (address) { return _owner; } modifier onlyOwner() { require(_owner == msg.sender, "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual override onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership( address newOwner_ ) public virtual override onlyOwner { require( newOwner_ != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner_); _owner = newOwner_; } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function add32(uint32 a, uint32 b) internal pure returns (uint32) { uint32 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function sub32(uint32 a, uint32 b) internal pure returns (uint32) { return sub32(a, b, "SafeMath: subtraction overflow"); } function sub32( uint32 a, uint32 b, string memory errorMessage ) internal pure returns (uint32) { require(b <= a, errorMessage); uint32 c = a - b; return c; } 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; } function mul32(uint32 a, uint32 b) internal pure returns (uint32) { if (a == 0) { return 0; } uint32 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by 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; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add(div(a, 2), 1); while (b < c) { c = b; b = div(add(div(a, b), b), 2); } } else if (a != 0) { c = 1; } } function percentageAmount( uint256 total_, uint8 percentage_ ) internal pure returns (uint256 percentAmount_) { return div(mul(total_, percentage_), 1000); } function substractPercentage( uint256 total_, uint8 percentageToSub_ ) internal pure returns (uint256 result_) { return sub(total_, div(mul(total_, percentageToSub_), 1000)); } function percentageOfTotal( uint256 part_, uint256 total_ ) internal pure returns (uint256 percent_) { return div(mul(part_, 100), total_); } function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2); } function quadraticPricing( uint256 payment_, uint256 multiplier_ ) internal pure returns (uint256) { return sqrrt(mul(multiplier_, payment_)); } function bondingCurve( uint256 supply_, uint256 multiplier_ ) internal pure returns (uint256) { return mul(multiplier_, supply_); } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; import "./Ownable.sol"; contract VaultOwned is Ownable { address internal _vault; function setVault(address vault_) external onlyOwner returns (bool) { _vault = vault_; return true; } function vault() public view returns (address) { return _vault; } modifier onlyVault() { require(_vault == msg.sender, "VaultOwned: caller is not the Vault"); _; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_presaleToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"DistributionStateChanged","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":"participant","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PresaleContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"PresaleStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participant","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"RefundsStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SolisDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participant","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistRemoved","type":"event"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"addMultipleToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_participant","type":"address"}],"name":"calculateClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_solisToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositSolisTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getParticipantAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getParticipantCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hardCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minContribution","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":"_amount","type":"uint256"}],"name":"participate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setContributionLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setDistributionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hardCap","type":"uint256"}],"name":"setHardCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setPresaleEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setRefundsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"solisToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPresaleAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSolisAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052681b1ae4d6e2ef500000600c5569032d26d12e980b600000600d55699ed194db19b238c00000600e553480156200003a57600080fd5b5060405162003fb938038062003fb983398181016040528101906200006091906200017a565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001f4565b6000815190506200017481620001da565b92915050565b6000602082840312156200018d57600080fd5b60006200019d8482850162000163565b91505092915050565b6000620001b382620001ba565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001e581620001a6565b8114620001f157600080fd5b50565b613db580620002046000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637274f7fd1161011a57806398de5421116100ad578063c67e04d81161007c578063c67e04d814610556578063d18d944b14610572578063e43252d71461058e578063f2fde38b146105aa578063fb86a404146105c6576101fb565b806398de5421146104e0578063aaffadf3146104fe578063ad6057291461051c578063c10225b81461053a576101fb565b806386608326116100e9578063866083261461046a5780638ab1d681146104885780638d3d6576146104a45780638da5cb5b146104c2576101fb565b80637274f7fd146103d257806373b2e80e146104025780638401f8d114610432578063845c93061461044e576101fb565b806342e94c9011610192578063532f117911610161578063532f117914610384578063590e1ae3146103a25780636ff1c9bc146103ac578063715018a6146103c8576101fb565b806342e94c90146102fe57806343bb18ff1461032e57806348c54b9d1461034a57806351eb455414610354576101fb565b806333a2ef86116101ce57806333a2ef8614610274578063397e5d9e146102925780633af32abf146102b05780633edff20f146102e0576101fb565b8063039ae0a114610200578063143b237f1461021c57806324ffea1a1461023a57806330767d0914610258575b600080fd5b61021a60048036038101906102159190612fbd565b6105e4565b005b610224610a1c565b604051610231919061388d565b60405180910390f35b610242610a2f565b60405161024f91906138a8565b60405180910390f35b610272600480360381019061026d919061303e565b610a55565b005b61027c610b6a565b60405161028991906138a8565b60405180910390f35b61029a610b90565b6040516102a79190613c03565b60405180910390f35b6102ca60048036038101906102c59190612f94565b610b96565b6040516102d7919061388d565b60405180910390f35b6102e8610bb3565b6040516102f59190613c03565b60405180910390f35b61031860048036038101906103139190612f94565b610bc4565b6040516103259190613c03565b60405180910390f35b6103486004803603810190610343919061303e565b610bdc565b005b610352610cf1565b005b61036e60048036038101906103699190613090565b611117565b60405161037b91906137e9565b60405180910390f35b61038c61117f565b604051610399919061388d565b60405180910390f35b6103aa611192565b005b6103c660048036038101906103c19190612f94565b611534565b005b6103d06117a2565b005b6103ec60048036038101906103e79190612f94565b611921565b6040516103f99190613c03565b60405180910390f35b61041c60048036038101906104179190612f94565b6119b3565b604051610429919061388d565b60405180910390f35b61044c60048036038101906104479190612ff9565b6119d3565b005b61046860048036038101906104639190613090565b611baa565b005b610472612068565b60405161047f919061388d565b60405180910390f35b6104a2600480360381019061049d9190612f94565b61207b565b005b6104ac6121d5565b6040516104b99190613c03565b60405180910390f35b6104ca6121db565b6040516104d791906137e9565b60405180910390f35b6104e8612204565b6040516104f59190613c03565b60405180910390f35b61050661220a565b6040516105139190613c03565b60405180910390f35b610524612210565b6040516105319190613c03565b60405180910390f35b610554600480360381019061054f919061303e565b612221565b005b610570600480360381019061056b91906130e2565b612336565b005b61058c60048036038101906105879190613090565b61244c565b005b6105a860048036038101906105a39190612f94565b612517565b005b6105c460048036038101906105bf9190612f94565b6126e1565b005b6105ce6128e5565b6040516105db9190613c03565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c906138e3565b60405180910390fd5b60008111610758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074f906139e3565b60405180910390fd5b600b60009054906101000a900460ff16156107a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079f906139a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108455781600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506108d6565b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90613903565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161093593929190613804565b602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109879190613067565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613a83565b60405180910390fd5b6109db81600a546128eb90919063ffffffff16565b600a819055507f81f28822c7c409b31de66706469ff5909e983a9d78f04f6a592eb53b7e74910381604051610a109190613c03565b60405180910390a15050565b600b60009054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60026101000a81548160ff0219169083151502179055507f24805b58c9a333d598a8dff28e34e0061fd3c24cfd1de6a924f31709f41842d481604051610b5f919061388d565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6000610bac82600361297390919063ffffffff16565b9050919050565b6000610bbf60036129a3565b905090565b60076020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60016101000a81548160ff0219169083151502179055507f11d48e11836d1d72286877c5b0f66b9a7c76273a1a1037b299c8460a4979386781604051610ce6919061388d565b60405180910390a150565b600b60039054906101000a900460ff1615610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60019054906101000a900460ff16610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613a23565b60405180910390fd5b610dbf33600561297390919063ffffffff16565b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613923565b60405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613ac3565b60405180910390fd5b600060095411610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790613b43565b60405180910390fd5b6000600a5411610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c906139c3565b60405180910390fd5b6000610f2033611921565b905060008111610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90613943565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161101a92919061383b565b602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190613067565b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613a83565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040516110f19190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b600061112360056129a3565b8210611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613b83565b60405180910390fd5b6111788260056129b890919063ffffffff16565b9050919050565b600b60029054906101000a900460ff1681565b600b60039054906101000a900460ff16156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60029054906101000a900460ff1661124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390613a43565b60405180910390fd5b61126033600561297390919063ffffffff16565b61129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613923565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613ae3565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113be3360056129d290919063ffffffff16565b506113d481600954612a0290919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161143792919061383b565b602060405180830381600087803b15801561145157600080fd5b505af1158015611465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114899190613067565b6114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ba3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161150e9190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161163591906137e9565b60206040518083038186803b15801561164d57600080fd5b505afa158015611661573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168591906130b9565b9050600081116116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613aa3565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6116ee6121db565b836040518363ffffffff1660e01b815260040161170c929190613864565b602060405180830381600087803b15801561172657600080fd5b505af115801561173a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175e9190613067565b61179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613963565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600954148061193557506000600a54145b1561194357600090506119ae565b6119ab60095461199d600a54600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a4c90919063ffffffff16565b612ad290919063ffffffff16565b90505b919050565b60086020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b82829050811015611ba557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ac657fe5b9050602002016020810190611adb9190612f94565b73ffffffffffffffffffffffffffffffffffffffff1614158015611b2f5750611b2e838383818110611b0957fe5b9050602002016020810190611b1e9190612f94565b6003612b1c90919063ffffffff16565b5b15611b9857828282818110611b4057fe5b9050602002016020810190611b559190612f94565b73ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a25b8080600101915050611a97565b505050565b600b60039054906101000a900460ff1615611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60009054906101000a900460ff16611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90613bc3565b60405180910390fd5b611c7833600361297390919063ffffffff16565b611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613b03565b60405180910390fd5b60008111611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906139e3565b60405180910390fd5b600c54811015611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613983565b60405180910390fd5b600d54611d9482600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b1115611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906138c3565b60405180910390fd5b600e54611ded826009546128eb90919063ffffffff16565b1115611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2590613b23565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611e8d93929190613804565b602060405180830381600087803b158015611ea757600080fd5b505af1158015611ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edf9190613067565b611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590613a83565b60405180910390fd5b611f3233600561297390919063ffffffff16565b611f4c57611f4a336005612b1c90919063ffffffff16565b505b611f9e81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ff6816009546128eb90919063ffffffff16565b6009819055503373ffffffffffffffffffffffffffffffffffffffff167f3d0ab7e8209f975ae8d4c319005ac3a64cf3b4ee6503d416abb001d442eb1abc826040516120429190613c03565b60405180910390a26000600b60036101000a81548160ff02191690831515021790555050565b600b60019054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6121508160036129d290919063ffffffff16565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690613b03565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fde8cf212af7ce38b2840785a2768d97ff2dbf3c21b516961cec0061e134c2a1e60405160405180910390a250565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b600c5481565b600061221c60056129a3565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548160ff0219169083151502179055507f1050112436208e776d9a33d97ca1981ed83303d2a93ccbd8c54f7a774c00f8148160405161232b919061388d565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8082111561243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190613a03565b60405180910390fd5b81600c8190555080600d819055505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461250d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f90613a63565b60405180910390fd5b61265c816003612b1c90919063ffffffff16565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290613b63565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612828576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613d396026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600080828401905083811015612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b4c565b905092915050565b60006129b182600001612b6f565b9050919050565b60006129c78360000183612b80565b60001c905092915050565b60006129fa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c03565b905092915050565b6000612a4483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ceb565b905092915050565b600080831415612a5f5760009050612acc565b6000828402905082848281612a7057fe5b0414612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d5f6021913960400191505060405180910390fd5b809150505b92915050565b6000612b1483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dab565b905092915050565b6000612b44836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e71565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b600081836000018054905011612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613d176022913960400191505060405180910390fd5b826000018281548110612bf057fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114612cdf5760006001820390506000600186600001805490500390506000866000018281548110612c4e57fe5b9060005260206000200154905080876000018481548110612c6b57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612ca357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612ce5565b60009150505b92915050565b6000838311158290612d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d5d578082015181840152602081019050612d42565b50505050905090810190601f168015612d8a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290612e57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578082015181840152602081019050612e01565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e6357fe5b049050809150509392505050565b6000612e7d8383612b4c565b612ed6578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612edb565b600090505b92915050565b600081359050612ef081613cd1565b92915050565b60008083601f840112612f0857600080fd5b8235905067ffffffffffffffff811115612f2157600080fd5b602083019150836020820283011115612f3957600080fd5b9250929050565b600081359050612f4f81613ce8565b92915050565b600081519050612f6481613ce8565b92915050565b600081359050612f7981613cff565b92915050565b600081519050612f8e81613cff565b92915050565b600060208284031215612fa657600080fd5b6000612fb484828501612ee1565b91505092915050565b60008060408385031215612fd057600080fd5b6000612fde85828601612ee1565b9250506020612fef85828601612f6a565b9150509250929050565b6000806020838503121561300c57600080fd5b600083013567ffffffffffffffff81111561302657600080fd5b61303285828601612ef6565b92509250509250929050565b60006020828403121561305057600080fd5b600061305e84828501612f40565b91505092915050565b60006020828403121561307957600080fd5b600061308784828501612f55565b91505092915050565b6000602082840312156130a257600080fd5b60006130b084828501612f6a565b91505092915050565b6000602082840312156130cb57600080fd5b60006130d984828501612f7f565b91505092915050565b600080604083850312156130f557600080fd5b600061310385828601612f6a565b925050602061311485828601612f6a565b9150509250929050565b61312781613c77565b82525050565b61313681613c2f565b82525050565b61314581613c41565b82525050565b61315481613c89565b82525050565b6000613167601c83613c1e565b91507f45786365656473206d6178696d756d20636f6e747269627574696f6e000000006000830152602082019050919050565b60006131a7601b83613c1e565b91507f496e76616c696420536f6c697320746f6b656e206164647265737300000000006000830152602082019050919050565b60006131e7601c83613c1e565b91507f536f6c697320746f6b656e2061646472657373206d69736d61746368000000006000830152602082019050919050565b6000613227601183613c1e565b91507f4e6f742061207061727469636970616e740000000000000000000000000000006000830152602082019050919050565b6000613267601083613c1e565b91507f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006000830152602082019050919050565b60006132a7600f83613c1e565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b60006132e7601a83613c1e565b91507f42656c6f77206d696e696d756d20636f6e747269627574696f6e0000000000006000830152602082019050919050565b6000613327601883613c1e565b91507f50726573616c65206d7573742062652064697361626c656400000000000000006000830152602082019050919050565b6000613367601d83613c1e565b91507f4e6f20536f6c697320746f6b656e7320746f20646973747269627574650000006000830152602082019050919050565b60006133a7601d83613c1e565b91507f416d6f756e74206d7573742062652067726561746572207468616e20300000006000830152602082019050919050565b60006133e7601283613c1e565b91507f4d696e206d757374206265203c3d206d617800000000000000000000000000006000830152602082019050919050565b6000613427601b83613c1e565b91507f446973747269627574696f6e206973206e6f7420656e61626c656400000000006000830152602082019050919050565b6000613467601383613c1e565b91507f526566756e6473206e6f7420656e61626c6564000000000000000000000000006000830152602082019050919050565b60006134a7601783613c1e565b91507f43616e6e6f7420616464207a65726f20616464726573730000000000000000006000830152602082019050919050565b60006134e7601583613c1e565b91507f546f6b656e207472616e73666572206661696c656400000000000000000000006000830152602082019050919050565b6000613527601583613c1e565b91507f4e6f20746f6b656e7320746f20776974686472617700000000000000000000006000830152602082019050919050565b6000613567600f83613c1e565b91507f416c726561647920636c61696d656400000000000000000000000000000000006000830152602082019050919050565b60006135a7601983613c1e565b91507f4e6f20636f6e747269627574696f6e20746f20726566756e64000000000000006000830152602082019050919050565b60006135e7601783613c1e565b91507f41646472657373206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000613627601083613c1e565b91507f48617264206361702072656163686564000000000000000000000000000000006000830152602082019050919050565b6000613667601883613c1e565b91507f4e6f2070726573616c6520636f6e747269627574696f6e7300000000000000006000830152602082019050919050565b60006136a7601b83613c1e565b91507f4164647265737320616c72656164792077686974656c697374656400000000006000830152602082019050919050565b60006136e7601383613c1e565b91507f496e646578206f7574206f6620626f756e6473000000000000000000000000006000830152602082019050919050565b6000613727601683613c1e565b91507f526566756e64207472616e73666572206661696c6564000000000000000000006000830152602082019050919050565b6000613767601683613c1e565b91507f50726573616c65206973206e6f7420656e61626c6564000000000000000000006000830152602082019050919050565b60006137a7601f83613c1e565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6137e381613c6d565b82525050565b60006020820190506137fe600083018461312d565b92915050565b6000606082019050613819600083018661311e565b613826602083018561312d565b61383360408301846137da565b949350505050565b6000604082019050613850600083018561311e565b61385d60208301846137da565b9392505050565b6000604082019050613879600083018561312d565b61388660208301846137da565b9392505050565b60006020820190506138a2600083018461313c565b92915050565b60006020820190506138bd600083018461314b565b92915050565b600060208201905081810360008301526138dc8161315a565b9050919050565b600060208201905081810360008301526138fc8161319a565b9050919050565b6000602082019050818103600083015261391c816131da565b9050919050565b6000602082019050818103600083015261393c8161321a565b9050919050565b6000602082019050818103600083015261395c8161325a565b9050919050565b6000602082019050818103600083015261397c8161329a565b9050919050565b6000602082019050818103600083015261399c816132da565b9050919050565b600060208201905081810360008301526139bc8161331a565b9050919050565b600060208201905081810360008301526139dc8161335a565b9050919050565b600060208201905081810360008301526139fc8161339a565b9050919050565b60006020820190508181036000830152613a1c816133da565b9050919050565b60006020820190508181036000830152613a3c8161341a565b9050919050565b60006020820190508181036000830152613a5c8161345a565b9050919050565b60006020820190508181036000830152613a7c8161349a565b9050919050565b60006020820190508181036000830152613a9c816134da565b9050919050565b60006020820190508181036000830152613abc8161351a565b9050919050565b60006020820190508181036000830152613adc8161355a565b9050919050565b60006020820190508181036000830152613afc8161359a565b9050919050565b60006020820190508181036000830152613b1c816135da565b9050919050565b60006020820190508181036000830152613b3c8161361a565b9050919050565b60006020820190508181036000830152613b5c8161365a565b9050919050565b60006020820190508181036000830152613b7c8161369a565b9050919050565b60006020820190508181036000830152613b9c816136da565b9050919050565b60006020820190508181036000830152613bbc8161371a565b9050919050565b60006020820190508181036000830152613bdc8161375a565b9050919050565b60006020820190508181036000830152613bfc8161379a565b9050919050565b6000602082019050613c1860008301846137da565b92915050565b600082825260208201905092915050565b6000613c3a82613c4d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613c8282613cad565b9050919050565b6000613c9482613c9b565b9050919050565b6000613ca682613c4d565b9050919050565b6000613cb882613cbf565b9050919050565b6000613cca82613c4d565b9050919050565b613cda81613c2f565b8114613ce557600080fd5b50565b613cf181613c41565b8114613cfc57600080fd5b50565b613d0881613c6d565b8114613d1357600080fd5b5056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220aea3aa01d50ff5ced2b7233679531cf3f8b69e8f76df25637accdcdacbd3ab4664736f6c6343000705003300000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637274f7fd1161011a57806398de5421116100ad578063c67e04d81161007c578063c67e04d814610556578063d18d944b14610572578063e43252d71461058e578063f2fde38b146105aa578063fb86a404146105c6576101fb565b806398de5421146104e0578063aaffadf3146104fe578063ad6057291461051c578063c10225b81461053a576101fb565b806386608326116100e9578063866083261461046a5780638ab1d681146104885780638d3d6576146104a45780638da5cb5b146104c2576101fb565b80637274f7fd146103d257806373b2e80e146104025780638401f8d114610432578063845c93061461044e576101fb565b806342e94c9011610192578063532f117911610161578063532f117914610384578063590e1ae3146103a25780636ff1c9bc146103ac578063715018a6146103c8576101fb565b806342e94c90146102fe57806343bb18ff1461032e57806348c54b9d1461034a57806351eb455414610354576101fb565b806333a2ef86116101ce57806333a2ef8614610274578063397e5d9e146102925780633af32abf146102b05780633edff20f146102e0576101fb565b8063039ae0a114610200578063143b237f1461021c57806324ffea1a1461023a57806330767d0914610258575b600080fd5b61021a60048036038101906102159190612fbd565b6105e4565b005b610224610a1c565b604051610231919061388d565b60405180910390f35b610242610a2f565b60405161024f91906138a8565b60405180910390f35b610272600480360381019061026d919061303e565b610a55565b005b61027c610b6a565b60405161028991906138a8565b60405180910390f35b61029a610b90565b6040516102a79190613c03565b60405180910390f35b6102ca60048036038101906102c59190612f94565b610b96565b6040516102d7919061388d565b60405180910390f35b6102e8610bb3565b6040516102f59190613c03565b60405180910390f35b61031860048036038101906103139190612f94565b610bc4565b6040516103259190613c03565b60405180910390f35b6103486004803603810190610343919061303e565b610bdc565b005b610352610cf1565b005b61036e60048036038101906103699190613090565b611117565b60405161037b91906137e9565b60405180910390f35b61038c61117f565b604051610399919061388d565b60405180910390f35b6103aa611192565b005b6103c660048036038101906103c19190612f94565b611534565b005b6103d06117a2565b005b6103ec60048036038101906103e79190612f94565b611921565b6040516103f99190613c03565b60405180910390f35b61041c60048036038101906104179190612f94565b6119b3565b604051610429919061388d565b60405180910390f35b61044c60048036038101906104479190612ff9565b6119d3565b005b61046860048036038101906104639190613090565b611baa565b005b610472612068565b60405161047f919061388d565b60405180910390f35b6104a2600480360381019061049d9190612f94565b61207b565b005b6104ac6121d5565b6040516104b99190613c03565b60405180910390f35b6104ca6121db565b6040516104d791906137e9565b60405180910390f35b6104e8612204565b6040516104f59190613c03565b60405180910390f35b61050661220a565b6040516105139190613c03565b60405180910390f35b610524612210565b6040516105319190613c03565b60405180910390f35b610554600480360381019061054f919061303e565b612221565b005b610570600480360381019061056b91906130e2565b612336565b005b61058c60048036038101906105879190613090565b61244c565b005b6105a860048036038101906105a39190612f94565b612517565b005b6105c460048036038101906105bf9190612f94565b6126e1565b005b6105ce6128e5565b6040516105db9190613c03565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c906138e3565b60405180910390fd5b60008111610758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074f906139e3565b60405180910390fd5b600b60009054906101000a900460ff16156107a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079f906139a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108455781600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506108d6565b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90613903565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161093593929190613804565b602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109879190613067565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613a83565b60405180910390fd5b6109db81600a546128eb90919063ffffffff16565b600a819055507f81f28822c7c409b31de66706469ff5909e983a9d78f04f6a592eb53b7e74910381604051610a109190613c03565b60405180910390a15050565b600b60009054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60026101000a81548160ff0219169083151502179055507f24805b58c9a333d598a8dff28e34e0061fd3c24cfd1de6a924f31709f41842d481604051610b5f919061388d565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6000610bac82600361297390919063ffffffff16565b9050919050565b6000610bbf60036129a3565b905090565b60076020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60016101000a81548160ff0219169083151502179055507f11d48e11836d1d72286877c5b0f66b9a7c76273a1a1037b299c8460a4979386781604051610ce6919061388d565b60405180910390a150565b600b60039054906101000a900460ff1615610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60019054906101000a900460ff16610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613a23565b60405180910390fd5b610dbf33600561297390919063ffffffff16565b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613923565b60405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613ac3565b60405180910390fd5b600060095411610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790613b43565b60405180910390fd5b6000600a5411610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c906139c3565b60405180910390fd5b6000610f2033611921565b905060008111610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90613943565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161101a92919061383b565b602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190613067565b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613a83565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040516110f19190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b600061112360056129a3565b8210611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613b83565b60405180910390fd5b6111788260056129b890919063ffffffff16565b9050919050565b600b60029054906101000a900460ff1681565b600b60039054906101000a900460ff16156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60029054906101000a900460ff1661124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390613a43565b60405180910390fd5b61126033600561297390919063ffffffff16565b61129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613923565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613ae3565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113be3360056129d290919063ffffffff16565b506113d481600954612a0290919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161143792919061383b565b602060405180830381600087803b15801561145157600080fd5b505af1158015611465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114899190613067565b6114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ba3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161150e9190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161163591906137e9565b60206040518083038186803b15801561164d57600080fd5b505afa158015611661573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168591906130b9565b9050600081116116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613aa3565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6116ee6121db565b836040518363ffffffff1660e01b815260040161170c929190613864565b602060405180830381600087803b15801561172657600080fd5b505af115801561173a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175e9190613067565b61179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613963565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600954148061193557506000600a54145b1561194357600090506119ae565b6119ab60095461199d600a54600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a4c90919063ffffffff16565b612ad290919063ffffffff16565b90505b919050565b60086020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b82829050811015611ba557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ac657fe5b9050602002016020810190611adb9190612f94565b73ffffffffffffffffffffffffffffffffffffffff1614158015611b2f5750611b2e838383818110611b0957fe5b9050602002016020810190611b1e9190612f94565b6003612b1c90919063ffffffff16565b5b15611b9857828282818110611b4057fe5b9050602002016020810190611b559190612f94565b73ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a25b8080600101915050611a97565b505050565b600b60039054906101000a900460ff1615611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60009054906101000a900460ff16611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90613bc3565b60405180910390fd5b611c7833600361297390919063ffffffff16565b611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613b03565b60405180910390fd5b60008111611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906139e3565b60405180910390fd5b600c54811015611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613983565b60405180910390fd5b600d54611d9482600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b1115611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906138c3565b60405180910390fd5b600e54611ded826009546128eb90919063ffffffff16565b1115611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2590613b23565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611e8d93929190613804565b602060405180830381600087803b158015611ea757600080fd5b505af1158015611ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edf9190613067565b611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590613a83565b60405180910390fd5b611f3233600561297390919063ffffffff16565b611f4c57611f4a336005612b1c90919063ffffffff16565b505b611f9e81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ff6816009546128eb90919063ffffffff16565b6009819055503373ffffffffffffffffffffffffffffffffffffffff167f3d0ab7e8209f975ae8d4c319005ac3a64cf3b4ee6503d416abb001d442eb1abc826040516120429190613c03565b60405180910390a26000600b60036101000a81548160ff02191690831515021790555050565b600b60019054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6121508160036129d290919063ffffffff16565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690613b03565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fde8cf212af7ce38b2840785a2768d97ff2dbf3c21b516961cec0061e134c2a1e60405160405180910390a250565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b600c5481565b600061221c60056129a3565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548160ff0219169083151502179055507f1050112436208e776d9a33d97ca1981ed83303d2a93ccbd8c54f7a774c00f8148160405161232b919061388d565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8082111561243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190613a03565b60405180910390fd5b81600c8190555080600d819055505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461250d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f90613a63565b60405180910390fd5b61265c816003612b1c90919063ffffffff16565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290613b63565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612828576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613d396026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600080828401905083811015612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b4c565b905092915050565b60006129b182600001612b6f565b9050919050565b60006129c78360000183612b80565b60001c905092915050565b60006129fa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c03565b905092915050565b6000612a4483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ceb565b905092915050565b600080831415612a5f5760009050612acc565b6000828402905082848281612a7057fe5b0414612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d5f6021913960400191505060405180910390fd5b809150505b92915050565b6000612b1483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dab565b905092915050565b6000612b44836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e71565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b600081836000018054905011612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613d176022913960400191505060405180910390fd5b826000018281548110612bf057fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114612cdf5760006001820390506000600186600001805490500390506000866000018281548110612c4e57fe5b9060005260206000200154905080876000018481548110612c6b57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612ca357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612ce5565b60009150505b92915050565b6000838311158290612d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d5d578082015181840152602081019050612d42565b50505050905090810190601f168015612d8a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290612e57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578082015181840152602081019050612e01565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e6357fe5b049050809150509392505050565b6000612e7d8383612b4c565b612ed6578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612edb565b600090505b92915050565b600081359050612ef081613cd1565b92915050565b60008083601f840112612f0857600080fd5b8235905067ffffffffffffffff811115612f2157600080fd5b602083019150836020820283011115612f3957600080fd5b9250929050565b600081359050612f4f81613ce8565b92915050565b600081519050612f6481613ce8565b92915050565b600081359050612f7981613cff565b92915050565b600081519050612f8e81613cff565b92915050565b600060208284031215612fa657600080fd5b6000612fb484828501612ee1565b91505092915050565b60008060408385031215612fd057600080fd5b6000612fde85828601612ee1565b9250506020612fef85828601612f6a565b9150509250929050565b6000806020838503121561300c57600080fd5b600083013567ffffffffffffffff81111561302657600080fd5b61303285828601612ef6565b92509250509250929050565b60006020828403121561305057600080fd5b600061305e84828501612f40565b91505092915050565b60006020828403121561307957600080fd5b600061308784828501612f55565b91505092915050565b6000602082840312156130a257600080fd5b60006130b084828501612f6a565b91505092915050565b6000602082840312156130cb57600080fd5b60006130d984828501612f7f565b91505092915050565b600080604083850312156130f557600080fd5b600061310385828601612f6a565b925050602061311485828601612f6a565b9150509250929050565b61312781613c77565b82525050565b61313681613c2f565b82525050565b61314581613c41565b82525050565b61315481613c89565b82525050565b6000613167601c83613c1e565b91507f45786365656473206d6178696d756d20636f6e747269627574696f6e000000006000830152602082019050919050565b60006131a7601b83613c1e565b91507f496e76616c696420536f6c697320746f6b656e206164647265737300000000006000830152602082019050919050565b60006131e7601c83613c1e565b91507f536f6c697320746f6b656e2061646472657373206d69736d61746368000000006000830152602082019050919050565b6000613227601183613c1e565b91507f4e6f742061207061727469636970616e740000000000000000000000000000006000830152602082019050919050565b6000613267601083613c1e565b91507f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006000830152602082019050919050565b60006132a7600f83613c1e565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b60006132e7601a83613c1e565b91507f42656c6f77206d696e696d756d20636f6e747269627574696f6e0000000000006000830152602082019050919050565b6000613327601883613c1e565b91507f50726573616c65206d7573742062652064697361626c656400000000000000006000830152602082019050919050565b6000613367601d83613c1e565b91507f4e6f20536f6c697320746f6b656e7320746f20646973747269627574650000006000830152602082019050919050565b60006133a7601d83613c1e565b91507f416d6f756e74206d7573742062652067726561746572207468616e20300000006000830152602082019050919050565b60006133e7601283613c1e565b91507f4d696e206d757374206265203c3d206d617800000000000000000000000000006000830152602082019050919050565b6000613427601b83613c1e565b91507f446973747269627574696f6e206973206e6f7420656e61626c656400000000006000830152602082019050919050565b6000613467601383613c1e565b91507f526566756e6473206e6f7420656e61626c6564000000000000000000000000006000830152602082019050919050565b60006134a7601783613c1e565b91507f43616e6e6f7420616464207a65726f20616464726573730000000000000000006000830152602082019050919050565b60006134e7601583613c1e565b91507f546f6b656e207472616e73666572206661696c656400000000000000000000006000830152602082019050919050565b6000613527601583613c1e565b91507f4e6f20746f6b656e7320746f20776974686472617700000000000000000000006000830152602082019050919050565b6000613567600f83613c1e565b91507f416c726561647920636c61696d656400000000000000000000000000000000006000830152602082019050919050565b60006135a7601983613c1e565b91507f4e6f20636f6e747269627574696f6e20746f20726566756e64000000000000006000830152602082019050919050565b60006135e7601783613c1e565b91507f41646472657373206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000613627601083613c1e565b91507f48617264206361702072656163686564000000000000000000000000000000006000830152602082019050919050565b6000613667601883613c1e565b91507f4e6f2070726573616c6520636f6e747269627574696f6e7300000000000000006000830152602082019050919050565b60006136a7601b83613c1e565b91507f4164647265737320616c72656164792077686974656c697374656400000000006000830152602082019050919050565b60006136e7601383613c1e565b91507f496e646578206f7574206f6620626f756e6473000000000000000000000000006000830152602082019050919050565b6000613727601683613c1e565b91507f526566756e64207472616e73666572206661696c6564000000000000000000006000830152602082019050919050565b6000613767601683613c1e565b91507f50726573616c65206973206e6f7420656e61626c6564000000000000000000006000830152602082019050919050565b60006137a7601f83613c1e565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6137e381613c6d565b82525050565b60006020820190506137fe600083018461312d565b92915050565b6000606082019050613819600083018661311e565b613826602083018561312d565b61383360408301846137da565b949350505050565b6000604082019050613850600083018561311e565b61385d60208301846137da565b9392505050565b6000604082019050613879600083018561312d565b61388660208301846137da565b9392505050565b60006020820190506138a2600083018461313c565b92915050565b60006020820190506138bd600083018461314b565b92915050565b600060208201905081810360008301526138dc8161315a565b9050919050565b600060208201905081810360008301526138fc8161319a565b9050919050565b6000602082019050818103600083015261391c816131da565b9050919050565b6000602082019050818103600083015261393c8161321a565b9050919050565b6000602082019050818103600083015261395c8161325a565b9050919050565b6000602082019050818103600083015261397c8161329a565b9050919050565b6000602082019050818103600083015261399c816132da565b9050919050565b600060208201905081810360008301526139bc8161331a565b9050919050565b600060208201905081810360008301526139dc8161335a565b9050919050565b600060208201905081810360008301526139fc8161339a565b9050919050565b60006020820190508181036000830152613a1c816133da565b9050919050565b60006020820190508181036000830152613a3c8161341a565b9050919050565b60006020820190508181036000830152613a5c8161345a565b9050919050565b60006020820190508181036000830152613a7c8161349a565b9050919050565b60006020820190508181036000830152613a9c816134da565b9050919050565b60006020820190508181036000830152613abc8161351a565b9050919050565b60006020820190508181036000830152613adc8161355a565b9050919050565b60006020820190508181036000830152613afc8161359a565b9050919050565b60006020820190508181036000830152613b1c816135da565b9050919050565b60006020820190508181036000830152613b3c8161361a565b9050919050565b60006020820190508181036000830152613b5c8161365a565b9050919050565b60006020820190508181036000830152613b7c8161369a565b9050919050565b60006020820190508181036000830152613b9c816136da565b9050919050565b60006020820190508181036000830152613bbc8161371a565b9050919050565b60006020820190508181036000830152613bdc8161375a565b9050919050565b60006020820190508181036000830152613bfc8161379a565b9050919050565b6000602082019050613c1860008301846137da565b92915050565b600082825260208201905092915050565b6000613c3a82613c4d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613c8282613cad565b9050919050565b6000613c9482613c9b565b9050919050565b6000613ca682613c4d565b9050919050565b6000613cb882613cbf565b9050919050565b6000613cca82613c4d565b9050919050565b613cda81613c2f565b8114613ce557600080fd5b50565b613cf181613c41565b8114613cfc57600080fd5b50565b613d0881613c6d565b8114613d1357600080fd5b5056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220aea3aa01d50ff5ced2b7233679531cf3f8b69e8f76df25637accdcdacbd3ab4664736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
-----Decoded View---------------
Arg [0] : _presaleToken (address): 0x29219dd400f2Bf60E5a23d13Be72B486D4038894
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.