Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Whitelist Fee Ac... | 12443181 | 1743 days ago | IN | 0 ETH | 0.00418084 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
UniswapV2Locker
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-06-09
*/
// SPDX-License-Identifier: UNLICENSED
// This contract locks uniswap v2 liquidity tokens. Used to give investors peace of mind a token team has locked liquidity
// and that the univ2 tokens cannot be removed from uniswap until the specified unlock date has been reached.
pragma solidity ^0.6.12;
abstract contract Context {
function _msgSender() internal virtual view returns (address payable) {
return msg.sender;
}
function _msgData() internal virtual view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/**
helper methods for interacting with ERC20 tokens that do not consistently return true/false
with the addition of a transfer function to send eth or an erc20 token
*/
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0x095ea7b3, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper: APPROVE_FAILED"
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0xa9059cbb, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper: TRANSFER_FAILED"
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0x23b872dd, from, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper: TRANSFER_FROM_FAILED"
);
}
// sends ETH or an erc20 token
function safeTransferBaseToken(
address token,
address payable to,
uint256 value,
bool isERC20
) internal {
if (!isERC20) {
to.transfer(value);
} else {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0xa9059cbb, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper: TRANSFER_FAILED"
);
}
}
}
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value)
private
view
returns (bool)
{
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index)
private
view
returns (bytes32)
{
require(
set._values.length > index,
"EnumerableSet: index out of bounds"
);
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value)
internal
returns (bool)
{
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value)
internal
returns (bool)
{
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value)
internal
view
returns (bool)
{
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index)
internal
view
returns (bytes32)
{
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value)
internal
returns (bool)
{
return _add(set._inner, bytes32(uint256(value)));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index)
internal
view
returns (address)
{
return address(uint256(_at(set._inner, index)));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index)
internal
view
returns (uint256)
{
return uint256(_at(set._inner, index));
}
}
library SafeMath {
function tryAdd(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
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 div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() internal {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
interface IUniswapV2Pair {
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
}
interface IERCBurn {
function burn(uint256 _amount) external;
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external returns (uint256);
function balanceOf(address account) external view returns (uint256);
}
interface IUniFactory {
function getPair(address tokenA, address tokenB) external view returns (address);
}
interface IMigrator {
function migrate(address lpToken, uint256 amount, uint256 unlockDate, address owner) external returns (bool);
}
contract UniswapV2Locker is Ownable, ReentrancyGuard {
using SafeMath for uint256;
using EnumerableSet for EnumerableSet.AddressSet;
IUniFactory public uniswapFactory;
struct UserInfo {
EnumerableSet.AddressSet lockedTokens; // records all tokens the user has locked
mapping(address => uint256[]) locksForToken; // map erc20 address to lock id for that token
}
struct TokenLock {
uint256 lockDate; // the date the token was locked
uint256 amount; // the amount of tokens still locked (initialAmount minus withdrawls)
uint256 initialAmount; // the initial lock amount
uint256 unlockDate; // the date the token can be withdrawn
uint256 lockID; // lockID nonce per uni pair
address owner;
}
mapping(address => UserInfo) private users;
EnumerableSet.AddressSet private lockedTokens;
mapping(address => TokenLock[]) public tokenLocks; //map univ2 pair to all its locks
struct FeeStruct {
uint256 ethFee; // Small eth fee to prevent spam on the platform
IERCBurn secondaryFeeToken; // UNCX or UNCL
uint256 secondaryTokenFee; // optional, UNCX or UNCL
uint256 secondaryTokenDiscount; // discount on liquidity fee for burning secondaryToken
uint256 liquidityFee; // fee on univ2 liquidity tokens
uint256 referralPercent; // fee for referrals
IERCBurn referralToken; // token the refferer must hold to qualify as a referrer
uint256 referralHold; // balance the referrer must hold to qualify as a referrer
uint256 referralDiscount; // discount on flatrate fees for using a valid referral address
}
FeeStruct public gFees;
EnumerableSet.AddressSet private feeWhitelist;
address payable devaddr;
IMigrator migrator;
event onDeposit(address lpToken, address user, uint256 amount, uint256 lockDate, uint256 unlockDate);
event onWithdraw(address lpToken, uint256 amount);
constructor(IUniFactory _uniswapFactory) public {
devaddr = msg.sender;
gFees.referralPercent = 250; // 25%
gFees.ethFee = 1e18;
gFees.secondaryTokenFee = 100e18;
gFees.secondaryTokenDiscount = 200; // 20%
gFees.liquidityFee = 10; // 1%
gFees.referralHold = 10e18;
gFees.referralDiscount = 100; // 10%
uniswapFactory = _uniswapFactory;
}
function setDev(address payable _devaddr) public onlyOwner {
devaddr = _devaddr;
}
/**
* @notice set the migrator contract which allows locked lp tokens to be migrated to uniswap v3
*/
function setMigrator(IMigrator _migrator) public onlyOwner {
migrator = _migrator;
}
function setSecondaryFeeToken(address _secondaryFeeToken) public onlyOwner {
gFees.secondaryFeeToken = IERCBurn(_secondaryFeeToken);
}
/**
* @notice referrers need to hold the specified token and hold amount to be elegible for referral fees
*/
function setReferralTokenAndHold(IERCBurn _referralToken, uint256 _hold) public onlyOwner {
gFees.referralToken = _referralToken;
gFees.referralHold = _hold;
}
function setFees(
uint256 _referralPercent, uint256 _referralDiscount, uint256 _ethFee, uint256 _secondaryTokenFee, uint256 _secondaryTokenDiscount, uint256 _liquidityFee) public onlyOwner {
gFees.referralPercent = _referralPercent;
gFees.referralDiscount = _referralDiscount;
gFees.ethFee = _ethFee;
gFees.secondaryTokenFee = _secondaryTokenFee;
gFees.secondaryTokenDiscount = _secondaryTokenDiscount;
gFees.liquidityFee = _liquidityFee;
}
/**
* @notice whitelisted accounts dont pay flatrate fees on locking
*/
function whitelistFeeAccount(address _user, bool _add) public onlyOwner {
if (_add) {
feeWhitelist.add(_user);
} else {
feeWhitelist.remove(_user);
}
}
/**
* @notice Creates a new lock
* @param _lpToken the univ2 token address
* @param _amount amount of LP tokens to lock
* @param _unlock_date the unix timestamp (in seconds) until unlock
* @param _referral the referrer address if any or address(0) for none
* @param _fee_in_eth fees can be paid in eth or in a secondary token such as UNCX with a discount on univ2 tokens
* @param _withdrawer the user who can withdraw liquidity once the lock expires.
*/
function lockLPToken (
address _lpToken, uint256 _amount, uint256 _unlock_date, address payable _referral, bool _fee_in_eth, address payable _withdrawer) external payable nonReentrant {
require(_unlock_date < 10000000000, 'TIMESTAMP INVALID'); // prevents errors when timestamp entered in milliseconds
require(_amount > 0, 'INSUFFICIENT');
// ensure this pair is a univ2 pair by querying the factory
IUniswapV2Pair lpair = IUniswapV2Pair(address(_lpToken));
address factoryPairAddress = uniswapFactory.getPair(lpair.token0(), lpair.token1());
require(factoryPairAddress == address(_lpToken), 'NOT UNIV2');
TransferHelper.safeTransferFrom(_lpToken, address(msg.sender), address(this), _amount);
if (_referral != address(0) && address(gFees.referralToken) != address(0)) {
require(gFees.referralToken.balanceOf(_referral) >= gFees.referralHold, 'INADEQUATE BALANCE');
}
// flatrate fees
if (!feeWhitelist.contains(msg.sender)) {
if (_fee_in_eth) { // charge fee in eth
uint256 ethFee = gFees.ethFee;
if (_referral != address(0)) {
ethFee = ethFee.mul(1000 - gFees.referralDiscount).div(1000);
}
require(msg.value == ethFee, 'FEE NOT MET');
uint256 devFee = ethFee;
if (ethFee != 0 && _referral != address(0)) { // referral fee
uint256 referralFee = devFee.mul(gFees.referralPercent).div(1000);
_referral.transfer(referralFee);
devFee = devFee.sub(referralFee);
}
devaddr.transfer(devFee);
} else { // charge fee in token
uint256 burnFee = gFees.secondaryTokenFee;
if (_referral != address(0)) {
burnFee = burnFee.mul(1000 - gFees.referralDiscount).div(1000);
}
TransferHelper.safeTransferFrom(address(gFees.secondaryFeeToken), address(msg.sender), address(this), burnFee);
if (gFees.referralPercent != 0 && _referral != address(0)) { // referral fee
uint256 referralFee = burnFee.mul(gFees.referralPercent).div(1000);
TransferHelper.safeApprove(address(gFees.secondaryFeeToken), _referral, referralFee);
TransferHelper.safeTransfer(address(gFees.secondaryFeeToken), _referral, referralFee);
burnFee = burnFee.sub(referralFee);
}
gFees.secondaryFeeToken.burn(burnFee);
}
} else if (msg.value > 0){
// refund eth if a whitelisted member sent it by mistake
msg.sender.transfer(msg.value);
}
// percent fee
uint256 liquidityFee = _amount.mul(gFees.liquidityFee).div(1000);
if (!_fee_in_eth && !feeWhitelist.contains(msg.sender)) { // fee discount for large lockers using secondary token
liquidityFee = liquidityFee.mul(1000 - gFees.secondaryTokenDiscount).div(1000);
}
TransferHelper.safeTransfer(_lpToken, devaddr, liquidityFee);
uint256 amountLocked = _amount.sub(liquidityFee);
TokenLock memory token_lock;
token_lock.lockDate = block.timestamp;
token_lock.amount = amountLocked;
token_lock.initialAmount = amountLocked;
token_lock.unlockDate = _unlock_date;
token_lock.lockID = tokenLocks[_lpToken].length;
token_lock.owner = _withdrawer;
// record the lock for the univ2pair
tokenLocks[_lpToken].push(token_lock);
lockedTokens.add(_lpToken);
// record the lock for the user
UserInfo storage user = users[_withdrawer];
user.lockedTokens.add(_lpToken);
uint256[] storage user_locks = user.locksForToken[_lpToken];
user_locks.push(token_lock.lockID);
emit onDeposit(_lpToken, msg.sender, token_lock.amount, token_lock.lockDate, token_lock.unlockDate);
}
/**
* @notice extend a lock with a new unlock date, _index and _lockID ensure the correct lock is changed
* this prevents errors when a user performs multiple tx per block possibly with varying gas prices
*/
function relock (address _lpToken, uint256 _index, uint256 _lockID, uint256 _unlock_date) external nonReentrant {
require(_unlock_date < 10000000000, 'TIMESTAMP INVALID'); // prevents errors when timestamp entered in milliseconds
uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index];
TokenLock storage userLock = tokenLocks[_lpToken][lockID];
require(lockID == _lockID && userLock.owner == msg.sender, 'LOCK MISMATCH'); // ensures correct lock is affected
require(userLock.unlockDate < _unlock_date, 'UNLOCK BEFORE');
uint256 liquidityFee = userLock.amount.mul(gFees.liquidityFee).div(1000);
uint256 amountLocked = userLock.amount.sub(liquidityFee);
userLock.amount = amountLocked;
userLock.unlockDate = _unlock_date;
// send univ2 fee to dev address
TransferHelper.safeTransfer(_lpToken, devaddr, liquidityFee);
}
/**
* @notice withdraw a specified amount from a lock. _index and _lockID ensure the correct lock is changed
* this prevents errors when a user performs multiple tx per block possibly with varying gas prices
*/
function withdraw (address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount) external nonReentrant {
require(_amount > 0, 'ZERO WITHDRAWL');
uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index];
TokenLock storage userLock = tokenLocks[_lpToken][lockID];
require(lockID == _lockID && userLock.owner == msg.sender, 'LOCK MISMATCH'); // ensures correct lock is affected
require(userLock.unlockDate < block.timestamp, 'NOT YET');
userLock.amount = userLock.amount.sub(_amount);
// clean user storage
if (userLock.amount == 0) {
uint256[] storage userLocks = users[msg.sender].locksForToken[_lpToken];
userLocks[_index] = userLocks[userLocks.length-1];
userLocks.pop();
if (userLocks.length == 0) {
users[msg.sender].lockedTokens.remove(_lpToken);
}
}
TransferHelper.safeTransfer(_lpToken, msg.sender, _amount);
emit onWithdraw(_lpToken, _amount);
}
/**
* @notice increase the amount of tokens per a specific lock, this is preferable to creating a new lock, less fees, and faster loading on our live block explorer
*/
function incrementLock (address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount) external nonReentrant {
require(_amount > 0, 'ZERO AMOUNT');
uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index];
TokenLock storage userLock = tokenLocks[_lpToken][lockID];
require(lockID == _lockID && userLock.owner == msg.sender, 'LOCK MISMATCH'); // ensures correct lock is affected
TransferHelper.safeTransferFrom(_lpToken, address(msg.sender), address(this), _amount);
// send univ2 fee to dev address
uint256 liquidityFee = _amount.mul(gFees.liquidityFee).div(1000);
TransferHelper.safeTransfer(_lpToken, devaddr, liquidityFee);
uint256 amountLocked = _amount.sub(liquidityFee);
userLock.amount = userLock.amount.add(amountLocked);
emit onDeposit(_lpToken, msg.sender, amountLocked, userLock.lockDate, userLock.unlockDate);
}
/**
* @notice split a lock into two seperate locks, useful when a lock is about to expire and youd like to relock a portion
* and withdraw a smaller portion
*/
function splitLock (address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount) external payable nonReentrant {
require(_amount > 0, 'ZERO AMOUNT');
uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index];
TokenLock storage userLock = tokenLocks[_lpToken][lockID];
require(lockID == _lockID && userLock.owner == msg.sender, 'LOCK MISMATCH'); // ensures correct lock is affected
require(msg.value == gFees.ethFee, 'FEE NOT MET');
devaddr.transfer(gFees.ethFee);
userLock.amount = userLock.amount.sub(_amount);
TokenLock memory token_lock;
token_lock.lockDate = userLock.lockDate;
token_lock.amount = _amount;
token_lock.initialAmount = _amount;
token_lock.unlockDate = userLock.unlockDate;
token_lock.lockID = tokenLocks[_lpToken].length;
token_lock.owner = msg.sender;
// record the lock for the univ2pair
tokenLocks[_lpToken].push(token_lock);
// record the lock for the user
UserInfo storage user = users[msg.sender];
uint256[] storage user_locks = user.locksForToken[_lpToken];
user_locks.push(token_lock.lockID);
}
/**
* @notice transfer a lock to a new owner, e.g. presale project -> project owner
*/
function transferLockOwnership (address _lpToken, uint256 _index, uint256 _lockID, address payable _newOwner) external {
require(msg.sender != _newOwner, 'OWNER');
uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index];
TokenLock storage transferredLock = tokenLocks[_lpToken][lockID];
require(lockID == _lockID && transferredLock.owner == msg.sender, 'LOCK MISMATCH'); // ensures correct lock is affected
// record the lock for the new Owner
UserInfo storage user = users[_newOwner];
user.lockedTokens.add(_lpToken);
uint256[] storage user_locks = user.locksForToken[_lpToken];
user_locks.push(transferredLock.lockID);
// remove the lock from the old owner
uint256[] storage userLocks = users[msg.sender].locksForToken[_lpToken];
userLocks[_index] = userLocks[userLocks.length-1];
userLocks.pop();
if (userLocks.length == 0) {
users[msg.sender].lockedTokens.remove(_lpToken);
}
transferredLock.owner = _newOwner;
}
/**
* @notice migrates liquidity to uniswap v3
*/
function migrate (address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount) external nonReentrant {
require(address(migrator) != address(0), "NOT SET");
require(_amount > 0, 'ZERO MIGRATION');
uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index];
TokenLock storage userLock = tokenLocks[_lpToken][lockID];
require(lockID == _lockID && userLock.owner == msg.sender, 'LOCK MISMATCH'); // ensures correct lock is affected
userLock.amount = userLock.amount.sub(_amount);
// clean user storage
if (userLock.amount == 0) {
uint256[] storage userLocks = users[msg.sender].locksForToken[_lpToken];
userLocks[_index] = userLocks[userLocks.length-1];
userLocks.pop();
if (userLocks.length == 0) {
users[msg.sender].lockedTokens.remove(_lpToken);
}
}
TransferHelper.safeApprove(_lpToken, address(migrator), _amount);
migrator.migrate(_lpToken, _amount, userLock.unlockDate, msg.sender);
}
function getNumLocksForToken (address _lpToken) external view returns (uint256) {
return tokenLocks[_lpToken].length;
}
function getNumLockedTokens () external view returns (uint256) {
return lockedTokens.length();
}
function getLockedTokenAtIndex (uint256 _index) external view returns (address) {
return lockedTokens.at(_index);
}
// user functions
function getUserNumLockedTokens (address _user) external view returns (uint256) {
UserInfo storage user = users[_user];
return user.lockedTokens.length();
}
function getUserLockedTokenAtIndex (address _user, uint256 _index) external view returns (address) {
UserInfo storage user = users[_user];
return user.lockedTokens.at(_index);
}
function getUserNumLocksForToken (address _user, address _lpToken) external view returns (uint256) {
UserInfo storage user = users[_user];
return user.locksForToken[_lpToken].length;
}
function getUserLockForTokenAtIndex (
address _user, address _lpToken, uint256 _index) external view returns (uint256, uint256, uint256, uint256, uint256, address) {
uint256 lockID = users[_user].locksForToken[_lpToken][_index];
TokenLock storage tokenLock = tokenLocks[_lpToken][lockID];
return (tokenLock.lockDate, tokenLock.amount, tokenLock.initialAmount, tokenLock.unlockDate, tokenLock.lockID, tokenLock.owner);
}
// whitelist
function getWhitelistedUsersLength () external view returns (uint256) {
return feeWhitelist.length();
}
function getWhitelistedUserAtIndex (uint256 _index) external view returns (address) {
return feeWhitelist.at(_index);
}
function getUserWhitelistStatus (address _user) external view returns (bool) {
return feeWhitelist.contains(_user);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IUniFactory","name":"_uniswapFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"onDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"onWithdraw","type":"event"},{"inputs":[],"name":"gFees","outputs":[{"internalType":"uint256","name":"ethFee","type":"uint256"},{"internalType":"contract IERCBurn","name":"secondaryFeeToken","type":"address"},{"internalType":"uint256","name":"secondaryTokenFee","type":"uint256"},{"internalType":"uint256","name":"secondaryTokenDiscount","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"referralPercent","type":"uint256"},{"internalType":"contract IERCBurn","name":"referralToken","type":"address"},{"internalType":"uint256","name":"referralHold","type":"uint256"},{"internalType":"uint256","name":"referralDiscount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLockedTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"getNumLocksForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockForTokenAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockedTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserNumLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"}],"name":"getUserNumLocksForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getWhitelistedUserAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistedUsersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"incrementLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_unlock_date","type":"uint256"},{"internalType":"address payable","name":"_referral","type":"address"},{"internalType":"bool","name":"_fee_in_eth","type":"bool"},{"internalType":"address payable","name":"_withdrawer","type":"address"}],"name":"lockLPToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_unlock_date","type":"uint256"}],"name":"relock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_devaddr","type":"address"}],"name":"setDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_referralPercent","type":"uint256"},{"internalType":"uint256","name":"_referralDiscount","type":"uint256"},{"internalType":"uint256","name":"_ethFee","type":"uint256"},{"internalType":"uint256","name":"_secondaryTokenFee","type":"uint256"},{"internalType":"uint256","name":"_secondaryTokenDiscount","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigrator","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERCBurn","name":"_referralToken","type":"address"},{"internalType":"uint256","name":"_hold","type":"uint256"}],"name":"setReferralTokenAndHold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_secondaryFeeToken","type":"address"}],"name":"setSecondaryFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"splitLock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenLocks","outputs":[{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"},{"internalType":"uint256","name":"lockID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferLockOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"whitelistFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200315e3803806200315e833981810160405260208110156200003757600080fd5b505160006200004562000100565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001805560128054336001600160a01b03199182161790915560fa600c55670de0b6b3a764000060075568056bc75e2d6310000060095560c8600a908155600b55678ac7230489e80000600e556064600f55600280549091166001600160a01b039290921691909117905562000104565b3390565b61304a80620001146000396000f3fe6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063b9863a4411610095578063d4ff493f11610064578063d4ff493f14610773578063ee424278146107b6578063f02c2643146107fb578063f2fde38b14610834576101c2565b8063b9863a441461063d578063bef497fd14610684578063ccebfa3f146106cb578063d477f05f14610740576101c2565b806391ff1eb1116100d157806391ff1eb11461054f578063a39698151461058a578063a69d9c4f146105bd578063a9b07cea146105f8576101c2565b80638da5cb5b1461048c578063903df806146104a157806390e1a003146104da576101c2565b8063715018a6116101645780638931a4be1161013e5780638931a4be146103d05780638af416f6146104035780638bdb2afa1461044d5780638c301df814610462576101c2565b8063715018a61461035e578063783451e81461037357806386f6c3c114610388576101c2565b80634532d776116101a05780634532d776146102875780634bb18e3f146102cc578063582d5adc146102e157806360491d2414610319576101c2565b806314dd79a3146101c75780631f2a1d2f1461020d57806323cf311814610252575b600080fd5b3480156101d357600080fd5b506101f1600480360360208110156101ea57600080fd5b5035610867565b604080516001600160a01b039092168252519081900360200190f35b34801561021957600080fd5b506102406004803603602081101561023057600080fd5b50356001600160a01b031661087a565b60408051918252519081900360200190f35b34801561025e57600080fd5b506102856004803603602081101561027557600080fd5b50356001600160a01b0316610895565b005b34801561029357600080fd5b50610285600480360360808110156102aa57600080fd5b506001600160a01b03813516906020810135906040810135906060013561090f565b3480156102d857600080fd5b50610240610bd3565b610285600480360360808110156102f757600080fd5b506001600160a01b038135169060208101359060408101359060600135610be4565b34801561032557600080fd5b506102856004803603608081101561033c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610eba565b34801561036a57600080fd5b506102856110f3565b34801561037f57600080fd5b50610240611195565b34801561039457600080fd5b50610285600480360360c08110156103ab57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356111a1565b3480156103dc57600080fd5b50610285600480360360208110156103f357600080fd5b50356001600160a01b0316611216565b610285600480360360c081101561041957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135821691608082013515159160a0013516611290565b34801561045957600080fd5b506101f1611b4d565b34801561046e57600080fd5b506101f16004803603602081101561048557600080fd5b5035611b5c565b34801561049857600080fd5b506101f1611b69565b3480156104ad57600080fd5b506101f1600480360360408110156104c457600080fd5b506001600160a01b038135169060200135611b78565b3480156104e657600080fd5b506104ef611ba2565b604051808a8152602001896001600160a01b03168152602001888152602001878152602001868152602001858152602001846001600160a01b03168152602001838152602001828152602001995050505050505050505060405180910390f35b34801561055b57600080fd5b506102856004803603604081101561057257600080fd5b506001600160a01b0381351690602001351515611bd0565b34801561059657600080fd5b50610240600480360360208110156105ad57600080fd5b50356001600160a01b0316611c50565b3480156105c957600080fd5b50610240600480360360408110156105e057600080fd5b506001600160a01b0381358116916020013516611c78565b34801561060457600080fd5b506102856004803603608081101561061b57600080fd5b506001600160a01b038135169060208101359060408101359060600135611ca7565b34801561064957600080fd5b506106706004803603602081101561066057600080fd5b50356001600160a01b0316611ee5565b604080519115158252519081900360200190f35b34801561069057600080fd5b50610285600480360360808110156106a757600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611ef2565b3480156106d757600080fd5b50610704600480360360408110156106ee57600080fd5b506001600160a01b038135169060200135612125565b60408051968752602087019590955285850193909352606085019190915260808401526001600160a01b031660a0830152519081900360c00190f35b34801561074c57600080fd5b506102856004803603602081101561076357600080fd5b50356001600160a01b031661217f565b34801561077f57600080fd5b506107046004803603606081101561079657600080fd5b506001600160a01b038135811691602081013590911690604001356121f9565b3480156107c257600080fd5b50610285600480360360808110156107d957600080fd5b506001600160a01b0381351690602081013590604081013590606001356122eb565b34801561080757600080fd5b506102856004803603604081101561081e57600080fd5b506001600160a01b038135169060200135612607565b34801561084057600080fd5b506102856004803603602081101561085757600080fd5b50356001600160a01b0316612685565b600061087460048361277d565b92915050565b6001600160a01b031660009081526006602052604090205490565b61089d612789565b6000546001600160a01b039081169116146108ed576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60026001541415610955576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001558061099d576040805162461bcd60e51b815260206004820152600e60248201526d16915493c815d2551211149055d360921b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b038816845260020190915281208054859081106109cf57fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610a0e57fe5b906000526020600020906006020190508382148015610a39575060058101546001600160a01b031633145b610a7a576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b42816003015410610abc576040805162461bcd60e51b81526020600482015260076024820152661393d50816515560ca1b604482015290519081900360640190fd5b6001810154610acb908461278d565b60018201819055610b78573360009081526003602090815260408083206001600160a01b038a1684526002019091529020805481906000198101908110610b0e57fe5b9060005260206000200154818781548110610b2557fe5b906000526020600020018190555080805480610b3d57fe5b6000828152602081208201600019908101919091550190558054610b7657336000908152600360205260409020610b7490886127ea565b505b505b610b838633856127ff565b604080516001600160a01b03881681526020810185905281517fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc929181900390910190a150506001805550505050565b6000610bdf6010612969565b905090565b60026001541415610c2a576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b600260015580610c6f576040805162461bcd60e51b815260206004820152600b60248201526a16915493c8105353d5539560aa1b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110610ca157fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610ce057fe5b906000526020600020906006020190508382148015610d0b575060058101546001600160a01b031633145b610d4c576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b6007543414610d90576040805162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b604482015290519081900360640190fd5b6012546007546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610dcc573d6000803e3d6000fd5b506001810154610ddc908461278d565b6001820155610de9612f08565b8154815260208082018581526040808401968752600394850154606085019081526001600160a01b039a8b1660008181526006808752848220805460808a018181523360a08c01818152858c52600180850186559487528b87209c5193909502909b019182559751818301559b516002808e019190915594518c8b0155865160048d015590516005909b0180546001600160a01b0319169b909e169a909a17909c55948b52948352808a20938a52929093018152908720915182548086018455928852962001949094558055505050565b60026001541415610f00576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001556402540be4008110610f52576040805162461bcd60e51b81526020600482015260116024820152701512535154d51053540812539590531251607a1b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110610f8457fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610fc357fe5b906000526020600020906006020190508382148015610fee575060058101546001600160a01b031633145b61102f576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b82816003015410611077576040805162461bcd60e51b815260206004820152600d60248201526c554e4c4f434b204245464f524560981b604482015290519081900360640190fd5b60006110a16103e861109b600760040154856001015461297490919063ffffffff16565b906129cd565b905060006110bc82846001015461278d90919063ffffffff16565b60018401819055600384018690556012549091506110e59089906001600160a01b0316846127ff565b505060018055505050505050565b6110fb612789565b6000546001600160a01b0390811691161461114b576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bdf6004612969565b6111a9612789565b6000546001600160a01b039081169116146111f9576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600c95909555600f93909355600791909155600955600a55600b55565b61121e612789565b6000546001600160a01b0390811691161461126e576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156112d6576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001556402540be4008410611328576040805162461bcd60e51b81526020600482015260116024820152701512535154d51053540812539590531251607a1b604482015290519081900360640190fd5b6000851161136c576040805162461bcd60e51b815260206004820152600c60248201526b125394d551919250d251539560a21b604482015290519081900360640190fd5b60025460408051630dfe168160e01b8152905188926000926001600160a01b039182169263e6a4390592861691630dfe1681916004808301926020929190829003018186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b50516040805163d21220a760e01b815290516001600160a01b0387169163d21220a7916004808301926020929190829003018186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d60208110156114ce57600080fd5b505190506001600160a01b038082169089161461151e576040805162461bcd60e51b81526020600482015260096024820152682727aa102aa724ab1960b91b604482015290519081900360640190fd5b61152a8833308a612a34565b6001600160a01b0385161580159061154c5750600d546001600160a01b031615155b1561161557600e54600d54604080516370a0823160e01b81526001600160a01b038981166004830152915191909216916370a08231916024808301926020929190829003018186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d60208110156115cb57600080fd5b50511015611615576040805162461bcd60e51b8152602060048201526012602482015271494e41444551554154452042414c414e434560701b604482015290519081900360640190fd5b611620601033612b91565b61188e578315611760576007546001600160a01b0386161561165757600f54611654906103e89061109b9084908303612974565b90505b803414611699576040805162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b604482015290519081900360640190fd5b8080158015906116b157506001600160a01b03871615155b1561171e5760006116d66103e861109b6007600501548561297490919063ffffffff16565b6040519091506001600160a01b0389169082156108fc029083906000818181858888f1935050505015801561170f573d6000803e3d6000fd5b5061171a828261278d565b9150505b6012546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611758573d6000803e3d6000fd5b505050611889565b6009546001600160a01b0386161561178d57600f5461178a906103e89061109b9084908303612974565b90505b6008546117a5906001600160a01b0316333084612a34565b600c54158015906117be57506001600160a01b03861615155b156118225760006117e36103e861109b6007600501548561297490919063ffffffff16565b6008549091506117fd906001600160a01b03168883612ba6565b600854611814906001600160a01b031688836127ff565b61181e828261278d565b9150505b60085460408051630852cd8d60e31b81526004810184905290516001600160a01b03909216916342966c689160248082019260009290919082900301818387803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b50505050505b6118c2565b34156118c25760405133903480156108fc02916000818181858888f193505050501580156118c0573d6000803e3d6000fd5b505b60006118e26103e861109b6007600401548b61297490919063ffffffff16565b9050841580156118fa57506118f8601033612b91565b155b1561191a57600a54611917906103e89061109b9084908303612974565b90505b601254611932908a906001600160a01b0316836127ff565b600061193e898361278d565b9050611948612f08565b42816000018181525050818160200181815250508181604001818152505088816060018181525050600660008c6001600160a01b03166001600160a01b0316815260200190815260200160002080549050816080018181525050858160a001906001600160a01b031690816001600160a01b031681525050600660008c6001600160a01b03166001600160a01b03168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050611a848b6004612d0990919063ffffffff16565b506001600160a01b0386166000908152600360205260409020611aa7818d612d09565b506001600160a01b038c1660008181526002830160209081526040808320608080880151825460018101845583875295859020909501949094558683015187516060808a0151855198895233968901969096528785019290925290860152928401919091525190917f830357565da6ecfc26d8d9f69df488ed6f70361af9a07e570544aeb5c5e765e5919081900360a00190a15050600180555050505050505050505050565b6002546001600160a01b031681565b600061087460108361277d565b6000546001600160a01b031690565b6001600160a01b0382166000908152600360205260408120611b9a818461277d565b949350505050565b600754600854600954600a54600b54600c54600d54600e54600f546001600160a01b03978816979092169189565b611bd8612789565b6000546001600160a01b03908116911614611c28576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b8015611c3f57611c39601083612d09565b50611c4c565b611c4a6010836127ea565b505b5050565b6001600160a01b0381166000908152600360205260408120611c7181612969565b9392505050565b6001600160a01b0391821660009081526003602090815260408083209390941682526002909201909152205490565b60026001541415611ced576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b600260015580611d32576040805162461bcd60e51b815260206004820152600b60248201526a16915493c8105353d5539560aa1b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110611d6457fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110611da357fe5b906000526020600020906006020190508382148015611dce575060058101546001600160a01b031633145b611e0f576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b611e1b86333086612a34565b6000611e3b6103e861109b6007600401548761297490919063ffffffff16565b601254909150611e569088906001600160a01b0316836127ff565b6000611e62858361278d565b6001840154909150611e749082612d1e565b600184015582546003840154604080516001600160a01b038c16815233602082015280820185905260608101939093526080830191909152517f830357565da6ecfc26d8d9f69df488ed6f70361af9a07e570544aeb5c5e765e59181900360a00190a1505060018055505050505050565b6000610874601083612b91565b336001600160a01b0382161415611f38576040805162461bcd60e51b815260206004820152600560248201526427aba722a960d91b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110611f6a57fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110611fa957fe5b906000526020600020906006020190508382148015611fd4575060058101546001600160a01b031633145b612015576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090206120378188612d09565b506001600160a01b038716600081815260028084016020908152604080842060048801548154600181018355828752848720015533855260038352818520958552949092019052902080548190600019810190811061209257fe5b90600052602060002001548189815481106120a957fe5b9060005260206000200181905550808054806120c157fe5b60008281526020812082016000199081019190915501905580546120fa573360009081526003602052604090206120f8908a6127ea565b505b50505060050180546001600160a01b0319166001600160a01b03939093169290921790915550505050565b6006602052816000526040600020818154811061213e57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501549396509194509290916001600160a01b031686565b612187612789565b6000546001600160a01b039081169116146121d7576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000806000806000600360008b6001600160a01b03166001600160a01b0316815260200190815260200160002060020160008a6001600160a01b03166001600160a01b03168152602001908152602001600020888154811061225a57fe5b906000526020600020015490506000600660008b6001600160a01b03166001600160a01b03168152602001908152602001600020828154811061229957fe5b6000918252602090912060069091020180546001820154600283015460038401546004850154600590950154939c50919a50985096509094506001600160a01b03169250505093975093979195509350565b60026001541415612331576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001556013546001600160a01b031661237d576040805162461bcd60e51b81526020600482015260076024820152661393d50814d15560ca1b604482015290519081900360640190fd5b600081116123c3576040805162461bcd60e51b815260206004820152600e60248201526d2d22a9279026a4a3a920aa24a7a760911b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b038816845260020190915281208054859081106123f557fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b03168152602001908152602001600020828154811061243457fe5b90600052602060002090600602019050838214801561245f575060058101546001600160a01b031633145b6124a0576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b60018101546124af908461278d565b6001820181905561255c573360009081526003602090815260408083206001600160a01b038a16845260020190915290208054819060001981019081106124f257fe5b906000526020600020015481878154811061250957fe5b90600052602060002001819055508080548061252157fe5b600082815260208120820160001990810191909155019055805461255a5733600090815260036020526040902061255890886127ea565b505b505b6013546125749087906001600160a01b031685612ba6565b60135460038201546040805163db5ecd3f60e01b81526001600160a01b038a811660048301526024820188905260448201939093523360648201529051919092169163db5ecd3f9160848083019260209291908290030181600087803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050506040513d60208110156110e557600080fd5b61260f612789565b6000546001600160a01b0390811691161461265f576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b61268d612789565b6000546001600160a01b039081169116146126dd576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b6001600160a01b0381166127225760405162461bcd60e51b8152600401808060200182810382526026815260200180612f8a6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611c718383612d78565b3390565b6000828211156127e4576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000611c71836001600160a01b038416612ddc565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061287c5780518252601f19909201916020918201910161285d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146128de576040519150601f19603f3d011682016040523d82523d6000602084013e6128e3565b606091505b5091509150818015612911575080511580612911575080806020019051602081101561290e57600080fd5b50515b612962576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b600061087482612ea2565b60008261298357506000610874565b8282028284828161299057fe5b0414611c715760405162461bcd60e51b8152600401808060200182810382526021815260200180612fb06021913960400191505060405180910390fd5b6000808211612a23576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a2c57fe5b049392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310612ab95780518252601f199092019160209182019101612a9a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b1b576040519150601f19603f3d011682016040523d82523d6000602084013e612b20565b606091505b5091509150818015612b4e575080511580612b4e5750808060200190516020811015612b4b57600080fd5b50515b612b895760405162461bcd60e51b8152600401808060200182810382526024815260200180612ff16024913960400191505060405180910390fd5b505050505050565b6000611c71836001600160a01b038416612ea6565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310612c235780518252601f199092019160209182019101612c04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c85576040519150601f19603f3d011682016040523d82523d6000602084013e612c8a565b606091505b5091509150818015612cb8575080511580612cb85750808060200190516020811015612cb557600080fd5b50515b612962576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b6000611c71836001600160a01b038416612ebe565b600082820183811015611c71576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b81546000908210612dba5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f486022913960400191505060405180910390fd5b826000018281548110612dc957fe5b9060005260206000200154905092915050565b60008181526001830160205260408120548015612e985783546000198083019190810190600090879083908110612e0f57fe5b9060005260206000200154905080876000018481548110612e2c57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612e5c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610874565b6000915050610874565b5490565b60009081526001919091016020526040902054151590565b6000612eca8383612ea6565b612f0057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610874565b506000610874565b6040518060c00160405280600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64735265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212202d349316d2c905e80212ae79efae8bcad3634db842c9c3e0ab73422f2565e16c64736f6c634300060c00330000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80638da5cb5b116100f7578063b9863a4411610095578063d4ff493f11610064578063d4ff493f14610773578063ee424278146107b6578063f02c2643146107fb578063f2fde38b14610834576101c2565b8063b9863a441461063d578063bef497fd14610684578063ccebfa3f146106cb578063d477f05f14610740576101c2565b806391ff1eb1116100d157806391ff1eb11461054f578063a39698151461058a578063a69d9c4f146105bd578063a9b07cea146105f8576101c2565b80638da5cb5b1461048c578063903df806146104a157806390e1a003146104da576101c2565b8063715018a6116101645780638931a4be1161013e5780638931a4be146103d05780638af416f6146104035780638bdb2afa1461044d5780638c301df814610462576101c2565b8063715018a61461035e578063783451e81461037357806386f6c3c114610388576101c2565b80634532d776116101a05780634532d776146102875780634bb18e3f146102cc578063582d5adc146102e157806360491d2414610319576101c2565b806314dd79a3146101c75780631f2a1d2f1461020d57806323cf311814610252575b600080fd5b3480156101d357600080fd5b506101f1600480360360208110156101ea57600080fd5b5035610867565b604080516001600160a01b039092168252519081900360200190f35b34801561021957600080fd5b506102406004803603602081101561023057600080fd5b50356001600160a01b031661087a565b60408051918252519081900360200190f35b34801561025e57600080fd5b506102856004803603602081101561027557600080fd5b50356001600160a01b0316610895565b005b34801561029357600080fd5b50610285600480360360808110156102aa57600080fd5b506001600160a01b03813516906020810135906040810135906060013561090f565b3480156102d857600080fd5b50610240610bd3565b610285600480360360808110156102f757600080fd5b506001600160a01b038135169060208101359060408101359060600135610be4565b34801561032557600080fd5b506102856004803603608081101561033c57600080fd5b506001600160a01b038135169060208101359060408101359060600135610eba565b34801561036a57600080fd5b506102856110f3565b34801561037f57600080fd5b50610240611195565b34801561039457600080fd5b50610285600480360360c08110156103ab57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356111a1565b3480156103dc57600080fd5b50610285600480360360208110156103f357600080fd5b50356001600160a01b0316611216565b610285600480360360c081101561041957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135821691608082013515159160a0013516611290565b34801561045957600080fd5b506101f1611b4d565b34801561046e57600080fd5b506101f16004803603602081101561048557600080fd5b5035611b5c565b34801561049857600080fd5b506101f1611b69565b3480156104ad57600080fd5b506101f1600480360360408110156104c457600080fd5b506001600160a01b038135169060200135611b78565b3480156104e657600080fd5b506104ef611ba2565b604051808a8152602001896001600160a01b03168152602001888152602001878152602001868152602001858152602001846001600160a01b03168152602001838152602001828152602001995050505050505050505060405180910390f35b34801561055b57600080fd5b506102856004803603604081101561057257600080fd5b506001600160a01b0381351690602001351515611bd0565b34801561059657600080fd5b50610240600480360360208110156105ad57600080fd5b50356001600160a01b0316611c50565b3480156105c957600080fd5b50610240600480360360408110156105e057600080fd5b506001600160a01b0381358116916020013516611c78565b34801561060457600080fd5b506102856004803603608081101561061b57600080fd5b506001600160a01b038135169060208101359060408101359060600135611ca7565b34801561064957600080fd5b506106706004803603602081101561066057600080fd5b50356001600160a01b0316611ee5565b604080519115158252519081900360200190f35b34801561069057600080fd5b50610285600480360360808110156106a757600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611ef2565b3480156106d757600080fd5b50610704600480360360408110156106ee57600080fd5b506001600160a01b038135169060200135612125565b60408051968752602087019590955285850193909352606085019190915260808401526001600160a01b031660a0830152519081900360c00190f35b34801561074c57600080fd5b506102856004803603602081101561076357600080fd5b50356001600160a01b031661217f565b34801561077f57600080fd5b506107046004803603606081101561079657600080fd5b506001600160a01b038135811691602081013590911690604001356121f9565b3480156107c257600080fd5b50610285600480360360808110156107d957600080fd5b506001600160a01b0381351690602081013590604081013590606001356122eb565b34801561080757600080fd5b506102856004803603604081101561081e57600080fd5b506001600160a01b038135169060200135612607565b34801561084057600080fd5b506102856004803603602081101561085757600080fd5b50356001600160a01b0316612685565b600061087460048361277d565b92915050565b6001600160a01b031660009081526006602052604090205490565b61089d612789565b6000546001600160a01b039081169116146108ed576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60026001541415610955576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001558061099d576040805162461bcd60e51b815260206004820152600e60248201526d16915493c815d2551211149055d360921b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b038816845260020190915281208054859081106109cf57fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610a0e57fe5b906000526020600020906006020190508382148015610a39575060058101546001600160a01b031633145b610a7a576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b42816003015410610abc576040805162461bcd60e51b81526020600482015260076024820152661393d50816515560ca1b604482015290519081900360640190fd5b6001810154610acb908461278d565b60018201819055610b78573360009081526003602090815260408083206001600160a01b038a1684526002019091529020805481906000198101908110610b0e57fe5b9060005260206000200154818781548110610b2557fe5b906000526020600020018190555080805480610b3d57fe5b6000828152602081208201600019908101919091550190558054610b7657336000908152600360205260409020610b7490886127ea565b505b505b610b838633856127ff565b604080516001600160a01b03881681526020810185905281517fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc929181900390910190a150506001805550505050565b6000610bdf6010612969565b905090565b60026001541415610c2a576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b600260015580610c6f576040805162461bcd60e51b815260206004820152600b60248201526a16915493c8105353d5539560aa1b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110610ca157fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610ce057fe5b906000526020600020906006020190508382148015610d0b575060058101546001600160a01b031633145b610d4c576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b6007543414610d90576040805162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b604482015290519081900360640190fd5b6012546007546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610dcc573d6000803e3d6000fd5b506001810154610ddc908461278d565b6001820155610de9612f08565b8154815260208082018581526040808401968752600394850154606085019081526001600160a01b039a8b1660008181526006808752848220805460808a018181523360a08c01818152858c52600180850186559487528b87209c5193909502909b019182559751818301559b516002808e019190915594518c8b0155865160048d015590516005909b0180546001600160a01b0319169b909e169a909a17909c55948b52948352808a20938a52929093018152908720915182548086018455928852962001949094558055505050565b60026001541415610f00576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001556402540be4008110610f52576040805162461bcd60e51b81526020600482015260116024820152701512535154d51053540812539590531251607a1b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110610f8457fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610fc357fe5b906000526020600020906006020190508382148015610fee575060058101546001600160a01b031633145b61102f576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b82816003015410611077576040805162461bcd60e51b815260206004820152600d60248201526c554e4c4f434b204245464f524560981b604482015290519081900360640190fd5b60006110a16103e861109b600760040154856001015461297490919063ffffffff16565b906129cd565b905060006110bc82846001015461278d90919063ffffffff16565b60018401819055600384018690556012549091506110e59089906001600160a01b0316846127ff565b505060018055505050505050565b6110fb612789565b6000546001600160a01b0390811691161461114b576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bdf6004612969565b6111a9612789565b6000546001600160a01b039081169116146111f9576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600c95909555600f93909355600791909155600955600a55600b55565b61121e612789565b6000546001600160a01b0390811691161461126e576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156112d6576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001556402540be4008410611328576040805162461bcd60e51b81526020600482015260116024820152701512535154d51053540812539590531251607a1b604482015290519081900360640190fd5b6000851161136c576040805162461bcd60e51b815260206004820152600c60248201526b125394d551919250d251539560a21b604482015290519081900360640190fd5b60025460408051630dfe168160e01b8152905188926000926001600160a01b039182169263e6a4390592861691630dfe1681916004808301926020929190829003018186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b50516040805163d21220a760e01b815290516001600160a01b0387169163d21220a7916004808301926020929190829003018186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d60208110156114ce57600080fd5b505190506001600160a01b038082169089161461151e576040805162461bcd60e51b81526020600482015260096024820152682727aa102aa724ab1960b91b604482015290519081900360640190fd5b61152a8833308a612a34565b6001600160a01b0385161580159061154c5750600d546001600160a01b031615155b1561161557600e54600d54604080516370a0823160e01b81526001600160a01b038981166004830152915191909216916370a08231916024808301926020929190829003018186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d60208110156115cb57600080fd5b50511015611615576040805162461bcd60e51b8152602060048201526012602482015271494e41444551554154452042414c414e434560701b604482015290519081900360640190fd5b611620601033612b91565b61188e578315611760576007546001600160a01b0386161561165757600f54611654906103e89061109b9084908303612974565b90505b803414611699576040805162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b604482015290519081900360640190fd5b8080158015906116b157506001600160a01b03871615155b1561171e5760006116d66103e861109b6007600501548561297490919063ffffffff16565b6040519091506001600160a01b0389169082156108fc029083906000818181858888f1935050505015801561170f573d6000803e3d6000fd5b5061171a828261278d565b9150505b6012546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611758573d6000803e3d6000fd5b505050611889565b6009546001600160a01b0386161561178d57600f5461178a906103e89061109b9084908303612974565b90505b6008546117a5906001600160a01b0316333084612a34565b600c54158015906117be57506001600160a01b03861615155b156118225760006117e36103e861109b6007600501548561297490919063ffffffff16565b6008549091506117fd906001600160a01b03168883612ba6565b600854611814906001600160a01b031688836127ff565b61181e828261278d565b9150505b60085460408051630852cd8d60e31b81526004810184905290516001600160a01b03909216916342966c689160248082019260009290919082900301818387803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b50505050505b6118c2565b34156118c25760405133903480156108fc02916000818181858888f193505050501580156118c0573d6000803e3d6000fd5b505b60006118e26103e861109b6007600401548b61297490919063ffffffff16565b9050841580156118fa57506118f8601033612b91565b155b1561191a57600a54611917906103e89061109b9084908303612974565b90505b601254611932908a906001600160a01b0316836127ff565b600061193e898361278d565b9050611948612f08565b42816000018181525050818160200181815250508181604001818152505088816060018181525050600660008c6001600160a01b03166001600160a01b0316815260200190815260200160002080549050816080018181525050858160a001906001600160a01b031690816001600160a01b031681525050600660008c6001600160a01b03166001600160a01b03168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050611a848b6004612d0990919063ffffffff16565b506001600160a01b0386166000908152600360205260409020611aa7818d612d09565b506001600160a01b038c1660008181526002830160209081526040808320608080880151825460018101845583875295859020909501949094558683015187516060808a0151855198895233968901969096528785019290925290860152928401919091525190917f830357565da6ecfc26d8d9f69df488ed6f70361af9a07e570544aeb5c5e765e5919081900360a00190a15050600180555050505050505050505050565b6002546001600160a01b031681565b600061087460108361277d565b6000546001600160a01b031690565b6001600160a01b0382166000908152600360205260408120611b9a818461277d565b949350505050565b600754600854600954600a54600b54600c54600d54600e54600f546001600160a01b03978816979092169189565b611bd8612789565b6000546001600160a01b03908116911614611c28576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b8015611c3f57611c39601083612d09565b50611c4c565b611c4a6010836127ea565b505b5050565b6001600160a01b0381166000908152600360205260408120611c7181612969565b9392505050565b6001600160a01b0391821660009081526003602090815260408083209390941682526002909201909152205490565b60026001541415611ced576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b600260015580611d32576040805162461bcd60e51b815260206004820152600b60248201526a16915493c8105353d5539560aa1b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110611d6457fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110611da357fe5b906000526020600020906006020190508382148015611dce575060058101546001600160a01b031633145b611e0f576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b611e1b86333086612a34565b6000611e3b6103e861109b6007600401548761297490919063ffffffff16565b601254909150611e569088906001600160a01b0316836127ff565b6000611e62858361278d565b6001840154909150611e749082612d1e565b600184015582546003840154604080516001600160a01b038c16815233602082015280820185905260608101939093526080830191909152517f830357565da6ecfc26d8d9f69df488ed6f70361af9a07e570544aeb5c5e765e59181900360a00190a1505060018055505050505050565b6000610874601083612b91565b336001600160a01b0382161415611f38576040805162461bcd60e51b815260206004820152600560248201526427aba722a960d91b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b03881684526002019091528120805485908110611f6a57fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110611fa957fe5b906000526020600020906006020190508382148015611fd4575060058101546001600160a01b031633145b612015576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090206120378188612d09565b506001600160a01b038716600081815260028084016020908152604080842060048801548154600181018355828752848720015533855260038352818520958552949092019052902080548190600019810190811061209257fe5b90600052602060002001548189815481106120a957fe5b9060005260206000200181905550808054806120c157fe5b60008281526020812082016000199081019190915501905580546120fa573360009081526003602052604090206120f8908a6127ea565b505b50505060050180546001600160a01b0319166001600160a01b03939093169290921790915550505050565b6006602052816000526040600020818154811061213e57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501549396509194509290916001600160a01b031686565b612187612789565b6000546001600160a01b039081169116146121d7576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000806000806000600360008b6001600160a01b03166001600160a01b0316815260200190815260200160002060020160008a6001600160a01b03166001600160a01b03168152602001908152602001600020888154811061225a57fe5b906000526020600020015490506000600660008b6001600160a01b03166001600160a01b03168152602001908152602001600020828154811061229957fe5b6000918252602090912060069091020180546001820154600283015460038401546004850154600590950154939c50919a50985096509094506001600160a01b03169250505093975093979195509350565b60026001541415612331576040805162461bcd60e51b815260206004820152601f6024820152600080516020612f6a833981519152604482015290519081900360640190fd5b60026001556013546001600160a01b031661237d576040805162461bcd60e51b81526020600482015260076024820152661393d50814d15560ca1b604482015290519081900360640190fd5b600081116123c3576040805162461bcd60e51b815260206004820152600e60248201526d2d22a9279026a4a3a920aa24a7a760911b604482015290519081900360640190fd5b3360009081526003602090815260408083206001600160a01b038816845260020190915281208054859081106123f557fe5b90600052602060002001549050600060066000876001600160a01b03166001600160a01b03168152602001908152602001600020828154811061243457fe5b90600052602060002090600602019050838214801561245f575060058101546001600160a01b031633145b6124a0576040805162461bcd60e51b815260206004820152600d60248201526c0989e8696409a92a69a82a8869609b1b604482015290519081900360640190fd5b60018101546124af908461278d565b6001820181905561255c573360009081526003602090815260408083206001600160a01b038a16845260020190915290208054819060001981019081106124f257fe5b906000526020600020015481878154811061250957fe5b90600052602060002001819055508080548061252157fe5b600082815260208120820160001990810191909155019055805461255a5733600090815260036020526040902061255890886127ea565b505b505b6013546125749087906001600160a01b031685612ba6565b60135460038201546040805163db5ecd3f60e01b81526001600160a01b038a811660048301526024820188905260448201939093523360648201529051919092169163db5ecd3f9160848083019260209291908290030181600087803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050506040513d60208110156110e557600080fd5b61260f612789565b6000546001600160a01b0390811691161461265f576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b039390931692909217909155600e55565b61268d612789565b6000546001600160a01b039081169116146126dd576040805162461bcd60e51b81526020600482018190526024820152600080516020612fd1833981519152604482015290519081900360640190fd5b6001600160a01b0381166127225760405162461bcd60e51b8152600401808060200182810382526026815260200180612f8a6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611c718383612d78565b3390565b6000828211156127e4576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000611c71836001600160a01b038416612ddc565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061287c5780518252601f19909201916020918201910161285d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146128de576040519150601f19603f3d011682016040523d82523d6000602084013e6128e3565b606091505b5091509150818015612911575080511580612911575080806020019051602081101561290e57600080fd5b50515b612962576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b600061087482612ea2565b60008261298357506000610874565b8282028284828161299057fe5b0414611c715760405162461bcd60e51b8152600401808060200182810382526021815260200180612fb06021913960400191505060405180910390fd5b6000808211612a23576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a2c57fe5b049392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310612ab95780518252601f199092019160209182019101612a9a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b1b576040519150601f19603f3d011682016040523d82523d6000602084013e612b20565b606091505b5091509150818015612b4e575080511580612b4e5750808060200190516020811015612b4b57600080fd5b50515b612b895760405162461bcd60e51b8152600401808060200182810382526024815260200180612ff16024913960400191505060405180910390fd5b505050505050565b6000611c71836001600160a01b038416612ea6565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b60208310612c235780518252601f199092019160209182019101612c04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c85576040519150601f19603f3d011682016040523d82523d6000602084013e612c8a565b606091505b5091509150818015612cb8575080511580612cb85750808060200190516020811015612cb557600080fd5b50515b612962576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b6000611c71836001600160a01b038416612ebe565b600082820183811015611c71576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b81546000908210612dba5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f486022913960400191505060405180910390fd5b826000018281548110612dc957fe5b9060005260206000200154905092915050565b60008181526001830160205260408120548015612e985783546000198083019190810190600090879083908110612e0f57fe5b9060005260206000200154905080876000018481548110612e2c57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612e5c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610874565b6000915050610874565b5490565b60009081526001919091016020526040902054151590565b6000612eca8383612ea6565b612f0057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610874565b506000610874565b6040518060c00160405280600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64735265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212202d349316d2c905e80212ae79efae8bcad3634db842c9c3e0ab73422f2565e16c64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
-----Decoded View---------------
Arg [0] : _uniswapFactory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Deployed Bytecode Sourcemap
19046:17981:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35371:129;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35371:129:0;;:::i;:::-;;;;-1:-1:-1;;;;;35371:129:0;;;;;;;;;;;;;;35112:133;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35112:133:0;-1:-1:-1;;;;;35112:133:0;;:::i;:::-;;;;;;;;;;;;;;;;21725:98;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21725:98:0;-1:-1:-1;;;;;21725:98:0;;:::i;:::-;;29116:1058;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29116:1058:0;;;;;;;;;;;;;;;;;;:::i;36627:117::-;;;;;;;;;;;;;:::i;31503:1232::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31503:1232:0;;;;;;;;;;;;;;;;;;:::i;27939:938::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27939:938:0;;;;;;;;;;;;;;;;;;:::i;15844:148::-;;;;;;;;;;;;;:::i;35253:110::-;;;;;;;;;;;;;:::i;22301:508::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22301:508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21831:148::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21831:148:0;-1:-1:-1;;;;;21831:148:0;;:::i;23620:4083::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23620:4083:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19196:33::-;;;;;;;;;;;;;:::i;36752:133::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36752:133:0;;:::i;15202:79::-;;;;;;;;;;;;;:::i;35718:200::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35718:200:0;;;;;;;;:::i;20766:22::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;20766:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20766:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22904:209;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22904:209:0;;;;;;;;;;:::i;35531:179::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35531:179:0;-1:-1:-1;;;;;35531:179:0;;:::i;35926:207::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35926:207:0;;;;;;;;;;:::i;30365:950::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30365:950:0;;;;;;;;;;;;;;;;;;:::i;36893:131::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36893:131:0;-1:-1:-1;;;;;36893:131:0;;:::i;:::-;;;;;;;;;;;;;;;;;;32845:1093;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32845:1093:0;;;;;;;;;;;;;;;;;;;;:::i;19957:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19957:49:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19957:49:0;;;;;;;;;;;;;;21504:96;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21504:96:0;-1:-1:-1;;;;;21504:96:0;;:::i;36141:460::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36141:460:0;;;;;;;;;;;;;;;;;:::i;34011:1093::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34011:1093:0;;;;;;;;;;;;;;;;;;:::i;22111:182::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22111:182:0;;;;;;;;:::i;16147:281::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16147:281:0;-1:-1:-1;;;;;16147:281:0;;:::i;35371:129::-;35442:7;35469:23;:12;35485:6;35469:15;:23::i;:::-;35462:30;35371:129;-1:-1:-1;;35371:129:0:o;35112:133::-;-1:-1:-1;;;;;35210:20:0;35183:7;35210:20;;;:10;:20;;;;;:27;;35112:133::o;21725:98::-;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;21795:8:::1;:20:::0;;-1:-1:-1;;;;;;21795:20:0::1;-1:-1:-1::0;;;;;21795:20:0;;;::::1;::::0;;;::::1;::::0;;21725:98::o;29116:1058::-;17319:1;17924:7;;:19;;17916:63;;;;;-1:-1:-1;;;17916:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17916:63:0;;;;;;;;;;;;;;;17319:1;18057:7;:18;29244:11;29236:38:::1;;;::::0;;-1:-1:-1;;;29236:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29236:38:0;;;;;;;;;;;;;::::1;;29308:10;29285:14;29302:17:::0;;;:5:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;29302:41:0;::::1;::::0;;:31:::1;;:41:::0;;;;;:49;;29344:6;;29302:49;::::1;;;;;;;;;;;;;29285:66;;29362:26;29391:10;:20;29402:8;-1:-1:-1::0;;;;;29391:20:0::1;-1:-1:-1::0;;;;;29391:20:0::1;;;;;;;;;;;;29412:6;29391:28;;;;;;;;;;;;;;;;;;29362:57;;29448:7;29438:6;:17;:49;;;;-1:-1:-1::0;29459:14:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;29459:14:0::1;29477:10;29459:28;29438:49;29430:75;;;::::0;;-1:-1:-1;;;29430:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29430:75:0;;;;;;;;;;;;;::::1;;29582:15;29560:8;:19;;;:37;29552:57;;;::::0;;-1:-1:-1;;;29552:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29552:57:0;;;;;;;;;;;;;::::1;;29638:15;::::0;::::1;::::0;:28:::1;::::0;29658:7;29638:19:::1;:28::i;:::-;29620:15;::::0;::::1;:46:::0;;;29710:341:::1;;29787:10;29751:27;29781:17:::0;;;:5:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;29781:41:0;::::1;::::0;;:31:::1;;:41:::0;;;;;29867:16;;29781:41;;-1:-1:-1;;29867:18:0;;;29857:29;::::1;;;;;;;;;;;;;29837:9;29847:6;29837:17;;;;;;;;;;;;;;;:49;;;;29901:9;:15;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;29901:15:0;;;;;;;;;;29935:16;;29931:109:::1;;29983:10;29977:17;::::0;;;:5:::1;:17;::::0;;;;:47:::1;::::0;30015:8;29977:37:::1;:47::i;:::-;;29931:109;29710:341;;30063:58;30091:8;30101:10;30113:7;30063:27;:58::i;:::-;30137:29;::::0;;-1:-1:-1;;;;;30137:29:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;;17275:1:0;18236:22;;-1:-1:-1;;;;29116:1058:0:o;36627:117::-;36688:7;36715:21;:12;:19;:21::i;:::-;36708:28;;36627:117;:::o;31503:1232::-;17319:1;17924:7;;:19;;17916:63;;;;;-1:-1:-1;;;17916:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17916:63:0;;;;;;;;;;;;;;;17319:1;18057:7;:18;31640:11;31632:35:::1;;;::::0;;-1:-1:-1;;;31632:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31632:35:0;;;;;;;;;;;;;::::1;;31701:10;31678:14;31695:17:::0;;;:5:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;31695:41:0;::::1;::::0;;:31:::1;;:41:::0;;;;;:49;;31737:6;;31695:49;::::1;;;;;;;;;;;;;31678:66;;31755:26;31784:10;:20;31795:8;-1:-1:-1::0;;;;;31784:20:0::1;-1:-1:-1::0;;;;;31784:20:0::1;;;;;;;;;;;;31805:6;31784:28;;;;;;;;;;;;;;;;;;31755:57;;31841:7;31831:6;:17;:49;;;;-1:-1:-1::0;31852:14:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;31852:14:0::1;31870:10;31852:28;31831:49;31823:75;;;::::0;;-1:-1:-1;;;31823:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31823:75:0;;;;;;;;;;;;;::::1;;31968:5;:12:::0;31955:9:::1;:25;31947:49;;;::::0;;-1:-1:-1;;;31947:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31947:49:0;;;;;;;;;;;;;::::1;;32007:7;::::0;32024:5:::1;:12:::0;32007:30:::1;::::0;-1:-1:-1;;;;;32007:7:0;;::::1;::::0;:30;::::1;;;::::0;32024:12;32007:7:::1;:30:::0;:7;:30;32024:12;32007:7;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;32068:15:0::1;::::0;::::1;::::0;:28:::1;::::0;32088:7;32068:19:::1;:28::i;:::-;32050:15;::::0;::::1;:46:::0;32109:27:::1;;:::i;:::-;32169:17:::0;;32147:39;;32197:17:::1;::::0;;::::1;:27:::0;;;32235:24:::1;::::0;;::::1;:34:::0;;;32304:19:::1;::::0;;::::1;::::0;32280:21:::1;::::0;::::1;:43:::0;;;-1:-1:-1;;;;;32354:20:0;;::::1;-1:-1:-1::0;32354:20:0;;;:10:::1;:20:::0;;;;;;:27;;32334:17:::1;::::0;::::1;:47:::0;;;32411:10:::1;32392:16;::::0;::::1;:29:::0;;;32480:20;;;:37:::1;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;32480:37:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;32595:17;;;;;;;;;32654:28;;;:18;;;::::1;:28:::0;;;;;32709:17;;32693:34;;;;::::1;::::0;;;;;;;::::1;::::0;;;;18236:22;;-1:-1:-1;;;31503:1232:0:o;27939:938::-;17319:1;17924:7;;:19;;17916:63;;;;;-1:-1:-1;;;17916:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17916:63:0;;;;;;;;;;;;;;;17319:1;18057:7;:18;28085:11:::1;28070:26:::0;::::1;28062:56;;;::::0;;-1:-1:-1;;;28062:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28062:56:0;;;;;;;;;;;;;::::1;;28210:10;28187:14;28204:17:::0;;;:5:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;28204:41:0;::::1;::::0;;:31:::1;;:41:::0;;;;;:49;;28246:6;;28204:49;::::1;;;;;;;;;;;;;28187:66;;28264:26;28293:10;:20;28304:8;-1:-1:-1::0;;;;;28293:20:0::1;-1:-1:-1::0;;;;;28293:20:0::1;;;;;;;;;;;;28314:6;28293:28;;;;;;;;;;;;;;;;;;28264:57;;28350:7;28340:6;:17;:49;;;;-1:-1:-1::0;28361:14:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;28361:14:0::1;28379:10;28361:28;28340:49;28332:75;;;::::0;;-1:-1:-1;;;28332:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28332:75:0;;;;;;;;;;;;;::::1;;28484:12;28462:8;:19;;;:34;28454:60;;;::::0;;-1:-1:-1;;;28454:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28454:60:0;;;;;;;;;;;;;::::1;;28527:20;28550:49;28594:4;28550:39;28570:5;:18;;;28550:8;:15;;;:19;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;28527:72;;28610:20;28633:33;28653:12;28633:8;:15;;;:19;;:33;;;;:::i;:::-;28679:15;::::0;::::1;:30:::0;;;28720:19:::1;::::0;::::1;:34:::0;;;28847:7:::1;::::0;28610:56;;-1:-1:-1;28809:60:0::1;::::0;28837:8;;-1:-1:-1;;;;;28847:7:0::1;28856:12:::0;28809:27:::1;:60::i;:::-;-1:-1:-1::0;;17275:1:0;18236:22;;-1:-1:-1;;;;;;27939:938:0:o;15844:148::-;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;15951:1:::1;15935:6:::0;;15914:40:::1;::::0;-1:-1:-1;;;;;15935:6:0;;::::1;::::0;15914:40:::1;::::0;15951:1;;15914:40:::1;15982:1;15965:19:::0;;-1:-1:-1;;;;;;15965:19:0::1;::::0;;15844:148::o;35253:110::-;35307:7;35334:21;:12;:19;:21::i;22301:508::-;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;22510:21;:40;;;;22561:22;:42;;;;22510:5:::1;22614:22:::0;;;;22647:23;:44;22702:28;:54;22767:18;:34;22301:508::o;21831:148::-;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;21917:23;:54;;-1:-1:-1;;;;;;21917:54:0::1;-1:-1:-1::0;;;;;21917:54:0;;;::::1;::::0;;;::::1;::::0;;21831:148::o;23620:4083::-;17319:1;17924:7;;:19;;17916:63;;;;;-1:-1:-1;;;17916:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17916:63:0;;;;;;;;;;;;;;;17319:1;18057:7;:18;23847:11:::1;23832:26:::0;::::1;23824:56;;;::::0;;-1:-1:-1;;;23824:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23824:56:0;;;;;;;;;;;;;::::1;;23967:1;23957:7;:11;23949:36;;;::::0;;-1:-1:-1;;;23949:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23949:36:0;;;;;;;;;;;;;::::1;;24163:14;::::0;24186::::1;::::0;;-1:-1:-1;;;24186:14:0;;;;24113:8;;24067:20:::1;::::0;-1:-1:-1;;;;;24163:14:0;;::::1;::::0;:22:::1;::::0;24186:12;::::1;::::0;::::1;::::0;:14:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:12;:14;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24186:14:0;24202::::1;::::0;;-1:-1:-1;;;24202:14:0;;;;-1:-1:-1;;;;;24202:12:0;::::1;::::0;::::1;::::0;:14:::1;::::0;;::::1;::::0;24186::::1;::::0;24202;;;;;;;:12;:14;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24202:14:0;24163:54:::1;::::0;;-1:-1:-1;;;;;;24163:54:0::1;::::0;;;;;;-1:-1:-1;;;;;24163:54:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;24202:14:::1;::::0;24163:54;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24163:54:0;;-1:-1:-1;;;;;;24236:39:0;;::::1;::::0;;::::1;;24228:61;;;::::0;;-1:-1:-1;;;24228:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24228:61:0;;;;;;;;;;;;;::::1;;24302:86;24334:8;24352:10;24373:4;24380:7;24302:31;:86::i;:::-;-1:-1:-1::0;;;;;24405:23:0;::::1;::::0;;::::1;::::0;:69:::1;;-1:-1:-1::0;24440:19:0;;-1:-1:-1;;;;;24440:19:0::1;24432:42:::0;::::1;24405:69;24401:195;;;24543:18:::0;;24499:19;;:40:::1;::::0;;-1:-1:-1;;;24499:40:0;;-1:-1:-1;;;;;24499:40:0;;::::1;;::::0;::::1;::::0;;;:19;;;::::1;::::0;:29:::1;::::0;:40;;;;;::::1;::::0;;;;;;;;:19;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24499:40:0;:62:::1;;24491:93;;;::::0;;-1:-1:-1;;;24491:93:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24491:93:0;;;;;;;;;;;;;::::1;;24639:33;:12;24661:10;24639:21;:33::i;:::-;24634:1783;;24693:11;24689:1574;;;24763:5;:12:::0;-1:-1:-1;;;;;24798:23:0;::::1;::::0;24794:128:::1;;24869:22:::0;;24851:51:::1;::::0;24897:4:::1;::::0;24851:41:::1;::::0;:6;;24862:29;::::1;24851:10;:41::i;:51::-;24842:60;;24794:128;24961:6;24948:9;:19;24940:43;;;::::0;;-1:-1:-1;;;24940:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24940:43:0;;;;;;;;;;;;;::::1;;25019:6:::0;25048:11;;;::::1;::::0;:38:::1;;-1:-1:-1::0;;;;;;25063:23:0;::::1;::::0;::::1;25048:38;25044:265;;;25123:19;25145:43;25183:4;25145:33;25156:5;:21;;;25145:6;:10;;:33;;;;:::i;:43::-;25207:31;::::0;25123:65;;-1:-1:-1;;;;;;25207:18:0;::::1;::::0;:31;::::1;;;::::0;25123:65;;25207:31:::1;::::0;;;25123:65;25207:18;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;25266:23:0::1;:6:::0;25277:11;25266:10:::1;:23::i;:::-;25257:32;;25044:265;;25327:7;::::0;:24:::1;::::0;-1:-1:-1;;;;;25327:7:0;;::::1;::::0;:24;::::1;;;::::0;25344:6;;25327:7:::1;:24:::0;:7;:24;25344:6;25327:7;:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;24689:1574;;;;;25433:23:::0;;-1:-1:-1;;;;;25479:23:0;::::1;::::0;25475:130:::1;;25552:22:::0;;25533:52:::1;::::0;25580:4:::1;::::0;25533:42:::1;::::0;:7;;25545:29;::::1;25533:11;:42::i;:52::-;25523:62;;25475:130;25663:23:::0;;25623:110:::1;::::0;-1:-1:-1;;;;;25663:23:0::1;25697:10;25718:4;25725:7:::0;25623:31:::1;:110::i;:::-;25756:21:::0;;:26;;::::1;::::0;:53:::1;;-1:-1:-1::0;;;;;;25786:23:0;::::1;::::0;::::1;25756:53;25752:440;;;25846:19;25868:44;25907:4;25868:34;25880:5;:21;;;25868:7;:11;;:34;;;;:::i;:44::-;25966:23:::0;;25846:66;;-1:-1:-1;25931:84:0::1;::::0;-1:-1:-1;;;;;25966:23:0::1;25992:9:::0;25846:66;25931:26:::1;:84::i;:::-;26070:23:::0;;26034:85:::1;::::0;-1:-1:-1;;;;;26070:23:0::1;26096:9:::0;26107:11;26034:27:::1;:85::i;:::-;26148:24;:7:::0;26160:11;26148::::1;:24::i;:::-;26138:34;;25752:440;;26210:23:::0;;:37:::1;::::0;;-1:-1:-1;;;26210:37:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;26210:23:0;;::::1;::::0;:28:::1;::::0;:37;;;;;:23:::1;::::0;:37;;;;;;;;:23;;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24689:1574;;24634:1783;;;26284:9;:13:::0;26280:137:::1;;26375:30;::::0;:10:::1;::::0;26395:9:::1;26375:30:::0;::::1;;;::::0;::::1;::::0;;;26395:9;26375:10;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;26280:137;26453:20;26476:41;26512:4;26476:31;26488:5;:18;;;26476:7;:11;;:31;;;;:::i;:41::-;26453:64;;26533:11;26532:12;:50;;;;-1:-1:-1::0;26549:33:0::1;:12;26571:10;26549:21;:33::i;:::-;26548:34;26532:50;26528:213;;;26690:28:::0;;26666:63:::1;::::0;26724:4:::1;::::0;26666:53:::1;::::0;:12;;26683:35;::::1;26666:16;:53::i;:63::-;26651:78;;26528:213;26789:7;::::0;26751:60:::1;::::0;26779:8;;-1:-1:-1;;;;;26789:7:0::1;26798:12:::0;26751:27:::1;:60::i;:::-;26822:20;26845:25;:7:::0;26857:12;26845:11:::1;:25::i;:::-;26822:48;;26883:27;;:::i;:::-;26943:15;26921:10;:19;;:37;;;::::0;::::1;26989:12;26969:10;:17;;:32;;;::::0;::::1;27039:12;27012:10;:24;;:39;;;::::0;::::1;27086:12;27062:10;:21;;:36;;;::::0;::::1;27129:10;:20;27140:8;-1:-1:-1::0;;;;;27129:20:0::1;-1:-1:-1::0;;;;;27129:20:0::1;;;;;;;;;;;;:27;;;;27109:10;:17;;:47;;;::::0;::::1;27186:11;27167:10;:16;;:30;-1:-1:-1::0;;;;;27167:30:0::1;;;-1:-1:-1::0;;;;;27167:30:0::1;;;::::0;::::1;27256:10;:20;27267:8;-1:-1:-1::0;;;;;27256:20:0::1;-1:-1:-1::0;;;;;27256:20:0::1;;;;;;;;;;;;27282:10;27256:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27256:37:0::1;;;;;-1:-1:-1::0;;;;;27256:37:0::1;;;;;;;;27304:26;27321:8;27304:12;:16;;:26;;;;:::i;:::-;-1:-1:-1::0;;;;;;27408:18:0;::::1;27384:21;27408:18:::0;;;:5:::1;:18;::::0;;;;27437:31:::1;27408:18:::0;27459:8;27437:21:::1;:31::i;:::-;-1:-1:-1::0;;;;;;27510:28:0;::::1;27479;27510::::0;;;:18:::1;::::0;::::1;:28;::::0;;;;;;;27565:17:::1;::::0;;::::1;::::0;27549:34;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;27633:17;;::::1;::::0;27652:19;;27673:21:::1;::::0;;::::1;::::0;27601:94;;;;;27621:10:::1;27601:94:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;27510:28;;27601:94:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;17275:1:0;18236:22;;-1:-1:-1;;;;;;;;;;;23620:4083:0:o;19196:33::-;;;-1:-1:-1;;;;;19196:33:0;;:::o;36752:133::-;36827:7;36854:23;:12;36870:6;36854:15;:23::i;15202:79::-;15240:7;15267:6;-1:-1:-1;;;;;15267:6:0;15202:79;:::o;35718:200::-;-1:-1:-1;;;;;35852:12:0;;35808:7;35852:12;;;:5;:12;;;;;35882:28;35852:12;35903:6;35882:20;:28::i;:::-;35875:35;35718:200;-1:-1:-1;;;;35718:200:0:o;20766:22::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20766:22:0;;;;;;;;;:::o;22904:209::-;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;22991:4:::1;22987:119;;;23012:23;:12;23029:5:::0;23012:16:::1;:23::i;:::-;;22987:119;;;23068:26;:12;23088:5:::0;23068:19:::1;:26::i;:::-;;22987:119;22904:209:::0;;:::o;35531:179::-;-1:-1:-1;;;;;35646:12:0;;35602:7;35646:12;;;:5;:12;;;;;35676:26;35646:12;35676:24;:26::i;:::-;35669:33;35531:179;-1:-1:-1;;;35531:179:0:o;35926:207::-;-1:-1:-1;;;;;36060:12:0;;;36016:7;36060:12;;;:5;:12;;;;;;;;36090:28;;;;;;:18;;;;:28;;;;:35;;35926:207::o;30365:950::-;17319:1;17924:7;;:19;;17916:63;;;;;-1:-1:-1;;;17916:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17916:63:0;;;;;;;;;;;;;;;17319:1;18057:7;:18;30498:11;30490:35:::1;;;::::0;;-1:-1:-1;;;30490:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30490:35:0;;;;;;;;;;;;;::::1;;30559:10;30536:14;30553:17:::0;;;:5:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;30553:41:0;::::1;::::0;;:31:::1;;:41:::0;;;;;:49;;30595:6;;30553:49;::::1;;;;;;;;;;;;;30536:66;;30613:26;30642:10;:20;30653:8;-1:-1:-1::0;;;;;30642:20:0::1;-1:-1:-1::0;;;;;30642:20:0::1;;;;;;;;;;;;30663:6;30642:28;;;;;;;;;;;;;;;;;;30613:57;;30699:7;30689:6;:17;:49;;;;-1:-1:-1::0;30710:14:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;30710:14:0::1;30728:10;30710:28;30689:49;30681:75;;;::::0;;-1:-1:-1;;;30681:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30681:75:0;;;;;;;;;;;;;::::1;;30805:86;30837:8;30855:10;30876:4;30883:7;30805:31;:86::i;:::-;30946:20;30969:41;31005:4;30969:31;30981:5;:18;;;30969:7;:11;;:31;;;;:::i;:41::-;31059:7;::::0;30946:64;;-1:-1:-1;31021:60:0::1;::::0;31049:8;;-1:-1:-1;;;;;31059:7:0::1;30946:64:::0;31021:27:::1;:60::i;:::-;31092:20;31115:25;:7:::0;31127:12;31115:11:::1;:25::i;:::-;31171:15;::::0;::::1;::::0;31092:48;;-1:-1:-1;31171:33:0::1;::::0;31092:48;31171:19:::1;:33::i;:::-;31153:15;::::0;::::1;:51:::0;31268:17;;31287:19:::1;::::0;::::1;::::0;31222:85:::1;::::0;;-1:-1:-1;;;;;31222:85:0;::::1;::::0;;31242:10:::1;31222:85;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;17275:1:0;18236:22;;-1:-1:-1;;;;;;30365:950:0:o;36893:131::-;36964:4;36988:28;:12;37010:5;36988:21;:28::i;32845:1093::-;32983:10;-1:-1:-1;;;;;32983:23:0;;;;32975:41;;;;;-1:-1:-1;;;32975:41:0;;;;;;;;;;;;-1:-1:-1;;;32975:41:0;;;;;;;;;;;;;;;33050:10;33027:14;33044:17;;;:5;:17;;;;;;;;-1:-1:-1;;;;;33044:41:0;;;;:31;;:41;;;;;:49;;33086:6;;33044:49;;;;;;;;;;;;;;33027:66;;33104:33;33140:10;:20;33151:8;-1:-1:-1;;;;;33140:20:0;-1:-1:-1;;;;;33140:20:0;;;;;;;;;;;;33161:6;33140:28;;;;;;;;;;;;;;;;;;33104:64;;33197:7;33187:6;:17;:56;;;;-1:-1:-1;33208:21:0;;;;-1:-1:-1;;;;;33208:21:0;33233:10;33208:35;33187:56;33179:82;;;;;-1:-1:-1;;;33179:82:0;;;;;;;;;;;;-1:-1:-1;;;33179:82:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33380:16:0;;33356:21;33380:16;;;:5;:16;;;;;33407:31;33380:16;33429:8;33407:21;:31::i;:::-;-1:-1:-1;;;;;;33480:28:0;;33449;33480;;;:18;;;;:28;;;;;;;;33535:22;;;;33519:39;;;;;;;;;;;;;;;33654:10;33648:17;;:5;:17;;;;;:41;;;:31;;;;:41;;;;33730:16;;33648:41;;-1:-1:-1;;33730:18:0;;;33720:29;;;;;;;;;;;;;;33700:9;33710:6;33700:17;;;;;;;;;;;;;;;:49;;;;33760:9;:15;;;;;;;;;;;;;;;;-1:-1:-1;;33760:15:0;;;;;;;;;;33790:16;;33786:101;;33834:10;33828:17;;;;:5;:17;;;;;:47;;33866:8;33828:37;:47::i;:::-;;33786:101;-1:-1:-1;;;33897:21:0;;:33;;-1:-1:-1;;;;;;33897:33:0;-1:-1:-1;;;;;33897:33:0;;;;;;;;;;;-1:-1:-1;;;;32845:1093:0:o;19957:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19957:49:0;;-1:-1:-1;19957:49:0;;;-1:-1:-1;;;;;19957:49:0;;:::o;21504:96::-;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;21574:7:::1;:18:::0;;-1:-1:-1;;;;;;21574:18:0::1;-1:-1:-1::0;;;;;21574:18:0;;;::::1;::::0;;;::::1;::::0;;21504:96::o;36141:460::-;36260:7;36269;36278;36287;36296;36305;36325:14;36342:5;:12;36348:5;-1:-1:-1;;;;;36342:12:0;-1:-1:-1;;;;;36342:12:0;;;;;;;;;;;;:26;;:36;36369:8;-1:-1:-1;;;;;36342:36:0;-1:-1:-1;;;;;36342:36:0;;;;;;;;;;;;36379:6;36342:44;;;;;;;;;;;;;;;;36325:61;;36397:27;36427:10;:20;36438:8;-1:-1:-1;;;;;36427:20:0;-1:-1:-1;;;;;36427:20:0;;;;;;;;;;;;36448:6;36427:28;;;;;;;;;;;;;;;;;;;;;36474:18;;36494:16;;;;36512:23;;;;36537:20;;;;36559:16;;;;36577:15;;;;;36474:18;;-1:-1:-1;36494:16:0;;-1:-1:-1;36512:23:0;-1:-1:-1;36537:20:0;-1:-1:-1;36559:16:0;;-1:-1:-1;;;;;;36577:15:0;;-1:-1:-1;;;36141:460:0;;;;;;;;;;:::o;34011:1093::-;17319:1;17924:7;;:19;;17916:63;;;;;-1:-1:-1;;;17916:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17916:63:0;;;;;;;;;;;;;;;17319:1;18057:7;:18;34146:8:::1;::::0;-1:-1:-1;;;;;34146:8:0::1;34130:51;;;::::0;;-1:-1:-1;;;34130:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34130:51:0;;;;;;;;;;;;;::::1;;34210:1;34200:7;:11;34192:38;;;::::0;;-1:-1:-1;;;34192:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34192:38:0;;;;;;;;;;;;;::::1;;34266:10;34243:14;34260:17:::0;;;:5:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;34260:41:0;::::1;::::0;;:31:::1;;:41:::0;;;;;:49;;34302:6;;34260:49;::::1;;;;;;;;;;;;;34243:66;;34320:26;34349:10;:20;34360:8;-1:-1:-1::0;;;;;34349:20:0::1;-1:-1:-1::0;;;;;34349:20:0::1;;;;;;;;;;;;34370:6;34349:28;;;;;;;;;;;;;;;;;;34320:57;;34406:7;34396:6;:17;:49;;;;-1:-1:-1::0;34417:14:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;34417:14:0::1;34435:10;34417:28;34396:49;34388:75;;;::::0;;-1:-1:-1;;;34388:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34388:75:0;;;;;;;;;;;;;::::1;;34528:15;::::0;::::1;::::0;:28:::1;::::0;34548:7;34528:19:::1;:28::i;:::-;34510:15;::::0;::::1;:46:::0;;;34600:341:::1;;34677:10;34641:27;34671:17:::0;;;:5:::1;:17;::::0;;;;;;;-1:-1:-1;;;;;34671:41:0;::::1;::::0;;:31:::1;;:41:::0;;;;;34757:16;;34671:41;;-1:-1:-1;;34757:18:0;;;34747:29;::::1;;;;;;;;;;;;;34727:9;34737:6;34727:17;;;;;;;;;;;;;;;:49;;;;34791:9;:15;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;34791:15:0;;;;;;;;;;34825:16;;34821:109:::1;;34873:10;34867:17;::::0;;;:5:::1;:17;::::0;;;;:47:::1;::::0;34905:8;34867:37:::1;:47::i;:::-;;34821:109;34600:341;;34998:8;::::0;34953:64:::1;::::0;34980:8;;-1:-1:-1;;;;;34998:8:0::1;35009:7:::0;34953:26:::1;:64::i;:::-;35028:8;::::0;35064:19:::1;::::0;::::1;::::0;35028:68:::1;::::0;;-1:-1:-1;;;35028:68:0;;-1:-1:-1;;;;;35028:68:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;35085:10:::1;35028:68:::0;;;;;;:8;;;::::1;::::0;:16:::1;::::0;:68;;;;;::::1;::::0;;;;;;;;:8:::1;::::0;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;22111:182:::0;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;22212:19;:36;;-1:-1:-1;;;;;;22212:36:0::1;-1:-1:-1::0;;;;;22212:36:0;;;::::1;::::0;;;::::1;::::0;;;22259:18;:26;22111:182::o;16147:281::-;15424:12;:10;:12::i;:::-;15414:6;;-1:-1:-1;;;;;15414:6:0;;;:22;;;15406:67;;;;;-1:-1:-1;;;15406:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15406:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16250:22:0;::::1;16228:110;;;;-1:-1:-1::0;;;16228:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16375:6;::::0;;16354:38:::1;::::0;-1:-1:-1;;;;;16354:38:0;;::::1;::::0;16375:6;::::1;::::0;16354:38:::1;::::0;::::1;16403:6;:17:::0;;-1:-1:-1;;;;;;16403:17:0::1;-1:-1:-1::0;;;;;16403:17:0;;;::::1;::::0;;;::::1;::::0;;16147:281::o;10168:181::-;10269:7;10317:22;10321:3;10333:5;10317:3;:22::i;340:106::-;428:10;340:106;:::o;13333:158::-;13391:7;13424:1;13419;:6;;13411:49;;;;;-1:-1:-1;;;13411:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13478:5:0;;;13333:158::o;9163:172::-;9254:4;9283:44;9291:3;-1:-1:-1;;;;;9311:14:0;;9283:7;:44::i;1304:392::-;1483:45;;;-1:-1:-1;;;;;1483:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1483:45:0;-1:-1:-1;;;1483:45:0;;;1458:81;;;;1423:12;;1437:17;;1458:10;;;;1483:45;1458:81;;;1483:45;1458:81;;1483:45;1458:81;;;;;;;;;;-1:-1:-1;;1458:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1422:117;;;;1572:7;:57;;;;-1:-1:-1;1584:11:0;;:16;;:44;;;1615:4;1604:24;;;;;;;;;;;;;;;-1:-1:-1;1604:24:0;1584:44;1550:138;;;;;-1:-1:-1;;;1550:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1304:392;;;;;:::o;9697:117::-;9760:7;9787:19;9795:3;9787:7;:19::i;13499:220::-;13557:7;13581:6;13577:20;;-1:-1:-1;13596:1:0;13589:8;;13577:20;13620:5;;;13624:1;13620;:5;:1;13644:5;;;;;:10;13636:56;;;;-1:-1:-1;;;13636:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13727:153;13785:7;13817:1;13813;:5;13805:44;;;;;-1:-1:-1;;;13805:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13871:1;13867;:5;;;;;;;13727:153;-1:-1:-1;;;13727:153:0:o;1704:430::-;1910:51;;;-1:-1:-1;;;;;1910:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1910:51:0;-1:-1:-1;;;1910:51:0;;;1885:87;;;;1850:12;;1864:17;;1885:10;;;;1910:51;1885:87;;;1910:51;1885:87;;1910:51;1885:87;;;;;;;;;;-1:-1:-1;;1885:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1849:123;;;;2005:7;:57;;;;-1:-1:-1;2017:11:0;;:16;;:44;;;2048:4;2037:24;;;;;;;;;;;;;;;-1:-1:-1;2037:24:0;2017:44;1983:143;;;;-1:-1:-1;;;1983:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1704:430;;;;;;:::o;9421:190::-;9528:4;9557:46;9567:3;-1:-1:-1;;;;;9587:14:0;;9557:9;:46::i;906:390::-;1084:45;;;-1:-1:-1;;;;;1084:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1084:45:0;-1:-1:-1;;;1084:45:0;;;1059:81;;;;1024:12;;1038:17;;1059:10;;;;1084:45;1059:81;;;1084:45;1059:81;;1084:45;1059:81;;;;;;;;;;-1:-1:-1;;1059:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1023:117;;;;1173:7;:57;;;;-1:-1:-1;1185:11:0;;:16;;:44;;;1216:4;1205:24;;;;;;;;;;;;;;;-1:-1:-1;1205:24:0;1185:44;1151:137;;;;;-1:-1:-1;;;1151:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8821:166;8909:4;8938:41;8943:3;-1:-1:-1;;;;;8963:14:0;;8938:4;:41::i;13146:179::-;13204:7;13236:5;;;13260:6;;;;13252:46;;;;;-1:-1:-1;;;13252:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6584:273;6725:18;;6678:7;;6725:26;-1:-1:-1;6703:110:0;;;;-1:-1:-1;;;6703:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6831:3;:11;;6843:5;6831:18;;;;;;;;;;;;;;;;6824:25;;6584:273;;;;:::o;4231:1557::-;4297:4;4436:19;;;:12;;;:19;;;;;;4472:15;;4468:1313;;4920:18;;-1:-1:-1;;4871:14:0;;;;4920:22;;;;4847:21;;4920:3;;:22;;5207;;;;;;;;;;;;;;5187:42;;5353:9;5324:3;:11;;5336:13;5324:26;;;;;;;;;;;;;;;;;;;:38;;;;5430:23;;;5472:1;5430:12;;;:23;;;;;;5456:17;;;5430:43;;5582:17;;5430:3;;5582:17;;;;;;;;;;;;;;;;;;;;;;5677:3;:12;;:19;5690:5;5677:19;;;;;;;;;;;5670:26;;;5720:4;5713:11;;;;;;;;4468:1313;5764:5;5757:12;;;;;6121:109;6204:18;;6121:109::o;5874:161::-;5974:4;6003:19;;;:12;;;;;:19;;;;;;:24;;;5874:161::o;3641:414::-;3704:4;3726:21;3736:3;3741:5;3726:9;:21::i;:::-;3721:327;;-1:-1:-1;3764:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;3947:18;;3925:19;;;:12;;;:19;;;;;;:40;;;;3980:11;;3721:327;-1:-1:-1;4031:5:0;4024:12;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://2d349316d2c905e80212ae79efae8bcad3634db842c9c3e0ab73422f2565e16c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.