Source Code
Overview
S Balance
S Value
$0.00Latest 25 from a total of 221 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Emergency Withdr... | 11457568 | 329 days ago | IN | 0 S | 0.00380988 | ||||
| Set Presale Enab... | 11455902 | 329 days ago | IN | 0 S | 0.00147718 | ||||
| Participate | 11455815 | 329 days ago | IN | 0 S | 0.00791131 | ||||
| Participate | 11455690 | 329 days ago | IN | 0 S | 0.00533144 | ||||
| Participate | 11455601 | 329 days ago | IN | 0 S | 0.00791065 | ||||
| Participate | 11455565 | 329 days ago | IN | 0 S | 0.00895682 | ||||
| Participate | 11453649 | 329 days ago | IN | 0 S | 0.00817531 | ||||
| Participate | 11453551 | 329 days ago | IN | 0 S | 0.00904039 | ||||
| Participate | 11452986 | 329 days ago | IN | 0 S | 0.00484693 | ||||
| Participate | 11452878 | 329 days ago | IN | 0 S | 0.00528738 | ||||
| Participate | 11452871 | 329 days ago | IN | 0 S | 0.00817465 | ||||
| Participate | 11452332 | 329 days ago | IN | 0 S | 0.00817531 | ||||
| Participate | 11451937 | 329 days ago | IN | 0 S | 0.00817465 | ||||
| Participate | 11451650 | 329 days ago | IN | 0 S | 0.00764665 | ||||
| Participate | 11451274 | 329 days ago | IN | 0 S | 0.00691839 | ||||
| Participate | 11451039 | 329 days ago | IN | 0 S | 0.0083687 | ||||
| Participate | 11450898 | 329 days ago | IN | 0 S | 0.0085965 | ||||
| Participate | 11450387 | 329 days ago | IN | 0 S | 0.00953509 | ||||
| Participate | 11449276 | 329 days ago | IN | 0 S | 0.0074321 | ||||
| Participate | 11448284 | 329 days ago | IN | 0 S | 0.0103158 | ||||
| Participate | 11447667 | 329 days ago | IN | 0 S | 0.01901024 | ||||
| Participate | 11445288 | 329 days ago | IN | 0 S | 0.00859806 | ||||
| Participate | 11444624 | 329 days ago | IN | 0 S | 0.00945615 | ||||
| Participate | 11443257 | 329 days ago | IN | 0 S | 0.00455257 | ||||
| Participate | 11442233 | 329 days ago | IN | 0 S | 0.00859877 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
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 = 200 * 10**6;
uint256 public maxContribution = 10000 * 10**6;
// Hard cap for the presale
uint256 public hardCap = 400000 * 10**6;
// 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
6080604052630bebc200600c556402540be400600d55645d21dba000600e553480156200002b57600080fd5b5060405162003faa38038062003faa83398181016040528101906200005191906200016b565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001e5565b6000815190506200016581620001cb565b92915050565b6000602082840312156200017e57600080fd5b60006200018e8482850162000154565b91505092915050565b6000620001a482620001ab565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001d68162000197565b8114620001e257600080fd5b50565b613db580620001f56000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637274f7fd1161011a57806398de5421116100ad578063c67e04d81161007c578063c67e04d814610556578063d18d944b14610572578063e43252d71461058e578063f2fde38b146105aa578063fb86a404146105c6576101fb565b806398de5421146104e0578063aaffadf3146104fe578063ad6057291461051c578063c10225b81461053a576101fb565b806386608326116100e9578063866083261461046a5780638ab1d681146104885780638d3d6576146104a45780638da5cb5b146104c2576101fb565b80637274f7fd146103d257806373b2e80e146104025780638401f8d114610432578063845c93061461044e576101fb565b806342e94c9011610192578063532f117911610161578063532f117914610384578063590e1ae3146103a25780636ff1c9bc146103ac578063715018a6146103c8576101fb565b806342e94c90146102fe57806343bb18ff1461032e57806348c54b9d1461034a57806351eb455414610354576101fb565b806333a2ef86116101ce57806333a2ef8614610274578063397e5d9e146102925780633af32abf146102b05780633edff20f146102e0576101fb565b8063039ae0a114610200578063143b237f1461021c57806324ffea1a1461023a57806330767d0914610258575b600080fd5b61021a60048036038101906102159190612fbd565b6105e4565b005b610224610a1c565b604051610231919061388d565b60405180910390f35b610242610a2f565b60405161024f91906138a8565b60405180910390f35b610272600480360381019061026d919061303e565b610a55565b005b61027c610b6a565b60405161028991906138a8565b60405180910390f35b61029a610b90565b6040516102a79190613c03565b60405180910390f35b6102ca60048036038101906102c59190612f94565b610b96565b6040516102d7919061388d565b60405180910390f35b6102e8610bb3565b6040516102f59190613c03565b60405180910390f35b61031860048036038101906103139190612f94565b610bc4565b6040516103259190613c03565b60405180910390f35b6103486004803603810190610343919061303e565b610bdc565b005b610352610cf1565b005b61036e60048036038101906103699190613090565b611117565b60405161037b91906137e9565b60405180910390f35b61038c61117f565b604051610399919061388d565b60405180910390f35b6103aa611192565b005b6103c660048036038101906103c19190612f94565b611534565b005b6103d06117a2565b005b6103ec60048036038101906103e79190612f94565b611921565b6040516103f99190613c03565b60405180910390f35b61041c60048036038101906104179190612f94565b6119b3565b604051610429919061388d565b60405180910390f35b61044c60048036038101906104479190612ff9565b6119d3565b005b61046860048036038101906104639190613090565b611baa565b005b610472612068565b60405161047f919061388d565b60405180910390f35b6104a2600480360381019061049d9190612f94565b61207b565b005b6104ac6121d5565b6040516104b99190613c03565b60405180910390f35b6104ca6121db565b6040516104d791906137e9565b60405180910390f35b6104e8612204565b6040516104f59190613c03565b60405180910390f35b61050661220a565b6040516105139190613c03565b60405180910390f35b610524612210565b6040516105319190613c03565b60405180910390f35b610554600480360381019061054f919061303e565b612221565b005b610570600480360381019061056b91906130e2565b612336565b005b61058c60048036038101906105879190613090565b61244c565b005b6105a860048036038101906105a39190612f94565b612517565b005b6105c460048036038101906105bf9190612f94565b6126e1565b005b6105ce6128e5565b6040516105db9190613c03565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c906138e3565b60405180910390fd5b60008111610758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074f906139e3565b60405180910390fd5b600b60009054906101000a900460ff16156107a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079f906139a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108455781600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506108d6565b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90613903565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161093593929190613804565b602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109879190613067565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613a83565b60405180910390fd5b6109db81600a546128eb90919063ffffffff16565b600a819055507f81f28822c7c409b31de66706469ff5909e983a9d78f04f6a592eb53b7e74910381604051610a109190613c03565b60405180910390a15050565b600b60009054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60026101000a81548160ff0219169083151502179055507f24805b58c9a333d598a8dff28e34e0061fd3c24cfd1de6a924f31709f41842d481604051610b5f919061388d565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6000610bac82600361297390919063ffffffff16565b9050919050565b6000610bbf60036129a3565b905090565b60076020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60016101000a81548160ff0219169083151502179055507f11d48e11836d1d72286877c5b0f66b9a7c76273a1a1037b299c8460a4979386781604051610ce6919061388d565b60405180910390a150565b600b60039054906101000a900460ff1615610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60019054906101000a900460ff16610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613a23565b60405180910390fd5b610dbf33600561297390919063ffffffff16565b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613923565b60405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613ac3565b60405180910390fd5b600060095411610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790613b43565b60405180910390fd5b6000600a5411610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c906139c3565b60405180910390fd5b6000610f2033611921565b905060008111610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90613943565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161101a92919061383b565b602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190613067565b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613a83565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040516110f19190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b600061112360056129a3565b8210611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613b83565b60405180910390fd5b6111788260056129b890919063ffffffff16565b9050919050565b600b60029054906101000a900460ff1681565b600b60039054906101000a900460ff16156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60029054906101000a900460ff1661124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390613a43565b60405180910390fd5b61126033600561297390919063ffffffff16565b61129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613923565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613ae3565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113be3360056129d290919063ffffffff16565b506113d481600954612a0290919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161143792919061383b565b602060405180830381600087803b15801561145157600080fd5b505af1158015611465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114899190613067565b6114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ba3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161150e9190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161163591906137e9565b60206040518083038186803b15801561164d57600080fd5b505afa158015611661573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168591906130b9565b9050600081116116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613aa3565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6116ee6121db565b836040518363ffffffff1660e01b815260040161170c929190613864565b602060405180830381600087803b15801561172657600080fd5b505af115801561173a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175e9190613067565b61179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613963565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600954148061193557506000600a54145b1561194357600090506119ae565b6119ab60095461199d600a54600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a4c90919063ffffffff16565b612ad290919063ffffffff16565b90505b919050565b60086020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b82829050811015611ba557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ac657fe5b9050602002016020810190611adb9190612f94565b73ffffffffffffffffffffffffffffffffffffffff1614158015611b2f5750611b2e838383818110611b0957fe5b9050602002016020810190611b1e9190612f94565b6003612b1c90919063ffffffff16565b5b15611b9857828282818110611b4057fe5b9050602002016020810190611b559190612f94565b73ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a25b8080600101915050611a97565b505050565b600b60039054906101000a900460ff1615611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60009054906101000a900460ff16611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90613bc3565b60405180910390fd5b611c7833600361297390919063ffffffff16565b611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613b03565b60405180910390fd5b60008111611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906139e3565b60405180910390fd5b600c54811015611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613983565b60405180910390fd5b600d54611d9482600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b1115611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906138c3565b60405180910390fd5b600e54611ded826009546128eb90919063ffffffff16565b1115611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2590613b23565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611e8d93929190613804565b602060405180830381600087803b158015611ea757600080fd5b505af1158015611ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edf9190613067565b611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590613a83565b60405180910390fd5b611f3233600561297390919063ffffffff16565b611f4c57611f4a336005612b1c90919063ffffffff16565b505b611f9e81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ff6816009546128eb90919063ffffffff16565b6009819055503373ffffffffffffffffffffffffffffffffffffffff167f3d0ab7e8209f975ae8d4c319005ac3a64cf3b4ee6503d416abb001d442eb1abc826040516120429190613c03565b60405180910390a26000600b60036101000a81548160ff02191690831515021790555050565b600b60019054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6121508160036129d290919063ffffffff16565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690613b03565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fde8cf212af7ce38b2840785a2768d97ff2dbf3c21b516961cec0061e134c2a1e60405160405180910390a250565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b600c5481565b600061221c60056129a3565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548160ff0219169083151502179055507f1050112436208e776d9a33d97ca1981ed83303d2a93ccbd8c54f7a774c00f8148160405161232b919061388d565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8082111561243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190613a03565b60405180910390fd5b81600c8190555080600d819055505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461250d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f90613a63565b60405180910390fd5b61265c816003612b1c90919063ffffffff16565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290613b63565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612828576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613d396026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600080828401905083811015612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b4c565b905092915050565b60006129b182600001612b6f565b9050919050565b60006129c78360000183612b80565b60001c905092915050565b60006129fa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c03565b905092915050565b6000612a4483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ceb565b905092915050565b600080831415612a5f5760009050612acc565b6000828402905082848281612a7057fe5b0414612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d5f6021913960400191505060405180910390fd5b809150505b92915050565b6000612b1483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dab565b905092915050565b6000612b44836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e71565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b600081836000018054905011612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613d176022913960400191505060405180910390fd5b826000018281548110612bf057fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114612cdf5760006001820390506000600186600001805490500390506000866000018281548110612c4e57fe5b9060005260206000200154905080876000018481548110612c6b57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612ca357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612ce5565b60009150505b92915050565b6000838311158290612d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d5d578082015181840152602081019050612d42565b50505050905090810190601f168015612d8a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290612e57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578082015181840152602081019050612e01565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e6357fe5b049050809150509392505050565b6000612e7d8383612b4c565b612ed6578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612edb565b600090505b92915050565b600081359050612ef081613cd1565b92915050565b60008083601f840112612f0857600080fd5b8235905067ffffffffffffffff811115612f2157600080fd5b602083019150836020820283011115612f3957600080fd5b9250929050565b600081359050612f4f81613ce8565b92915050565b600081519050612f6481613ce8565b92915050565b600081359050612f7981613cff565b92915050565b600081519050612f8e81613cff565b92915050565b600060208284031215612fa657600080fd5b6000612fb484828501612ee1565b91505092915050565b60008060408385031215612fd057600080fd5b6000612fde85828601612ee1565b9250506020612fef85828601612f6a565b9150509250929050565b6000806020838503121561300c57600080fd5b600083013567ffffffffffffffff81111561302657600080fd5b61303285828601612ef6565b92509250509250929050565b60006020828403121561305057600080fd5b600061305e84828501612f40565b91505092915050565b60006020828403121561307957600080fd5b600061308784828501612f55565b91505092915050565b6000602082840312156130a257600080fd5b60006130b084828501612f6a565b91505092915050565b6000602082840312156130cb57600080fd5b60006130d984828501612f7f565b91505092915050565b600080604083850312156130f557600080fd5b600061310385828601612f6a565b925050602061311485828601612f6a565b9150509250929050565b61312781613c77565b82525050565b61313681613c2f565b82525050565b61314581613c41565b82525050565b61315481613c89565b82525050565b6000613167601c83613c1e565b91507f45786365656473206d6178696d756d20636f6e747269627574696f6e000000006000830152602082019050919050565b60006131a7601b83613c1e565b91507f496e76616c696420536f6c697320746f6b656e206164647265737300000000006000830152602082019050919050565b60006131e7601c83613c1e565b91507f536f6c697320746f6b656e2061646472657373206d69736d61746368000000006000830152602082019050919050565b6000613227601183613c1e565b91507f4e6f742061207061727469636970616e740000000000000000000000000000006000830152602082019050919050565b6000613267601083613c1e565b91507f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006000830152602082019050919050565b60006132a7600f83613c1e565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b60006132e7601a83613c1e565b91507f42656c6f77206d696e696d756d20636f6e747269627574696f6e0000000000006000830152602082019050919050565b6000613327601883613c1e565b91507f50726573616c65206d7573742062652064697361626c656400000000000000006000830152602082019050919050565b6000613367601d83613c1e565b91507f4e6f20536f6c697320746f6b656e7320746f20646973747269627574650000006000830152602082019050919050565b60006133a7601d83613c1e565b91507f416d6f756e74206d7573742062652067726561746572207468616e20300000006000830152602082019050919050565b60006133e7601283613c1e565b91507f4d696e206d757374206265203c3d206d617800000000000000000000000000006000830152602082019050919050565b6000613427601b83613c1e565b91507f446973747269627574696f6e206973206e6f7420656e61626c656400000000006000830152602082019050919050565b6000613467601383613c1e565b91507f526566756e6473206e6f7420656e61626c6564000000000000000000000000006000830152602082019050919050565b60006134a7601783613c1e565b91507f43616e6e6f7420616464207a65726f20616464726573730000000000000000006000830152602082019050919050565b60006134e7601583613c1e565b91507f546f6b656e207472616e73666572206661696c656400000000000000000000006000830152602082019050919050565b6000613527601583613c1e565b91507f4e6f20746f6b656e7320746f20776974686472617700000000000000000000006000830152602082019050919050565b6000613567600f83613c1e565b91507f416c726561647920636c61696d656400000000000000000000000000000000006000830152602082019050919050565b60006135a7601983613c1e565b91507f4e6f20636f6e747269627574696f6e20746f20726566756e64000000000000006000830152602082019050919050565b60006135e7601783613c1e565b91507f41646472657373206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000613627601083613c1e565b91507f48617264206361702072656163686564000000000000000000000000000000006000830152602082019050919050565b6000613667601883613c1e565b91507f4e6f2070726573616c6520636f6e747269627574696f6e7300000000000000006000830152602082019050919050565b60006136a7601b83613c1e565b91507f4164647265737320616c72656164792077686974656c697374656400000000006000830152602082019050919050565b60006136e7601383613c1e565b91507f496e646578206f7574206f6620626f756e6473000000000000000000000000006000830152602082019050919050565b6000613727601683613c1e565b91507f526566756e64207472616e73666572206661696c6564000000000000000000006000830152602082019050919050565b6000613767601683613c1e565b91507f50726573616c65206973206e6f7420656e61626c6564000000000000000000006000830152602082019050919050565b60006137a7601f83613c1e565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6137e381613c6d565b82525050565b60006020820190506137fe600083018461312d565b92915050565b6000606082019050613819600083018661311e565b613826602083018561312d565b61383360408301846137da565b949350505050565b6000604082019050613850600083018561311e565b61385d60208301846137da565b9392505050565b6000604082019050613879600083018561312d565b61388660208301846137da565b9392505050565b60006020820190506138a2600083018461313c565b92915050565b60006020820190506138bd600083018461314b565b92915050565b600060208201905081810360008301526138dc8161315a565b9050919050565b600060208201905081810360008301526138fc8161319a565b9050919050565b6000602082019050818103600083015261391c816131da565b9050919050565b6000602082019050818103600083015261393c8161321a565b9050919050565b6000602082019050818103600083015261395c8161325a565b9050919050565b6000602082019050818103600083015261397c8161329a565b9050919050565b6000602082019050818103600083015261399c816132da565b9050919050565b600060208201905081810360008301526139bc8161331a565b9050919050565b600060208201905081810360008301526139dc8161335a565b9050919050565b600060208201905081810360008301526139fc8161339a565b9050919050565b60006020820190508181036000830152613a1c816133da565b9050919050565b60006020820190508181036000830152613a3c8161341a565b9050919050565b60006020820190508181036000830152613a5c8161345a565b9050919050565b60006020820190508181036000830152613a7c8161349a565b9050919050565b60006020820190508181036000830152613a9c816134da565b9050919050565b60006020820190508181036000830152613abc8161351a565b9050919050565b60006020820190508181036000830152613adc8161355a565b9050919050565b60006020820190508181036000830152613afc8161359a565b9050919050565b60006020820190508181036000830152613b1c816135da565b9050919050565b60006020820190508181036000830152613b3c8161361a565b9050919050565b60006020820190508181036000830152613b5c8161365a565b9050919050565b60006020820190508181036000830152613b7c8161369a565b9050919050565b60006020820190508181036000830152613b9c816136da565b9050919050565b60006020820190508181036000830152613bbc8161371a565b9050919050565b60006020820190508181036000830152613bdc8161375a565b9050919050565b60006020820190508181036000830152613bfc8161379a565b9050919050565b6000602082019050613c1860008301846137da565b92915050565b600082825260208201905092915050565b6000613c3a82613c4d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613c8282613cad565b9050919050565b6000613c9482613c9b565b9050919050565b6000613ca682613c4d565b9050919050565b6000613cb882613cbf565b9050919050565b6000613cca82613c4d565b9050919050565b613cda81613c2f565b8114613ce557600080fd5b50565b613cf181613c41565b8114613cfc57600080fd5b50565b613d0881613c6d565b8114613d1357600080fd5b5056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122040f9a906bc8708de4363b86f6084de016bfcad72bf14ee25dc3614787780f72364736f6c6343000705003300000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637274f7fd1161011a57806398de5421116100ad578063c67e04d81161007c578063c67e04d814610556578063d18d944b14610572578063e43252d71461058e578063f2fde38b146105aa578063fb86a404146105c6576101fb565b806398de5421146104e0578063aaffadf3146104fe578063ad6057291461051c578063c10225b81461053a576101fb565b806386608326116100e9578063866083261461046a5780638ab1d681146104885780638d3d6576146104a45780638da5cb5b146104c2576101fb565b80637274f7fd146103d257806373b2e80e146104025780638401f8d114610432578063845c93061461044e576101fb565b806342e94c9011610192578063532f117911610161578063532f117914610384578063590e1ae3146103a25780636ff1c9bc146103ac578063715018a6146103c8576101fb565b806342e94c90146102fe57806343bb18ff1461032e57806348c54b9d1461034a57806351eb455414610354576101fb565b806333a2ef86116101ce57806333a2ef8614610274578063397e5d9e146102925780633af32abf146102b05780633edff20f146102e0576101fb565b8063039ae0a114610200578063143b237f1461021c57806324ffea1a1461023a57806330767d0914610258575b600080fd5b61021a60048036038101906102159190612fbd565b6105e4565b005b610224610a1c565b604051610231919061388d565b60405180910390f35b610242610a2f565b60405161024f91906138a8565b60405180910390f35b610272600480360381019061026d919061303e565b610a55565b005b61027c610b6a565b60405161028991906138a8565b60405180910390f35b61029a610b90565b6040516102a79190613c03565b60405180910390f35b6102ca60048036038101906102c59190612f94565b610b96565b6040516102d7919061388d565b60405180910390f35b6102e8610bb3565b6040516102f59190613c03565b60405180910390f35b61031860048036038101906103139190612f94565b610bc4565b6040516103259190613c03565b60405180910390f35b6103486004803603810190610343919061303e565b610bdc565b005b610352610cf1565b005b61036e60048036038101906103699190613090565b611117565b60405161037b91906137e9565b60405180910390f35b61038c61117f565b604051610399919061388d565b60405180910390f35b6103aa611192565b005b6103c660048036038101906103c19190612f94565b611534565b005b6103d06117a2565b005b6103ec60048036038101906103e79190612f94565b611921565b6040516103f99190613c03565b60405180910390f35b61041c60048036038101906104179190612f94565b6119b3565b604051610429919061388d565b60405180910390f35b61044c60048036038101906104479190612ff9565b6119d3565b005b61046860048036038101906104639190613090565b611baa565b005b610472612068565b60405161047f919061388d565b60405180910390f35b6104a2600480360381019061049d9190612f94565b61207b565b005b6104ac6121d5565b6040516104b99190613c03565b60405180910390f35b6104ca6121db565b6040516104d791906137e9565b60405180910390f35b6104e8612204565b6040516104f59190613c03565b60405180910390f35b61050661220a565b6040516105139190613c03565b60405180910390f35b610524612210565b6040516105319190613c03565b60405180910390f35b610554600480360381019061054f919061303e565b612221565b005b610570600480360381019061056b91906130e2565b612336565b005b61058c60048036038101906105879190613090565b61244c565b005b6105a860048036038101906105a39190612f94565b612517565b005b6105c460048036038101906105bf9190612f94565b6126e1565b005b6105ce6128e5565b6040516105db9190613c03565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070c906138e3565b60405180910390fd5b60008111610758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074f906139e3565b60405180910390fd5b600b60009054906101000a900460ff16156107a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079f906139a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108455781600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506108d6565b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90613903565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161093593929190613804565b602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109879190613067565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613a83565b60405180910390fd5b6109db81600a546128eb90919063ffffffff16565b600a819055507f81f28822c7c409b31de66706469ff5909e983a9d78f04f6a592eb53b7e74910381604051610a109190613c03565b60405180910390a15050565b600b60009054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60026101000a81548160ff0219169083151502179055507f24805b58c9a333d598a8dff28e34e0061fd3c24cfd1de6a924f31709f41842d481604051610b5f919061388d565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6000610bac82600361297390919063ffffffff16565b9050919050565b6000610bbf60036129a3565b905090565b60076020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60016101000a81548160ff0219169083151502179055507f11d48e11836d1d72286877c5b0f66b9a7c76273a1a1037b299c8460a4979386781604051610ce6919061388d565b60405180910390a150565b600b60039054906101000a900460ff1615610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60019054906101000a900460ff16610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613a23565b60405180910390fd5b610dbf33600561297390919063ffffffff16565b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613923565b60405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613ac3565b60405180910390fd5b600060095411610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790613b43565b60405180910390fd5b6000600a5411610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c906139c3565b60405180910390fd5b6000610f2033611921565b905060008111610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90613943565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161101a92919061383b565b602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190613067565b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613a83565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040516110f19190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b600061112360056129a3565b8210611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613b83565b60405180910390fd5b6111788260056129b890919063ffffffff16565b9050919050565b600b60029054906101000a900460ff1681565b600b60039054906101000a900460ff16156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60029054906101000a900460ff1661124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390613a43565b60405180910390fd5b61126033600561297390919063ffffffff16565b61129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690613923565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613ae3565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113be3360056129d290919063ffffffff16565b506113d481600954612a0290919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161143792919061383b565b602060405180830381600087803b15801561145157600080fd5b505af1158015611465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114899190613067565b6114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ba3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161150e9190613c03565b60405180910390a2506000600b60036101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161163591906137e9565b60206040518083038186803b15801561164d57600080fd5b505afa158015611661573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168591906130b9565b9050600081116116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613aa3565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6116ee6121db565b836040518363ffffffff1660e01b815260040161170c929190613864565b602060405180830381600087803b15801561172657600080fd5b505af115801561173a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175e9190613067565b61179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613963565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600954148061193557506000600a54145b1561194357600090506119ae565b6119ab60095461199d600a54600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a4c90919063ffffffff16565b612ad290919063ffffffff16565b90505b919050565b60086020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b82829050811015611ba557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ac657fe5b9050602002016020810190611adb9190612f94565b73ffffffffffffffffffffffffffffffffffffffff1614158015611b2f5750611b2e838383818110611b0957fe5b9050602002016020810190611b1e9190612f94565b6003612b1c90919063ffffffff16565b5b15611b9857828282818110611b4057fe5b9050602002016020810190611b559190612f94565b73ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a25b8080600101915050611a97565b505050565b600b60039054906101000a900460ff1615611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190613be3565b60405180910390fd5b6001600b60036101000a81548160ff021916908315150217905550600b60009054906101000a900460ff16611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90613bc3565b60405180910390fd5b611c7833600361297390919063ffffffff16565b611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613b03565b60405180910390fd5b60008111611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906139e3565b60405180910390fd5b600c54811015611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613983565b60405180910390fd5b600d54611d9482600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b1115611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906138c3565b60405180910390fd5b600e54611ded826009546128eb90919063ffffffff16565b1115611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2590613b23565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611e8d93929190613804565b602060405180830381600087803b158015611ea757600080fd5b505af1158015611ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edf9190613067565b611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590613a83565b60405180910390fd5b611f3233600561297390919063ffffffff16565b611f4c57611f4a336005612b1c90919063ffffffff16565b505b611f9e81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128eb90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ff6816009546128eb90919063ffffffff16565b6009819055503373ffffffffffffffffffffffffffffffffffffffff167f3d0ab7e8209f975ae8d4c319005ac3a64cf3b4ee6503d416abb001d442eb1abc826040516120429190613c03565b60405180910390a26000600b60036101000a81548160ff02191690831515021790555050565b600b60019054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461213c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6121508160036129d290919063ffffffff16565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690613b03565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fde8cf212af7ce38b2840785a2768d97ff2dbf3c21b516961cec0061e134c2a1e60405160405180910390a250565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b600c5481565b600061221c60056129a3565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548160ff0219169083151502179055507f1050112436208e776d9a33d97ca1981ed83303d2a93ccbd8c54f7a774c00f8148160405161232b919061388d565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8082111561243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190613a03565b60405180910390fd5b81600c8190555080600d819055505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461250d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f90613a63565b60405180910390fd5b61265c816003612b1c90919063ffffffff16565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290613b63565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d660405160405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612828576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613d396026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600080828401905083811015612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b4c565b905092915050565b60006129b182600001612b6f565b9050919050565b60006129c78360000183612b80565b60001c905092915050565b60006129fa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c03565b905092915050565b6000612a4483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ceb565b905092915050565b600080831415612a5f5760009050612acc565b6000828402905082848281612a7057fe5b0414612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d5f6021913960400191505060405180910390fd5b809150505b92915050565b6000612b1483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dab565b905092915050565b6000612b44836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e71565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b600081836000018054905011612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613d176022913960400191505060405180910390fd5b826000018281548110612bf057fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114612cdf5760006001820390506000600186600001805490500390506000866000018281548110612c4e57fe5b9060005260206000200154905080876000018481548110612c6b57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612ca357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612ce5565b60009150505b92915050565b6000838311158290612d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d5d578082015181840152602081019050612d42565b50505050905090810190601f168015612d8a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290612e57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578082015181840152602081019050612e01565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e6357fe5b049050809150509392505050565b6000612e7d8383612b4c565b612ed6578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612edb565b600090505b92915050565b600081359050612ef081613cd1565b92915050565b60008083601f840112612f0857600080fd5b8235905067ffffffffffffffff811115612f2157600080fd5b602083019150836020820283011115612f3957600080fd5b9250929050565b600081359050612f4f81613ce8565b92915050565b600081519050612f6481613ce8565b92915050565b600081359050612f7981613cff565b92915050565b600081519050612f8e81613cff565b92915050565b600060208284031215612fa657600080fd5b6000612fb484828501612ee1565b91505092915050565b60008060408385031215612fd057600080fd5b6000612fde85828601612ee1565b9250506020612fef85828601612f6a565b9150509250929050565b6000806020838503121561300c57600080fd5b600083013567ffffffffffffffff81111561302657600080fd5b61303285828601612ef6565b92509250509250929050565b60006020828403121561305057600080fd5b600061305e84828501612f40565b91505092915050565b60006020828403121561307957600080fd5b600061308784828501612f55565b91505092915050565b6000602082840312156130a257600080fd5b60006130b084828501612f6a565b91505092915050565b6000602082840312156130cb57600080fd5b60006130d984828501612f7f565b91505092915050565b600080604083850312156130f557600080fd5b600061310385828601612f6a565b925050602061311485828601612f6a565b9150509250929050565b61312781613c77565b82525050565b61313681613c2f565b82525050565b61314581613c41565b82525050565b61315481613c89565b82525050565b6000613167601c83613c1e565b91507f45786365656473206d6178696d756d20636f6e747269627574696f6e000000006000830152602082019050919050565b60006131a7601b83613c1e565b91507f496e76616c696420536f6c697320746f6b656e206164647265737300000000006000830152602082019050919050565b60006131e7601c83613c1e565b91507f536f6c697320746f6b656e2061646472657373206d69736d61746368000000006000830152602082019050919050565b6000613227601183613c1e565b91507f4e6f742061207061727469636970616e740000000000000000000000000000006000830152602082019050919050565b6000613267601083613c1e565b91507f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006000830152602082019050919050565b60006132a7600f83613c1e565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b60006132e7601a83613c1e565b91507f42656c6f77206d696e696d756d20636f6e747269627574696f6e0000000000006000830152602082019050919050565b6000613327601883613c1e565b91507f50726573616c65206d7573742062652064697361626c656400000000000000006000830152602082019050919050565b6000613367601d83613c1e565b91507f4e6f20536f6c697320746f6b656e7320746f20646973747269627574650000006000830152602082019050919050565b60006133a7601d83613c1e565b91507f416d6f756e74206d7573742062652067726561746572207468616e20300000006000830152602082019050919050565b60006133e7601283613c1e565b91507f4d696e206d757374206265203c3d206d617800000000000000000000000000006000830152602082019050919050565b6000613427601b83613c1e565b91507f446973747269627574696f6e206973206e6f7420656e61626c656400000000006000830152602082019050919050565b6000613467601383613c1e565b91507f526566756e6473206e6f7420656e61626c6564000000000000000000000000006000830152602082019050919050565b60006134a7601783613c1e565b91507f43616e6e6f7420616464207a65726f20616464726573730000000000000000006000830152602082019050919050565b60006134e7601583613c1e565b91507f546f6b656e207472616e73666572206661696c656400000000000000000000006000830152602082019050919050565b6000613527601583613c1e565b91507f4e6f20746f6b656e7320746f20776974686472617700000000000000000000006000830152602082019050919050565b6000613567600f83613c1e565b91507f416c726561647920636c61696d656400000000000000000000000000000000006000830152602082019050919050565b60006135a7601983613c1e565b91507f4e6f20636f6e747269627574696f6e20746f20726566756e64000000000000006000830152602082019050919050565b60006135e7601783613c1e565b91507f41646472657373206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000613627601083613c1e565b91507f48617264206361702072656163686564000000000000000000000000000000006000830152602082019050919050565b6000613667601883613c1e565b91507f4e6f2070726573616c6520636f6e747269627574696f6e7300000000000000006000830152602082019050919050565b60006136a7601b83613c1e565b91507f4164647265737320616c72656164792077686974656c697374656400000000006000830152602082019050919050565b60006136e7601383613c1e565b91507f496e646578206f7574206f6620626f756e6473000000000000000000000000006000830152602082019050919050565b6000613727601683613c1e565b91507f526566756e64207472616e73666572206661696c6564000000000000000000006000830152602082019050919050565b6000613767601683613c1e565b91507f50726573616c65206973206e6f7420656e61626c6564000000000000000000006000830152602082019050919050565b60006137a7601f83613c1e565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6137e381613c6d565b82525050565b60006020820190506137fe600083018461312d565b92915050565b6000606082019050613819600083018661311e565b613826602083018561312d565b61383360408301846137da565b949350505050565b6000604082019050613850600083018561311e565b61385d60208301846137da565b9392505050565b6000604082019050613879600083018561312d565b61388660208301846137da565b9392505050565b60006020820190506138a2600083018461313c565b92915050565b60006020820190506138bd600083018461314b565b92915050565b600060208201905081810360008301526138dc8161315a565b9050919050565b600060208201905081810360008301526138fc8161319a565b9050919050565b6000602082019050818103600083015261391c816131da565b9050919050565b6000602082019050818103600083015261393c8161321a565b9050919050565b6000602082019050818103600083015261395c8161325a565b9050919050565b6000602082019050818103600083015261397c8161329a565b9050919050565b6000602082019050818103600083015261399c816132da565b9050919050565b600060208201905081810360008301526139bc8161331a565b9050919050565b600060208201905081810360008301526139dc8161335a565b9050919050565b600060208201905081810360008301526139fc8161339a565b9050919050565b60006020820190508181036000830152613a1c816133da565b9050919050565b60006020820190508181036000830152613a3c8161341a565b9050919050565b60006020820190508181036000830152613a5c8161345a565b9050919050565b60006020820190508181036000830152613a7c8161349a565b9050919050565b60006020820190508181036000830152613a9c816134da565b9050919050565b60006020820190508181036000830152613abc8161351a565b9050919050565b60006020820190508181036000830152613adc8161355a565b9050919050565b60006020820190508181036000830152613afc8161359a565b9050919050565b60006020820190508181036000830152613b1c816135da565b9050919050565b60006020820190508181036000830152613b3c8161361a565b9050919050565b60006020820190508181036000830152613b5c8161365a565b9050919050565b60006020820190508181036000830152613b7c8161369a565b9050919050565b60006020820190508181036000830152613b9c816136da565b9050919050565b60006020820190508181036000830152613bbc8161371a565b9050919050565b60006020820190508181036000830152613bdc8161375a565b9050919050565b60006020820190508181036000830152613bfc8161379a565b9050919050565b6000602082019050613c1860008301846137da565b92915050565b600082825260208201905092915050565b6000613c3a82613c4d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613c8282613cad565b9050919050565b6000613c9482613c9b565b9050919050565b6000613ca682613c4d565b9050919050565b6000613cb882613cbf565b9050919050565b6000613cca82613c4d565b9050919050565b613cda81613c2f565b8114613ce557600080fd5b50565b613cf181613c41565b8114613cfc57600080fd5b50565b613d0881613c6d565b8114613d1357600080fd5b5056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122040f9a906bc8708de4363b86f6084de016bfcad72bf14ee25dc3614787780f72364736f6c63430007050033
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
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.